diff --git a/.lefthook.yml b/.lefthook.yml index 0940acb99..463022511 100644 --- a/.lefthook.yml +++ b/.lefthook.yml @@ -19,7 +19,7 @@ pre-commit: glob: "components/**/*.js" - name: stylelint - run: npx stylelint --fix --cache {staged_files} + run: npx stylelint --fix --cache --allow-empty-input {staged_files} glob: "*.css" stage_fixed: true @@ -42,7 +42,7 @@ pre-push: - name: lit-analyzer run: npm run lit-analyzer -- components - name: stylelint - run: npx stylelint '**/*.css' --cache --ignore-path .gitignore + run: npx stylelint '**/*.css' --cache --ignore-path .stylelintignore --ignore-path .gitignore - name: tsc run: npx tsc diff --git a/.prettierignore b/.prettierignore index 1b763b1ba..4fcab6ce2 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1 +1,2 @@ CHANGELOG.md +vendor diff --git a/.stylelintignore b/.stylelintignore index 849ddff3b..0ff09cb7a 100644 --- a/.stylelintignore +++ b/.stylelintignore @@ -1 +1,2 @@ dist/ +vendor/ diff --git a/legacy/index.tsx b/legacy/index.tsx index 72d916b20..5265289d8 100644 --- a/legacy/index.tsx +++ b/legacy/index.tsx @@ -1,12 +1,12 @@ import ReactDOM from "react-dom/client"; import { BrowserRouter as Router, Route, Routes } from "react-router-dom"; -import { UserDataProvider } from "@mdn/yari/client/src/user-context"; -import { UIProvider } from "@mdn/yari/client/src/ui-context"; -import { Plus } from "@mdn/yari/client/src/plus"; -import { GleanProvider } from "@mdn/yari/client/src/telemetry/glean-context"; +import { UserDataProvider } from "../vendor/yari/client/src/user-context"; +import { UIProvider } from "../vendor/yari/client/src/ui-context"; +import { Plus } from "../vendor/yari/client/src/plus"; +import { GleanProvider } from "../vendor/yari/client/src/telemetry/glean-context"; -import "@mdn/yari/client/src/app.scss"; -import "@mdn/yari/client/src/document/index.scss"; +import "../vendor/yari/client/src/app.scss"; +import "../vendor/yari/client/src/document/index.scss"; import "./legacy.css"; import "../hooks/legacy-theme-controller.js"; diff --git a/package-lock.json b/package-lock.json index 7af35e5c0..ae89e6001 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,7 +54,6 @@ "@jackolope/lit-analyzer": "^3.2.0", "@jackolope/ts-lit-plugin": "^3.1.6", "@mdn/browser-compat-data": "^7.1.9", - "@mdn/yari": "^5.1.2", "@rsdoctor/rspack-plugin": "^1.2.3", "@rspack/cli": "^1.5.7", "@rspack/core": "^1.5.7", @@ -1908,193 +1907,6 @@ "dev": true, "license": "(Apache-2.0 AND BSD-3-Clause)" }, - "node_modules/@caporal/core": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@caporal/core/-/core-2.0.7.tgz", - "integrity": "sha512-OvKBEidoXUGT28RP3USXFdLgiR5kGCHfRXR1uBQznyxBHaWjGcpH+G1chRqyIVT82pQoJiauOZRIGlrpyAbRYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/glob": "^7.1.1", - "@types/lodash": "^4.14.149", - "@types/node": "13.9.3", - "@types/table": "^5.0.0", - "@types/tabtab": "^3.0.1", - "@types/wrap-ansi": "^3.0.0", - "chalk": "^3.0.0", - "glob": "^7.1.6", - "lodash": "^4.17.21", - "table": "^5.4.6", - "tabtab": "^3.0.2", - "winston": "^3.2.1", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@caporal/core/node_modules/@types/node": { - "version": "13.9.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.3.tgz", - "integrity": "sha512-01s+ac4qerwd6RHD+mVbOEsraDHSgUaefQlEdBbUolnQFjKwCr7luvAlEwW1RFojh67u0z4OUTjPn9LEl4zIkA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@caporal/core/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@caporal/core/node_modules/astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@caporal/core/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@caporal/core/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@caporal/core/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@caporal/core/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@caporal/core/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@caporal/core/node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@caporal/core/node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@caporal/core/node_modules/table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@caporal/core/node_modules/table/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@caporal/core/node_modules/table/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@caporal/core/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@codemirror/autocomplete": { "version": "6.18.7", "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.18.7.tgz", @@ -2245,16 +2057,6 @@ "w3c-keyname": "^2.2.4" } }, - "node_modules/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, "node_modules/@csstools/cascade-layer-name-parser": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", @@ -3501,18 +3303,6 @@ "postcss": "^8.4" } }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -3804,49 +3594,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@fast-csv/parse": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-5.0.5.tgz", - "integrity": "sha512-M0IbaXZDbxfOnpVE5Kps/a6FGlILLhtLsvWd9qNH3d2TxNnpbNkFf3KD26OmJX6MHq7PdQAl5htStDwnuwHx6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash.escaperegexp": "^4.1.2", - "lodash.groupby": "^4.6.0", - "lodash.isfunction": "^3.0.9", - "lodash.isnil": "^4.0.0", - "lodash.isundefined": "^3.0.1", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/@file-type/xml": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@file-type/xml/-/xml-0.4.3.tgz", - "integrity": "sha512-pGRmkHf+NofNy/52r06HOTsEwdNnBsFEhN6U95s33P+ezuoxZEyBTV9lOB1/Zr0So6/9vDVfWZXLpgd0fy8cOQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "sax": "^1.4.1", - "strtok3": "^10.2.2" - } - }, - "node_modules/@file-type/xml/node_modules/strtok3": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.1.tgz", - "integrity": "sha512-3JWEZM6mfix/GCJBBUrkA8p2Id2pBkyTkVCJKto55w080QBKZ+8R171fGrbiSp+yMO/u6F8/yUh7K4V9K+YCnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tokenizer/token": "^0.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, "node_modules/@fluent/bundle": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@fluent/bundle/-/bundle-0.19.1.tgz", @@ -3923,11466 +3670,4916 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@inquirer/checkbox": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.2.2.tgz", - "integrity": "sha512-E+KExNurKcUJJdxmjglTl141EwxWyAHplvsYJQgSwXf8qiNWkTxTuCCqmhFEmbIXd4zLaGMfQFJ6WrZ7fSeV3g==", - "dev": true, - "license": "MIT", + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", "dependencies": { - "@inquirer/core": "^10.2.0", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" + "minipass": "^7.0.4" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=18.0.0" } }, - "node_modules/@inquirer/checkbox/node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "node_modules/@jackolope/lit-analyzer": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@jackolope/lit-analyzer/-/lit-analyzer-3.2.1.tgz", + "integrity": "sha512-Iacmgm3BkUttulImotXkLaIDK3CJuU+M8Y0oBFGxe45ZkOXu0J7rZR/sb9HWhLKAgmsHa4e2ajC5f8LUEQT/3g==", "dev": true, "license": "MIT", "dependencies": { - "type-fest": "^0.21.3" + "@jackolope/web-component-analyzer": "^4.0.4", + "@vscode/web-custom-data": "^0.6.0", + "chalk": "^5.4.0", + "didyoumean2": "7.0.4", + "fast-glob": "^3.2.11", + "parse5": "7.2.1", + "ts-simple-type": "~2.0.0-next.0", + "vscode-css-languageservice": "6.3.7", + "vscode-html-languageservice": "5.5.1" }, - "engines": { - "node": ">=8" + "bin": { + "lit-analyzer": "cli.mjs" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=18" } }, - "node_modules/@inquirer/checkbox/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "node_modules/@jackolope/lit-analyzer/node_modules/chalk": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", "engines": { - "node": ">=10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@inquirer/confirm": { - "version": "5.1.16", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.16.tgz", - "integrity": "sha512-j1a5VstaK5KQy8Mu8cHmuQvN1Zc62TbLhjJxwHvKPPKEoowSF6h/0UdOpA9DNdWZ+9Inq73+puRq1df6OJ8Sag==", + "node_modules/@jackolope/ts-lit-plugin": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@jackolope/ts-lit-plugin/-/ts-lit-plugin-3.1.6.tgz", + "integrity": "sha512-NuHmReHF+3fXGUtmgox7jHwqF0Fng+utyxHTgSbY25fVKeygBiCRXSeLwP9L4p3M672qdgMal3LJEu2ErbnhVA==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/core": "^10.2.0", - "@inquirer/type": "^3.0.8" + "@jackolope/lit-analyzer": "^3.2.1", + "@jackolope/web-component-analyzer": "^4.0.4" }, "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } } }, - "node_modules/@inquirer/core": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.2.0.tgz", - "integrity": "sha512-NyDSjPqhSvpZEMZrLCYUquWNl+XC/moEcVFqS55IEYIYsY0a1cUCevSqk7ctOlnm/RaSBU5psFryNlxcmGrjaA==", + "node_modules/@jackolope/web-component-analyzer": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@jackolope/web-component-analyzer/-/web-component-analyzer-4.0.4.tgz", + "integrity": "sha512-2ub611LA9nTfGYWJZVg9/oqUs/gmujuqLURCUn1FGo73MDgVuMOMqlym9dwFFo3BZva+4NZJniz2+WjzC3CNOg==", "dev": true, "license": "MIT", "dependencies": { - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "mute-stream": "^2.0.0", - "signal-exit": "^4.1.0", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" + "ts-simple-type": "2.0.0-next.0", + "typescript": "^5.8.3" }, "engines": { "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } } }, - "node_modules/@inquirer/core/node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "license": "MIT", "dependencies": { - "type-fest": "^0.21.3" + "@sinclair/typebox": "^0.27.8" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@inquirer/core/node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, "engines": { - "node": ">= 12" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@inquirer/core/node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/@inquirer/core/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@inquirer/core/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { - "node": ">=8" + "node": ">=6.0.0" } }, - "node_modules/@inquirer/editor": { - "version": "4.2.18", - "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.18.tgz", - "integrity": "sha512-yeQN3AXjCm7+Hmq5L6Dm2wEDeBRdAZuyZ4I7tWSSanbxDzqM0KqzoDbKM7p4ebllAYdoQuPJS6N71/3L281i6w==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.2.0", - "@inquirer/external-editor": "^1.0.1", - "@inquirer/type": "^3.0.8" - }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=6.0.0" } }, - "node_modules/@inquirer/expand": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.18.tgz", - "integrity": "sha512-xUjteYtavH7HwDMzq4Cn2X4Qsh5NozoDHCJTdoXg9HfZ4w3R6mxV1B9tL7DGJX2eq/zqtsFjhm0/RJIMGlh3ag==", + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.2.0", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" - }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=6.0.0" } }, - "node_modules/@inquirer/external-editor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.1.tgz", - "integrity": "sha512-Oau4yL24d2B5IL4ma4UpbQigkVhzPDXLoqy1ggK4gnHg/stmkffJE4oOXHXF3uz0UEpywG68KcyXsyYpA1Re/Q==", + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "license": "MIT", "dependencies": { - "chardet": "^2.1.0", - "iconv-lite": "^0.6.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, - "node_modules/@inquirer/external-editor/node_modules/chardet": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.1.0.tgz", - "integrity": "sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true, "license": "MIT" }, - "node_modules/@inquirer/figures": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.13.tgz", - "integrity": "sha512-lGPVU3yO9ZNqA7vTYz26jny41lE7yoQansmqdMLBEfqaGsmdg7V3W9mK9Pvb5IL4EVZ9GnSDGMO/cJXud5dMaw==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@inquirer/input": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.2.2.tgz", - "integrity": "sha512-hqOvBZj/MhQCpHUuD3MVq18SSoDNHy7wEnQ8mtvs71K8OPZVXJinOzcvQna33dNYLYE4LkA9BlhAhK6MJcsVbw==", + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "license": "MIT" + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.2.0", - "@inquirer/type": "^3.0.8" - }, + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": ">=10.0" }, - "peerDependencies": { - "@types/node": ">=18" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@inquirer/number": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.18.tgz", - "integrity": "sha512-7exgBm52WXZRczsydCVftozFTrrwbG5ySE0GqUd2zLNSBXyIucs2Wnm7ZKLe/aUu6NUg9dg7Q80QIHCdZJiY4A==", + "node_modules/@jsonjoy.com/buffers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.0.0.tgz", + "integrity": "sha512-NDigYR3PHqCnQLXYyoLbnEdzMMvzeiCWo1KOut7Q0CoIqg9tUAPKJ1iq/2nFhc5kZtexzutNY0LFjdwWL3Dw3Q==", "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.2.0", - "@inquirer/type": "^3.0.8" - }, + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": ">=10.0" }, - "peerDependencies": { - "@types/node": ">=18" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@inquirer/password": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.18.tgz", - "integrity": "sha512-zXvzAGxPQTNk/SbT3carAD4Iqi6A2JS2qtcqQjsL22uvD+JfQzUrDEtPjLL7PLn8zlSNyPdY02IiQjzoL9TStA==", + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", + "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.2.0", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2" - }, + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": ">=10.0" }, - "peerDependencies": { - "@types/node": ">=18" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@inquirer/password/node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "node_modules/@jsonjoy.com/json-pack": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.14.0.tgz", + "integrity": "sha512-LpWbYgVnKzphN5S6uss4M25jJ/9+m6q6UJoeN6zTkK4xAGhKsiBRPVeF7OYMWonn5repMQbE5vieRXcMUrKDKw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "type-fest": "^0.21.3" + "@jsonjoy.com/base64": "^1.1.2", + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/json-pointer": "^1.0.1", + "@jsonjoy.com/util": "^1.9.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0" }, "engines": { - "node": ">=8" + "node": ">=10.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@inquirer/password/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" + "type": "github", + "url": "https://github.com/sponsors/streamich" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@inquirer/prompts": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.8.4.tgz", - "integrity": "sha512-MuxVZ1en1g5oGamXV3DWP89GEkdD54alcfhHd7InUW5BifAdKQEK9SLFa/5hlWbvuhMPlobF0WAx7Okq988Jxg==", + "node_modules/@jsonjoy.com/json-pointer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", + "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@inquirer/checkbox": "^4.2.2", - "@inquirer/confirm": "^5.1.16", - "@inquirer/editor": "^4.2.18", - "@inquirer/expand": "^4.0.18", - "@inquirer/input": "^4.2.2", - "@inquirer/number": "^3.0.18", - "@inquirer/password": "^4.0.18", - "@inquirer/rawlist": "^4.1.6", - "@inquirer/search": "^3.1.1", - "@inquirer/select": "^4.3.2" + "@jsonjoy.com/codegen": "^1.0.0", + "@jsonjoy.com/util": "^1.9.0" }, "engines": { - "node": ">=18" + "node": ">=10.0" }, - "peerDependencies": { - "@types/node": ">=18" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@inquirer/rawlist": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.6.tgz", - "integrity": "sha512-KOZqa3QNr3f0pMnufzL7K+nweFFCCBs6LCXZzXDrVGTyssjLeudn5ySktZYv1XiSqobyHRYYK0c6QsOxJEhXKA==", + "node_modules/@jsonjoy.com/util": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", + "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@inquirer/core": "^10.2.0", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" + "@jsonjoy.com/buffers": "^1.0.0", + "@jsonjoy.com/codegen": "^1.0.0" }, "engines": { - "node": ">=18" + "node": ">=10.0" }, - "peerDependencies": { - "@types/node": ">=18" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@inquirer/search": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.1.1.tgz", - "integrity": "sha512-TkMUY+A2p2EYVY3GCTItYGvqT6LiLzHBnqsU1rJbrpXUijFfM6zvUx0R4civofVwFCmJZcKqOVwwWAjplKkhxA==", + "node_modules/@keyv/serialize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.0.tgz", + "integrity": "sha512-RlDgexML7Z63Q8BSaqhXdCYNBy/JQnqYIwxofUrNLGCblOMHp+xux2Q8nLMLlPpgHQPoU0Do8Z6btCpRBEqZ8g==", "dev": true, - "license": "MIT", - "dependencies": { - "@inquirer/core": "^10.2.0", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } + "license": "MIT" }, - "node_modules/@inquirer/select": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.3.2.tgz", - "integrity": "sha512-nwous24r31M+WyDEHV+qckXkepvihxhnyIaod2MG7eCE6G0Zm/HUF6jgN8GXgf4U7AU6SLseKdanY195cwvU6w==", + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", "dev": true, + "license": "MIT" + }, + "node_modules/@lezer/common": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz", + "integrity": "sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==", + "license": "MIT" + }, + "node_modules/@lezer/css": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.1.11.tgz", + "integrity": "sha512-FuAnusbLBl1SEAtfN8NdShxYJiESKw9LAFysfea1T96jD3ydBn12oYjaSG1a04BQRIUd93/0D8e5CV1cUMkmQg==", "license": "MIT", "dependencies": { - "@inquirer/core": "^10.2.0", - "@inquirer/figures": "^1.0.13", - "@inquirer/type": "^3.0.8", - "ansi-escapes": "^4.3.2", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" } }, - "node_modules/@inquirer/select/node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, + "node_modules/@lezer/highlight": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.1.tgz", + "integrity": "sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==", "license": "MIT", "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@lezer/common": "^1.0.0" } }, - "node_modules/@inquirer/select/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/@lezer/html": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.10.tgz", + "integrity": "sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" } }, - "node_modules/@inquirer/type": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.8.tgz", - "integrity": "sha512-lg9Whz8onIHRthWaN1Q9EGLa/0LFJjyM8mEUbL1eTi6yMGvBf8gvyDLtxSXztQsxMvhxxNpJYrwa1YHdq+w4Jw==", - "dev": true, + "node_modules/@lezer/javascript": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.5.1.tgz", + "integrity": "sha512-ATOImjeVJuvgm3JQ/bpo2Tmv55HSScE2MTPnKRMRIPx2cLhHGyX2VnqpHhtIV1tVzIjZDbcWQm+NCTF40ggZVw==", "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.1.3", + "@lezer/lr": "^1.3.0" } }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "license": "ISC", + "node_modules/@lezer/lr": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz", + "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==", + "license": "MIT", "dependencies": { - "minipass": "^7.0.4" + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lit-labs/ssr": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr/-/ssr-3.3.1.tgz", + "integrity": "sha512-JlF1PempxvzrGEpRFrF+Ki0MHzR3HA51SK8Zv0cFpW9p0bPW4k0FeCwrElCu371UEpXF7RcaE2wgYaE1az0XKg==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit-labs/ssr-client": "^1.1.7", + "@lit-labs/ssr-dom-shim": "^1.3.0", + "@lit/reactive-element": "^2.0.4", + "@parse5/tools": "^0.3.0", + "@types/node": "^16.0.0", + "enhanced-resolve": "^5.10.0", + "lit": "^3.1.2", + "lit-element": "^4.0.4", + "lit-html": "^3.1.2", + "node-fetch": "^3.2.8", + "parse5": "^7.1.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=13.9.0" } }, - "node_modules/@jackolope/lit-analyzer": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@jackolope/lit-analyzer/-/lit-analyzer-3.2.1.tgz", - "integrity": "sha512-Iacmgm3BkUttulImotXkLaIDK3CJuU+M8Y0oBFGxe45ZkOXu0J7rZR/sb9HWhLKAgmsHa4e2ajC5f8LUEQT/3g==", + "node_modules/@lit-labs/ssr-client": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-client/-/ssr-client-1.1.7.tgz", + "integrity": "sha512-VvqhY/iif3FHrlhkzEPsuX/7h/NqnfxLwVf0p8ghNIlKegRyRqgeaJevZ57s/u/LiFyKgqksRP5n+LmNvpxN+A==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit/reactive-element": "^2.0.4", + "lit": "^3.1.2", + "lit-html": "^3.1.2" + } + }, + "node_modules/@lit-labs/ssr-dom-shim": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.3.0.tgz", + "integrity": "sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@lit-labs/ssr/node_modules/@types/node": { + "version": "16.18.126", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz", + "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==", + "license": "MIT" + }, + "node_modules/@lit/reactive-element": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.1.0.tgz", + "integrity": "sha512-L2qyoZSQClcBmq0qajBVbhYEcG6iK0XfLn66ifLe/RfC0/ihpc+pl0Wdn8bJ8o+hj38cG0fGXRgSS20MuXn7qA==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.2.0" + } + }, + "node_modules/@lit/task": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@lit/task/-/task-1.0.3.tgz", + "integrity": "sha512-1gJGJl8WON+2j0y9xfcD+XsS1rvcy3XDgsIhcdUW++yTR8ESjZW6o7dn8M8a4SZM8NnJe6ynS2cKWwsbfLOurg==", + "license": "BSD-3-Clause", + "dependencies": { + "@lit/reactive-element": "^1.0.0 || ^2.0.0" + } + }, + "node_modules/@marijn/find-cluster-break": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", + "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", + "license": "MIT" + }, + "node_modules/@mdn/browser-compat-data": { + "version": "7.1.9", + "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-7.1.9.tgz", + "integrity": "sha512-9LSpbU93tzkXgT0agCJtTEie/6kS4DNVXwr6phvwjw2oyetueOf5R84SHjgYgvx0LYnnqLjXvBRO8U4z5M3GFw==", "dev": true, - "license": "MIT", + "license": "CC0-1.0" + }, + "node_modules/@mdn/rari": { + "version": "0.1.51", + "resolved": "https://registry.npmjs.org/@mdn/rari/-/rari-0.1.51.tgz", + "integrity": "sha512-QB/1fWrARDt2UJe8OOBuBCxuEhr3JxKcsPbBiffjEsB821lj5RNyScH6AEIy8zHu9jcHyLdGx689cT/o91iIdw==", + "hasInstallScript": true, + "license": "MPL-2.0", "dependencies": { - "@jackolope/web-component-analyzer": "^4.0.4", - "@vscode/web-custom-data": "^0.6.0", - "chalk": "^5.4.0", - "didyoumean2": "7.0.4", - "fast-glob": "^3.2.11", - "parse5": "7.2.1", - "ts-simple-type": "~2.0.0-next.0", - "vscode-css-languageservice": "6.3.7", - "vscode-html-languageservice": "5.5.1" + "extract-zip": "^2.0.1", + "https-proxy-agent": "^7.0.2", + "json-schema-to-typescript": "^15.0.0", + "proxy-from-env": "^1.1.0", + "tar": "^7.4.3" }, "bin": { - "lit-analyzer": "cli.mjs" + "rari": "lib/cli.js" }, "engines": { - "node": ">=18" + "node": ">=20" } }, - "node_modules/@jackolope/lit-analyzer/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "node_modules/@mdn/watify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@mdn/watify/-/watify-1.1.3.tgz", + "integrity": "sha512-yV69YDzMLY3iqF66yhs8QYTAjhWqOrehOfBSp5M+bDF0RM6Qjoodceomcdypr/wClvtPsXEald0d57t+CsE9XA==", + "license": "MPL-2.0" + }, + "node_modules/@module-federation/error-codes": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.18.0.tgz", + "integrity": "sha512-Woonm8ehyVIUPXChmbu80Zj6uJkC0dD9SJUZ/wOPtO8iiz/m+dkrOugAuKgoiR6qH4F+yorWila954tBz4uKsQ==", "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } + "license": "MIT" }, - "node_modules/@jackolope/ts-lit-plugin": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@jackolope/ts-lit-plugin/-/ts-lit-plugin-3.1.6.tgz", - "integrity": "sha512-NuHmReHF+3fXGUtmgox7jHwqF0Fng+utyxHTgSbY25fVKeygBiCRXSeLwP9L4p3M672qdgMal3LJEu2ErbnhVA==", + "node_modules/@module-federation/runtime": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.18.0.tgz", + "integrity": "sha512-+C4YtoSztM7nHwNyZl6dQKGUVJdsPrUdaf3HIKReg/GQbrt9uvOlUWo2NXMZ8vDAnf/QRrpSYAwXHmWDn9Obaw==", "dev": true, "license": "MIT", "dependencies": { - "@jackolope/lit-analyzer": "^3.2.1", - "@jackolope/web-component-analyzer": "^4.0.4" - }, - "engines": { - "node": ">=18" + "@module-federation/error-codes": "0.18.0", + "@module-federation/runtime-core": "0.18.0", + "@module-federation/sdk": "0.18.0" } }, - "node_modules/@jackolope/web-component-analyzer": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@jackolope/web-component-analyzer/-/web-component-analyzer-4.0.4.tgz", - "integrity": "sha512-2ub611LA9nTfGYWJZVg9/oqUs/gmujuqLURCUn1FGo73MDgVuMOMqlym9dwFFo3BZva+4NZJniz2+WjzC3CNOg==", + "node_modules/@module-federation/runtime-core": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.18.0.tgz", + "integrity": "sha512-ZyYhrDyVAhUzriOsVfgL6vwd+5ebYm595Y13KeMf6TKDRoUHBMTLGQ8WM4TDj8JNsy7LigncK8C03fn97of0QQ==", "dev": true, "license": "MIT", "dependencies": { - "ts-simple-type": "2.0.0-next.0", - "typescript": "^5.8.3" - }, - "engines": { - "node": ">=18" + "@module-federation/error-codes": "0.18.0", + "@module-federation/sdk": "0.18.0" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "node_modules/@module-federation/runtime-tools": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.18.0.tgz", + "integrity": "sha512-fSga9o4t1UfXNV/Kh6qFvRyZpPp3EHSPRISNeyT8ZoTpzDNiYzhtw0BPUSSD8m6C6XQh2s/11rI4g80UY+d+hA==", "dev": true, "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "@module-federation/runtime": "0.18.0", + "@module-federation/webpack-bundler-runtime": "0.18.0" } }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "node_modules/@module-federation/sdk": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.18.0.tgz", + "integrity": "sha512-Lo/Feq73tO2unjmpRfyyoUkTVoejhItXOk/h5C+4cistnHbTV8XHrW/13fD5e1Iu60heVdAhhelJd6F898Ve9A==", "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } + "license": "MIT" }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "node_modules/@module-federation/webpack-bundler-runtime": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.18.0.tgz", + "integrity": "sha512-TEvErbF+YQ+6IFimhUYKK3a5wapD90d90sLsNpcu2kB3QGT7t4nIluE25duXuZDVUKLz86tEPrza/oaaCWTpvQ==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" + "@module-federation/runtime": "0.18.0", + "@module-federation/sdk": "0.18.0" + } + }, + "node_modules/@mozilla/glean": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@mozilla/glean/-/glean-5.0.6.tgz", + "integrity": "sha512-Oz4M+pxHmTcy82iCCmcARjEwwDCsMZCwidRhdZU0pYueEFJgDc5S+u48Y68SxEsExFAthuhzE2H4BcvwsRhYJg==", + "license": "MPL-2.0", + "dependencies": { + "fflate": "^0.8.0", + "tslib": "^2.3.1", + "uuid": "^9.0.0" + }, + "bin": { + "glean": "dist/cli/cli.js" }, "engines": { - "node": ">=6.0.0" + "node": ">=12.20.0", + "npm": ">=7.0.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, + "node_modules/@mozilla/glean/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "license": "MIT", - "engines": { - "node": ">=6.0.0" + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.5.tgz", + "integrity": "sha512-TBr9Cf9onSAS2LQ2+QHx6XcC6h9+RIzJgbqG3++9TUZSH204AwEy5jg3BTQ0VATsyoGj4ee49tN/y6rvaOOtcg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0.0" + "optional": true, + "dependencies": { + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@tybys/wasm-util": "^0.10.1" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "engines": { + "node": ">= 8" } }, - "node_modules/@js-temporal/polyfill": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@js-temporal/polyfill/-/polyfill-0.4.4.tgz", - "integrity": "sha512-2X6bvghJ/JAoZO52lbgyAPFj8uCflhTo2g7nkFzEQdXd/D8rEeD4HtmTEpmtGCva260fcd66YNXBOYdnmHqSOg==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "jsbi": "^4.3.0", - "tslib": "^2.4.1" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": ">=12" + "node": ">= 8" } }, - "node_modules/@jsdevtools/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", - "license": "MIT" - }, - "node_modules/@jsonjoy.com/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", "dev": true, - "license": "Apache-2.0", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, "engines": { - "node": ">=10.0" + "node": ">= 10.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "type": "opencollective", + "url": "https://opencollective.com/parcel" }, - "peerDependencies": { - "tslib": "2" + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" } }, - "node_modules/@jsonjoy.com/buffers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.0.0.tgz", - "integrity": "sha512-NDigYR3PHqCnQLXYyoLbnEdzMMvzeiCWo1KOut7Q0CoIqg9tUAPKJ1iq/2nFhc5kZtexzutNY0LFjdwWL3Dw3Q==", + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=10.0" + "node": ">= 10.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@jsonjoy.com/codegen": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", - "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=10.0" + "node": ">= 10.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@jsonjoy.com/json-pack": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.14.0.tgz", - "integrity": "sha512-LpWbYgVnKzphN5S6uss4M25jJ/9+m6q6UJoeN6zTkK4xAGhKsiBRPVeF7OYMWonn5repMQbE5vieRXcMUrKDKw==", + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/base64": "^1.1.2", - "@jsonjoy.com/buffers": "^1.0.0", - "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/json-pointer": "^1.0.1", - "@jsonjoy.com/util": "^1.9.0", - "hyperdyperid": "^1.2.0", - "thingies": "^2.5.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=10.0" + "node": ">= 10.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@jsonjoy.com/json-pointer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", - "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/util": "^1.9.0" - }, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=10.0" + "node": ">= 10.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/util": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", - "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/buffers": "^1.0.0", - "@jsonjoy.com/codegen": "^1.0.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@keyv/serialize": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.0.tgz", - "integrity": "sha512-RlDgexML7Z63Q8BSaqhXdCYNBy/JQnqYIwxofUrNLGCblOMHp+xux2Q8nLMLlPpgHQPoU0Do8Z6btCpRBEqZ8g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@lezer/common": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz", - "integrity": "sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==", - "license": "MIT" - }, - "node_modules/@lezer/css": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.1.11.tgz", - "integrity": "sha512-FuAnusbLBl1SEAtfN8NdShxYJiESKw9LAFysfea1T96jD3ydBn12oYjaSG1a04BQRIUd93/0D8e5CV1cUMkmQg==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@lezer/highlight": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.1.tgz", - "integrity": "sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@lezer/html": { - "version": "1.3.10", - "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.10.tgz", - "integrity": "sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@lezer/javascript": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.5.1.tgz", - "integrity": "sha512-ATOImjeVJuvgm3JQ/bpo2Tmv55HSScE2MTPnKRMRIPx2cLhHGyX2VnqpHhtIV1tVzIjZDbcWQm+NCTF40ggZVw==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.1.3", - "@lezer/lr": "^1.3.0" - } - }, - "node_modules/@lezer/lr": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz", - "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==", - "license": "MIT", - "dependencies": { - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@lit-labs/ssr": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@lit-labs/ssr/-/ssr-3.3.1.tgz", - "integrity": "sha512-JlF1PempxvzrGEpRFrF+Ki0MHzR3HA51SK8Zv0cFpW9p0bPW4k0FeCwrElCu371UEpXF7RcaE2wgYaE1az0XKg==", - "license": "BSD-3-Clause", - "dependencies": { - "@lit-labs/ssr-client": "^1.1.7", - "@lit-labs/ssr-dom-shim": "^1.3.0", - "@lit/reactive-element": "^2.0.4", - "@parse5/tools": "^0.3.0", - "@types/node": "^16.0.0", - "enhanced-resolve": "^5.10.0", - "lit": "^3.1.2", - "lit-element": "^4.0.4", - "lit-html": "^3.1.2", - "node-fetch": "^3.2.8", - "parse5": "^7.1.1" - }, - "engines": { - "node": ">=13.9.0" - } - }, - "node_modules/@lit-labs/ssr-client": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@lit-labs/ssr-client/-/ssr-client-1.1.7.tgz", - "integrity": "sha512-VvqhY/iif3FHrlhkzEPsuX/7h/NqnfxLwVf0p8ghNIlKegRyRqgeaJevZ57s/u/LiFyKgqksRP5n+LmNvpxN+A==", - "license": "BSD-3-Clause", - "dependencies": { - "@lit/reactive-element": "^2.0.4", - "lit": "^3.1.2", - "lit-html": "^3.1.2" - } - }, - "node_modules/@lit-labs/ssr-dom-shim": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.3.0.tgz", - "integrity": "sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@lit-labs/ssr/node_modules/@types/node": { - "version": "16.18.126", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz", - "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==", - "license": "MIT" - }, - "node_modules/@lit/react": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@lit/react/-/react-1.0.8.tgz", - "integrity": "sha512-p2+YcF+JE67SRX3mMlJ1TKCSTsgyOVdAwd/nxp3NuV1+Cb6MWALbN6nT7Ld4tpmYofcE5kcaSY1YBB9erY+6fw==", - "dev": true, - "license": "BSD-3-Clause", - "peerDependencies": { - "@types/react": "17 || 18 || 19" - } - }, - "node_modules/@lit/reactive-element": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.1.0.tgz", - "integrity": "sha512-L2qyoZSQClcBmq0qajBVbhYEcG6iK0XfLn66ifLe/RfC0/ihpc+pl0Wdn8bJ8o+hj38cG0fGXRgSS20MuXn7qA==", - "license": "BSD-3-Clause", - "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.2.0" - } - }, - "node_modules/@lit/task": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@lit/task/-/task-1.0.3.tgz", - "integrity": "sha512-1gJGJl8WON+2j0y9xfcD+XsS1rvcy3XDgsIhcdUW++yTR8ESjZW6o7dn8M8a4SZM8NnJe6ynS2cKWwsbfLOurg==", - "license": "BSD-3-Clause", - "dependencies": { - "@lit/reactive-element": "^1.0.0 || ^2.0.0" - } - }, - "node_modules/@marijn/find-cluster-break": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", - "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", - "license": "MIT" - }, - "node_modules/@mdn/browser-compat-data": { - "version": "7.1.9", - "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-7.1.9.tgz", - "integrity": "sha512-9LSpbU93tzkXgT0agCJtTEie/6kS4DNVXwr6phvwjw2oyetueOf5R84SHjgYgvx0LYnnqLjXvBRO8U4z5M3GFw==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/@mdn/minimalist": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@mdn/minimalist/-/minimalist-2.0.4.tgz", - "integrity": "sha512-jocePw/fsGcBxO67D+iWQLZ0TQjwNVonaME2BFN98QIm/e1kTY1/k2s4fOqH5MMa3QYURxa098bI4sChn6s/7Q==", - "dev": true, - "license": "MPL-2.0" - }, - "node_modules/@mdn/rari": { - "version": "0.1.51", - "resolved": "https://registry.npmjs.org/@mdn/rari/-/rari-0.1.51.tgz", - "integrity": "sha512-QB/1fWrARDt2UJe8OOBuBCxuEhr3JxKcsPbBiffjEsB821lj5RNyScH6AEIy8zHu9jcHyLdGx689cT/o91iIdw==", - "hasInstallScript": true, - "license": "MPL-2.0", - "dependencies": { - "extract-zip": "^2.0.1", - "https-proxy-agent": "^7.0.2", - "json-schema-to-typescript": "^15.0.0", - "proxy-from-env": "^1.1.0", - "tar": "^7.4.3" - }, - "bin": { - "rari": "lib/cli.js" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/@mdn/watify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@mdn/watify/-/watify-1.1.3.tgz", - "integrity": "sha512-yV69YDzMLY3iqF66yhs8QYTAjhWqOrehOfBSp5M+bDF0RM6Qjoodceomcdypr/wClvtPsXEald0d57t+CsE9XA==", - "license": "MPL-2.0" - }, - "node_modules/@mdn/yari": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@mdn/yari/-/yari-5.1.2.tgz", - "integrity": "sha512-ifiC751+QWb3ND37rGf0F4irmPWJicMCM7OCwBpn5XeDZ4bf3nOczgY4v9vNjvso0HABsurLLes+wU+S5UtWbA==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "@caporal/core": "^2.0.7", - "@codemirror/lang-css": "^6.3.1", - "@codemirror/lang-html": "^6.4.9", - "@codemirror/lang-javascript": "^6.2.4", - "@codemirror/lang-wast": "^6.0.2", - "@codemirror/state": "^6.5.2", - "@codemirror/theme-one-dark": "^6.1.3", - "@fast-csv/parse": "^5.0.5", - "@inquirer/prompts": "^7.8.4", - "@lit/react": "^1.0.8", - "@lit/task": "^1.0.3", - "@mdn/bcd-utils-api": "^0.0.8", - "@mdn/browser-compat-data": "^6.0.28", - "@mdn/minimalist": "^2.0.4", - "@mdn/rari": "^0.1.49", - "@mdn/watify": "^1.1.3", - "@mozilla/glean": "5.0.5", - "@sentry/node": "^8.55.0", - "@stripe/stripe-js": "^7.9.0", - "@use-it/interval": "^1.0.0", - "@webref/css": "^6.17.5", - "accept-language-parser": "^1.5.0", - "async": "^3.2.6", - "chalk": "^5.6.0", - "cheerio": "1.0.0-rc.12", - "cli-progress": "^3.12.0", - "codemirror": "^6.0.2", - "compression": "^1.8.1", - "compute-baseline": "^0.3.1", - "concurrently": "^9.2.1", - "construct-style-sheets-polyfill": "^3.1.0", - "cookie": "^0.7.2", - "cookie-parser": "^1.4.7", - "cross-spawn": "^7.0.6", - "css-tree": "^2.3.1", - "dayjs": "^1.11.18", - "dexie": "^4.2.0", - "dotenv": "^17.2.2", - "ejs": "^3.1.10", - "express": "^4.21.2", - "fdir": "^6.5.0", - "feed": "^4.2.2", - "file-type": "^21.0.0", - "front-matter": "^4.0.2", - "fs-extra": "^11.3.0", - "he": "^1.2.0", - "http-proxy-middleware": "^2.0.9", - "image-size": "^1.2.1", - "image-type": "^4.1.0", - "imagemin": "^9.0.1", - "imagemin-gifsicle": "^7.0.0", - "imagemin-mozjpeg": "^10.0.0", - "imagemin-pngquant": "^10.0.0", - "imagemin-svgo": "^11.0.1", - "is-svg": "^6.1.0", - "js-yaml": "^4.1.0", - "lit": "^3.3.1", - "loglevel": "^1.9.2", - "lru-cache": "^10.4.3", - "md5-file": "^5.0.0", - "mdast-util-from-markdown": "^2.0.2", - "mdast-util-phrasing": "^4.1.0", - "mdn-data": "^2.24.0", - "open": "^10.2.0", - "open-editor": "^5.1.0", - "openai": "^5.18.1", - "pg": "^8.16.3", - "pgvector": "^0.2.1", - "prism-svelte": "^0.5.0", - "prismjs": "^1.30.0", - "react-markdown": "^10.1.0", - "react-modal": "^3.16.3", - "react-router-dom": "^7.8.2", - "read-chunk": "^5.0.0", - "rehype-format": "^5.0.1", - "rehype-parse": "^9.0.1", - "rehype-raw": "^7.0.0", - "rehype-remark": "^10.0.1", - "rehype-sanitize": "^6.0.0", - "rehype-stringify": "^10.0.1", - "remark-gfm": "^4.0.1", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.1.2", - "remark-stringify": "^11.0.0", - "sanitize-filename": "^1.6.3", - "send": "^1.2.0", - "source-map-support": "^0.5.21", - "sse.js": "^2.7.0", - "swr": "^2.3.6", - "tempy": "^3.1.0", - "unified": "^11.0.5", - "unist-builder": "^4.0.0", - "unist-util-visit": "^5.0.0", - "web-features": "^2.40.2", - "web-specs": "^3.54.0" - }, - "bin": { - "rari-build": "bins/build.mjs", - "rari-server": "bins/server.mjs", - "rari-tool": "bins/tool.mjs", - "yari-build": "build/cli.js", - "yari-build-blog": "build/build-blog.js", - "yari-filecheck": "filecheck/cli.js", - "yari-render-html": "build/ssr-cli.js", - "yari-server": "server/index.js", - "yari-tool": "tool/cli.js" - }, - "engines": { - "node": ">=22" - } - }, - "node_modules/@mdn/yari/node_modules/@mdn/bcd-utils-api": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/@mdn/bcd-utils-api/-/bcd-utils-api-0.0.8.tgz", - "integrity": "sha512-qYjXx0rw1SfmNzVYP5yU5HDdr+urRdyfPzyL7+75sYXg27af0zG5t7suu7ewsHVq9XEhpFOMM5+atbvW+uYXig==", - "dev": true, - "license": "MPL-2.0", - "peerDependencies": { - "@mdn/browser-compat-data": "^6.0.0" - } - }, - "node_modules/@mdn/yari/node_modules/@mdn/browser-compat-data": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-6.1.5.tgz", - "integrity": "sha512-PzdZZzRhcXvKB0begee28n5lvwAcinGKYuLZOVxHAZm+n7y01ddEGfdS1ZXRuVcV+ndG6mSEAE8vgudom5UjYg==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/@mdn/yari/node_modules/@mozilla/glean": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@mozilla/glean/-/glean-5.0.5.tgz", - "integrity": "sha512-OvimNMd4X/HzP9i5UOpYKpi+nqm8GugwIVV/XA5dgDfIkH1MniXBpUbBtn7xZdoHPg3AXpdmESkSN6f0THQPOQ==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "fflate": "^0.8.0", - "tslib": "^2.3.1", - "uuid": "^9.0.0" - }, - "bin": { - "glean": "dist/cli/cli.js" - }, - "engines": { - "node": ">=12.20.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@mdn/yari/node_modules/@types/express": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", - "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@mdn/yari/node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@mdn/yari/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@mdn/yari/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/@mdn/yari/node_modules/chalk": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.0.tgz", - "integrity": "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@mdn/yari/node_modules/compute-baseline": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/compute-baseline/-/compute-baseline-0.3.1.tgz", - "integrity": "sha512-fehgbBh5UG4H5AemyVXWaviTwUbcPduhaD9iHWfkIy5fv2xFou/Zfs5z0VISXJyUEDzThe84MMofNOZ/qd0K6g==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@js-temporal/polyfill": "^0.4.4", - "compare-versions": "^6.1.1" - }, - "peerDependencies": { - "@mdn/browser-compat-data": "^6.0.1" - } - }, - "node_modules/@mdn/yari/node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@mdn/yari/node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@mdn/yari/node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/@mdn/yari/node_modules/css-tree/node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/@mdn/yari/node_modules/dayjs": { - "version": "1.11.18", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.18.tgz", - "integrity": "sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@mdn/yari/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@mdn/yari/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@mdn/yari/node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@mdn/yari/node_modules/express/node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@mdn/yari/node_modules/express/node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@mdn/yari/node_modules/express/node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@mdn/yari/node_modules/file-type": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-21.0.0.tgz", - "integrity": "sha512-ek5xNX2YBYlXhiUXui3D/BXa3LdqPmoLJ7rqEx2bKJ7EAUEfmXgW0Das7Dc6Nr9MvqaOnIqiPV0mZk/r/UpNAg==", - "dev": true, - "dependencies": { - "@tokenizer/inflate": "^0.2.7", - "strtok3": "^10.2.2", - "token-types": "^6.0.0", - "uint8array-extras": "^1.4.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sindresorhus/file-type?sponsor=1" - } - }, - "node_modules/@mdn/yari/node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@mdn/yari/node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@mdn/yari/node_modules/http-proxy-middleware": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", - "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/@mdn/yari/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@mdn/yari/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/@mdn/yari/node_modules/mdn-data": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.24.0.tgz", - "integrity": "sha512-i97fklrJl03tL1tdRVw0ZfLLvuDsdb6wxL+TrJ+PKkCbLrp2PCu2+OYdCKychIUm19nSM/35S6qz7pJpnXttoA==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/@mdn/yari/node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@mdn/yari/node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@mdn/yari/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@mdn/yari/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@mdn/yari/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@mdn/yari/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@mdn/yari/node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@mdn/yari/node_modules/serve-static/node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@mdn/yari/node_modules/serve-static/node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@mdn/yari/node_modules/strtok3": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.1.tgz", - "integrity": "sha512-3JWEZM6mfix/GCJBBUrkA8p2Id2pBkyTkVCJKto55w080QBKZ+8R171fGrbiSp+yMO/u6F8/yUh7K4V9K+YCnw==", - "dev": true, - "dependencies": { - "@tokenizer/token": "^0.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/@mdn/yari/node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@mdn/yari/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@module-federation/error-codes": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@module-federation/error-codes/-/error-codes-0.18.0.tgz", - "integrity": "sha512-Woonm8ehyVIUPXChmbu80Zj6uJkC0dD9SJUZ/wOPtO8iiz/m+dkrOugAuKgoiR6qH4F+yorWila954tBz4uKsQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@module-federation/runtime": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime/-/runtime-0.18.0.tgz", - "integrity": "sha512-+C4YtoSztM7nHwNyZl6dQKGUVJdsPrUdaf3HIKReg/GQbrt9uvOlUWo2NXMZ8vDAnf/QRrpSYAwXHmWDn9Obaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@module-federation/error-codes": "0.18.0", - "@module-federation/runtime-core": "0.18.0", - "@module-federation/sdk": "0.18.0" - } - }, - "node_modules/@module-federation/runtime-core": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-core/-/runtime-core-0.18.0.tgz", - "integrity": "sha512-ZyYhrDyVAhUzriOsVfgL6vwd+5ebYm595Y13KeMf6TKDRoUHBMTLGQ8WM4TDj8JNsy7LigncK8C03fn97of0QQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@module-federation/error-codes": "0.18.0", - "@module-federation/sdk": "0.18.0" - } - }, - "node_modules/@module-federation/runtime-tools": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@module-federation/runtime-tools/-/runtime-tools-0.18.0.tgz", - "integrity": "sha512-fSga9o4t1UfXNV/Kh6qFvRyZpPp3EHSPRISNeyT8ZoTpzDNiYzhtw0BPUSSD8m6C6XQh2s/11rI4g80UY+d+hA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@module-federation/runtime": "0.18.0", - "@module-federation/webpack-bundler-runtime": "0.18.0" - } - }, - "node_modules/@module-federation/sdk": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@module-federation/sdk/-/sdk-0.18.0.tgz", - "integrity": "sha512-Lo/Feq73tO2unjmpRfyyoUkTVoejhItXOk/h5C+4cistnHbTV8XHrW/13fD5e1Iu60heVdAhhelJd6F898Ve9A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@module-federation/webpack-bundler-runtime": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.18.0.tgz", - "integrity": "sha512-TEvErbF+YQ+6IFimhUYKK3a5wapD90d90sLsNpcu2kB3QGT7t4nIluE25duXuZDVUKLz86tEPrza/oaaCWTpvQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@module-federation/runtime": "0.18.0", - "@module-federation/sdk": "0.18.0" - } - }, - "node_modules/@mozilla/glean": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@mozilla/glean/-/glean-5.0.6.tgz", - "integrity": "sha512-Oz4M+pxHmTcy82iCCmcARjEwwDCsMZCwidRhdZU0pYueEFJgDc5S+u48Y68SxEsExFAthuhzE2H4BcvwsRhYJg==", - "license": "MPL-2.0", - "dependencies": { - "fflate": "^0.8.0", - "tslib": "^2.3.1", - "uuid": "^9.0.0" - }, - "bin": { - "glean": "dist/cli/cli.js" - }, - "engines": { - "node": ">=12.20.0", - "npm": ">=7.0.0" - } - }, - "node_modules/@mozilla/glean/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.5.tgz", - "integrity": "sha512-TBr9Cf9onSAS2LQ2+QHx6XcC6h9+RIzJgbqG3++9TUZSH204AwEy5jg3BTQ0VATsyoGj4ee49tN/y6rvaOOtcg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.5.0", - "@emnapi/runtime": "^1.5.0", - "@tybys/wasm-util": "^0.10.1" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/api-logs": { - "version": "0.57.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz", - "integrity": "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.3.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/context-async-hooks": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.30.1.tgz", - "integrity": "sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/core": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", - "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.28.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", - "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation": { - "version": "0.57.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz", - "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.57.2", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-amqplib": { - "version": "0.46.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.46.1.tgz", - "integrity": "sha512-AyXVnlCf/xV3K/rNumzKxZqsULyITJH6OVLiW6730JPRqWA7Zc9bvYoVNpN6iOpTU8CasH34SU/ksVJmObFibQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.57.1", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-connect": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.43.0.tgz", - "integrity": "sha512-Q57JGpH6T4dkYHo9tKXONgLtxzsh1ZEW5M9A/OwKrZFyEpLqWgjhcZ3hIuVvDlhb426iDF1f9FPToV/mi5rpeA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.57.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@types/connect": "3.4.36" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-connect/node_modules/@types/connect": { - "version": "3.4.36", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", - "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@opentelemetry/instrumentation-dataloader": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.16.0.tgz", - "integrity": "sha512-88+qCHZC02up8PwKHk0UQKLLqGGURzS3hFQBZC7PnGwReuoKjHXS1o29H58S+QkXJpkTr2GACbx8j6mUoGjNPA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.57.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-express": { - "version": "0.47.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.47.0.tgz", - "integrity": "sha512-XFWVx6k0XlU8lu6cBlCa29ONtVt6ADEjmxtyAyeF2+rifk8uBJbk1La0yIVfI0DoKURGbaEDTNelaXG9l/lNNQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.57.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-fastify": { - "version": "0.44.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.44.1.tgz", - "integrity": "sha512-RoVeMGKcNttNfXMSl6W4fsYoCAYP1vi6ZAWIGhBY+o7R9Y0afA7f9JJL0j8LHbyb0P0QhSYk+6O56OwI2k4iRQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.57.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-fs": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.19.0.tgz", - "integrity": "sha512-JGwmHhBkRT2G/BYNV1aGI+bBjJu4fJUD/5/Jat0EWZa2ftrLV3YE8z84Fiij/wK32oMZ88eS8DI4ecLGZhpqsQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.57.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-generic-pool": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.43.0.tgz", - "integrity": "sha512-at8GceTtNxD1NfFKGAuwtqM41ot/TpcLh+YsGe4dhf7gvv1HW/ZWdq6nfRtS6UjIvZJOokViqLPJ3GVtZItAnQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.57.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-graphql": { - "version": "0.47.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.47.0.tgz", - "integrity": "sha512-Cc8SMf+nLqp0fi8oAnooNEfwZWFnzMiBHCGmDFYqmgjPylyLmi83b+NiTns/rKGwlErpW0AGPt0sMpkbNlzn8w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.57.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-hapi": { - "version": "0.45.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.45.1.tgz", - "integrity": "sha512-VH6mU3YqAKTePPfUPwfq4/xr049774qWtfTuJqVHoVspCLiT3bW+fCQ1toZxt6cxRPYASoYaBsMA3CWo8B8rcw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.57.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-http": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.57.1.tgz", - "integrity": "sha512-ThLmzAQDs7b/tdKI3BV2+yawuF09jF111OFsovqT1Qj3D8vjwKBwhi/rDE5xethwn4tSXtZcJ9hBsVAlWFQZ7g==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.30.1", - "@opentelemetry/instrumentation": "0.57.1", - "@opentelemetry/semantic-conventions": "1.28.0", - "forwarded-parse": "2.1.2", - "semver": "^7.5.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/api-logs": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.1.tgz", - "integrity": "sha512-I4PHczeujhQAQv6ZBzqHYEUiggZL4IdSMixtVD3EYqbdrjujE7kRfI5QohjlPoJm8BvenoW5YaTMWRrbpot6tg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.3.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/instrumentation": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.1.tgz", - "integrity": "sha512-SgHEKXoVxOjc20ZYusPG3Fh+RLIZTSa4x8QtD3NfgAUDyqdFFS9W1F2ZVbZkqDCdyMcQG02Ok4duUGLHJXHgbA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.57.1", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", - "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation-ioredis": { - "version": "0.47.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.47.0.tgz", - "integrity": "sha512-4HqP9IBC8e7pW9p90P3q4ox0XlbLGme65YTrA3UTLvqvo4Z6b0puqZQP203YFu8m9rE/luLfaG7/xrwwqMUpJw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.57.0", - "@opentelemetry/redis-common": "^0.36.2", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-kafkajs": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.7.0.tgz", - "integrity": "sha512-LB+3xiNzc034zHfCtgs4ITWhq6Xvdo8bsq7amR058jZlf2aXXDrN9SV4si4z2ya9QX4tz6r4eZJwDkXOp14/AQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.57.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-knex": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.44.0.tgz", - "integrity": "sha512-SlT0+bLA0Lg3VthGje+bSZatlGHw/vwgQywx0R/5u9QC59FddTQSPJeWNw29M6f8ScORMeUOOTwihlQAn4GkJQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.57.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-koa": { - "version": "0.47.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.47.0.tgz", - "integrity": "sha512-HFdvqf2+w8sWOuwtEXayGzdZ2vWpCKEQv5F7+2DSA74Te/Cv4rvb2E5So5/lh+ok4/RAIPuvCbCb/SHQFzMmbw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.57.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-lru-memoizer": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.44.0.tgz", - "integrity": "sha512-Tn7emHAlvYDFik3vGU0mdwvWJDwtITtkJ+5eT2cUquct6nIs+H8M47sqMJkCpyPe5QIBJoTOHxmc6mj9lz6zDw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.57.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-mongodb": { - "version": "0.51.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.51.0.tgz", - "integrity": "sha512-cMKASxCX4aFxesoj3WK8uoQ0YUrRvnfxaO72QWI2xLu5ZtgX/QvdGBlU3Ehdond5eb74c2s1cqRQUIptBnKz1g==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.57.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-mongoose": { - "version": "0.46.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.46.0.tgz", - "integrity": "sha512-mtVv6UeaaSaWTeZtLo4cx4P5/ING2obSqfWGItIFSunQBrYROfhuVe7wdIrFUs2RH1tn2YYpAJyMaRe/bnTTIQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.57.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-mysql": { - "version": "0.45.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.45.0.tgz", - "integrity": "sha512-tWWyymgwYcTwZ4t8/rLDfPYbOTF3oYB8SxnYMtIQ1zEf5uDm90Ku3i6U/vhaMyfHNlIHvDhvJh+qx5Nc4Z3Acg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.57.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@types/mysql": "2.15.26" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-mysql2": { - "version": "0.45.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.45.0.tgz", - "integrity": "sha512-qLslv/EPuLj0IXFvcE3b0EqhWI8LKmrgRPIa4gUd8DllbBpqJAvLNJSv3cC6vWwovpbSI3bagNO/3Q2SuXv2xA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.57.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@opentelemetry/sql-common": "^0.40.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-nestjs-core": { - "version": "0.44.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.44.0.tgz", - "integrity": "sha512-t16pQ7A4WYu1yyQJZhRKIfUNvl5PAaF2pEteLvgJb/BWdd1oNuU1rOYt4S825kMy+0q4ngiX281Ss9qiwHfxFQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.57.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-pg": { - "version": "0.50.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.50.0.tgz", - "integrity": "sha512-TtLxDdYZmBhFswm8UIsrDjh/HFBeDXd4BLmE8h2MxirNHewLJ0VS9UUddKKEverb5Sm2qFVjqRjcU+8Iw4FJ3w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^1.26.0", - "@opentelemetry/instrumentation": "^0.57.0", - "@opentelemetry/semantic-conventions": "1.27.0", - "@opentelemetry/sql-common": "^0.40.1", - "@types/pg": "8.6.1", - "@types/pg-pool": "2.0.6" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-pg/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", - "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation-redis-4": { - "version": "0.46.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.46.0.tgz", - "integrity": "sha512-aTUWbzbFMFeRODn3720TZO0tsh/49T8H3h8vVnVKJ+yE36AeW38Uj/8zykQ/9nO8Vrtjr5yKuX3uMiG/W8FKNw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.57.0", - "@opentelemetry/redis-common": "^0.36.2", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-tedious": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.18.0.tgz", - "integrity": "sha512-9zhjDpUDOtD+coeADnYEJQ0IeLVCj7w/hqzIutdp5NqS1VqTAanaEfsEcSypyvYv5DX3YOsTUoF+nr2wDXPETA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/instrumentation": "^0.57.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "@types/tedious": "^4.0.14" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-undici": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.10.0.tgz", - "integrity": "sha512-vm+V255NGw9gaSsPD6CP0oGo8L55BffBc8KnxqsMuc6XiAD1L8SFNzsW0RHhxJFqy9CJaJh+YiJ5EHXuZ5rZBw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.57.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.7.0" - } - }, - "node_modules/@opentelemetry/redis-common": { - "version": "0.36.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz", - "integrity": "sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/resources": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.1.tgz", - "integrity": "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.30.1", - "@opentelemetry/semantic-conventions": "1.28.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", - "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.30.1.tgz", - "integrity": "sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.30.1", - "@opentelemetry/resources": "1.30.1", - "@opentelemetry/semantic-conventions": "1.28.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", - "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.34.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.34.0.tgz", - "integrity": "sha512-aKcOkyrorBGlajjRdVoJWHTxfxO1vCNHLJVlSDaRHDIdjU+pX8IYQPvPDkYiujKLbRnWU+1TBwEt0QRgSm4SGA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/sql-common": { - "version": "0.40.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.1.tgz", - "integrity": "sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "^1.1.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", - "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.1", - "@parcel/watcher-darwin-arm64": "2.5.1", - "@parcel/watcher-darwin-x64": "2.5.1", - "@parcel/watcher-freebsd-x64": "2.5.1", - "@parcel/watcher-linux-arm-glibc": "2.5.1", - "@parcel/watcher-linux-arm-musl": "2.5.1", - "@parcel/watcher-linux-arm64-glibc": "2.5.1", - "@parcel/watcher-linux-arm64-musl": "2.5.1", - "@parcel/watcher-linux-x64-glibc": "2.5.1", - "@parcel/watcher-linux-x64-musl": "2.5.1", - "@parcel/watcher-win32-arm64": "2.5.1", - "@parcel/watcher-win32-ia32": "2.5.1", - "@parcel/watcher-win32-x64": "2.5.1" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", - "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", - "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", - "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", - "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", - "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", - "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", - "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", - "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", - "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", - "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", - "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", - "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", - "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parse5/tools": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@parse5/tools/-/tools-0.3.0.tgz", - "integrity": "sha512-zxRyTHkqb7WQMV8kTNBKWb1BeOFUKXBXTBWuxg9H9hfvQB3IwP6Iw2U75Ia5eyRxPNltmY7E8YAlz6zWwUnjKg==", - "license": "MIT", - "dependencies": { - "parse5": "^7.0.0" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "dev": true, - "license": "MIT" - }, - "node_modules/@prisma/instrumentation": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/@prisma/instrumentation/-/instrumentation-5.22.0.tgz", - "integrity": "sha512-LxccF392NN37ISGxIurUljZSh1YWnphO34V5a0+T7FVQG2u9bhAXRTJpgmQ3483woVhkraQZFF7cbRrpbw/F4Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.8", - "@opentelemetry/instrumentation": "^0.49 || ^0.50 || ^0.51 || ^0.52.0 || ^0.53.0", - "@opentelemetry/sdk-trace-base": "^1.22" - } - }, - "node_modules/@prisma/instrumentation/node_modules/@opentelemetry/api-logs": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz", - "integrity": "sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@prisma/instrumentation/node_modules/@opentelemetry/instrumentation": { - "version": "0.53.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz", - "integrity": "sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.53.0", - "@types/shimmer": "^1.2.0", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@rsbuild/plugin-check-syntax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@rsbuild/plugin-check-syntax/-/plugin-check-syntax-1.3.0.tgz", - "integrity": "sha512-lHrd6hToPFVOGWr0U/Ox7pudHWdhPSFsr2riWpjNRlUuwiXdU2SYMROaVUCrLJvYFzJyEMsFOi1w59rBQCG2HQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.14.0", - "browserslist-to-es-version": "^1.0.0", - "htmlparser2": "10.0.0", - "picocolors": "^1.1.1", - "source-map": "^0.7.4" - }, - "peerDependencies": { - "@rsbuild/core": "1.x" - }, - "peerDependenciesMeta": { - "@rsbuild/core": { - "optional": true - } - } - }, - "node_modules/@rsbuild/plugin-check-syntax/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/@rsbuild/plugin-check-syntax/node_modules/htmlparser2": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", - "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.2.1", - "entities": "^6.0.0" - } - }, - "node_modules/@rsbuild/plugin-check-syntax/node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 12" - } - }, - "node_modules/@rsdoctor/client": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rsdoctor/client/-/client-1.2.3.tgz", - "integrity": "sha512-KzfRONtUFMOhgyd9Kur9C/eqh+qPE0UDQEwp/uCMIQHwmompGgChuGniVENd2mGgkZX4MDHubFSvjoeI7j4UBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rsdoctor/core": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rsdoctor/core/-/core-1.2.3.tgz", - "integrity": "sha512-7o+SoN0JVwvxi0LSToA9G5PvSDag9ri0pQ/krlsJdkg2aVCRSR1xVjS8pzaKR9F+Q5Mnj6RixYOhIkWqWoMWFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rsbuild/plugin-check-syntax": "1.3.0", - "@rsdoctor/graph": "1.2.3", - "@rsdoctor/sdk": "1.2.3", - "@rsdoctor/types": "1.2.3", - "@rsdoctor/utils": "1.2.3", - "axios": "^1.11.0", - "browserslist-load-config": "^1.0.0", - "enhanced-resolve": "5.12.0", - "filesize": "^10.1.6", - "fs-extra": "^11.1.1", - "lodash": "^4.17.21", - "path-browserify": "1.0.1", - "semver": "^7.7.2", - "source-map": "^0.7.4" - } - }, - "node_modules/@rsdoctor/core/node_modules/enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@rsdoctor/core/node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 12" - } - }, - "node_modules/@rsdoctor/graph": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rsdoctor/graph/-/graph-1.2.3.tgz", - "integrity": "sha512-HYnUGnpWfkvrwex0VvfP4G5BTe/18bc03GHTM4iBwRuVkgi2PN1OkU/iGFSS3AbctnHLNQMC2NFuV8+U1wzynw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rsdoctor/types": "1.2.3", - "@rsdoctor/utils": "1.2.3", - "lodash.unionby": "^4.8.0", - "source-map": "^0.7.4" - } - }, - "node_modules/@rsdoctor/graph/node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 12" - } - }, - "node_modules/@rsdoctor/rspack-plugin": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rsdoctor/rspack-plugin/-/rspack-plugin-1.2.3.tgz", - "integrity": "sha512-IW0dyCmEC9Sxz7pHpUPDIjUTpFdxPocIGrcw04J5CgD5hYbyDrJ6ubDRAY4W6jm4CGvr0524s4xfW2pfsKY1Ew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rsdoctor/core": "1.2.3", - "@rsdoctor/graph": "1.2.3", - "@rsdoctor/sdk": "1.2.3", - "@rsdoctor/types": "1.2.3", - "@rsdoctor/utils": "1.2.3", - "lodash": "^4.17.21" - }, - "peerDependencies": { - "@rspack/core": "*" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - } - } - }, - "node_modules/@rsdoctor/sdk": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rsdoctor/sdk/-/sdk-1.2.3.tgz", - "integrity": "sha512-kd6JQKNihmfwKrem2LhGih5MV6zb/RBNqnkuu/BDTuOClaKzq9JEbQlfYstGDv1yF3ECR/OEOCKNGNbnCbNtmg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rsdoctor/client": "1.2.3", - "@rsdoctor/graph": "1.2.3", - "@rsdoctor/types": "1.2.3", - "@rsdoctor/utils": "1.2.3", - "@types/fs-extra": "^11.0.4", - "body-parser": "1.20.3", - "cors": "2.8.5", - "dayjs": "1.11.13", - "fs-extra": "^11.1.1", - "json-cycle": "^1.5.0", - "open": "^8.4.2", - "sirv": "2.0.4", - "socket.io": "4.8.1", - "source-map": "^0.7.4", - "tapable": "2.2.2" - } - }, - "node_modules/@rsdoctor/sdk/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/@rsdoctor/sdk/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@rsdoctor/sdk/node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@rsdoctor/sdk/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@rsdoctor/sdk/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@rsdoctor/sdk/node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@rsdoctor/sdk/node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@rsdoctor/sdk/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rsdoctor/sdk/node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@rsdoctor/sdk/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@rsdoctor/sdk/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@rsdoctor/sdk/node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 12" - } - }, - "node_modules/@rsdoctor/sdk/node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@rsdoctor/types": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rsdoctor/types/-/types-1.2.3.tgz", - "integrity": "sha512-UMh4zdyKs3K4Jh7YQvHiaXKY9c7gFwCUcRaPtpB4XjlzE3lML21d0SBAXkGduwz9AmhuTRQCqaLKA2NNuDUivQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "3.4.38", - "@types/estree": "1.0.5", - "@types/tapable": "2.2.7", - "source-map": "^0.7.4" - }, - "peerDependencies": { - "@rspack/core": "*", - "webpack": "5.x" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/@rsdoctor/types/node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rsdoctor/types/node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 12" - } - }, - "node_modules/@rsdoctor/utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rsdoctor/utils/-/utils-1.2.3.tgz", - "integrity": "sha512-HawWrcqXeqdhj4dKhdjJg4BXvstcQauYSRx0cnYH78f7z9PW60Smr6vYpByXC87rK3JKpa6CNiZi+qhI5yTAog==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "7.26.2", - "@rsdoctor/types": "1.2.3", - "@types/estree": "1.0.5", - "acorn": "^8.10.0", - "acorn-import-attributes": "^1.9.5", - "acorn-walk": "8.3.4", - "connect": "3.7.0", - "deep-eql": "4.1.4", - "envinfo": "7.14.0", - "filesize": "^10.1.6", - "fs-extra": "^11.1.1", - "get-port": "5.1.1", - "json-stream-stringify": "3.0.1", - "lines-and-columns": "2.0.4", - "picocolors": "^1.1.1", - "rslog": "^1.2.9", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/@rsdoctor/utils/node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@rsdoctor/utils/node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rsdoctor/utils/node_modules/lines-and-columns": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", - "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/@rspack/binding": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.5.7.tgz", - "integrity": "sha512-/fFrf4Yu8Tc0yXBw33g2++turdld1MDphLiLg05bx92fOVI1MafocwPvm35e3y1z7CtlQJ2Bmvzhi6APJShKxg==", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "@rspack/binding-darwin-arm64": "1.5.7", - "@rspack/binding-darwin-x64": "1.5.7", - "@rspack/binding-linux-arm64-gnu": "1.5.7", - "@rspack/binding-linux-arm64-musl": "1.5.7", - "@rspack/binding-linux-x64-gnu": "1.5.7", - "@rspack/binding-linux-x64-musl": "1.5.7", - "@rspack/binding-wasm32-wasi": "1.5.7", - "@rspack/binding-win32-arm64-msvc": "1.5.7", - "@rspack/binding-win32-ia32-msvc": "1.5.7", - "@rspack/binding-win32-x64-msvc": "1.5.7" - } - }, - "node_modules/@rspack/binding-darwin-arm64": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.5.7.tgz", - "integrity": "sha512-prQ/vgJxOPdlYiR4gVeOEKofTCEOu70JQIQApqFnw8lKM7rd9ag8ogDNqmc2L/GGXGHLAqds28oeKXRlzYf7+Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rspack/binding-darwin-x64": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.5.7.tgz", - "integrity": "sha512-FPqiWSbEEerqfJrGnYe68svvl6NyuQFAb3qqFe/Q0MqFhBYmAZwa0R2/ylugCdgFLZxmkFuWqpDgItpvJb/E3Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rspack/binding-linux-arm64-gnu": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.5.7.tgz", - "integrity": "sha512-fwy+NY+0CHrZqqzDrjPBlTuK53W4dG5EEg/QQFAE7KVM+okRqPk8tg45bJ5628rCNLe13GDmPIE107LmgspNqA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rspack/binding-linux-arm64-musl": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.5.7.tgz", - "integrity": "sha512-576u/0F4ZUzpHckFme4vQ0sSxjE+B/gVP4tNJ+P6bJaclXLFXV4icbjTUQwOIgmA1EQz/JFeKGGJZ4p6mowpBQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rspack/binding-linux-x64-gnu": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.5.7.tgz", - "integrity": "sha512-brSHywXjjeuWkv0ywgxS4VgDgquarEb4XGr+eXhOaPcc8x2rNefyc4hErplrI7+oxPXVuGK5VE4ZH5bj3Yknvg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rspack/binding-linux-x64-musl": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.5.7.tgz", - "integrity": "sha512-HcS0DzbLlWCwVfYcWMbTgILh4GELD6m4CZoFEhIr4fJCJi0p8NgLYycy1QtDhaUjs8TKalmyMwHrJwGnD141JA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rspack/binding-wasm32-wasi": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.5.7.tgz", - "integrity": "sha512-uTRUEuK+TVlvUBSWXVoxD+6JTN+rvtRqVlO+A7I7VnOY7p9Rpvk1sXcHtEwg/XuDCq4DALnvlzbFLh7G3zILvw==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^1.0.5" - } - }, - "node_modules/@rspack/binding-win32-arm64-msvc": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.5.7.tgz", - "integrity": "sha512-dFHrXRUmMTkxEn/Uw2RLbIckKfi0Zmn2NnEXwedWdyRgZW4Vhk7+VBxM22O/CHZmAGt12Ol25yTuVv58ANLEKA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rspack/binding-win32-ia32-msvc": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.5.7.tgz", - "integrity": "sha512-PNtnOIUzE9p/Fbl6l/1Zs7bhn8ccTlaHTgZgQq0sO/QxjLlbU0WPjRl+YLo27cAningSOAbANuYlN8vAcuimrw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rspack/binding-win32-x64-msvc": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.5.7.tgz", - "integrity": "sha512-22gTaYkwaIUvyXRxf1RVnFTJPqF2hD1pgAQNBIz7kYybe6vvSZ6KInW4WyG4vjYKrJg/cbS4QvtlLn0lYXrdIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rspack/cli": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@rspack/cli/-/cli-1.5.7.tgz", - "integrity": "sha512-oxNl4XwJFK3nsyPk2cz1eXQNZSEtSdf2lSGaKr3wG0hCy2y+M0v+muHfem+2lG4ePcocpCYSS1beQpQ/bDV0dA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "^0.5.7", - "@rspack/dev-server": "~1.1.4", - "colorette": "2.0.20", - "exit-hook": "^4.0.0", - "pirates": "^4.0.7", - "webpack-bundle-analyzer": "4.10.2", - "yargs": "17.7.2" - }, - "bin": { - "rspack": "bin/rspack.js" - }, - "peerDependencies": { - "@rspack/core": "^1.0.0-alpha || ^1.x" - } - }, - "node_modules/@rspack/core": { - "version": "1.5.7", - "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.5.7.tgz", - "integrity": "sha512-57ey3wafK/g+B9zLdCiIrX3eTK8rFEM3yvxBUb2ro3ZtAaCGm4y7xERcXZJNn4D01pjzzCJ/u1ezpQmsZYLP7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@module-federation/runtime-tools": "0.18.0", - "@rspack/binding": "1.5.7", - "@rspack/lite-tapable": "1.0.1" - }, - "engines": { - "node": ">=18.12.0" - }, - "peerDependencies": { - "@swc/helpers": ">=0.5.1" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } - } - }, - "node_modules/@rspack/dev-server": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@rspack/dev-server/-/dev-server-1.1.4.tgz", - "integrity": "sha512-kGHYX2jYf3ZiHwVl0aUEPBOBEIG1aWleCDCAi+Jg32KUu3qr/zDUpCEd0wPuHfLEgk0X0xAEYCS6JMO7nBStNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^3.6.0", - "http-proxy-middleware": "^2.0.9", - "p-retry": "^6.2.0", - "webpack-dev-server": "5.2.2", - "ws": "^8.18.0" - }, - "engines": { - "node": ">= 18.12.0" - }, - "peerDependencies": { - "@rspack/core": "*" - } - }, - "node_modules/@rspack/dev-server/node_modules/@types/express": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", - "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@rspack/dev-server/node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@rspack/dev-server/node_modules/http-proxy-middleware": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", - "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/@rspack/lite-tapable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz", - "integrity": "sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sec-ant/readable-stream": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", - "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", - "license": "MIT" - }, - "node_modules/@sentry/core": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.55.0.tgz", - "integrity": "sha512-6g7jpbefjHYs821Z+EBJ8r4Z7LT5h80YSWRJaylGS4nW5W5Z2KXzpdnyFarv37O7QjauzVC2E+PABmpkw5/JGA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.18" - } - }, - "node_modules/@sentry/node": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-8.55.0.tgz", - "integrity": "sha512-h10LJLDTRAzYgay60Oy7moMookqqSZSviCWkkmHZyaDn+4WURnPp5SKhhfrzPRQcXKrweiOwDSHBgn1tweDssg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/context-async-hooks": "^1.30.1", - "@opentelemetry/core": "^1.30.1", - "@opentelemetry/instrumentation": "^0.57.1", - "@opentelemetry/instrumentation-amqplib": "^0.46.0", - "@opentelemetry/instrumentation-connect": "0.43.0", - "@opentelemetry/instrumentation-dataloader": "0.16.0", - "@opentelemetry/instrumentation-express": "0.47.0", - "@opentelemetry/instrumentation-fastify": "0.44.1", - "@opentelemetry/instrumentation-fs": "0.19.0", - "@opentelemetry/instrumentation-generic-pool": "0.43.0", - "@opentelemetry/instrumentation-graphql": "0.47.0", - "@opentelemetry/instrumentation-hapi": "0.45.1", - "@opentelemetry/instrumentation-http": "0.57.1", - "@opentelemetry/instrumentation-ioredis": "0.47.0", - "@opentelemetry/instrumentation-kafkajs": "0.7.0", - "@opentelemetry/instrumentation-knex": "0.44.0", - "@opentelemetry/instrumentation-koa": "0.47.0", - "@opentelemetry/instrumentation-lru-memoizer": "0.44.0", - "@opentelemetry/instrumentation-mongodb": "0.51.0", - "@opentelemetry/instrumentation-mongoose": "0.46.0", - "@opentelemetry/instrumentation-mysql": "0.45.0", - "@opentelemetry/instrumentation-mysql2": "0.45.0", - "@opentelemetry/instrumentation-nestjs-core": "0.44.0", - "@opentelemetry/instrumentation-pg": "0.50.0", - "@opentelemetry/instrumentation-redis-4": "0.46.0", - "@opentelemetry/instrumentation-tedious": "0.18.0", - "@opentelemetry/instrumentation-undici": "0.10.0", - "@opentelemetry/resources": "^1.30.1", - "@opentelemetry/sdk-trace-base": "^1.30.1", - "@opentelemetry/semantic-conventions": "^1.28.0", - "@prisma/instrumentation": "5.22.0", - "@sentry/core": "8.55.0", - "@sentry/opentelemetry": "8.55.0", - "import-in-the-middle": "^1.11.2" - }, - "engines": { - "node": ">=14.18" - } - }, - "node_modules/@sentry/opentelemetry": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-8.55.0.tgz", - "integrity": "sha512-UvatdmSr3Xf+4PLBzJNLZ2JjG1yAPWGe/VrJlJAqyTJ2gKeTzgXJJw8rp4pbvNZO8NaTGEYhhO+scLUj0UtLAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sentry/core": "8.55.0" - }, - "engines": { - "node": ">=14.18" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/context-async-hooks": "^1.30.1", - "@opentelemetry/core": "^1.30.1", - "@opentelemetry/instrumentation": "^0.57.1", - "@opentelemetry/sdk-trace-base": "^1.30.1", - "@opentelemetry/semantic-conventions": "^1.28.0" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@stripe/stripe-js": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-7.9.0.tgz", - "integrity": "sha512-ggs5k+/0FUJcIgNY08aZTqpBTtbExkJMYMLSMwyucrhtWexVOEY1KJmhBsxf+E/Q15f5rbwBpj+t0t2AW2oCsQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.16" - } - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", - "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", - "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", - "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", - "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", - "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", - "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-preset": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", - "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", - "@svgr/babel-plugin-transform-svg-component": "8.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/core": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", - "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^8.1.3", - "snake-case": "^3.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/core/node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", - "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.21.3", - "entities": "^4.4.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-jsx": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", - "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "@svgr/hast-util-to-babel-ast": "8.0.0", - "svg-parser": "^2.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@svgr/plugin-svgo": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", - "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cosmiconfig": "^8.1.3", - "deepmerge": "^4.3.1", - "svgo": "^3.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@svgr/plugin-svgo/node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@svgr/webpack": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", - "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.21.3", - "@babel/plugin-transform-react-constant-elements": "^7.21.3", - "@babel/preset-env": "^7.20.2", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.21.0", - "@svgr/core": "8.1.0", - "@svgr/plugin-jsx": "8.1.0", - "@svgr/plugin-svgo": "8.1.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@tokenizer/inflate": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.2.7.tgz", - "integrity": "sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==", - "dev": true, - "dependencies": { - "debug": "^4.4.0", - "fflate": "^0.8.2", - "token-types": "^6.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/compression": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@types/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-kCFuWS0ebDbmxs0AXYn6e2r2nrGAb5KwQhknjSPSPgJcGd8+HVSILlUyFhGqML2gk39HcG7D1ydW9/qpYkN00Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/cookie-parser": { - "version": "1.4.9", - "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.9.tgz", - "integrity": "sha512-tGZiZ2Gtc4m3wIdLkZ8mkj1T6CEHb35+VApbL2T14Dew8HA7c+04dmKqsKRNC+8RJPm16JEK0tFSwdZqubfc4g==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/cors": { - "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree-jsx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", - "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/express": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.3.tgz", - "integrity": "sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^5.0.0", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", - "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/fs-extra": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", - "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/jsonfile": "*", - "@types/node": "*" - } - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/he": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/he/-/he-1.2.3.tgz", - "integrity": "sha512-q67/qwlxblDzEDvzHhVkwc1gzVWxaNxeyHUBF4xElrvjL11O+Ytze+1fGpBHlr/H9myiBUaUXNnNPmBHxxfAcA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/http-proxy": { - "version": "1.17.16", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", - "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/insane": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/insane/-/insane-1.0.0.tgz", - "integrity": "sha512-9FNbmwdaQezEszc5B/w4kRSpMJMOVj+gX7CKSbBCFO4WPiUqKO3HJlUNXzjtus0w5tF2BOJoKTbyps/Envlg/Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/jsonfile": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", - "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/lodash": { - "version": "4.17.16", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.16.tgz", - "integrity": "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==", - "license": "MIT" - }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mysql": { - "version": "2.15.26", - "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.26.tgz", - "integrity": "sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "22.18.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.6.tgz", - "integrity": "sha512-r8uszLPpeIWbNKtvWRt/DbVi5zbqZyj1PTmhRMqBMvDnaz1QpmSKujUtJLrqGZeoM8v72MfYggDceY4K1itzWQ==", - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/node-forge": { - "version": "1.3.14", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", - "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/pg": { - "version": "8.6.1", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", - "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "pg-protocol": "*", - "pg-types": "^2.2.0" - } - }, - "node_modules/@types/pg-pool": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.6.tgz", - "integrity": "sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/pg": "*" - } - }, - "node_modules/@types/prismjs": { - "version": "1.26.5", - "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", - "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/qs": { - "version": "6.9.18", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", - "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "19.1.7", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.7.tgz", - "integrity": "sha512-BnsPLV43ddr05N71gaGzyZ5hzkCmGwhMvYc8zmvI8Ci1bRkkDSzDDVfAXfN2tk748OwI7ediiPX6PfT9p0QGVg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "csstype": "^3.0.2" - } - }, - "node_modules/@types/retry": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", - "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/shimmer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.2.0.tgz", - "integrity": "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/sockjs": { - "version": "0.3.36", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", - "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/table": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/table/-/table-5.0.0.tgz", - "integrity": "sha512-fQLtGLZXor264zUPWI95WNDsZ3QV43/c0lJpR/h1hhLJumXRmHNsrvBfEzW2YMhb0EWCsn4U6h82IgwsajAuTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/tabtab": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/tabtab/-/tabtab-3.0.4.tgz", - "integrity": "sha512-gmh8JsmIYPGRqk8Xb4dmulV37TpLwg0Quo3GJ0LgEcl4v0O92F14PGebBd7LHv9GBEw2KbmBSrvU0/NzIy5AoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/tapable": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-2.2.7.tgz", - "integrity": "sha512-D6QzACV9vNX3r8HQQNTOnpG+Bv1rko+yEA82wKs3O9CQ5+XW7HI7TED17/UE7+5dIxyxZIWTxKbsBeF6uKFCwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tapable": "^2.2.0" - } - }, - "node_modules/@types/tedious": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", - "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/triple-beam": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "license": "MIT" - }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/webpack-hot-middleware": { - "version": "2.25.10", - "resolved": "https://registry.npmjs.org/@types/webpack-hot-middleware/-/webpack-hot-middleware-2.25.10.tgz", - "integrity": "sha512-MpUbBgM2b3Sfh9lB/S6aZP0mIPXunBNBAV+eod39fdzHWTCIrtbRfUvfPXNixi0cEIR9G3S2j0mCWNH06cFlmw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "tapable": "^2.2.0", - "webpack": "^5" - } - }, - "node_modules/@types/wrap-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", - "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.1.tgz", - "integrity": "sha512-molgphGqOBT7t4YKCSkbasmu1tb1MgrZ2szGzHbclF7PNmOkSTQVHy+2jXOSnxvR3+Xe1yySHFZoqMpz3TfQsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.44.1", - "@typescript-eslint/type-utils": "8.44.1", - "@typescript-eslint/utils": "8.44.1", - "@typescript-eslint/visitor-keys": "8.44.1", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.44.1", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.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.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.1.tgz", - "integrity": "sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@typescript-eslint/scope-manager": "8.44.1", - "@typescript-eslint/types": "8.44.1", - "@typescript-eslint/typescript-estree": "8.44.1", - "@typescript-eslint/visitor-keys": "8.44.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.1.tgz", - "integrity": "sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.44.1", - "@typescript-eslint/types": "^8.44.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.1.tgz", - "integrity": "sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.44.1", - "@typescript-eslint/visitor-keys": "8.44.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.1.tgz", - "integrity": "sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.44.1.tgz", - "integrity": "sha512-KdEerZqHWXsRNKjF9NYswNISnFzXfXNDfPxoTh7tqohU/PRIbwTmsjGK6V9/RTYWau7NZvfo52lgVk+sJh0K3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.44.1", - "@typescript-eslint/typescript-estree": "8.44.1", - "@typescript-eslint/utils": "8.44.1", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.1.tgz", - "integrity": "sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.1.tgz", - "integrity": "sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.44.1", - "@typescript-eslint/tsconfig-utils": "8.44.1", - "@typescript-eslint/types": "8.44.1", - "@typescript-eslint/visitor-keys": "8.44.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": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.44.1.tgz", - "integrity": "sha512-DpX5Fp6edTlocMCwA+mHY8Mra+pPjRZ0TfHkXI8QFelIKcbADQz1LUPNtzOFUriBB2UYqw4Pi9+xV4w9ZczHFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.44.1", - "@typescript-eslint/types": "8.44.1", - "@typescript-eslint/typescript-estree": "8.44.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.1.tgz", - "integrity": "sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.44.1", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true, - "license": "ISC" - }, - "node_modules/@use-it/interval": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@use-it/interval/-/interval-1.0.0.tgz", - "integrity": "sha512-WQFcnSt/xM/mS8ZtJ0ut5lhPrl+V0HDPPcI/J0eUClsfiD+/r8A7IeW/pVcfpSVGWRmN3+WnjNteWuKyWs2WZg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/@vscode/l10n": { - "version": "0.0.18", - "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz", - "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vscode/web-custom-data": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@vscode/web-custom-data/-/web-custom-data-0.6.0.tgz", - "integrity": "sha512-ZcDarMVk4SquxEtgVcFQc+9DoWTyT3s+lUjreNQz1fmcoCB21DF+wSgy4H9BGcicPUInmiJnGDxRJ9U7LjOmGw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webref/css": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/@webref/css/-/css-6.23.0.tgz", - "integrity": "sha512-6bR0iNhl8/oWitLCIGDvs1B4CJBq2cuV9SRjEE4nZUOJzyn5WK6Y4sBfSiCwQqX0WEgASwywukcCVEEaJoRGNA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "css-tree": "^3.1.0" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@zip.js/zip.js": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.8.2.tgz", - "integrity": "sha512-PI6UdgpSeVoGvzguKHmy2bwOqI3UYkntLZOCpyJSKIi7234c5aJmQYkJB/P4P2YUJkqhbqvu7iM2/0eJZ178nA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "bun": ">=0.7.0", - "deno": ">=1.0.0", - "node": ">=16.5.0" - } - }, - "node_modules/accept-language-parser": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/accept-language-parser/-/accept-language-parser-1.5.0.tgz", - "integrity": "sha512-QhyTbMLYo0BBGg1aWbeMG4ekWtds/31BrEU+DONOg/7ax23vxpL03Pb7/zBmha2v7vdD3AyzZVWBVGEZxKOXWw==", - "dev": true, - "license": "MIT" - }, - "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==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/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==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/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==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/adjust-sourcemap-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "node_modules/ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "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/archive-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", - "integrity": "sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "file-type": "^4.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/archive-type/node_modules/file-type": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", - "integrity": "sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/are-docs-informative": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", - "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/array-includes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.0", - "es-object-atoms": "^1.1.1", - "get-intrinsic": "^1.3.0", - "is-string": "^1.1.1", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", - "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-shim-unscopables": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/assignment": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/assignment/-/assignment-2.0.0.tgz", - "integrity": "sha512-naMULXjtgCs9SVUEtyvJNt68aF18em7/W+dhbR59kbz9cXWPEvUkCun2tqlgqRPSqZaKPpqLc5ZnwL8jVmJRvw==" - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true, - "license": "MIT" - }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/autoprefixer": { - "version": "10.4.21", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axios": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", - "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", - "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.4", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", - "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.3", - "core-js-compat": "^3.40.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", - "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.4" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "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/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.8.6", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.6.tgz", - "integrity": "sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true, - "license": "MIT" - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/bin-build": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-3.0.0.tgz", - "integrity": "sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "decompress": "^4.0.0", - "download": "^6.2.2", - "execa": "^0.7.0", - "p-map-series": "^1.0.0", - "tempfile": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/bin-build/node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/bin-build/node_modules/execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/bin-build/node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/bin-build/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "license": "ISC", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/bin-build/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/bin-build/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/bin-build/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/bin-build/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/bin-build/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true, - "license": "ISC" - }, - "node_modules/bin-check": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-4.1.0.tgz", - "integrity": "sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^0.7.0", - "executable": "^4.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/bin-check/node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/bin-check/node_modules/execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/bin-check/node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/bin-check/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "license": "ISC", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/bin-check/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/bin-check/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/bin-check/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/bin-check/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/bin-check/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true, - "license": "ISC" - }, - "node_modules/bin-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-3.1.0.tgz", - "integrity": "sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^1.0.0", - "find-versions": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/bin-version-check": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-4.0.0.tgz", - "integrity": "sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bin-version": "^3.0.0", - "semver": "^5.6.0", - "semver-truncate": "^1.1.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/bin-version-check/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/bin-wrapper": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-4.1.0.tgz", - "integrity": "sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "bin-check": "^4.1.0", - "bin-version-check": "^4.0.0", - "download": "^7.1.0", - "import-lazy": "^3.1.0", - "os-filter-obj": "^2.0.0", - "pify": "^4.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/bin-wrapper/node_modules/@sindresorhus/is": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", - "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/bin-wrapper/node_modules/cacheable-request": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", - "integrity": "sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-response": "1.0.2", - "get-stream": "3.0.0", - "http-cache-semantics": "3.8.1", - "keyv": "3.0.0", - "lowercase-keys": "1.0.0", - "normalize-url": "2.0.1", - "responselike": "1.0.2" - } - }, - "node_modules/bin-wrapper/node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha512-RPlX0+PHuvxVDZ7xX+EBVAp4RsVxP/TdDSN2mJYdiq1Lc4Hz7EUSjUI7RZrKKlmrIzVhf6Jo2stj7++gVarS0A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/bin-wrapper/node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/bin-wrapper/node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/bin-wrapper/node_modules/download": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz", - "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "archive-type": "^4.0.0", - "caw": "^2.0.1", - "content-disposition": "^0.5.2", - "decompress": "^4.2.0", - "ext-name": "^5.0.0", - "file-type": "^8.1.0", - "filenamify": "^2.0.0", - "get-stream": "^3.0.0", - "got": "^8.3.1", - "make-dir": "^1.2.0", - "p-event": "^2.1.0", - "pify": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/bin-wrapper/node_modules/download/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/bin-wrapper/node_modules/file-type": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz", - "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/bin-wrapper/node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/bin-wrapper/node_modules/got": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", - "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^0.7.0", - "cacheable-request": "^2.1.1", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "into-stream": "^3.1.0", - "is-retry-allowed": "^1.1.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "mimic-response": "^1.0.0", - "p-cancelable": "^0.4.0", - "p-timeout": "^2.0.1", - "pify": "^3.0.0", - "safe-buffer": "^5.1.1", - "timed-out": "^4.0.1", - "url-parse-lax": "^3.0.0", - "url-to-options": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/bin-wrapper/node_modules/got/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/bin-wrapper/node_modules/http-cache-semantics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/bin-wrapper/node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/bin-wrapper/node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/bin-wrapper/node_modules/keyv": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", - "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.0" - } - }, - "node_modules/bin-wrapper/node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/bin-wrapper/node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/bin-wrapper/node_modules/normalize-url": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", - "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "prepend-http": "^2.0.0", - "query-string": "^5.0.1", - "sort-keys": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/bin-wrapper/node_modules/p-cancelable": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", - "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/bin-wrapper/node_modules/p-event": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", - "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-timeout": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/bin-wrapper/node_modules/p-timeout": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", - "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/bin-wrapper/node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, - "node_modules/bin-wrapper/node_modules/sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-plain-obj": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/bl/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/bl/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/bl/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "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==", - "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/bonjour-service": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", - "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true, - "license": "ISC" - }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.26.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.2.tgz", - "integrity": "sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.8.3", - "caniuse-lite": "^1.0.30001741", - "electron-to-chromium": "^1.5.218", - "node-releases": "^2.0.21", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/browserslist-load-config": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserslist-load-config/-/browserslist-load-config-1.0.1.tgz", - "integrity": "sha512-orLR5HAoQugQNVUXUwNd+GAAwl3H64KLIwoMFBNW0AbMSqX2Lxs4ZV2/5UoNrVQlQqF9ygychiu7Svr/99bLtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/browserslist-to-es-version": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/browserslist-to-es-version/-/browserslist-to-es-version-1.1.1.tgz", - "integrity": "sha512-jfRStKh3aQ8HqQA45MWHYYtzhhlMM8X3cffhXJmMRlRWEu8+fk9bN8dYEsfY7j5pAvtSK8ehelUSvyDmEKijOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.25.1" - } - }, - "node_modules/buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "node_modules/buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true, - "license": "MIT" - }, - "node_modules/buffer-builder": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz", - "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==", - "dev": true, - "license": "MIT/X11" - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/builtin-modules": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.0.0.tgz", - "integrity": "sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "license": "MIT", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacheable": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.10.4.tgz", - "integrity": "sha512-Gd7ccIUkZ9TE2odLQVS+PDjIvQCdJKUlLdJRVvZu0aipj07Qfx+XIej7hhDrKGGoIxV5m5fT/kOJNJPQhQneRg==", - "dev": true, - "license": "MIT", - "dependencies": { - "hookified": "^1.11.0", - "keyv": "^5.5.0" - } - }, - "node_modules/cacheable/node_modules/keyv": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.0.tgz", - "integrity": "sha512-QG7qR2tijh1ftOvClut4YKKg1iW6cx3GZsKoGyJPxHkGWK9oJhG9P3j5deP0QQOGDowBMVQFaP+Vm4NpGYvmIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@keyv/serialize": "^1.1.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "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==", - "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", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001743", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001743.tgz", - "integrity": "sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/caw": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", - "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-proxy": "^2.0.0", - "isurl": "^1.0.0-alpha5", - "tunnel-agent": "^0.6.0", - "url-to-options": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/change-case": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", - "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/change-file-extension": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/change-file-extension/-/change-file-extension-0.1.1.tgz", - "integrity": "sha512-lB0j9teu8JtDPDHRfU8pNH33w4wMu5bOaKoT4PxH+AKugBrIfpiJMTTKIm0TErNeJPkeQEgvH31YpccTwOKPRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true, - "license": "MIT" - }, - "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cheerio/node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", - "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "domhandler": "^5.0.3", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", - "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/clean-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", - "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/clean-regexp/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-progress": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", - "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.3" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "dev": true, - "license": "ISC" - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/clone-deep/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - } - }, - "node_modules/clone-response/node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/codemirror": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz", - "integrity": "sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==", - "license": "MIT", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/commands": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/lint": "^6.0.0", - "@codemirror/search": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0" - } - }, - "node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/color/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", - "dev": true, - "license": "MIT" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/colorjs.io": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", - "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", - "dev": true, - "license": "MIT" - }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/comma-separated-tokens": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", - "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/comment-parser": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", - "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/compare-versions": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", - "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", - "dev": true, - "license": "MIT" - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "compressible": "~2.0.18", - "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.1.0", - "safe-buffer": "5.2.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/compression/node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compute-scroll-into-view": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz", - "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/concurrently": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", - "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", - "license": "MIT", - "dependencies": { - "chalk": "4.1.2", - "rxjs": "7.8.2", - "shell-quote": "1.8.3", - "supports-color": "8.1.1", - "tree-kill": "1.2.2", - "yargs": "17.7.2" - }, - "bin": { - "conc": "dist/bin/concurrently.js", - "concurrently": "dist/bin/concurrently.js" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" - } - }, - "node_modules/concurrently/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/connect/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/connect/node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/connect/node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.8" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/connect/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.6" - } - }, - "node_modules/construct-style-sheets-polyfill": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/construct-style-sheets-polyfill/-/construct-style-sheets-polyfill-3.1.0.tgz", - "integrity": "sha512-HBLKP0chz8BAY6rBdzda11c3wAZeCZ+kIG4weVC2NM3AXzxx09nhe8t0SQNdloAvg5GLuHwq/0SPOOSPvtCcKw==", - "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==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" + "node": ">= 10.0.0" }, - "engines": { - "node": ">= 0.6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "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==", + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.6" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/convert-hrtime": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz", - "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==", + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=12" + "node": ">= 10.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-parser": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", - "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", - "license": "MIT", - "dependencies": { - "cookie": "0.7.2", - "cookie-signature": "1.0.6" + "node": ">= 10.0.0" }, - "engines": { - "node": ">= 0.8.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/cookie-parser/node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" - }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.6.0" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/core-js-compat": { - "version": "3.44.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.44.0.tgz", - "integrity": "sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA==", + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "browserslist": "^4.25.1" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/core-js" + "url": "https://opencollective.com/parcel" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true, - "license": "MIT" - }, - "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==", + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.10" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=14" + "node": ">= 10.0.0" }, "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/crelt": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", - "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "node_modules/@parse5/tools": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@parse5/tools/-/tools-0.3.0.tgz", + "integrity": "sha512-zxRyTHkqb7WQMV8kTNBKWb1BeOFUKXBXTBWuxg9H9hfvQB3IwP6Iw2U75Ia5eyRxPNltmY7E8YAlz6zWwUnjKg==", "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" + "parse5": "^7.0.0" } }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rsbuild/plugin-check-syntax": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@rsbuild/plugin-check-syntax/-/plugin-check-syntax-1.3.0.tgz", + "integrity": "sha512-lHrd6hToPFVOGWr0U/Ox7pudHWdhPSFsr2riWpjNRlUuwiXdU2SYMROaVUCrLJvYFzJyEMsFOi1w59rBQCG2HQ==", "dev": true, "license": "MIT", "dependencies": { - "type-fest": "^1.0.1" + "acorn": "^8.14.0", + "browserslist-to-es-version": "^1.0.0", + "htmlparser2": "10.0.0", + "picocolors": "^1.1.1", + "source-map": "^0.7.4" }, - "engines": { - "node": ">=12" + "peerDependencies": { + "@rsbuild/core": "1.x" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "@rsbuild/core": { + "optional": true + } } }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "node_modules/@rsbuild/plugin-check-syntax/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "BSD-2-Clause", "engines": { - "node": ">=10" + "node": ">=0.12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/css-blank-pseudo": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", - "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", + "node_modules/@rsbuild/plugin-check-syntax/node_modules/htmlparser2": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", "dev": true, "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", { "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "url": "https://github.com/sponsors/fb55" } ], - "license": "MIT-0", + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" } }, - "node_modules/css-declaration-sorter": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", - "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", + "node_modules/@rsbuild/plugin-check-syntax/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "dev": true, - "license": "ISC", + "license": "BSD-3-Clause", "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.0.9" + "node": ">= 12" } }, - "node_modules/css-functions-list": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", - "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", + "node_modules/@rsdoctor/client": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rsdoctor/client/-/client-1.2.3.tgz", + "integrity": "sha512-KzfRONtUFMOhgyd9Kur9C/eqh+qPE0UDQEwp/uCMIQHwmompGgChuGniVENd2mGgkZX4MDHubFSvjoeI7j4UBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rsdoctor/core": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rsdoctor/core/-/core-1.2.3.tgz", + "integrity": "sha512-7o+SoN0JVwvxi0LSToA9G5PvSDag9ri0pQ/krlsJdkg2aVCRSR1xVjS8pzaKR9F+Q5Mnj6RixYOhIkWqWoMWFw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12 || >=16" + "dependencies": { + "@rsbuild/plugin-check-syntax": "1.3.0", + "@rsdoctor/graph": "1.2.3", + "@rsdoctor/sdk": "1.2.3", + "@rsdoctor/types": "1.2.3", + "@rsdoctor/utils": "1.2.3", + "axios": "^1.11.0", + "browserslist-load-config": "^1.0.0", + "enhanced-resolve": "5.12.0", + "filesize": "^10.1.6", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "path-browserify": "1.0.1", + "semver": "^7.7.2", + "source-map": "^0.7.4" } }, - "node_modules/css-has-pseudo": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz", - "integrity": "sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==", + "node_modules/@rsdoctor/core/node_modules/enhanced-resolve": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", + "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", + "license": "MIT", "dependencies": { - "@csstools/selector-specificity": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.2.0" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" + "node": ">=10.13.0" } }, - "node_modules/css-loader": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", - "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", + "node_modules/@rsdoctor/core/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "dev": true, - "license": "MIT", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.33", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.5.4" - }, + "license": "BSD-3-Clause", "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.27.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } + "node": ">= 12" } }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-7.0.2.tgz", - "integrity": "sha512-nBRWZtI77PBZQgcXMNqiIXVshiQOVLGSf2qX/WZfG8IQfMbeHUMXaBWQmiiSTmPJUflQxHjZjzAmuyO7tpL2Jg==", + "node_modules/@rsdoctor/graph": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rsdoctor/graph/-/graph-1.2.3.tgz", + "integrity": "sha512-HYnUGnpWfkvrwex0VvfP4G5BTe/18bc03GHTM4iBwRuVkgi2PN1OkU/iGFSS3AbctnHLNQMC2NFuV8+U1wzynw==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "cssnano": "^7.0.4", - "jest-worker": "^29.7.0", - "postcss": "^8.4.40", - "schema-utils": "^4.2.0", - "serialize-javascript": "^6.0.2" - }, + "@rsdoctor/types": "1.2.3", + "@rsdoctor/utils": "1.2.3", + "lodash.unionby": "^4.8.0", + "source-map": "^0.7.4" + } + }, + "node_modules/@rsdoctor/graph/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">= 12" + } + }, + "node_modules/@rsdoctor/rspack-plugin": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rsdoctor/rspack-plugin/-/rspack-plugin-1.2.3.tgz", + "integrity": "sha512-IW0dyCmEC9Sxz7pHpUPDIjUTpFdxPocIGrcw04J5CgD5hYbyDrJ6ubDRAY4W6jm4CGvr0524s4xfW2pfsKY1Ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rsdoctor/core": "1.2.3", + "@rsdoctor/graph": "1.2.3", + "@rsdoctor/sdk": "1.2.3", + "@rsdoctor/types": "1.2.3", + "@rsdoctor/utils": "1.2.3", + "lodash": "^4.17.21" }, "peerDependencies": { - "webpack": "^5.0.0" + "@rspack/core": "*" }, "peerDependenciesMeta": { - "@parcel/css": { - "optional": true - }, - "@swc/css": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "lightningcss": { + "@rspack/core": { "optional": true } } }, - "node_modules/css-prefers-color-scheme": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", - "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", + "node_modules/@rsdoctor/sdk": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rsdoctor/sdk/-/sdk-1.2.3.tgz", + "integrity": "sha512-kd6JQKNihmfwKrem2LhGih5MV6zb/RBNqnkuu/BDTuOClaKzq9JEbQlfYstGDv1yF3ECR/OEOCKNGNbnCbNtmg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "postcss": "^8.4" + "license": "MIT", + "dependencies": { + "@rsdoctor/client": "1.2.3", + "@rsdoctor/graph": "1.2.3", + "@rsdoctor/types": "1.2.3", + "@rsdoctor/utils": "1.2.3", + "@types/fs-extra": "^11.0.4", + "body-parser": "1.20.3", + "cors": "2.8.5", + "dayjs": "1.11.13", + "fs-extra": "^11.1.1", + "json-cycle": "^1.5.0", + "open": "^8.4.2", + "sirv": "2.0.4", + "socket.io": "4.8.1", + "source-map": "^0.7.4", + "tapable": "2.2.2" } }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "node_modules/@rsdoctor/sdk/node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/css-tree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", - "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "node_modules/@rsdoctor/sdk/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { - "mdn-data": "2.12.2", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + "ms": "2.0.0" } }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "node_modules/@rsdoctor/sdk/node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "node": ">=8" } }, - "node_modules/cssdb": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.4.2.tgz", - "integrity": "sha512-PzjkRkRUS+IHDJohtxkIczlxPPZqRo0nXplsYXOMBRPjcVRjj1W4DfvRgshUYTVuUigU7ptVYkFJQ7abUB0nyg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - } - ], - "license": "MIT-0" - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "node_modules/@rsdoctor/sdk/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/cssnano": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.0.6.tgz", - "integrity": "sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw==", + "node_modules/@rsdoctor/sdk/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, "license": "MIT", - "dependencies": { - "cssnano-preset-default": "^7.0.6", - "lilconfig": "^3.1.2" + "bin": { + "is-docker": "cli.js" }, "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" + "node": ">=8" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cssnano-preset-default": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.6.tgz", - "integrity": "sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ==", + "node_modules/@rsdoctor/sdk/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "license": "MIT", "dependencies": { - "browserslist": "^4.23.3", - "css-declaration-sorter": "^7.2.0", - "cssnano-utils": "^5.0.0", - "postcss-calc": "^10.0.2", - "postcss-colormin": "^7.0.2", - "postcss-convert-values": "^7.0.4", - "postcss-discard-comments": "^7.0.3", - "postcss-discard-duplicates": "^7.0.1", - "postcss-discard-empty": "^7.0.0", - "postcss-discard-overridden": "^7.0.0", - "postcss-merge-longhand": "^7.0.4", - "postcss-merge-rules": "^7.0.4", - "postcss-minify-font-values": "^7.0.0", - "postcss-minify-gradients": "^7.0.0", - "postcss-minify-params": "^7.0.2", - "postcss-minify-selectors": "^7.0.4", - "postcss-normalize-charset": "^7.0.0", - "postcss-normalize-display-values": "^7.0.0", - "postcss-normalize-positions": "^7.0.0", - "postcss-normalize-repeat-style": "^7.0.0", - "postcss-normalize-string": "^7.0.0", - "postcss-normalize-timing-functions": "^7.0.0", - "postcss-normalize-unicode": "^7.0.2", - "postcss-normalize-url": "^7.0.0", - "postcss-normalize-whitespace": "^7.0.0", - "postcss-ordered-values": "^7.0.1", - "postcss-reduce-initial": "^7.0.2", - "postcss-reduce-transforms": "^7.0.0", - "postcss-svgo": "^7.0.1", - "postcss-unique-selectors": "^7.0.3" + "is-docker": "^2.0.0" }, "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" + "node": ">=8" } }, - "node_modules/cssnano-utils": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.0.tgz", - "integrity": "sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==", + "node_modules/@rsdoctor/sdk/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@rsdoctor/sdk/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rsdoctor/sdk/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" + "node": ">=12" }, - "peerDependencies": { - "postcss": "^8.4.31" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "node_modules/@rsdoctor/sdk/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "css-tree": "~2.2.0" + "side-channel": "^1.0.6" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "node_modules/@rsdoctor/sdk/node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, "license": "MIT", "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" + "node": ">= 0.8" } }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "node_modules/@rsdoctor/sdk/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "license": "MIT", + "license": "BSD-3-Clause", "engines": { "node": ">= 12" } }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "node_modules/@rsdoctor/sdk/node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.6" } }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "node_modules/@rsdoctor/types": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rsdoctor/types/-/types-1.2.3.tgz", + "integrity": "sha512-UMh4zdyKs3K4Jh7YQvHiaXKY9c7gFwCUcRaPtpB4XjlzE3lML21d0SBAXkGduwz9AmhuTRQCqaLKA2NNuDUivQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" + "@types/connect": "3.4.38", + "@types/estree": "1.0.5", + "@types/tapable": "2.2.7", + "source-map": "^0.7.4" }, - "engines": { - "node": ">= 0.4" + "peerDependencies": { + "@rspack/core": "*", + "webpack": "5.x" }, - "funding": { - "url": "https://github.com/sponsors/inspect-js" + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "node_modules/@rsdoctor/types/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rsdoctor/types/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/@rsdoctor/utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rsdoctor/utils/-/utils-1.2.3.tgz", + "integrity": "sha512-HawWrcqXeqdhj4dKhdjJg4BXvstcQauYSRx0cnYH78f7z9PW60Smr6vYpByXC87rK3JKpa6CNiZi+qhI5yTAog==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "@babel/code-frame": "7.26.2", + "@rsdoctor/types": "1.2.3", + "@types/estree": "1.0.5", + "acorn": "^8.10.0", + "acorn-import-attributes": "^1.9.5", + "acorn-walk": "8.3.4", + "connect": "3.7.0", + "deep-eql": "4.1.4", + "envinfo": "7.14.0", + "filesize": "^10.1.6", + "fs-extra": "^11.1.1", + "get-port": "5.1.1", + "json-stream-stringify": "3.0.1", + "lines-and-columns": "2.0.4", + "picocolors": "^1.1.1", + "rslog": "^1.2.9", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/@rsdoctor/utils/node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6.9.0" } }, - "node_modules/dayjs": { - "version": "1.11.13", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "node_modules/@rsdoctor/utils/node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true, "license": "MIT" }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "node_modules/@rsdoctor/utils/node_modules/lines-and-columns": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/decode-named-character-reference": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz", - "integrity": "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==", + "node_modules/@rspack/binding": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@rspack/binding/-/binding-1.5.7.tgz", + "integrity": "sha512-/fFrf4Yu8Tc0yXBw33g2++turdld1MDphLiLg05bx92fOVI1MafocwPvm35e3y1z7CtlQJ2Bmvzhi6APJShKxg==", "dev": true, "license": "MIT", - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "optionalDependencies": { + "@rspack/binding-darwin-arm64": "1.5.7", + "@rspack/binding-darwin-x64": "1.5.7", + "@rspack/binding-linux-arm64-gnu": "1.5.7", + "@rspack/binding-linux-arm64-musl": "1.5.7", + "@rspack/binding-linux-x64-gnu": "1.5.7", + "@rspack/binding-linux-x64-musl": "1.5.7", + "@rspack/binding-wasm32-wasi": "1.5.7", + "@rspack/binding-win32-arm64-msvc": "1.5.7", + "@rspack/binding-win32-ia32-msvc": "1.5.7", + "@rspack/binding-win32-x64-msvc": "1.5.7" } }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "node_modules/@rspack/binding-darwin-arm64": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.5.7.tgz", + "integrity": "sha512-prQ/vgJxOPdlYiR4gVeOEKofTCEOu70JQIQApqFnw8lKM7rd9ag8ogDNqmc2L/GGXGHLAqds28oeKXRlzYf7+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-darwin-x64": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.5.7.tgz", + "integrity": "sha512-FPqiWSbEEerqfJrGnYe68svvl6NyuQFAb3qqFe/Q0MqFhBYmAZwa0R2/ylugCdgFLZxmkFuWqpDgItpvJb/E3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rspack/binding-linux-arm64-gnu": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.5.7.tgz", + "integrity": "sha512-fwy+NY+0CHrZqqzDrjPBlTuK53W4dG5EEg/QQFAE7KVM+okRqPk8tg45bJ5628rCNLe13GDmPIE107LmgspNqA==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/decompress": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", - "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", + "node_modules/@rspack/binding-linux-arm64-musl": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.5.7.tgz", + "integrity": "sha512-576u/0F4ZUzpHckFme4vQ0sSxjE+B/gVP4tNJ+P6bJaclXLFXV4icbjTUQwOIgmA1EQz/JFeKGGJZ4p6mowpBQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "decompress-tar": "^4.0.0", - "decompress-tarbz2": "^4.0.0", - "decompress-targz": "^4.0.0", - "decompress-unzip": "^4.0.1", - "graceful-fs": "^4.1.10", - "make-dir": "^1.0.0", - "pify": "^2.3.0", - "strip-dirs": "^2.0.0" - }, - "engines": { - "node": ">=4" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/decompress-tar": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", - "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "node_modules/@rspack/binding-linux-x64-gnu": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.5.7.tgz", + "integrity": "sha512-brSHywXjjeuWkv0ywgxS4VgDgquarEb4XGr+eXhOaPcc8x2rNefyc4hErplrI7+oxPXVuGK5VE4ZH5bj3Yknvg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "file-type": "^5.2.0", - "is-stream": "^1.1.0", - "tar-stream": "^1.5.2" - }, - "engines": { - "node": ">=4" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/decompress-tar/node_modules/file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", + "node_modules/@rspack/binding-linux-x64-musl": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.5.7.tgz", + "integrity": "sha512-HcS0DzbLlWCwVfYcWMbTgILh4GELD6m4CZoFEhIr4fJCJi0p8NgLYycy1QtDhaUjs8TKalmyMwHrJwGnD141JA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "engines": { - "node": ">=4" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/decompress-tarbz2": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", - "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "node_modules/@rspack/binding-wasm32-wasi": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.5.7.tgz", + "integrity": "sha512-uTRUEuK+TVlvUBSWXVoxD+6JTN+rvtRqVlO+A7I7VnOY7p9Rpvk1sXcHtEwg/XuDCq4DALnvlzbFLh7G3zILvw==", + "cpu": [ + "wasm32" + ], "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "decompress-tar": "^4.1.0", - "file-type": "^6.1.0", - "is-stream": "^1.1.0", - "seek-bzip": "^1.0.5", - "unbzip2-stream": "^1.0.9" - }, - "engines": { - "node": ">=4" + "@napi-rs/wasm-runtime": "^1.0.5" } }, - "node_modules/decompress-tarbz2/node_modules/file-type": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", - "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "node_modules/@rspack/binding-win32-arm64-msvc": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.5.7.tgz", + "integrity": "sha512-dFHrXRUmMTkxEn/Uw2RLbIckKfi0Zmn2NnEXwedWdyRgZW4Vhk7+VBxM22O/CHZmAGt12Ol25yTuVv58ANLEKA==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "engines": { - "node": ">=4" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/decompress-targz": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", - "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "node_modules/@rspack/binding-win32-ia32-msvc": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.5.7.tgz", + "integrity": "sha512-PNtnOIUzE9p/Fbl6l/1Zs7bhn8ccTlaHTgZgQq0sO/QxjLlbU0WPjRl+YLo27cAningSOAbANuYlN8vAcuimrw==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", - "dependencies": { - "decompress-tar": "^4.1.1", - "file-type": "^5.2.0", - "is-stream": "^1.1.0" - }, - "engines": { - "node": ">=4" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/decompress-targz/node_modules/file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", + "node_modules/@rspack/binding-win32-x64-msvc": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.5.7.tgz", + "integrity": "sha512-22gTaYkwaIUvyXRxf1RVnFTJPqF2hD1pgAQNBIz7kYybe6vvSZ6KInW4WyG4vjYKrJg/cbS4QvtlLn0lYXrdIw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "engines": { - "node": ">=4" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/decompress-unzip": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", + "node_modules/@rspack/cli": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@rspack/cli/-/cli-1.5.7.tgz", + "integrity": "sha512-oxNl4XwJFK3nsyPk2cz1eXQNZSEtSdf2lSGaKr3wG0hCy2y+M0v+muHfem+2lG4ePcocpCYSS1beQpQ/bDV0dA==", "dev": true, "license": "MIT", "dependencies": { - "file-type": "^3.8.0", - "get-stream": "^2.2.0", - "pify": "^2.3.0", - "yauzl": "^2.4.2" + "@discoveryjs/json-ext": "^0.5.7", + "@rspack/dev-server": "~1.1.4", + "colorette": "2.0.20", + "exit-hook": "^4.0.0", + "pirates": "^4.0.7", + "webpack-bundle-analyzer": "4.10.2", + "yargs": "17.7.2" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/decompress-unzip/node_modules/file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "bin": { + "rspack": "bin/rspack.js" + }, + "peerDependencies": { + "@rspack/core": "^1.0.0-alpha || ^1.x" } }, - "node_modules/decompress-unzip/node_modules/get-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==", + "node_modules/@rspack/core": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@rspack/core/-/core-1.5.7.tgz", + "integrity": "sha512-57ey3wafK/g+B9zLdCiIrX3eTK8rFEM3yvxBUb2ro3ZtAaCGm4y7xERcXZJNn4D01pjzzCJ/u1ezpQmsZYLP7A==", "dev": true, "license": "MIT", "dependencies": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" + "@module-federation/runtime-tools": "0.18.0", + "@rspack/binding": "1.5.7", + "@rspack/lite-tapable": "1.0.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decompress-unzip/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decompress/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "node": ">=18.12.0" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.1" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } } }, - "node_modules/deep-eql": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", - "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "node_modules/@rspack/dev-server": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@rspack/dev-server/-/dev-server-1.1.4.tgz", + "integrity": "sha512-kGHYX2jYf3ZiHwVl0aUEPBOBEIG1aWleCDCAi+Jg32KUu3qr/zDUpCEd0wPuHfLEgk0X0xAEYCS6JMO7nBStNQ==", "dev": true, "license": "MIT", "dependencies": { - "type-detect": "^4.0.0" + "chokidar": "^3.6.0", + "http-proxy-middleware": "^2.0.9", + "p-retry": "^6.2.0", + "webpack-dev-server": "5.2.2", + "ws": "^8.18.0" }, "engines": { - "node": ">=6" + "node": ">= 18.12.0" + }, + "peerDependencies": { + "@rspack/core": "*" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "node_modules/@rspack/dev-server/node_modules/@types/express": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz", + "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", - "license": "MIT", + "optional": true, + "peer": true, "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" } }, - "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "node_modules/@rspack/dev-server/node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "dev": true, "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" } }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "node_modules/@rspack/dev-server/node_modules/http-proxy-middleware": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", "dev": true, "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" }, "engines": { - "node": ">= 0.4" + "node": ">=12.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } } }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "node_modules/@rspack/lite-tapable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rspack/lite-tapable/-/lite-tapable-1.0.1.tgz", + "integrity": "sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==", + "dev": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=16.0.0" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "license": "MIT" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", "dev": true, "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, "engines": { - "node": ">= 0.4" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.4.0" - } - }, - "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==", - "license": "MIT", - "engines": { - "node": ">= 0.8" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" + "node": ">=14" }, - "engines": { - "node": ">=0.10" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true, - "license": "MIT" - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", "dev": true, "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" + "engines": { + "node": ">=14" }, "funding": { "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/dexie": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dexie/-/dexie-4.2.0.tgz", - "integrity": "sha512-OSeyyWOUetDy9oFWeddJgi83OnRA3hSFh3RrbltmPgqHszE9f24eUCVLI4mPg0ifsWk0lQTdnS+jyGNrPMvhDA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/didyoumean2": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/didyoumean2/-/didyoumean2-7.0.4.tgz", - "integrity": "sha512-+yW4SNY7W2DOWe2Jx5H4c2qMTFbLGM6wIyoDPkAPy66X+sD1KfYjBPAIWPVsYqMxelflaMQCloZDudELIPhLqA==", + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.24.8", - "fastest-levenshtein": "^1.0.16", - "lodash.deburr": "^4.1.0" - }, "engines": { - "node": "^18.12.0 || >=20.9.0" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", "dev": true, "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", "dev": true, "license": "MIT", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, "engines": { - "node": ">=6" - } - }, - "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" + "node": ">=12" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", "dev": true, "license": "MIT", "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" }, "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "domelementtype": "^2.3.0" + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" }, "engines": { - "node": ">= 4" + "node": ">=14" }, "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "node_modules/@svgr/core/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" }, "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", "dev": true, "license": "MIT", "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/dot-prop": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-8.0.2.tgz", - "integrity": "sha512-xaBe6ZT4DHPkg0k4Ytbvn5xoxgpG0jOS1dYxSOwAHPuNLjP3/OzN0gH55SrLqpx8cBfSaVt91lXYkApjb+nYdQ==", + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", "dev": true, "license": "MIT", "dependencies": { - "type-fest": "^3.8.0" + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" }, "engines": { - "node": ">=16" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" } }, - "node_modules/dot-prop/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, "engines": { - "node": ">=14.16" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" } }, - "node_modules/dotenv": { - "version": "17.2.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.2.tgz", - "integrity": "sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q==", + "node_modules/@svgr/plugin-svgo/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": ">=14" }, "funding": { - "url": "https://dotenvx.com" + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/download": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/download/-/download-6.2.5.tgz", - "integrity": "sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==", + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", "dev": true, "license": "MIT", "dependencies": { - "caw": "^2.0.0", - "content-disposition": "^0.5.2", - "decompress": "^4.0.0", - "ext-name": "^5.0.0", - "file-type": "5.2.0", - "filenamify": "^2.0.0", - "get-stream": "^3.0.0", - "got": "^7.0.0", - "make-dir": "^1.0.0", - "p-event": "^1.0.0", - "pify": "^3.0.0" + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" }, "engines": { - "node": ">=4" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/download/node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, + "license": "ISC", "engines": { - "node": ">= 0.6" + "node": ">=10.13.0" } }, - "node_modules/download/node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" + "tslib": "^2.4.0" } }, - "node_modules/download/node_modules/file-type": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "@types/connect": "*", + "@types/node": "*" } }, - "node_modules/download/node_modules/get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==", + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "@types/node": "*" } }, - "node_modules/download/node_modules/got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "node_modules/@types/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@types/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-kCFuWS0ebDbmxs0AXYn6e2r2nrGAb5KwQhknjSPSPgJcGd8+HVSILlUyFhGqML2gk39HcG7D1ydW9/qpYkN00Q==", "dev": true, "license": "MIT", "dependencies": { - "decompress-response": "^3.2.0", - "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - }, - "engines": { - "node": ">=4" + "@types/express": "*", + "@types/node": "*" } }, - "node_modules/download/node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "@types/node": "*" } }, - "node_modules/download/node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" } }, - "node_modules/download/node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "node_modules/@types/cookie-parser": { + "version": "1.4.9", + "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.9.tgz", + "integrity": "sha512-tGZiZ2Gtc4m3wIdLkZ8mkj1T6CEHb35+VApbL2T14Dew8HA7c+04dmKqsKRNC+8RJPm16JEK0tFSwdZqubfc4g==", "dev": true, "license": "MIT", - "engines": { - "node": ">=4" + "peerDependencies": { + "@types/express": "*" } }, - "node_modules/download/node_modules/p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", + "node_modules/@types/cors": { + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "@types/node": "*" } }, - "node_modules/download/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" } }, - "node_modules/download/node_modules/prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" } }, - "node_modules/download/node_modules/url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==", + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.3.tgz", + "integrity": "sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==", "dev": true, "license": "MIT", "dependencies": { - "prepend-http": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "*" } }, - "node_modules/downshift": { - "version": "9.0.10", - "resolved": "https://registry.npmjs.org/downshift/-/downshift-9.0.10.tgz", - "integrity": "sha512-TP/iqV6bBok6eGD5tZ8boM8Xt7/+DZvnVNr8cNIhbAm2oUBd79Tudiccs2hbcV9p7xAgS/ozE7Hxy3a9QqS6Mw==", + "node_modules/@types/express-serve-static-core": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.6.tgz", + "integrity": "sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.24.5", - "compute-scroll-into-view": "^3.1.0", - "prop-types": "^15.8.1", - "react-is": "18.2.0", - "tslib": "^2.6.2" - }, - "peerDependencies": { - "react": ">=16.12.0" + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" } }, - "node_modules/downshift/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "node_modules/@types/fs-extra": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.4.tgz", + "integrity": "sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==", "dev": true, - "license": "MIT" - }, - "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==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" + "@types/jsonfile": "*", + "@types/node": "*" } }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "node_modules/@types/he": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/he/-/he-1.2.3.tgz", + "integrity": "sha512-q67/qwlxblDzEDvzHhVkwc1gzVWxaNxeyHUBF4xElrvjL11O+Ytze+1fGpBHlr/H9myiBUaUXNnNPmBHxxfAcA==", "dev": true, "license": "MIT" }, - "node_modules/duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", "dev": true, - "license": "BSD-3-Clause" - }, - "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==", "license": "MIT" }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dev": true, - "license": "Apache-2.0", + "node_modules/@types/http-proxy": { + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "license": "MIT", "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" + "@types/node": "*" } }, - "node_modules/electron-to-chromium": { - "version": "1.5.222", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.222.tgz", - "integrity": "sha512-gA7psSwSwQRE60CEoLz6JBCQPIxNeuzB2nL8vE03GK/OHxlvykbLyeiumQy1iH5C2f3YbRAZpGCMT12a/9ih9w==", + "node_modules/@types/insane": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/insane/-/insane-1.0.0.tgz", + "integrity": "sha512-9FNbmwdaQezEszc5B/w4kRSpMJMOVj+gX7CKSbBCFO4WPiUqKO3HJlUNXzjtus0w5tF2BOJoKTbyps/Envlg/Q==", "dev": true, - "license": "ISC" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "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==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, "license": "MIT", "dependencies": { - "once": "^1.4.0" + "@types/istanbul-lib-coverage": "*" } }, - "node_modules/engine.io": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", - "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.7.2", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.17.1" - }, - "engines": { - "node": ">=10.2.0" + "@types/istanbul-lib-report": "*" } }, - "node_modules/engine.io-parser": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", - "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jsonfile": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz", + "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=10.0.0" + "dependencies": { + "@types/node": "*" } }, - "node_modules/engine.io/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/@types/lodash": { + "version": "4.17.16", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.16.tgz", + "integrity": "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.18.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.6.tgz", + "integrity": "sha512-r8uszLPpeIWbNKtvWRt/DbVi5zbqZyj1PTmhRMqBMvDnaz1QpmSKujUtJLrqGZeoM8v72MfYggDceY4K1itzWQ==", "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" + "dependencies": { + "undici-types": "~6.21.0" } }, - "node_modules/engine.io/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "node_modules/@types/node-forge": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.14.tgz", + "integrity": "sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==", "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "@types/node": "*" } }, - "node_modules/engine.io/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "node_modules/@types/prismjs": { + "version": "1.26.5", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", + "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } + "license": "MIT" }, - "node_modules/engine.io/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "node_modules/@types/qs": { + "version": "6.9.18", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", + "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } + "license": "MIT" }, - "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" + "@types/mime": "^1", + "@types/node": "*" } }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" } }, - "node_modules/env-editor": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-1.1.0.tgz", - "integrity": "sha512-7AXskzN6T7Q9TFcKAGJprUbpQa4i1VsAetO9rdBqbGMGlragTziBgWt4pVYJMBWHQlLoX0buy6WFikzPH4Qjpw==", + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "@types/node": "*" } }, - "node_modules/envinfo": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", - "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", + "node_modules/@types/tapable": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-2.2.7.tgz", + "integrity": "sha512-D6QzACV9vNX3r8HQQNTOnpG+Bv1rko+yEA82wKs3O9CQ5+XW7HI7TED17/UE7+5dIxyxZIWTxKbsBeF6uKFCwA==", "dev": true, "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" + "dependencies": { + "tapable": "^2.2.0" } }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT" + }, + "node_modules/@types/webpack-hot-middleware": { + "version": "2.25.10", + "resolved": "https://registry.npmjs.org/@types/webpack-hot-middleware/-/webpack-hot-middleware-2.25.10.tgz", + "integrity": "sha512-MpUbBgM2b3Sfh9lB/S6aZP0mIPXunBNBAV+eod39fdzHWTCIrtbRfUvfPXNixi0cEIR9G3S2j0mCWNH06cFlmw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "@types/connect": "*", + "tapable": "^2.2.0", + "webpack": "^5" } }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", "dev": true, "license": "MIT", "dependencies": { - "is-arrayish": "^0.2.1" + "@types/node": "*" } }, - "node_modules/es-abstract": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", - "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" } }, - "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==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.44.1.tgz", + "integrity": "sha512-molgphGqOBT7t4YKCSkbasmu1tb1MgrZ2szGzHbclF7PNmOkSTQVHy+2jXOSnxvR3+Xe1yySHFZoqMpz3TfQsw==", + "dev": true, "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.44.1", + "@typescript-eslint/type-utils": "8.44.1", + "@typescript-eslint/utils": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.44.1", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "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==", + "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": ">= 0.4" + "node": ">= 4" } }, - "node_modules/es-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "node_modules/@typescript-eslint/parser": { + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.1.tgz", + "integrity": "sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==", "dev": true, - "license": "MIT" - }, - "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==", "license": "MIT", + "peer": true, "dependencies": { - "es-errors": "^1.3.0" + "@typescript-eslint/scope-manager": "8.44.1", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/typescript-estree": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1", + "debug": "^4.3.4" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.1.tgz", + "integrity": "sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==", "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" + "@typescript-eslint/tsconfig-utils": "^8.44.1", + "@typescript-eslint/types": "^8.44.1", + "debug": "^4.3.4" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/es-shim-unscopables": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.1.tgz", + "integrity": "sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.1.tgz", + "integrity": "sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==", "dev": true, "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" - }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/es6-promisify": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.1.tgz", - "integrity": "sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.44.1.tgz", + "integrity": "sha512-KdEerZqHWXsRNKjF9NYswNISnFzXfXNDfPxoTh7tqohU/PRIbwTmsjGK6V9/RTYWau7NZvfo52lgVk+sJh0K3g==", "dev": true, - "license": "MIT" - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/typescript-estree": "8.44.1", + "@typescript-eslint/utils": "8.44.1", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, "engines": { - "node": ">=6" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "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==", - "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", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/@typescript-eslint/types": { + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.1.tgz", + "integrity": "sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/eslint": { - "version": "9.36.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz", - "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.1.tgz", + "integrity": "sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.1", - "@eslint/core": "^0.15.2", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.36.0", - "@eslint/plugin-kit": "^0.3.5", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" + "@typescript-eslint/project-service": "8.44.1", + "@typescript-eslint/tsconfig-utils": "8.44.1", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.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": "^2.1.0" }, - "bin": { - "eslint": "bin/eslint.js" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.44.1.tgz", + "integrity": "sha512-DpX5Fp6edTlocMCwA+mHY8Mra+pPjRZ0TfHkXI8QFelIKcbADQz1LUPNtzOFUriBB2UYqw4Pi9+xV4w9ZczHFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.44.1", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/typescript-estree": "8.44.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://eslint.org/donate" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/eslint-compat-utils": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", - "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.1.tgz", + "integrity": "sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==", "dev": true, "license": "MIT", "dependencies": { - "semver": "^7.5.4" + "@typescript-eslint/types": "8.44.1", + "eslint-visitor-keys": "^4.2.1" }, "engines": { - "node": ">=12" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "eslint": ">=6.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/eslint-config-prettier": { - "version": "10.1.8", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", - "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/eslint-config-prettier" - }, - "peerDependencies": { - "eslint": ">=7.0.0" + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "node_modules/@vscode/l10n": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz", + "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vscode/web-custom-data": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@vscode/web-custom-data/-/web-custom-data-0.6.0.tgz", + "integrity": "sha512-ZcDarMVk4SquxEtgVcFQc+9DoWTyT3s+lUjreNQz1fmcoCB21DF+wSgy4H9BGcicPUInmiJnGDxRJ9U7LjOmGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, "license": "MIT", "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" } }, - "node_modules/eslint-module-utils": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", - "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, "license": "MIT", "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "@xtuc/ieee754": "^1.2.0" } }, - "node_modules/eslint-plugin-es-x": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", - "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, - "funding": [ - "https://github.com/sponsors/ota-meshi", - "https://opencollective.com/eslint" - ], "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.1.2", - "@eslint-community/regexpp": "^4.11.0", - "eslint-compat-utils": "^0.5.1" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": ">=8" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, - "node_modules/eslint-plugin-import": { - "version": "2.32.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", - "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, "license": "MIT", "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.9", - "array.prototype.findlastindex": "^1.2.6", - "array.prototype.flat": "^1.3.3", - "array.prototype.flatmap": "^1.3.3", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.1", - "hasown": "^2.0.2", - "is-core-module": "^2.16.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.1", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.9", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, - "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" } }, - "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } + "license": "BSD-3-Clause" }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } + "license": "Apache-2.0" }, - "node_modules/eslint-plugin-jsdoc": { - "version": "55.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-55.0.3.tgz", - "integrity": "sha512-xU2/QZgBXIGFXOzyWsNaSwrcF80Rq2h084GvIU+pkfzwE55xnr+ShEUfVL6+fZ0Jrh0hWGHdk0RiN0axhK1new==", + "node_modules/@zip.js/zip.js": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.8.2.tgz", + "integrity": "sha512-PI6UdgpSeVoGvzguKHmy2bwOqI3UYkntLZOCpyJSKIi7234c5aJmQYkJB/P4P2YUJkqhbqvu7iM2/0eJZ178nA==", "dev": true, "license": "BSD-3-Clause", - "dependencies": { - "@es-joy/jsdoccomment": "~0.56.0", - "are-docs-informative": "^0.0.2", - "comment-parser": "1.4.1", - "debug": "^4.4.1", - "escape-string-regexp": "^4.0.0", - "espree": "^10.4.0", - "esquery": "^1.6.0", - "object-deep-merge": "^1.0.5", - "parse-imports-exports": "^0.2.4", - "semver": "^7.7.2", - "spdx-expression-parse": "^4.0.0" - }, "engines": { - "node": ">=20.11.0" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + "bun": ">=0.7.0", + "deno": ">=1.0.0", + "node": ">=16.5.0" } }, - "node_modules/eslint-plugin-lit": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-lit/-/eslint-plugin-lit-2.1.1.tgz", - "integrity": "sha512-qmyAOnnTCdS+vDnNxtCoF0icSKIio4GUv6ZLnaCtTX6G/YezRa6Ag6tOQ+MfV5Elvtw9CIXeliRX4mIBSwrPIA==", - "dev": true, + "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==", "license": "MIT", "dependencies": { - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1" + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" }, "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "eslint": ">= 8" + "node": ">= 0.6" } }, - "node_modules/eslint-plugin-lit/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true, - "license": "MIT" + "node_modules/accepts/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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, - "node_modules/eslint-plugin-n": { - "version": "17.23.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.1.tgz", - "integrity": "sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==", - "dev": true, + "node_modules/accepts/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==", "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.5.0", - "enhanced-resolve": "^5.17.1", - "eslint-plugin-es-x": "^7.8.0", - "get-tsconfig": "^4.8.1", - "globals": "^15.11.0", - "globrex": "^0.1.2", - "ignore": "^5.3.2", - "semver": "^7.6.3", - "ts-declaration-location": "^1.0.6" + "mime-db": "^1.54.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, + "license": "MIT", "peerDependencies": { - "eslint": ">=8.23.0" + "acorn": "^8" } }, - "node_modules/eslint-plugin-n/node_modules/globals": { - "version": "15.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/eslint-plugin-unicorn": { - "version": "61.0.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-61.0.2.tgz", - "integrity": "sha512-zLihukvneYT7f74GNbVJXfWIiNQmkc/a9vYBTE4qPkQZswolWNdu+Wsp9sIXno1JOzdn6OUwLPd19ekXVkahRA==", + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "@eslint-community/eslint-utils": "^4.7.0", - "@eslint/plugin-kit": "^0.3.3", - "change-case": "^5.4.4", - "ci-info": "^4.3.0", - "clean-regexp": "^1.0.0", - "core-js-compat": "^3.44.0", - "esquery": "^1.6.0", - "find-up-simple": "^1.0.1", - "globals": "^16.3.0", - "indent-string": "^5.0.0", - "is-builtin-module": "^5.0.0", - "jsesc": "^3.1.0", - "pluralize": "^8.0.0", - "regexp-tree": "^0.1.27", - "regjsparser": "^0.12.0", - "semver": "^7.7.2", - "strip-indent": "^4.0.0" + "acorn": "^8.11.0" }, "engines": { - "node": "^20.10.0 || >=21.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" - }, - "peerDependencies": { - "eslint": ">=9.29.0" + "node": ">=0.4.0" } }, - "node_modules/eslint-plugin-wc": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-wc/-/eslint-plugin-wc-3.0.1.tgz", - "integrity": "sha512-0p1wkSlA2Ue3FA4qW+5LZ+15sy0p1nUyVl1eyBMLq4rtN1LtE9IdI49BXNWMz8N8bM/y7Ulx8SWGAni5f8XO5g==", + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", "dev": true, "license": "MIT", "dependencies": { - "is-valid-element-name": "^1.0.0", - "js-levenshtein-esm": "^2.0.0" + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" }, - "peerDependencies": { - "eslint": ">=8.40.0" + "engines": { + "node": ">=8.9" } }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://opencollective.com/eslint" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", "dev": true, + "engines": [ + "node >= 0.8.0" + ], "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "bin": { + "ansi-html": "bin/ansi-html" } }, - "node_modules/eslint/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, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { - "node": ">=10.13.0" + "node": ">=8" } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "color-convert": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "license": "BSD-2-Clause", + "license": "ISC", "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 8" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=8.6" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=14" } }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "estraverse": "^5.2.0" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { - "node": ">=4.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } + "license": "MIT" }, - "node_modules/estree-util-is-identifier-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", - "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "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==", "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=8" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "license": "MIT" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, "engines": { - "node": ">=0.8.x" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, "license": "MIT", "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "6.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", - "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, "license": "MIT", "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { - "node": ">=4.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/execa/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, "license": "MIT", "dependencies": { - "pump": "^3.0.0" + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/execa/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "node_modules/assignment": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assignment/-/assignment-2.0.0.tgz", + "integrity": "sha512-naMULXjtgCs9SVUEtyvJNt68aF18em7/W+dhbR59kbz9cXWPEvUkCun2tqlgqRPSqZaKPpqLc5ZnwL8jVmJRvw==" + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/execa/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" + "license": "MIT", + "engines": { + "node": ">= 0.4" } }, - "node_modules/execa/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "shebang-regex": "^1.0.0" + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" }, "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/execa/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "node_modules/axios": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", + "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } }, - "node_modules/execa/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz", + "integrity": "sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.4", + "semver": "^6.3.1" }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", "bin": { - "which": "bin/which" + "semver": "bin/semver.js" } }, - "node_modules/executable": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", - "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz", + "integrity": "sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ==", "dev": true, "license": "MIT", "dependencies": { - "pify": "^2.2.0" + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" }, - "engines": { - "node": ">=4" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/executable/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz", + "integrity": "sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.4" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/exenv": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", - "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==", + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, - "license": "BSD-3-Clause" + "license": "MIT" }, - "node_modules/exit-hook": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-4.0.0.tgz", - "integrity": "sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==", + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^4.5.0 || >= 5.9" } }, - "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==", - "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/baseline-browser-mapping": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.6.tgz", + "integrity": "sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" } }, - "node_modules/express/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==", + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": "*" } }, - "node_modules/express/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==", + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, "engines": { - "node": ">= 0.6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ext-list": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", - "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", - "dev": true, + "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==", "license": "MIT", "dependencies": { - "mime-db": "^1.28.0" + "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": ">=0.10.0" + "node": ">=18" } }, - "node_modules/ext-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", - "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "node_modules/bonjour-service": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz", + "integrity": "sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==", "dev": true, "license": "MIT", "dependencies": { - "ext-list": "^2.0.0", - "sort-keys-length": "^1.0.0" - }, - "engines": { - "node": ">=4" + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true, - "license": "MIT" + "license": "ISC" }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" + "balanced-match": "^1.0.0" } }, - "node_modules/external-editor/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "fill-range": "^7.1.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "license": "BSD-2-Clause", + "node_modules/browserslist": { + "version": "4.26.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.2.tgz", + "integrity": "sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" + "baseline-browser-mapping": "^2.8.3", + "caniuse-lite": "^1.0.30001741", + "electron-to-chromium": "^1.5.218", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" }, "bin": { - "extract-zip": "cli.js" + "browserslist": "cli.js" }, "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "node_modules/browserslist-load-config": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserslist-load-config/-/browserslist-load-config-1.0.1.tgz", + "integrity": "sha512-orLR5HAoQugQNVUXUwNd+GAAwl3H64KLIwoMFBNW0AbMSqX2Lxs4ZV2/5UoNrVQlQqF9ygychiu7Svr/99bLtg==", "dev": true, "license": "MIT" }, - "node_modules/fast-equals": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz", - "integrity": "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==", + "node_modules/browserslist-to-es-version": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/browserslist-to-es-version/-/browserslist-to-es-version-1.1.1.tgz", + "integrity": "sha512-jfRStKh3aQ8HqQA45MWHYYtzhhlMM8X3cffhXJmMRlRWEu8+fk9bN8dYEsfY7j5pAvtSK8ehelUSvyDmEKijOg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.0.0" + "dependencies": { + "browserslist": "^4.25.1" } }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "node_modules/buffer-builder": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz", + "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==", "dev": true, + "license": "MIT/X11" + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, "engines": { - "node": ">=8.6.0" + "node": "*" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "license": "MIT" }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "node_modules/builtin-modules": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.0.0.tgz", + "integrity": "sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, - "node_modules/fast-xml-parser": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz", - "integrity": "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==", + "node_modules/cacheable": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.10.4.tgz", + "integrity": "sha512-Gd7ccIUkZ9TE2odLQVS+PDjIvQCdJKUlLdJRVvZu0aipj07Qfx+XIej7hhDrKGGoIxV5m5fT/kOJNJPQhQneRg==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], "license": "MIT", "dependencies": { - "strnum": "^1.1.1" - }, - "bin": { - "fxparser": "src/cli/cli.js" + "hookified": "^1.11.0", + "keyv": "^5.5.0" } }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "node_modules/cacheable/node_modules/keyv": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.0.tgz", + "integrity": "sha512-QG7qR2tijh1ftOvClut4YKKg1iW6cx3GZsKoGyJPxHkGWK9oJhG9P3j5deP0QQOGDowBMVQFaP+Vm4NpGYvmIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, "engines": { - "node": ">= 4.9.1" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fastq": { - "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", + "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==", + "license": "MIT", "dependencies": { - "reusify": "^1.0.4" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "license": "Apache-2.0", + "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==", + "license": "MIT", "dependencies": { - "websocket-driver": ">=0.5.1" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { - "node": ">=0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, "license": "MIT", - "dependencies": { - "pend": "~1.2.0" + "engines": { + "node": ">=6" } }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, "license": "MIT", "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" + "node": ">=10" }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 6" + } }, - "node_modules/feed": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", - "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "dev": true, "license": "MIT", "dependencies": { - "xml-js": "^1.6.11" - }, - "engines": { - "node": ">=0.4.0" + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" } }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "node_modules/caniuse-lite": { + "version": "1.0.30001743", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001743.tgz", + "integrity": "sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==", + "dev": true, "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" + "type": "opencollective", + "url": "https://opencollective.com/browserslist" }, { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^12.20 || >= 14.13" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "node_modules/change-case": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", + "dev": true, "license": "MIT" }, - "node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "license": "MIT", "dependencies": { - "escape-string-regexp": "^1.0.5" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" }, "engines": { - "node": ">=4" + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=0.8.0" + "node": ">=18" } }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, "engines": { - "node": ">=16.0.0" + "node": ">=6.0" } }, - "node_modules/file-type": { - "version": "19.6.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-19.6.0.tgz", - "integrity": "sha512-VZR5I7k5wkD0HgFnMsq5hOsSc710MJMu5Nc5QYsbe38NN5iPV/XTObYLc/cpttRTf6lX538+5uO1ZQRhYibiZQ==", + "node_modules/ci-info": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", + "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "license": "MIT", - "dependencies": { - "get-stream": "^9.0.1", - "strtok3": "^9.0.1", - "token-types": "^6.0.0", - "uint8array-extras": "^1.3.0" - }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sindresorhus/file-type?sponsor=1" + "node": ">=8" } }, - "node_modules/file-type/node_modules/get-stream": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", - "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "node_modules/clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", "dev": true, "license": "MIT", "dependencies": { - "@sec-ant/readable-stream": "^0.4.1", - "is-stream": "^4.0.1" + "escape-string-regexp": "^1.0.5" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/file-type/node_modules/is-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", - "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "node_modules/clean-regexp/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" + "node": ">=0.8.0" } }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/filename-reserved-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/filenamify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz", - "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==", + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "license": "MIT", "dependencies": { - "filename-reserved-regex": "^2.0.0", - "strip-outer": "^1.0.0", - "trim-repeated": "^1.0.0" + "isobject": "^3.0.1" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/filesize": { - "version": "10.1.6", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz", - "integrity": "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 10.4.0" + "node_modules/codemirror": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.2.tgz", + "integrity": "sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/commands": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/search": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "color-name": "~1.1.4" }, "engines": { - "node": ">=8" + "node": ">=7.0.0" } }, - "node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorjs.io": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", + "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "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" + "delayed-stream": "~1.0.0" }, "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", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 10" } }, - "node_modules/find-up-simple": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", - "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "node_modules/comment-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 12.0.0" } }, - "node_modules/find-versions": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", - "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", - "dev": true, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "license": "MIT", "dependencies": { - "semver-regex": "^2.0.0" + "mime-db": ">= 1.43.0 < 2" }, "engines": { - "node": ">=6" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" + "node": ">= 0.6" } }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, + "node_modules/compression": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", "license": "MIT", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" }, "engines": { - "node": ">=16" + "node": ">= 0.8.0" } }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } }, - "node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "dev": true, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", "license": "MIT", "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "node": ">= 0.6" } }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "node_modules/compute-scroll-into-view": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz", + "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==", "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, - "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true, + "license": "MIT" + }, + "node_modules/concurrently": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.1.tgz", + "integrity": "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==", "license": "MIT", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "chalk": "4.1.2", + "rxjs": "7.8.2", + "shell-quote": "1.8.3", + "supports-color": "8.1.1", + "tree-kill": "1.2.2", + "yargs": "17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" }, "engines": { - "node": ">= 6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" } }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", "dependencies": { - "fetch-blob": "^3.1.2" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/forwarded-parse": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/forwarded-parse/-/forwarded-parse-2.1.2.tgz", - "integrity": "sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "dev": true, "license": "MIT", - "engines": { - "node": "*" + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" + "engines": { + "node": ">= 0.10.0" } }, - "node_modules/fresh": { + "node_modules/connect-history-api-fallback": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=0.8" } }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" + "ms": "2.0.0" } }, - "node_modules/from2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "node_modules/connect/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, - "node_modules/from2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "node_modules/connect/node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/from2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, "license": "MIT" }, - "node_modules/from2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/connect/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/front-matter": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", - "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==", + "node_modules/connect/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true, "license": "MIT", - "dependencies": { - "js-yaml": "^3.13.1" + "engines": { + "node": ">= 0.6" } }, - "node_modules/front-matter/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, + "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==", "license": "MIT", "dependencies": { - "sprintf-js": "~1.0.2" + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" } }, - "node_modules/front-matter/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, + "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==", "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">= 0.6" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true, "license": "MIT" }, - "node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", - "dev": true, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, "engines": { - "node": ">=14.14" + "node": ">= 0.6" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, + "node_modules/cookie-parser": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", + "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "cookie": "0.7.2", + "cookie-signature": "1.0.6" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">= 0.8.0" } }, - "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==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/cookie-parser/node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" }, - "node_modules/function-timeout": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-1.0.2.tgz", - "integrity": "sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==", - "dev": true, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.6.0" } }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "node_modules/core-js-compat": { + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.44.0.tgz", + "integrity": "sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" + "browserslist": "^4.25.1" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "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", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, "engines": { - "node": ">=6.9.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">= 8" } }, - "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==", - "license": "MIT", + "node_modules/css-blank-pseudo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", + "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "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" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/get-port": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", - "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", + "node_modules/css-declaration-sorter": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", + "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", "dev": true, - "license": "MIT", + "license": "ISC", "engines": { - "node": ">=8" + "node": "^14 || ^16 || >=18" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "postcss": "^8.0.9" } }, - "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==", + "node_modules/css-functions-list": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", + "dev": true, "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, "engines": { - "node": ">= 0.4" + "node": ">=12 || >=16" } }, - "node_modules/get-proxy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", - "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", + "node_modules/css-has-pseudo": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.3.tgz", + "integrity": "sha512-oG+vKuGyqe/xvEMoxAQrhi7uY16deJR3i7wwhBerVrGQKSqUC5GiOVxTpM9F9B9hw0J+eKeOWLH7E9gZ1Dr5rA==", "dev": true, - "license": "MIT", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", "dependencies": { - "npm-conf": "^1.1.0" + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=4" + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "node_modules/css-loader": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz", + "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==", + "dev": true, "license": "MIT", "dependencies": { - "pump": "^3.0.0" + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" }, "engines": { - "node": ">=8" + "node": ">= 18.12.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.27.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "node_modules/css-minimizer-webpack-plugin": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-7.0.2.tgz", + "integrity": "sha512-nBRWZtI77PBZQgcXMNqiIXVshiQOVLGSf2qX/WZfG8IQfMbeHUMXaBWQmiiSTmPJUflQxHjZjzAmuyO7tpL2Jg==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" + "@jridgewell/trace-mapping": "^0.3.25", + "cssnano": "^7.0.4", + "jest-worker": "^29.7.0", + "postcss": "^8.4.40", + "schema-utils": "^4.2.0", + "serialize-javascript": "^6.0.2" }, "engines": { - "node": ">= 0.4" + "node": ">= 18.12.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } } }, - "node_modules/get-tsconfig": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", - "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", + "node_modules/css-prefers-color-scheme": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", + "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + "peerDependencies": { + "postcss": "^8.4" } }, - "node_modules/gifsicle": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/gifsicle/-/gifsicle-5.3.0.tgz", - "integrity": "sha512-FJTpgdj1Ow/FITB7SVza5HlzXa+/lqEY0tHQazAJbuAdvyJtkH4wIdsR2K414oaTwRXHFLLF+tYbipj+OpYg+Q==", + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, - "hasInstallScript": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "bin-build": "^3.0.0", - "bin-wrapper": "^4.0.0", - "execa": "^5.0.0" - }, - "bin": { - "gifsicle": "cli.js" - }, - "engines": { - "node": ">=10" + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" }, "funding": { - "url": "https://github.com/imagemin/gisicle-bin?sponsor=1" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/gifsicle/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", "dev": true, "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/gifsicle/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, - "node_modules/gifsicle/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "engines": { - "node": ">=8" + "node": ">= 6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/fb55" } }, - "node_modules/gifsicle/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "node_modules/cssdb": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.4.2.tgz", + "integrity": "sha512-PzjkRkRUS+IHDJohtxkIczlxPPZqRo0nXplsYXOMBRPjcVRjj1W4DfvRgshUYTVuUigU7ptVYkFJQ7abUB0nyg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ], + "license": "MIT-0" }, - "node_modules/gifsicle/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" + "bin": { + "cssesc": "bin/cssesc" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/gifsicle/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/cssnano": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.0.6.tgz", + "integrity": "sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw==", "dev": true, "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "cssnano-preset-default": "^7.0.6", + "lilconfig": "^3.1.2" }, "engines": { - "node": ">=6" + "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gifsicle/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" + "type": "opencollective", + "url": "https://opencollective.com/cssnano" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/cssnano-preset-default": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.6.tgz", + "integrity": "sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" + "browserslist": "^4.23.3", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^5.0.0", + "postcss-calc": "^10.0.2", + "postcss-colormin": "^7.0.2", + "postcss-convert-values": "^7.0.4", + "postcss-discard-comments": "^7.0.3", + "postcss-discard-duplicates": "^7.0.1", + "postcss-discard-empty": "^7.0.0", + "postcss-discard-overridden": "^7.0.0", + "postcss-merge-longhand": "^7.0.4", + "postcss-merge-rules": "^7.0.4", + "postcss-minify-font-values": "^7.0.0", + "postcss-minify-gradients": "^7.0.0", + "postcss-minify-params": "^7.0.2", + "postcss-minify-selectors": "^7.0.4", + "postcss-normalize-charset": "^7.0.0", + "postcss-normalize-display-values": "^7.0.0", + "postcss-normalize-positions": "^7.0.0", + "postcss-normalize-repeat-style": "^7.0.0", + "postcss-normalize-string": "^7.0.0", + "postcss-normalize-timing-functions": "^7.0.0", + "postcss-normalize-unicode": "^7.0.2", + "postcss-normalize-url": "^7.0.0", + "postcss-normalize-whitespace": "^7.0.0", + "postcss-ordered-values": "^7.0.1", + "postcss-reduce-initial": "^7.0.2", + "postcss-reduce-transforms": "^7.0.0", + "postcss-svgo": "^7.0.1", + "postcss-unique-selectors": "^7.0.3" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regex.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.0.1.tgz", - "integrity": "sha512-CG/iEvgQqfzoVsMUbxSJcwbG2JwyZ3naEqPkeltwl0BSS8Bp83k3xlGms+0QdWFUAwV+uvo80wNswKF6FWEkKg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "node": "^18.12.0 || ^20.9.0 || >=22.0" }, "peerDependencies": { - "tslib": "2" + "postcss": "^8.4.31" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/cssnano-utils": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.0.tgz", + "integrity": "sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==", "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, "engines": { - "node": "*" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" } }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "dev": true, "license": "MIT", "dependencies": { - "global-prefix": "^3.0.0" + "css-tree": "~2.2.0" }, "engines": { - "node": ">=6" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", "dev": true, "license": "MIT", "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" }, "engines": { - "node": ">=6" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "license": "CC0-1.0" + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" } }, - "node_modules/globals": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", - "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, "engines": { - "node": ">=18" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, "license": "MIT", "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/inspect-js" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, "license": "MIT", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/globjoin": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", - "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", "dev": true, "license": "MIT" }, - "node_modules/globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", "dev": true, "license": "MIT" }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">= 0.4" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "license": "MIT", "dependencies": { - "duplexer": "^0.1.2" + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true, - "license": "MIT" + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, "engines": { "node": ">= 0.4" }, @@ -15390,36 +8587,28 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "license": "MIT", "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "license": "MIT", "dependencies": { - "dunder-proto": "^1.0.0" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -15428,1640 +8617,1571 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-symbol-support-x": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", - "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, "license": "MIT", "engines": { - "node": "*" + "node": ">=0.4.0" } }, - "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==", + "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==", "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=0.10" } }, - "node_modules/has-to-string-tag-x": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", - "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/dexie": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dexie/-/dexie-4.2.0.tgz", + "integrity": "sha512-OSeyyWOUetDy9oFWeddJgi83OnRA3hSFh3RrbltmPgqHszE9f24eUCVLI4mPg0ifsWk0lQTdnS+jyGNrPMvhDA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/didyoumean2": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/didyoumean2/-/didyoumean2-7.0.4.tgz", + "integrity": "sha512-+yW4SNY7W2DOWe2Jx5H4c2qMTFbLGM6wIyoDPkAPy66X+sD1KfYjBPAIWPVsYqMxelflaMQCloZDudELIPhLqA==", "dev": true, "license": "MIT", "dependencies": { - "has-symbol-support-x": "^1.4.1" + "@babel/runtime": "^7.24.8", + "fastest-levenshtein": "^1.0.16", + "lodash.deburr": "^4.1.0" }, "engines": { - "node": "*" + "node": "^18.12.0 || >=20.9.0" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "license": "MIT", "dependencies": { - "has-symbols": "^1.0.3" + "path-type": "^4.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, "license": "MIT", "dependencies": { - "function-bind": "^1.1.2" + "@leichtgewicht/ip-codec": "^2.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">=6" } }, - "node_modules/hast-util-embedded": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", - "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==", + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-is-element": "^3.0.0" + "esutils": "^2.0.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/hast-util-format": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hast-util-format/-/hast-util-format-1.1.0.tgz", - "integrity": "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==", + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-embedded": "^3.0.0", - "hast-util-minify-whitespace": "^1.0.0", - "hast-util-phrasing": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "html-whitespace-sensitive-tag-names": "^3.0.0", - "unist-util-visit-parents": "^6.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/hast-util-from-html": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", - "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "devlop": "^1.1.0", - "hast-util-from-parse5": "^8.0.0", - "parse5": "^7.0.0", - "vfile": "^6.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" }, - "node_modules/hast-util-from-parse5": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", - "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "devlop": "^1.0.0", - "hastscript": "^9.0.0", - "property-information": "^7.0.0", - "vfile": "^6.0.0", - "vfile-location": "^5.0.0", - "web-namespaces": "^2.0.0" + "domelementtype": "^2.3.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-has-property": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", - "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" + "engines": { + "node": ">= 4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/hast-util-is-body-ok-link": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz", - "integrity": "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==", + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "@types/hast": "^3.0.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/hast-util-is-element": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", - "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "dev": true, "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "no-case": "^3.0.4", + "tslib": "^2.0.3" } }, - "node_modules/hast-util-minify-whitespace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz", - "integrity": "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==", + "node_modules/downshift": { + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/downshift/-/downshift-9.0.10.tgz", + "integrity": "sha512-TP/iqV6bBok6eGD5tZ8boM8Xt7/+DZvnVNr8cNIhbAm2oUBd79Tudiccs2hbcV9p7xAgS/ozE7Hxy3a9QqS6Mw==", "dev": true, "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-embedded": "^3.0.0", - "hast-util-is-element": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "unist-util-is": "^6.0.0" + "@babel/runtime": "^7.24.5", + "compute-scroll-into-view": "^3.1.0", + "prop-types": "^15.8.1", + "react-is": "18.2.0", + "tslib": "^2.6.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "peerDependencies": { + "react": ">=16.12.0" } }, - "node_modules/hast-util-parse-selector": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", - "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "node_modules/downshift/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "license": "MIT" }, - "node_modules/hast-util-phrasing": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz", - "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==", - "dev": true, + "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==", "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-embedded": "^3.0.0", - "hast-util-has-property": "^3.0.0", - "hast-util-is-body-ok-link": "^3.0.0", - "hast-util-is-element": "^3.0.0" + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 0.4" } }, - "node_modules/hast-util-raw": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", - "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "hast-util-from-parse5": "^8.0.0", - "hast-util-to-parse5": "^8.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "parse5": "^7.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "license": "MIT" }, - "node_modules/hast-util-sanitize": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-5.0.2.tgz", - "integrity": "sha512-3yTWghByc50aGS7JlGhk61SPenfE/p1oaFeNwkOOyrscaOkMGrcW9+Cy/QAIOBpZxP1yqDIzFMR0+Np0i0+usg==", + "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==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.222", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.222.tgz", + "integrity": "sha512-gA7psSwSwQRE60CEoLz6JBCQPIxNeuzB2nL8vE03GK/OHxlvykbLyeiumQy1iH5C2f3YbRAZpGCMT12a/9ih9w==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@ungap/structured-clone": "^1.0.0", - "unist-util-position": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "license": "ISC" }, - "node_modules/hast-util-to-html": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", - "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true, "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-whitespace": "^3.0.0", - "html-void-elements": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "stringify-entities": "^4.0.0", - "zwitch": "^2.0.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 4" } }, - "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", - "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", - "dev": true, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "estree-util-is-identifier-name": "^3.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-mdx-expression": "^2.0.0", - "mdast-util-mdx-jsx": "^3.0.0", - "mdast-util-mdxjs-esm": "^2.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0", - "style-to-js": "^1.0.0", - "unist-util-position": "^5.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 0.8" } }, - "node_modules/hast-util-to-mdast": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/hast-util-to-mdast/-/hast-util-to-mdast-10.1.2.tgz", - "integrity": "sha512-FiCRI7NmOvM4y+f5w32jPRzcxDIz+PUqDwEqn1A+1q2cdp3B8Gx7aVrXORdOKjMNDQsD1ogOr896+0jJHW1EFQ==", - "dev": true, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "hast-util-phrasing": "^3.0.0", - "hast-util-to-html": "^9.0.0", - "hast-util-to-text": "^4.0.0", - "hast-util-whitespace": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "mdast-util-to-string": "^4.0.0", - "rehype-minify-whitespace": "^6.0.0", - "trim-trailing-lines": "^2.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "once": "^1.4.0" } }, - "node_modules/hast-util-to-parse5": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", - "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "node_modules/engine.io": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", + "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", "dev": true, "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "devlop": "^1.0.0", - "property-information": "^6.0.0", - "space-separated-tokens": "^2.0.0", - "web-namespaces": "^2.0.0", - "zwitch": "^2.0.0" + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.7.2", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/hast-util-to-parse5/node_modules/property-information": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", - "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "engines": { + "node": ">=10.2.0" } }, - "node_modules/hast-util-to-text": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", - "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "dev": true, "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/unist": "^3.0.0", - "hast-util-is-element": "^3.0.0", - "unist-util-find-after": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=10.0.0" } }, - "node_modules/hast-util-whitespace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", - "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "node_modules/engine.io/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 0.6" } }, - "node_modules/hastscript": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", - "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/hast": "^3.0.0", - "comma-separated-tokens": "^2.0.0", - "hast-util-parse-selector": "^4.0.0", - "property-information": "^7.0.0", - "space-separated-tokens": "^2.0.0" + "ms": "^2.1.3" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "node_modules/engine.io/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, "license": "MIT", - "bin": { - "he": "bin/he" + "engines": { + "node": ">= 0.6" } }, - "node_modules/hookified": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.12.0.tgz", - "integrity": "sha512-hMr1Y9TCLshScrBbV2QxJ9BROddxZ12MX9KsCtuGGy/3SmmN5H1PllKerrVlSotur9dlE8hmUKAOSa3WDzsZmQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "node_modules/engine.io/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/hpack.js/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", "license": "MIT", "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" } }, - "node_modules/hpack.js/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } }, - "node_modules/hpack.js/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, + "node_modules/env-editor": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-1.1.0.tgz", + "integrity": "sha512-7AXskzN6T7Q9TFcKAGJprUbpQa4i1VsAetO9rdBqbGMGlragTziBgWt4pVYJMBWHQlLoX0buy6WFikzPH4Qjpw==", "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/html-entities": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", - "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT" - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "node_modules/html-tags": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "node_modules/envinfo": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz", + "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "bin": { + "envinfo": "dist/cli.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=4" } }, - "node_modules/html-url-attributes": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", - "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "dependencies": { + "is-arrayish": "^0.2.1" } }, - "node_modules/html-void-elements": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", - "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", "dev": true, "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/html-whitespace-sensitive-tag-names": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.1.tgz", - "integrity": "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==", - "dev": true, + "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==", "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">= 0.4" } }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], + "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==", "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" + "engines": { + "node": ">= 0.4" } }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "node_modules/es-module-lexer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", "dev": true, "license": "MIT" }, - "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==", + "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==", "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "es-errors": "^1.3.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" } }, - "node_modules/http-parser-js": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", - "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, - "license": "MIT" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "license": "MIT", "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { - "node": ">=8.0.0" + "node": ">= 0.4" } }, - "node_modules/http-proxy-middleware": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.5.tgz", - "integrity": "sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==", + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, "license": "MIT", "dependencies": { - "@types/http-proxy": "^1.17.15", - "debug": "^4.3.6", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.3", - "is-plain-object": "^5.0.0", - "micromatch": "^4.0.8" + "hasown": "^2.0.2" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">= 0.4" } }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, "license": "MIT", "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { - "node": ">= 14" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hyperdyperid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", - "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", - "dev": true, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", "engines": { - "node": ">=10.18" + "node": ">=6" } }, - "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==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } + "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==", + "license": "MIT" }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": "^10 || ^12 || >= 14" + "node": ">=10" }, - "peerDependencies": { - "postcss": "^8.1.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/identifier-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/identifier-regex/-/identifier-regex-1.0.0.tgz", - "integrity": "sha512-Rcy5cjBOM9iTR+Vwy0Llyip9u0cA99T1yiWOhDW/+PDaTQhyski0tMovsipQ/FRNDkudjLWusJ/IMVIlG5WZnQ==", + "node_modules/eslint": { + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz", + "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", "dev": true, "license": "MIT", "dependencies": { - "reserved-identifiers": "^1.0.0" + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.36.0", + "@eslint/plugin-kit": "^0.3.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "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" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true } - ], - "license": "BSD-3-Clause" + } }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "node_modules/eslint-compat-utils": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", "dev": true, "license": "MIT", + "dependencies": { + "semver": "^7.5.4" + }, "engines": { - "node": ">= 4" + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" } }, - "node_modules/image-dimensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/image-dimensions/-/image-dimensions-2.3.0.tgz", - "integrity": "sha512-8Ar3lsO6+/JLfnUeHnR8Jp/IyQR85Jut5t4Swy1yiXNwj/xM9h5V53v5KE/m/ZSMG4qGRopnSy37uPzKyQCv0A==", + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", "bin": { - "image-dimensions": "cli.js" - }, - "engines": { - "node": ">=18" + "eslint-config-prettier": "bin/cli.js" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/image-size": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz", - "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==", + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "license": "MIT", "dependencies": { - "queue": "6.0.2" - }, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=16.x" + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, - "node_modules/image-type": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/image-type/-/image-type-4.1.0.tgz", - "integrity": "sha512-CFJMJ8QK8lJvRlTCEgarL4ro6hfDQKif2HjSvYCdQZESaIPV4v9imrf7BQHK+sQeTeNeMpWciR9hyC/g8ybXEg==", + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", "dev": true, "license": "MIT", "dependencies": { - "file-type": "^10.10.0" + "debug": "^3.2.7" }, "engines": { - "node": ">=6" + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/image-type/node_modules/file-type": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz", - "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==", + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" + "dependencies": { + "ms": "^2.1.1" } }, - "node_modules/imagemin": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-9.0.1.tgz", - "integrity": "sha512-UoHOfynN8QeqRoUGunn6ilMnLpJ+utbmleP2ufcFqaGal8mY/PeOpV43N31uqtb+CBMFqQ7hxgKzIaAAnmcrdA==", + "node_modules/eslint-plugin-es-x": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", "dev": true, + "funding": [ + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" + ], "license": "MIT", "dependencies": { - "change-file-extension": "^0.1.1", - "environment": "^1.0.0", - "file-type": "^19.0.0", - "globby": "^14.0.1", - "image-dimensions": "^2.3.0", - "junk": "^4.0.1", - "ow": "^2.0.0", - "p-pipe": "^4.0.0", - "slash": "^5.1.0", - "uint8array-extras": "^1.1.0" + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" }, "engines": { - "node": ">=18" + "node": "^14.18.0 || >=16.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "eslint": ">=8" } }, - "node_modules/imagemin-gifsicle": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/imagemin-gifsicle/-/imagemin-gifsicle-7.0.0.tgz", - "integrity": "sha512-LaP38xhxAwS3W8PFh4y5iQ6feoTSF+dTAXFRUEYQWYst6Xd+9L/iPk34QGgK/VO/objmIlmq9TStGfVY2IcHIA==", + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", "dependencies": { - "execa": "^1.0.0", - "gifsicle": "^5.0.0", - "is-gif": "^3.0.0" + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" }, "engines": { - "node": ">=10" + "node": ">=4" }, - "funding": { - "url": "https://github.com/imagemin/imagemin-gifsicle?sponsor=1" + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, - "node_modules/imagemin-mozjpeg": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/imagemin-mozjpeg/-/imagemin-mozjpeg-10.0.0.tgz", - "integrity": "sha512-DK85QNOjS3/GzWYfNB3CACMZD10sIQgFDv1+WTOnZljgltQTEyATjdyUVyjKu5q4sCESQdwvwq7WEZzJ5fFjlg==", + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", "dependencies": { - "execa": "^6.0.0", - "is-jpg": "^3.0.0", - "mozjpeg": "^8.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/imagemin-mozjpeg/node_modules/execa": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", - "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^3.0.1", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "ms": "^2.1.1" } }, - "node_modules/imagemin-mozjpeg/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "*" } }, - "node_modules/imagemin-mozjpeg/node_modules/human-signals": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", - "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.20.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/imagemin-mozjpeg/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "node_modules/eslint-plugin-jsdoc": { + "version": "55.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-55.0.3.tgz", + "integrity": "sha512-xU2/QZgBXIGFXOzyWsNaSwrcF80Rq2h084GvIU+pkfzwE55xnr+ShEUfVL6+fZ0Jrh0hWGHdk0RiN0axhK1new==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", + "dependencies": { + "@es-joy/jsdoccomment": "~0.56.0", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.1", + "debug": "^4.4.1", + "escape-string-regexp": "^4.0.0", + "espree": "^10.4.0", + "esquery": "^1.6.0", + "object-deep-merge": "^1.0.5", + "parse-imports-exports": "^0.2.4", + "semver": "^7.7.2", + "spdx-expression-parse": "^4.0.0" + }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=20.11.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" } }, - "node_modules/imagemin-mozjpeg/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "node_modules/eslint-plugin-lit": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-lit/-/eslint-plugin-lit-2.1.1.tgz", + "integrity": "sha512-qmyAOnnTCdS+vDnNxtCoF0icSKIio4GUv6ZLnaCtTX6G/YezRa6Ag6tOQ+MfV5Elvtw9CIXeliRX4mIBSwrPIA==", "dev": true, "license": "MIT", + "dependencies": { + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1" + }, "engines": { - "node": ">=12" + "node": ">= 18" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "eslint": ">= 8" } }, - "node_modules/imagemin-mozjpeg/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "node_modules/eslint-plugin-lit/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint-plugin-n": { + "version": "17.23.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.23.1.tgz", + "integrity": "sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^4.0.0" + "@eslint-community/eslint-utils": "^4.5.0", + "enhanced-resolve": "^5.17.1", + "eslint-plugin-es-x": "^7.8.0", + "get-tsconfig": "^4.8.1", + "globals": "^15.11.0", + "globrex": "^0.1.2", + "ignore": "^5.3.2", + "semver": "^7.6.3", + "ts-declaration-location": "^1.0.6" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": ">=8.23.0" } }, - "node_modules/imagemin-mozjpeg/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "node_modules/eslint-plugin-n/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", "dev": true, "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/imagemin-mozjpeg/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "node_modules/eslint-plugin-unicorn": { + "version": "61.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-61.0.2.tgz", + "integrity": "sha512-zLihukvneYT7f74GNbVJXfWIiNQmkc/a9vYBTE4qPkQZswolWNdu+Wsp9sIXno1JOzdn6OUwLPd19ekXVkahRA==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "@eslint-community/eslint-utils": "^4.7.0", + "@eslint/plugin-kit": "^0.3.3", + "change-case": "^5.4.4", + "ci-info": "^4.3.0", + "clean-regexp": "^1.0.0", + "core-js-compat": "^3.44.0", + "esquery": "^1.6.0", + "find-up-simple": "^1.0.1", + "globals": "^16.3.0", + "indent-string": "^5.0.0", + "is-builtin-module": "^5.0.0", + "jsesc": "^3.1.0", + "pluralize": "^8.0.0", + "regexp-tree": "^0.1.27", + "regjsparser": "^0.12.0", + "semver": "^7.7.2", + "strip-indent": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imagemin-mozjpeg/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/imagemin-mozjpeg/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "license": "MIT", "engines": { - "node": ">=12" + "node": "^20.10.0 || >=21.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" + }, + "peerDependencies": { + "eslint": ">=9.29.0" } }, - "node_modules/imagemin-pngquant": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/imagemin-pngquant/-/imagemin-pngquant-10.0.0.tgz", - "integrity": "sha512-kt0LFxyv7sBxUbZyvt+JXoU0HvSnmTJkEW32rZPQ9d7AQJPVh0vkz9mGkvbX0yntY2zW/3N20Yw69PBSt1UQzw==", + "node_modules/eslint-plugin-wc": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-wc/-/eslint-plugin-wc-3.0.1.tgz", + "integrity": "sha512-0p1wkSlA2Ue3FA4qW+5LZ+15sy0p1nUyVl1eyBMLq4rtN1LtE9IdI49BXNWMz8N8bM/y7Ulx8SWGAni5f8XO5g==", "dev": true, "license": "MIT", "dependencies": { - "environment": "^1.0.0", - "execa": "^8.0.1", - "is-png": "^3.0.1", - "ow": "^2.0.0", - "pngquant-bin": "^9.0.0", - "uint8array-extras": "^1.1.0" + "is-valid-element-name": "^1.0.0", + "js-levenshtein-esm": "^2.0.0" }, - "engines": { - "node": ">=18" + "peerDependencies": { + "eslint": ">=8.40.0" } }, - "node_modules/imagemin-pngquant/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=16.17" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://opencollective.com/eslint" } }, - "node_modules/imagemin-pngquant/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">=16" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imagemin-pngquant/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=16.17.0" + "url": "https://opencollective.com/eslint" } }, - "node_modules/imagemin-pngquant/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/imagemin-pngquant/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">=12" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/imagemin-pngquant/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "node_modules/eslint/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, - "license": "MIT", + "license": "ISC", "dependencies": { - "path-key": "^4.0.0" + "is-glob": "^4.0.3" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10.13.0" } }, - "node_modules/imagemin-pngquant/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "mimic-fn": "^4.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" } }, - "node_modules/imagemin-pngquant/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, "engines": { - "node": ">=12" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/imagemin-pngquant/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">=12" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/imagemin-svgo": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/imagemin-svgo/-/imagemin-svgo-11.0.1.tgz", - "integrity": "sha512-sUZdlXFXZkPt61nzVXbt7EzYjjevPkNuZmAw0VjEm085PRrK5AHSF+1myF0NKtE+ZhY2Vf6W3CEoRqAgksruWQ==", + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "is-svg": "^5.0.1", - "svgo": "^3.3.2" + "estraverse": "^5.1.0" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sindresorhus/imagemin-svgo?sponsor=1" + "node": ">=0.10" } }, - "node_modules/imagemin-svgo/node_modules/is-svg": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-5.1.0.tgz", - "integrity": "sha512-uVg5yifaTxHoefNf5Jcx+i9RZe2OBYd/UStp1umx+EERa4xGRa3LLGXjoEph43qUORC0qkafUgrXZ6zzK89yGA==", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "fast-xml-parser": "^4.4.1" + "estraverse": "^5.2.0" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4.0" } }, - "node_modules/imagemin/node_modules/globby": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", - "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.3", - "path-type": "^6.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.3.0" - }, + "license": "BSD-2-Clause", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4.0" } }, - "node_modules/imagemin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", + "engines": { + "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==", "license": "MIT", "engines": { - "node": ">= 4" + "node": ">= 0.6" } }, - "node_modules/imagemin/node_modules/path-type": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", - "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.x" } }, - "node_modules/imagemin/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "node_modules/exit-hook": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-4.0.0.tgz", + "integrity": "sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=14.16" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/immutable": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.2.tgz", - "integrity": "sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, + "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==", "license": "MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "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": ">=6" + "node": ">= 18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-in-the-middle": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.14.0.tgz", - "integrity": "sha512-g5zLT0HaztRJWysayWYiUq/7E5H825QIiecMD2pI5QO7Wzr847l6GDvPvmZaDIdrDtS2w7qRczywxiK6SL5vRw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/import-lazy": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz", - "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==", - "dev": true, + "node_modules/express/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==", "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.6" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, + "node_modules/express/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==", "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, "engines": { - "node": ">=0.8.19" + "node": ">= 0.6" } }, - "node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true, - "license": "MIT", + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, "engines": { - "node": ">=12" + "node": ">= 10.17.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "optionalDependencies": { + "@types/yauzl": "^2.9.1" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "license": "ISC" - }, - "node_modules/inline-style-parser": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", - "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, "license": "MIT" }, - "node_modules/inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", + "node_modules/fast-glob": { + "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": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" }, "engines": { - "node": ">=6.0.0" + "node": ">=8.6.0" } }, - "node_modules/inquirer/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } + "license": "MIT" }, - "node_modules/inquirer/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, "engines": { - "node": ">=4" + "node": ">= 4.9.1" } }, - "node_modules/inquirer/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "color-name": "1.1.3" + "reusify": "^1.0.4" } }, - "node_modules/inquirer/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "license": "MIT" - }, - "node_modules/inquirer/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, "engines": { "node": ">=0.8.0" } }, - "node_modules/inquirer/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "license": "MIT", - "engines": { - "node": ">=4" + "dependencies": { + "pend": "~1.2.0" } }, - "node_modules/inquirer/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "license": "MIT", "engines": { - "node": ">=4" + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/inquirer/node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "license": "Apache-2.0", + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", "dependencies": { - "tslib": "^1.9.0" + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" }, "engines": { - "npm": ">=2.0.0" + "node": "^12.20 || >= 14.13" } }, - "node_modules/inquirer/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "flat-cache": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=16.0.0" } }, - "node_modules/inquirer/node_modules/string-width/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "node_modules/filesize": { + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz", + "integrity": "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "engines": { - "node": ">=4" + "node": ">= 10.4.0" } }, - "node_modules/inquirer/node_modules/string-width/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "license": "MIT", "dependencies": { - "ansi-regex": "^3.0.0" + "to-regex-range": "^5.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, + "node_modules/finalhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", "license": "MIT", "dependencies": { - "ansi-regex": "^4.1.0" + "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": ">=6" + "node": ">= 0.8" } }, - "node_modules/inquirer/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/inquirer/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", "dev": true, - "license": "0BSD" - }, - "node_modules/insane": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/insane/-/insane-2.6.2.tgz", - "integrity": "sha512-BqEL1CJsjJi+/C/zKZxv31zs3r6zkLH5Nz1WMFb7UBX2KHY2yXDpbFTSEmNHzomBbGDysIfkTX55A0mQZ2CQiw==", "license": "MIT", - "dependencies": { - "assignment": "2.0.0", - "he": "0.5.0" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/insane/node_modules/he": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/he/-/he-0.5.0.tgz", - "integrity": "sha512-DoufbNNOFzwRPy8uecq+j+VCPQ+JyDelHTmSgygrA5TsR8Cbw4Qcir5sGtWiusB4BdT89nmlaVDhSJOqC/33vw==", - "license": "MIT", + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", "bin": { - "he": "bin/he" + "flat": "cli.js" } }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": ">= 0.4" + "node": ">=16" } }, - "node_modules/into-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", - "integrity": "sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ==", + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true, - "license": "MIT", - "dependencies": { - "from2": "^2.1.1", - "p-is-promise": "^1.1.0" - }, - "engines": { - "node": ">=4" - } + "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==", + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "license": "MIT", "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" + "node": ">=4.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" + "is-callable": "^1.2.7" }, "engines": { "node": ">= 0.4" @@ -17070,116 +10190,119 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", "dev": true, "license": "MIT", "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 6" } }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dev": true, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", "license": "MIT", "dependencies": { - "has-bigints": "^1.0.2" + "fetch-blob": "^3.1.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12.20.0" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, "engines": { - "node": ">= 0.4" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "patreon", + "url": "https://github.com/sponsors/rawify" } }, - "node_modules/is-builtin-module": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-5.0.0.tgz", - "integrity": "sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==", + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", "dev": true, "license": "MIT", "dependencies": { - "builtin-modules": "^5.0.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=18.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, + "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==", "license": "MIT", - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" }, "engines": { "node": ">= 0.4" @@ -17188,33 +10311,51 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "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==", + "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" + "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": ">= 0.4" @@ -17223,77 +10364,57 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "node_modules/get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", "dev": true, "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, + "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==", "license": "MIT", "dependencies": { - "call-bound": "^1.0.3" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-generator-function": { + "node_modules/get-symbol-description": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -17302,126 +10423,120 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-gif": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-gif/-/is-gif-3.0.0.tgz", - "integrity": "sha512-IqJ/jlbw5WJSNfwQ/lHEDXF8rxhRgF6ythk2oiEvhpG29F704eX9NO6TvPfMiq9DrbwgcEDnETYNcZDPewQoVw==", + "node_modules/get-tsconfig": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", + "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", "dev": true, "license": "MIT", "dependencies": { - "file-type": "^10.4.0" + "resolve-pkg-maps": "^1.0.0" }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/is-gif/node_modules/file-type": { - "version": "10.11.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz", - "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==", + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", + "license": "ISC", "dependencies": { - "is-extglob": "^2.1.1" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 6" } }, - "node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "node_modules/glob-to-regex.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.0.1.tgz", + "integrity": "sha512-CG/iEvgQqfzoVsMUbxSJcwbG2JwyZ3naEqPkeltwl0BSS8Bp83k3xlGms+0QdWFUAwV+uvo80wNswKF6FWEkKg==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0" + }, "funding": { "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/is-identifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-identifier/-/is-identifier-1.0.1.tgz", - "integrity": "sha512-HQ5v4rEJ7REUV54bCd2l5FaD299SGDEn2UPoVXaTHAyGviLq2menVUD2udi3trQ32uvB6LdAh/0ck2EuizrtpA==", + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, "license": "MIT", "dependencies": { - "identifier-regex": "^1.0.0", - "super-regex": "^1.0.0" + "global-prefix": "^3.0.0" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, "license": "MIT", "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/is-jpg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-jpg/-/is-jpg-3.0.0.tgz", - "integrity": "sha512-Vcd67KWHZblEKEBrtP25qLZ8wN9ICoAhl1pKUqD7SM7hf2qtuRl7loDgP5Zigh2oN/+7uj+KVyC0eRJvgOEFeQ==", + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "which": "bin/which" } }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-natural-number": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", - "integrity": "sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, "engines": { "node": ">= 0.4" }, @@ -17429,38 +10544,46 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-network-error": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.2.0.tgz", - "integrity": "sha512-32jdpRpJo8SeL7zOuBJbMLz/VTw9mDpTvcKzzR8DkXWsJbbE60gdiX8YOd0UAV6b8Skt+CMytzfgVVIRFidn0Q==", + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, "engines": { - "node": ">=16" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } + "node_modules/globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", + "dev": true, + "license": "MIT" }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", "dev": true, + "license": "MIT" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, "engines": { "node": ">= 0.4" }, @@ -17468,22 +10591,28 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", - "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, - "node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", "dev": true, "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, "engines": { "node": ">=10" }, @@ -17491,75 +10620,68 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true, + "license": "MIT" }, - "node_modules/is-png": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-png/-/is-png-3.0.1.tgz", - "integrity": "sha512-8TqC8+bdsm3YkpI2aECCDycFDl1hTB0HMVRnP3xRRa3Tqx2oVE7sBi1G6CuO9IqEyWSzbBZr1mGqdb3it9h/pg==", + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-promise": { + "node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-retry-allowed": { + "node_modules/has-proto": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", - "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, + "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==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -17568,14 +10690,14 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -17584,2055 +10706,1688 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" } }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hookified": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.12.0.tgz", + "integrity": "sha512-hMr1Y9TCLshScrBbV2QxJ9BROddxZ12MX9KsCtuGGy/3SmmN5H1PllKerrVlSotur9dlE8hmUKAOSa3WDzsZmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" } }, - "node_modules/is-svg": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-6.1.0.tgz", - "integrity": "sha512-i7YPdvYuSCYcaLQrKwt8cvKTlwHcdA6Hp8N9SO3Q5jIzo8x6kH3N47W0BvPP7NdxVBmIHx7X9DK36czYYW7lHg==", + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "license": "MIT", "dependencies": { - "@file-type/xml": "^0.4.3" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/is-symbol": { + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "safe-buffer": "~5.1.0" } }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", "dev": true, - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" }, - "node_modules/is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, "license": "MIT", "engines": { - "node": ">=18" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-valid-element-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-element-name/-/is-valid-element-name-1.0.0.tgz", - "integrity": "sha512-GZITEJY2LkSjQfaIPBha7eyZv+ge0PhBR7KITeCCWvy7VBQrCUdFkvpI+HrAPQjVtVjy1LvlEkqQTHckoszruw==", + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "is-potential-custom-element-name": "^1.0.0" - } + "license": "MIT" }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, + "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==", "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.8" } }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "license": "MIT", "dependencies": { - "call-bound": "^1.0.3" + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8.0.0" } }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, + "node_modules/http-proxy-middleware": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.5.tgz", + "integrity": "sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==", "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" + "@types/http-proxy": "^1.17.15", + "debug": "^4.3.6", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.3", + "is-plain-object": "^5.0.0", + "micromatch": "^4.0.8" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "license": "MIT", "dependencies": { - "is-inside-container": "^1.0.0" + "agent-base": "^7.1.2", + "debug": "4" }, "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 14" } }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "node_modules/hyperdyperid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", + "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=10.18" } }, - "node_modules/isurl": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", - "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", - "dev": true, + "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==", "license": "MIT", "dependencies": { - "has-to-string-tag-x": "^1.2.0", - "is-object": "^1.0.1" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">= 4" + "node": ">=0.10.0" } }, - "node_modules/jake": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", - "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, + "license": "ISC", "engines": { - "node": ">=10" + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" } }, - "node_modules/jake/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">= 4" } }, - "node_modules/jake/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/immutable": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.2.tgz", + "integrity": "sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } + "license": "MIT" }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "node_modules/import-fresh": { + "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": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-util/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.8.19" } }, - "node_modules/jest-util/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true, + "license": "ISC" + }, + "node_modules/insane": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/insane/-/insane-2.6.2.tgz", + "integrity": "sha512-BqEL1CJsjJi+/C/zKZxv31zs3r6zkLH5Nz1WMFb7UBX2KHY2yXDpbFTSEmNHzomBbGDysIfkTX55A0mQZ2CQiw==", "license": "MIT", "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "assignment": "2.0.0", + "he": "0.5.0" } }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/insane/node_modules/he": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/he/-/he-0.5.0.tgz", + "integrity": "sha512-DoufbNNOFzwRPy8uecq+j+VCPQ+JyDelHTmSgygrA5TsR8Cbw4Qcir5sGtWiusB4BdT89nmlaVDhSJOqC/33vw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">= 0.4" } }, - "node_modules/jiti": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz", - "integrity": "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==", - "dev": true, + "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==", "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" + "engines": { + "node": ">= 0.10" } }, - "node_modules/js-levenshtein-esm": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/js-levenshtein-esm/-/js-levenshtein-esm-2.0.0.tgz", - "integrity": "sha512-1n4LEPOL4wRXY8rOQcuA7Iuaphe5xCMayvufCzlLAi+hRsnBRDbSS6XPuV58CBVJxj5D9ApFLyjQ7KzFToyHBw==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "license": "MIT", "dependencies": { - "argparse": "^2.0.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsbi": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-4.3.2.tgz", - "integrity": "sha512-9fqMSQbhJykSeii05nxKl4m6Eqn2P6rOlYiS+C5Dr/HPIU/7yZxu5qzbs40tgaFORiw2Amd0mirjxatXYMkIew==", + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true, - "license": "Apache-2.0" + "license": "MIT" }, - "node_modules/jsdoc-type-pratt-parser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-5.1.1.tgz", - "integrity": "sha512-DYYlVP1fe4QBMh2xTIs20/YeTz2GYVbWAEZweHSZD+qQ/Cx2d5RShuhhsdk64eTjNq0FeVnteP/qVOgaywSRbg==", + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, "engines": { - "node": ">=12.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" + "dependencies": { + "has-bigints": "^1.0.2" }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-cycle": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/json-cycle/-/json-cycle-1.5.0.tgz", - "integrity": "sha512-GOehvd5PO2FeZ5T4c+RxobeT5a1PiGpF4u9/3+UvrMU4bhnVqzJY7hm39wg8PDCqkU91fWGH8qjWR4bn+wgq9w==", + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, "engines": { - "node": ">= 4" + "node": ">=8" } }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-to-typescript": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-15.0.4.tgz", - "integrity": "sha512-Su9oK8DR4xCmDsLlyvadkXzX6+GGXJpbhwoLtOGArAG61dvbW4YQmSEno2y66ahpIdmLMg6YUf/QHLgiwvkrHQ==", "license": "MIT", "dependencies": { - "@apidevtools/json-schema-ref-parser": "^11.5.5", - "@types/json-schema": "^7.0.15", - "@types/lodash": "^4.17.7", - "is-glob": "^4.0.3", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "minimist": "^1.2.8", - "prettier": "^3.2.5", - "tinyglobby": "^0.2.9" - }, - "bin": { - "json2ts": "dist/src/cli.js" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=16.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stream-stringify": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-stream-stringify/-/json-stream-stringify-3.0.1.tgz", - "integrity": "sha512-vuxs3G1ocFDiAQ/SX0okcZbtqXwgj1g71qE9+vrjJ2EkjKQlEFDAcUNRxRU8O+GekV4v5cM2qXP0Wyt/EMDBiQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "node_modules/is-builtin-module": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-5.0.0.tgz", + "integrity": "sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==", "dev": true, "license": "MIT", "dependencies": { - "minimist": "^1.2.0" + "builtin-modules": "^5.0.0" }, - "bin": { - "json5": "lib/cli.js" + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" + "engines": { + "node": ">= 0.4" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/junk": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/junk/-/junk-4.0.1.tgz", - "integrity": "sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==", + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, "engines": { - "node": ">=12.20" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, "license": "MIT", "dependencies": { - "json-buffer": "3.0.1" + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/known-css-properties": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", - "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", - "dev": true, - "license": "MIT" + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "dev": true, - "license": "MIT" + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/launch-editor": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz", - "integrity": "sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==", + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, "license": "MIT", "dependencies": { - "picocolors": "^1.1.1", - "shell-quote": "^1.8.3" + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/lefthook": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/lefthook/-/lefthook-1.13.4.tgz", - "integrity": "sha512-4EJfkcNlZW69ISxyEuBzkyivER/XIVCJcGYTemVBf5DWlBwK97hSrbgDH8O5JuHiCR5lW83hDa1T5TW/dRfnGg==", - "dev": true, - "hasInstallScript": true, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", - "bin": { - "lefthook": "bin/index.js" - }, - "optionalDependencies": { - "lefthook-darwin-arm64": "1.13.4", - "lefthook-darwin-x64": "1.13.4", - "lefthook-freebsd-arm64": "1.13.4", - "lefthook-freebsd-x64": "1.13.4", - "lefthook-linux-arm64": "1.13.4", - "lefthook-linux-x64": "1.13.4", - "lefthook-openbsd-arm64": "1.13.4", - "lefthook-openbsd-x64": "1.13.4", - "lefthook-windows-arm64": "1.13.4", - "lefthook-windows-x64": "1.13.4" + "engines": { + "node": ">=8" } }, - "node_modules/lefthook-darwin-arm64": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.13.4.tgz", - "integrity": "sha512-A/t0OYW9NCEqJ+j3volPvetfgErveioYxTG0tzgmJoMOR4joFN0vkjahKQpKPIMQ1HSqFQtiRefXL3M97rCD1A==", - "cpu": [ - "arm64" - ], + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/lefthook-darwin-x64": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-1.13.4.tgz", - "integrity": "sha512-pBCy4pm8HEjsDSPNYv4Y4p94ZJYC7Q3KOMkYVH6no7e7ide2adetRq5eylNM7OyKF6fDA3VMv8ywINxHVKu3tg==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/lefthook-freebsd-arm64": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.13.4.tgz", - "integrity": "sha512-km8VRaIhORrebspVVwP+j01rYv2Wl8gDpEPcz42az9tfcp1o2d87Hi3zZ3DNSucSq+e7bMul1WNFYnk9xRy0jw==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/lefthook-freebsd-x64": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.13.4.tgz", - "integrity": "sha512-eWiFL4uFSg1XhLnbSo8dNF8K5yJ1Al3HauV1XbDfa8rUoonJfGWxOz6z22qzKj8mVkwl7Tk1hhjnAyNtXZNG8g==", - "cpu": [ - "x64" - ], + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/lefthook-linux-arm64": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-1.13.4.tgz", - "integrity": "sha512-0aHeK1WoRPHwvgbEXdo1Q25MMCWNeY5wouhcShHpxhmrVBX1c0rYkWC9mQgR+632eUKkA/48+1J69x3mvtMZRg==", - "cpu": [ - "arm64" - ], + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/lefthook-linux-x64": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/lefthook-linux-x64/-/lefthook-linux-x64-1.13.4.tgz", - "integrity": "sha512-f0rM3o5b7HNX+eKnCZzOPPWV+uPwOgfZEIKd1MqfkxxreQ+kloAcuUcNt6huwrs8foR7+45eC31T5plII3aTnw==", - "cpu": [ - "x64" - ], + "node_modules/is-network-error": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.2.0.tgz", + "integrity": "sha512-32jdpRpJo8SeL7zOuBJbMLz/VTw9mDpTvcKzzR8DkXWsJbbE60gdiX8YOd0UAV6b8Skt+CMytzfgVVIRFidn0Q==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/lefthook-openbsd-arm64": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/lefthook-openbsd-arm64/-/lefthook-openbsd-arm64-1.13.4.tgz", - "integrity": "sha512-ov9rjWPOtphlNG2SOPQAPBSeWVTfB/vbh5AcvPECnVVe9jZTCthhKIyr9wx/UfKKqGxlL4wi7jk7BQ1BEJuC5w==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] + "engines": { + "node": ">=0.12.0" + } }, - "node_modules/lefthook-openbsd-x64": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/lefthook-openbsd-x64/-/lefthook-openbsd-x64-1.13.4.tgz", - "integrity": "sha512-4TVuVG86fJhWGBx8nR+USq00lYHuzLp1PqrW3vDKmTwxlMf3gmquO6PyQ85I5jfr1G2QpKn/cVJCvj3ExMUOxg==", - "cpu": [ - "x64" - ], + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/lefthook-windows-arm64": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-1.13.4.tgz", - "integrity": "sha512-y46ZgRAgyMy5MQYkZoSBtHYUYj0+54cM0VDT/Lu/jz1GRFAE8JkrRVetk3geqECpnMGxBkSgfhcbGDYeEvJQdw==", - "cpu": [ - "arm64" - ], + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/lefthook-windows-x64": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-1.13.4.tgz", - "integrity": "sha512-p2YfWuj/43gUT0nHJ6j0pTRpLLwX9n2bio60POuXOrr3RVxdv5MEaQchdRhqYG5uWj7Zsm86K9FWkNuxPG81IA==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, "license": "MIT", "engines": { - "node": ">=14" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/antonk52" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/line-column-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/line-column-path/-/line-column-path-3.0.0.tgz", - "integrity": "sha512-Atocnm7Wr9nuvAn97yEPQa3pcQI5eLQGBz+m6iTb+CVw+IOzYB9MrYK7jI7BfC9ISnT4Fu0eiwhAScV//rp4Hw==", + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, "license": "MIT", "dependencies": { - "type-fest": "^2.0.0" + "call-bound": "^1.0.3" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/lit": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.1.tgz", - "integrity": "sha512-Ksr/8L3PTapbdXJCk+EJVB78jDodUMaP54gD24W186zGRARvwrsPfS60wae/SSCTCNZVPd1chXqio1qHQmu4NA==", - "license": "BSD-3-Clause", + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", "dependencies": { - "@lit/reactive-element": "^2.1.0", - "lit-element": "^4.2.0", - "lit-html": "^3.3.0" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/lit-element": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.2.0.tgz", - "integrity": "sha512-MGrXJVAI5x+Bfth/pU9Kst1iWID6GHDLEzFEnyULB/sFiRLgkd8NPK/PeeXxktA3T6EIIaq8U3KcbTU5XFcP2Q==", - "license": "BSD-3-Clause", + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", "dependencies": { - "@lit-labs/ssr-dom-shim": "^1.2.0", - "@lit/reactive-element": "^2.1.0", - "lit-html": "^3.3.0" + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/lit-html": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.1.tgz", - "integrity": "sha512-S9hbyDu/vs1qNrithiNyeyv64c9yqiW9l+DBgI18fL+MTvOtWoFR0FWiyq1TxaYef5wNlpEmzlXoBlZEO+WjoA==", - "license": "BSD-3-Clause", + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-valid-element-name": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-element-name/-/is-valid-element-name-1.0.0.tgz", + "integrity": "sha512-GZITEJY2LkSjQfaIPBha7eyZv+ge0PhBR7KITeCCWvy7VBQrCUdFkvpI+HrAPQjVtVjy1LvlEkqQTHckoszruw==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@types/trusted-types": "^2.0.2" + "is-potential-custom-element-name": "^1.0.0" } }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, "license": "MIT", "engines": { - "node": ">=6.11.5" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, "license": "MIT", "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" + "call-bound": "^1.0.3" }, "engines": { - "node": ">=8.9.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/loader-utils/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, "license": "MIT", - "bin": { - "json5": "lib/cli.js" + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" + "is-inside-container": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.deburr": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", - "integrity": "sha512-m/M1U1f3ddMCs6Hq2tAsYThTBDaAKFDX3dwDo97GEYzamXi9SqUpjWi/Rrj/gf3X2n8ktwgZrlP1z6E3v/IExQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", - "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.groupby": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", - "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isfunction": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", - "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, "license": "MIT" }, - "node_modules/lodash.isnil": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", - "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==", - "dev": true, - "license": "MIT" + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" }, - "node_modules/lodash.isundefined": { + "node_modules/isobject": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", - "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.unionby": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/lodash.unionby/-/lodash.unionby-4.8.0.tgz", - "integrity": "sha512-e60kn4GJIunNkw6v9MxRnUuLYI/Tyuanch7ozoCtk/1irJTYBj+qNTxr5B3qVflmJhwStJBv387Cb+9VOfABMg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/logform": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", - "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "license": "MIT", "dependencies": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" }, "engines": { - "node": ">= 12.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/loglevel": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz", - "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==", + "node_modules/jest-util/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], "license": "MIT", "engines": { - "node": ">= 0.6.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" + "node": ">=8" } }, - "node_modules/longest-streak": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", - "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", + "engines": { + "node": ">=8.6" + }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "license": "MIT", "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, - "bin": { - "loose-envify": "cli.js" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "license": "MIT", "dependencies": { - "tslib": "^2.0.3" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "node_modules/jiti": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.5.1.tgz", + "integrity": "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==", "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" } }, - "node_modules/lru-cache/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "node_modules/js-levenshtein-esm": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/js-levenshtein-esm/-/js-levenshtein-esm-2.0.0.tgz", + "integrity": "sha512-1n4LEPOL4wRXY8rOQcuA7Iuaphe5xCMayvufCzlLAi+hRsnBRDbSS6XPuV58CBVJxj5D9ApFLyjQ7KzFToyHBw==", "dev": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "license": "MIT", "dependencies": { - "pify": "^3.0.0" + "argparse": "^2.0.1" }, - "engines": { - "node": ">=4" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/make-dir/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "node_modules/jsdoc-type-pratt-parser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-5.1.1.tgz", + "integrity": "sha512-DYYlVP1fe4QBMh2xTIs20/YeTz2GYVbWAEZweHSZD+qQ/Cx2d5RShuhhsdk64eTjNq0FeVnteP/qVOgaywSRbg==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=12.0.0" } }, - "node_modules/markdown-table": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", - "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "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==", - "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, "engines": { - "node": ">= 0.4" + "node": ">=6" } }, - "node_modules/mathml-tag-names": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", - "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } + "license": "MIT" }, - "node_modules/md5-file": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-5.0.0.tgz", - "integrity": "sha512-xbEFXCYVWrSx/gEKS1VPlg84h/4L20znVIulKw6kMfmBUAZNAnF00eczz9ICMl+/hjQGo5KSXRxbL/47X3rmMw==", + "node_modules/json-cycle": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/json-cycle/-/json-cycle-1.5.0.tgz", + "integrity": "sha512-GOehvd5PO2FeZ5T4c+RxobeT5a1PiGpF4u9/3+UvrMU4bhnVqzJY7hm39wg8PDCqkU91fWGH8qjWR4bn+wgq9w==", "dev": true, "license": "MIT", - "bin": { - "md5-file": "cli.js" - }, "engines": { - "node": ">=10.13.0" + "node": ">= 4" } }, - "node_modules/mdast-util-find-and-replace": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", - "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-to-typescript": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-15.0.4.tgz", + "integrity": "sha512-Su9oK8DR4xCmDsLlyvadkXzX6+GGXJpbhwoLtOGArAG61dvbW4YQmSEno2y66ahpIdmLMg6YUf/QHLgiwvkrHQ==", "license": "MIT", "dependencies": { - "@types/mdast": "^4.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" + "@apidevtools/json-schema-ref-parser": "^11.5.5", + "@types/json-schema": "^7.0.15", + "@types/lodash": "^4.17.7", + "is-glob": "^4.0.3", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "minimist": "^1.2.8", + "prettier": "^3.2.5", + "tinyglobby": "^0.2.9" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "bin": { + "json2ts": "dist/src/cli.js" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, - "node_modules/mdast-util-from-markdown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", - "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stream-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-stream-stringify/-/json-stream-stringify-3.0.1.tgz", + "integrity": "sha512-vuxs3G1ocFDiAQ/SX0okcZbtqXwgj1g71qE9+vrjJ2EkjKQlEFDAcUNRxRU8O+GekV4v5cM2qXP0Wyt/EMDBiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "license": "MIT", "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" + "minimist": "^1.2.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "bin": { + "json5": "lib/cli.js" } }, - "node_modules/mdast-util-gfm": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", - "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "license": "MIT", "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-gfm-autolink-literal": "^2.0.0", - "mdast-util-gfm-footnote": "^2.0.0", - "mdast-util-gfm-strikethrough": "^2.0.0", - "mdast-util-gfm-table": "^2.0.0", - "mdast-util-gfm-task-list-item": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" + "universalify": "^2.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", - "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", "dependencies": { - "@types/mdast": "^4.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-find-and-replace": "^3.0.0", - "micromark-util-character": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "json-buffer": "3.0.1" } }, - "node_modules/mdast-util-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "node_modules/known-css-properties": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", + "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/launch-editor": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz", + "integrity": "sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==", "dev": true, "license": "MIT", "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "picocolors": "^1.1.1", + "shell-quote": "^1.8.3" } }, - "node_modules/mdast-util-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "node_modules/lefthook": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/lefthook/-/lefthook-1.13.4.tgz", + "integrity": "sha512-4EJfkcNlZW69ISxyEuBzkyivER/XIVCJcGYTemVBf5DWlBwK97hSrbgDH8O5JuHiCR5lW83hDa1T5TW/dRfnGg==", "dev": true, + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" + "bin": { + "lefthook": "bin/index.js" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "optionalDependencies": { + "lefthook-darwin-arm64": "1.13.4", + "lefthook-darwin-x64": "1.13.4", + "lefthook-freebsd-arm64": "1.13.4", + "lefthook-freebsd-x64": "1.13.4", + "lefthook-linux-arm64": "1.13.4", + "lefthook-linux-x64": "1.13.4", + "lefthook-openbsd-arm64": "1.13.4", + "lefthook-openbsd-x64": "1.13.4", + "lefthook-windows-arm64": "1.13.4", + "lefthook-windows-x64": "1.13.4" } }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "node_modules/lefthook-darwin-arm64": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/lefthook-darwin-arm64/-/lefthook-darwin-arm64-1.13.4.tgz", + "integrity": "sha512-A/t0OYW9NCEqJ+j3volPvetfgErveioYxTG0tzgmJoMOR4joFN0vkjahKQpKPIMQ1HSqFQtiRefXL3M97rCD1A==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/mdast-util-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", - "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "node_modules/lefthook-darwin-x64": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/lefthook-darwin-x64/-/lefthook-darwin-x64-1.13.4.tgz", + "integrity": "sha512-pBCy4pm8HEjsDSPNYv4Y4p94ZJYC7Q3KOMkYVH6no7e7ide2adetRq5eylNM7OyKF6fDA3VMv8ywINxHVKu3tg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/mdast-util-mdx-jsx": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", - "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "node_modules/lefthook-freebsd-arm64": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/lefthook-freebsd-arm64/-/lefthook-freebsd-arm64-1.13.4.tgz", + "integrity": "sha512-km8VRaIhORrebspVVwP+j01rYv2Wl8gDpEPcz42az9tfcp1o2d87Hi3zZ3DNSucSq+e7bMul1WNFYnk9xRy0jw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "ccount": "^2.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "parse-entities": "^4.0.0", - "stringify-entities": "^4.0.0", - "unist-util-stringify-position": "^4.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/lefthook-freebsd-x64": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/lefthook-freebsd-x64/-/lefthook-freebsd-x64-1.13.4.tgz", + "integrity": "sha512-eWiFL4uFSg1XhLnbSo8dNF8K5yJ1Al3HauV1XbDfa8rUoonJfGWxOz6z22qzKj8mVkwl7Tk1hhjnAyNtXZNG8g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/mdast-util-mdxjs-esm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", - "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "node_modules/lefthook-linux-arm64": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/lefthook-linux-arm64/-/lefthook-linux-arm64-1.13.4.tgz", + "integrity": "sha512-0aHeK1WoRPHwvgbEXdo1Q25MMCWNeY5wouhcShHpxhmrVBX1c0rYkWC9mQgR+632eUKkA/48+1J69x3mvtMZRg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/estree-jsx": "^1.0.0", - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/mdast-util-phrasing": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", - "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "node_modules/lefthook-linux-x64": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/lefthook-linux-x64/-/lefthook-linux-x64-1.13.4.tgz", + "integrity": "sha512-f0rM3o5b7HNX+eKnCZzOPPWV+uPwOgfZEIKd1MqfkxxreQ+kloAcuUcNt6huwrs8foR7+45eC31T5plII3aTnw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/mdast-util-to-hast": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", - "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "node_modules/lefthook-openbsd-arm64": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/lefthook-openbsd-arm64/-/lefthook-openbsd-arm64-1.13.4.tgz", + "integrity": "sha512-ov9rjWPOtphlNG2SOPQAPBSeWVTfB/vbh5AcvPECnVVe9jZTCthhKIyr9wx/UfKKqGxlL4wi7jk7BQ1BEJuC5w==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "@ungap/structured-clone": "^1.0.0", - "devlop": "^1.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "trim-lines": "^3.0.0", - "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "optional": true, + "os": [ + "openbsd" + ] }, - "node_modules/mdast-util-to-markdown": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", - "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "node_modules/lefthook-openbsd-x64": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/lefthook-openbsd-x64/-/lefthook-openbsd-x64-1.13.4.tgz", + "integrity": "sha512-4TVuVG86fJhWGBx8nR+USq00lYHuzLp1PqrW3vDKmTwxlMf3gmquO6PyQ85I5jfr1G2QpKn/cVJCvj3ExMUOxg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "optional": true, + "os": [ + "openbsd" + ] }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "node_modules/lefthook-windows-arm64": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/lefthook-windows-arm64/-/lefthook-windows-arm64-1.13.4.tgz", + "integrity": "sha512-y46ZgRAgyMy5MQYkZoSBtHYUYj0+54cM0VDT/Lu/jz1GRFAE8JkrRVetk3geqECpnMGxBkSgfhcbGDYeEvJQdw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/mdn-data": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", - "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "node_modules/lefthook-windows-x64": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/lefthook-windows-x64/-/lefthook-windows-x64-1.13.4.tgz", + "integrity": "sha512-p2YfWuj/43gUT0nHJ6j0pTRpLLwX9n2bio60POuXOrr3RVxdv5MEaQchdRhqYG5uWj7Zsm86K9FWkNuxPG81IA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "CC0-1.0" - }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", - "engines": { - "node": ">= 0.8" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/memfs": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.46.0.tgz", - "integrity": "sha512-//IxqL9OO/WMpm2kE2aq+y7vO7/xS9xgVIbFM8RUIfW7TY7lowtnuS1j9MwLGm0OwcHUa4p8Bp+40W7f1BiWGQ==", + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@jsonjoy.com/json-pack": "^1.11.0", - "@jsonjoy.com/util": "^1.9.0", - "glob-to-regex.js": "^1.0.1", - "thingies": "^2.5.0", - "tree-dump": "^1.0.3", - "tslib": "^2.0.0" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/meow": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", - "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/antonk52" } }, - "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==", + "node_modules/line-column-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/line-column-path/-/line-column-path-3.0.0.tgz", + "integrity": "sha512-Atocnm7Wr9nuvAn97yEPQa3pcQI5eLQGBz+m6iTb+CVw+IOzYB9MrYK7jI7BfC9ISnT4Fu0eiwhAScV//rp4Hw==", "license": "MIT", + "dependencies": { + "type-fest": "^2.0.0" + }, "engines": { - "node": ">=18" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true, "license": "MIT" }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromark": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", - "dev": true, - "license": "MIT", + "node_modules/lit": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.1.tgz", + "integrity": "sha512-Ksr/8L3PTapbdXJCk+EJVB78jDodUMaP54gD24W186zGRARvwrsPfS60wae/SSCTCNZVPd1chXqio1qHQmu4NA==", + "license": "BSD-3-Clause", "dependencies": { - "micromark-extension-gfm-autolink-literal": "^2.0.0", - "micromark-extension-gfm-footnote": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-tagfilter": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "@lit/reactive-element": "^2.1.0", + "lit-element": "^4.2.0", + "lit-html": "^3.3.0" } }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "dev": true, - "license": "MIT", + "node_modules/lit-element": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.2.0.tgz", + "integrity": "sha512-MGrXJVAI5x+Bfth/pU9Kst1iWID6GHDLEzFEnyULB/sFiRLgkd8NPK/PeeXxktA3T6EIIaq8U3KcbTU5XFcP2Q==", + "license": "BSD-3-Clause", "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "@lit-labs/ssr-dom-shim": "^1.2.0", + "@lit/reactive-element": "^2.1.0", + "lit-html": "^3.3.0" } }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "dev": true, - "license": "MIT", + "node_modules/lit-html": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.1.tgz", + "integrity": "sha512-S9hbyDu/vs1qNrithiNyeyv64c9yqiW9l+DBgI18fL+MTvOtWoFR0FWiyq1TxaYef5wNlpEmzlXoBlZEO+WjoA==", + "license": "BSD-3-Clause", "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "@types/trusted-types": "^2.0.2" } }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", - "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=6.11.5" } }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", - "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", "dev": true, "license": "MIT", "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=8.9.0" } }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "node_modules/loader-utils/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" + "bin": { + "json5": "lib/cli.js" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=6" } }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", - "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" }, - "node_modules/micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } + "license": "MIT" }, - "node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "node_modules/lodash.deburr": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", + "integrity": "sha512-m/M1U1f3ddMCs6Hq2tAsYThTBDaAKFDX3dwDo97GEYzamXi9SqUpjWi/Rrj/gf3X2n8ktwgZrlP1z6E3v/IExQ==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } + "license": "MIT" }, - "node_modules/micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } + "license": "MIT" }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } + "license": "MIT" }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } + "license": "MIT" }, - "node_modules/micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "node_modules/lodash.unionby": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/lodash.unionby/-/lodash.unionby-4.8.0.tgz", + "integrity": "sha512-e60kn4GJIunNkw6v9MxRnUuLYI/Tyuanch7ozoCtk/1irJTYBj+qNTxr5B3qVflmJhwStJBv387Cb+9VOfABMg==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } + "license": "MIT" }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } + "license": "MIT" }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "license": "MIT", "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" } }, - "node_modules/micromark-util-decode-numeric-character-reference": { + "node_modules/lower-case": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "license": "MIT", "dependencies": { - "micromark-util-symbol": "^2.0.0" + "tslib": "^2.0.3" } }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", - "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", + "license": "ISC", "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" + "yallist": "^3.0.2" } }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "node_modules/lru-cache/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" + "license": "ISC" }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" + "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "license": "MIT", - "dependencies": { - "micromark-util-symbol": "^2.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" + "engines": { + "node": ">= 0.8" } }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "node_modules/memfs": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.46.0.tgz", + "integrity": "sha512-//IxqL9OO/WMpm2kE2aq+y7vO7/xS9xgVIbFM8RUIfW7TY7lowtnuS1j9MwLGm0OwcHUa4p8Bp+40W7f1BiWGQ==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" + "@jsonjoy.com/json-pack": "^1.11.0", + "@jsonjoy.com/util": "^1.9.0", + "glob-to-regex.js": "^1.0.1", + "thingies": "^2.5.0", + "tree-dump": "^1.0.3", + "tslib": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" } }, - "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "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==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], "license": "MIT" }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, "node_modules/micromatch": { "version": "4.0.8", @@ -19694,16 +12449,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -19782,31 +12527,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/module-details-from-path": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", - "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", - "dev": true, - "license": "MIT" - }, - "node_modules/mozjpeg": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/mozjpeg/-/mozjpeg-8.0.0.tgz", - "integrity": "sha512-Ca2Yhah9hG0Iutgsn8MOrAl37P9ThnKsJatjXoWdUO+8X8GeG/6ahvHZrTyqvbs6leMww1SauWUCao/L9qBuFQ==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "bin-build": "^3.0.0", - "bin-wrapper": "^4.0.0" - }, - "bin": { - "mozjpeg": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, "node_modules/mrmime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", @@ -19837,13 +12557,6 @@ "multicast-dns": "cli.js" } }, - "node_modules/mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", - "dev": true, - "license": "ISC" - }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -19886,13 +12599,6 @@ "dev": true, "license": "MIT" }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true, - "license": "MIT" - }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -19986,53 +12692,6 @@ "node": ">=0.10.0" } }, - "node_modules/npm-conf": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", - "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", - "dev": true, - "license": "MIT", - "dependencies": { - "config-chain": "^1.1.11", - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-conf/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -20212,29 +12871,6 @@ "wrappy": "1" } }, - "node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fn.name": "1.x.x" - } - }, - "node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/open": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/open/-/open-10.2.0.tgz", @@ -20413,28 +13049,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/openai": { - "version": "5.19.1", - "resolved": "https://registry.npmjs.org/openai/-/openai-5.19.1.tgz", - "integrity": "sha512-zSqnUF7oR9ksmpusKkpUgkNrj8Sl57U+OyzO8jzc7LUjTMg4DRfR3uCm+EIMA6iw06sRPNp4t7ojp3sCpEUZRQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "openai": "bin/cli" - }, - "peerDependencies": { - "ws": "^8.18.0", - "zod": "^3.23.8" - }, - "peerDependenciesMeta": { - "ws": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, "node_modules/opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", @@ -20463,76 +13077,6 @@ "node": ">= 0.8.0" } }, - "node_modules/os-filter-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-2.0.0.tgz", - "integrity": "sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "arch": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ow/-/ow-2.0.0.tgz", - "integrity": "sha512-ESUigmGrdhUZ2nQSFNkeKSl6ZRPupXzprMs3yF9DYlNVpJ8XAjM/fI9RUZxA7PI1K9HQDCCvBo1jr/GEIo9joQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^6.3.0", - "callsites": "^4.1.0", - "dot-prop": "^8.0.2", - "environment": "^1.0.0", - "fast-equals": "^5.0.1", - "is-identifier": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ow/node_modules/@sindresorhus/is": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-6.3.1.tgz", - "integrity": "sha512-FX4MfcifwJyFOI2lPoX7PQxCqx8BG1HCho7WdiXwpEQx1Ycij0JxkfYtGK7yqNScrZGSlt6RE6sw8QYoH7eKnQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/ow/node_modules/callsites": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-4.2.0.tgz", - "integrity": "sha512-kfzR4zzQtAE9PC7CzZsjl3aBNbXWuXiSeOCdLcPpBfGW8YuCqQHcRPFDbr/BPVmd3EEPVpuFzLyuT/cUhPr4OQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/own-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", @@ -20545,43 +13089,10 @@ "safe-push-apply": "^1.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/p-event": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-1.3.0.tgz", - "integrity": "sha512-hV1zbA7gwqPVFcapfeATaNjQ3J0NuzorHPyG8GPL9g/Y/TplWVBVoCKCXL6Ej2zscrCEv195QNWJXuBH6XZuzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-timeout": "^1.1.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-is-promise": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/p-limit": { @@ -20616,42 +13127,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-map-series": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-1.0.0.tgz", - "integrity": "sha512-4k9LlvY6Bo/1FcIdV33wqZQES0Py+iKISU9Uc8p8AjWoZPnFKMpVIVD3s0EYn4jzLh1I+WeUZkJ0Yoa4Qfw3Kg==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-reduce": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/p-pipe": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-4.0.0.tgz", - "integrity": "sha512-HkPfFklpZQPUKBFXzKFB6ihLriIHxnmuQdK9WmLDwe4hf2PdhhfWT/FJa+pc3bA1ywvKXtedxIRmd4Y7BTXE4w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-reduce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", - "integrity": "sha512-3Tx1T3oM1xO/Y8Gj0sWyE78EIJZ+t+aEmXUdvQgvGmSMri7aPTHoovbXEreWKkL5j21Er60XAWLTzKbAKYOujQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/p-retry": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", @@ -20670,19 +13145,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-timeout": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", - "integrity": "sha512-gb0ryzr+K2qFqFv6qi3khoeqMZF/+ajxQipEF6NteZVnvz9tzdsfAVj3lYtn1gAXvH5lfLwfxEII799gt/mRIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -20696,33 +13158,6 @@ "node": ">=6" } }, - "node_modules/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true, - "license": "MIT" - }, "node_modules/parse-imports-exports": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz", @@ -20826,16 +13261,6 @@ "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -20871,127 +13296,12 @@ "node": ">=8" } }, - "node_modules/peek-readable": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.4.2.tgz", - "integrity": "sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "license": "MIT" }, - "node_modules/pg": { - "version": "8.16.3", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", - "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", - "dev": true, - "dependencies": { - "pg-connection-string": "^2.9.1", - "pg-pool": "^3.10.1", - "pg-protocol": "^1.10.3", - "pg-types": "2.2.0", - "pgpass": "1.0.5" - }, - "engines": { - "node": ">= 16.0.0" - }, - "optionalDependencies": { - "pg-cloudflare": "^1.2.7" - }, - "peerDependencies": { - "pg-native": ">=3.0.1" - }, - "peerDependenciesMeta": { - "pg-native": { - "optional": true - } - } - }, - "node_modules/pg-cloudflare": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz", - "integrity": "sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==", - "dev": true, - "optional": true - }, - "node_modules/pg-connection-string": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.1.tgz", - "integrity": "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==", - "dev": true - }, - "node_modules/pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/pg-pool": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.10.1.tgz", - "integrity": "sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==", - "dev": true, - "peerDependencies": { - "pg": ">=8.0" - } - }, - "node_modules/pg-protocol": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz", - "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==", - "dev": true - }, - "node_modules/pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pgpass": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", - "dev": true, - "dependencies": { - "split2": "^4.1.0" - } - }, - "node_modules/pgvector": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/pgvector/-/pgvector-0.2.1.tgz", - "integrity": "sha512-nKaQY9wtuiidwLMdVIce1O3kL0d+FxrigCVzsShnoqzOSaWWWOvuctb/sYwlai5cTwwzRSNa+a/NtN2kVZGNJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 18" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -21009,209 +13319,26 @@ }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/pngquant-bin": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/pngquant-bin/-/pngquant-bin-9.0.0.tgz", - "integrity": "sha512-jlOKfIQBTNJwQn2JKK5xLmwrsi/NwVTmHRvbrknCjdWxfX1/c/+yP4Jmp9jRZWedft/vnhh+rGbvl/kUmesurg==", - "dev": true, - "hasInstallScript": true, - "license": "GPL-3.0+", - "dependencies": { - "bin-build": "^3.0.0", - "bin-wrapper": "^4.0.1", - "execa": "^8.0.1" - }, - "bin": { - "pngquant": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/pngquant-bin/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/pngquant-bin/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pngquant-bin/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/pngquant-bin/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pngquant-bin/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pngquant-bin/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pngquant-bin/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pngquant-bin/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 6" } }, - "node_modules/pngquant-bin/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "node_modules/possible-typed-array-names": { @@ -22677,49 +14804,6 @@ "dev": true, "license": "MIT" }, - "node_modules/postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "xtend": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -22730,16 +14814,6 @@ "node": ">= 0.8.0" } }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/prettier": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", @@ -22803,24 +14877,6 @@ "react-is": "^16.13.1" } }, - "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true, - "license": "ISC" - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -22840,13 +14896,6 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true, - "license": "ISC" - }, "node_modules/pump": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", @@ -22882,31 +14931,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "dev": true, - "license": "MIT", - "dependencies": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "~2.0.3" - } - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -22973,20 +14997,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-dom": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", - "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "scheduler": "^0.26.0" - }, - "peerDependencies": { - "react": "^19.1.0" - } - }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -22994,121 +15004,6 @@ "dev": true, "license": "MIT" }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", - "dev": true, - "license": "MIT" - }, - "node_modules/react-markdown": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", - "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "html-url-attributes": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "unified": "^11.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=18", - "react": ">=18" - } - }, - "node_modules/react-modal": { - "version": "3.16.3", - "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.3.tgz", - "integrity": "sha512-yCYRJB5YkeQDQlTt17WGAgFJ7jr2QYcWa1SHqZ3PluDmnKJ/7+tVU+E6uKyZ0nODaeEj+xCpK4LcSnKXLMC0Nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "exenv": "^1.2.0", - "prop-types": "^15.7.2", - "react-lifecycles-compat": "^3.0.0", - "warning": "^4.0.3" - }, - "peerDependencies": { - "react": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19", - "react-dom": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18 || ^19" - } - }, - "node_modules/react-router": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.8.2.tgz", - "integrity": "sha512-7M2fR1JbIZ/jFWqelpvSZx+7vd7UlBTfdZqf6OSdF9g6+sfdqJDAWcak6ervbHph200ePlu+7G8LdoiC3ReyAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/react-router-dom": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.8.2.tgz", - "integrity": "sha512-Z4VM5mKDipal2jQ385H6UBhiiEDlnJPx6jyWsTYoZQdl5TrjxEV2a9yl3Fi60NBJxYzOTGTTHXPi0pdizvTwow==", - "dev": true, - "license": "MIT", - "dependencies": { - "react-router": "7.8.2" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - } - }, - "node_modules/react-router/node_modules/cookie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", - "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/read-chunk": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-5.0.0.tgz", - "integrity": "sha512-kEiU3Y6ET/R1CEpS29aupxwGd19P4y3Y50x0CNFI5j8jowtgHBlNVLH/z5KjjBT5pxixIb7eTeIMJVKTm200cw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -23278,189 +15173,8 @@ "bin": { "jsesc": "bin/jsesc" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/rehype-format": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/rehype-format/-/rehype-format-5.0.1.tgz", - "integrity": "sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-format": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-minify-whitespace": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/rehype-minify-whitespace/-/rehype-minify-whitespace-6.0.2.tgz", - "integrity": "sha512-Zk0pyQ06A3Lyxhe9vGtOtzz3Z0+qZ5+7icZ/PL/2x1SHPbKao5oB/g/rlc6BCTajqBb33JcOe71Ye1oFsuYbnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-minify-whitespace": "^1.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-parse": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", - "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-from-html": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-raw": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", - "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-raw": "^9.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-remark": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/rehype-remark/-/rehype-remark-10.0.1.tgz", - "integrity": "sha512-EmDndlb5NVwXGfUa4c9GPK+lXeItTilLhE6ADSaQuHr4JUlKw9MidzGzx4HpqZrNCt6vnHmEifXQiiA+CEnjYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "hast-util-to-mdast": "^10.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-sanitize": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/rehype-sanitize/-/rehype-sanitize-6.0.0.tgz", - "integrity": "sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-sanitize": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/rehype-stringify": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", - "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "hast-util-to-html": "^9.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-gfm": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", - "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-gfm": "^3.0.0", - "micromark-extension-gfm": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-rehype": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", - "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "mdast-util-to-hast": "^13.0.0", - "unified": "^11.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" + "engines": { + "node": ">=6" } }, "node_modules/require-directory": { @@ -23482,40 +15196,12 @@ "node": ">=0.10.0" } }, - "node_modules/require-in-the-middle": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", - "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "license": "MIT" }, - "node_modules/reserved-identifiers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.0.0.tgz", - "integrity": "sha512-h0bP2Katmvf3hv4Z3WtDl4+6xt/OglQ2Xa6TnhZ/Rm9/7IH1crXQqMwD4J2ngKBonVv+fB55zfGgNDAmsevLVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", @@ -23574,27 +15260,6 @@ "node": ">=12" } }, - "node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, "node_modules/retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", @@ -23672,16 +15337,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -23790,32 +15445,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, - "node_modules/sanitize-filename": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", - "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", - "dev": true, - "license": "WTFPL OR ISC", - "dependencies": { - "truncate-utf8-bytes": "^1.0.0" - } - }, "node_modules/sass": { "version": "1.93.2", "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.2.tgz", @@ -24276,21 +15911,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "dev": true, - "license": "ISC" - }, - "node_modules/scheduler": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", - "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/schema-utils": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", @@ -24348,27 +15968,6 @@ "dev": true, "license": "MIT" }, - "node_modules/seek-bzip": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", - "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "^2.8.1" - }, - "bin": { - "seek-bunzip": "bin/seek-bunzip", - "seek-table": "bin/seek-bzip-table" - } - }, - "node_modules/seek-bzip/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT" - }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -24403,39 +16002,6 @@ "node": ">=10" } }, - "node_modules/semver-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", - "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/semver-truncate": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.2.tgz", - "integrity": "sha512-V1fGg9i4CL3qesB6U0L6XAm4xOJiHmt4QAacazumuasc03BvtFGIMCduv01JWQ69Nv+JST9TqhSCiJoxoY031w==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^5.3.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/semver-truncate/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, "node_modules/send": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", @@ -24614,13 +16180,6 @@ "node": ">= 18" } }, - "node_modules/set-cookie-parser": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", - "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", - "dev": true, - "license": "MIT" - }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -24722,13 +16281,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/shimmer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", - "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==", - "dev": true, - "license": "BSD-2-Clause" - }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -24813,23 +16365,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true, - "license": "MIT" - }, "node_modules/sirv": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", @@ -25040,42 +16575,6 @@ "websocket-driver": "^0.7.4" } }, - "node_modules/sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-plain-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sort-keys-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", - "integrity": "sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==", - "dev": true, - "license": "MIT", - "dependencies": { - "sort-keys": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sort-keys/node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -25105,17 +16604,6 @@ "source-map": "^0.6.0" } }, - "node_modules/space-separated-tokens": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", - "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/spdx-exceptions": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", @@ -25173,39 +16661,6 @@ "wbuf": "^1.7.3" } }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "dev": true, - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/sse.js": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/sse.js/-/sse.js-2.7.0.tgz", - "integrity": "sha512-fBTq4O0Hoc2v3g8WJ3RvjjAL8ohtMIe7cdFQM0RmaTsm4kRZxSAMcAN+MctSalrcvPxDfFF0FP97EwKiTcU9IQ==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -25229,16 +16684,6 @@ "node": ">= 0.4" } }, - "node_modules/strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -25322,21 +16767,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/stringify-entities": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", - "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", - "dev": true, - "license": "MIT", - "dependencies": { - "character-entities-html4": "^2.0.0", - "character-entities-legacy": "^3.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -25359,36 +16789,6 @@ "node": ">=4" } }, - "node_modules/strip-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", - "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-natural-number": "^4.0.1" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/strip-indent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", @@ -25414,90 +16814,16 @@ "engines": { "node": ">=8" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-outer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", - "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-outer/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/strnum": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", - "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, - "node_modules/strtok3": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-9.1.1.tgz", - "integrity": "sha512-FhwotcEqjr241ZbjFzjlIYg6c5/L/s4yBGWSMvJ9UoExiSqL+FnFA/CaeZx17WGaZMS/4SOZp8wH18jSS4R4lw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tokenizer/token": "^0.3.0", - "peek-readable": "^5.3.1" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/style-mod": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", - "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", - "license": "MIT" - }, - "node_modules/style-to-js": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.16.tgz", - "integrity": "sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "style-to-object": "1.0.8" - } - }, - "node_modules/style-to-object": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", - "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "inline-style-parser": "0.2.4" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/style-mod": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", + "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", + "license": "MIT" + }, "node_modules/stylehacks": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.4.tgz", @@ -25742,23 +17068,6 @@ "postcss": "^8.3.3" } }, - "node_modules/super-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-1.0.0.tgz", - "integrity": "sha512-CY8u7DtbvucKuquCmOFEKhr9Besln7n9uN8eFbwcoGYWXOMW07u2o8njWaiXt11ylS3qoGF55pILjRmPlbodyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-timeout": "^1.0.1", - "time-span": "^5.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -25871,20 +17180,6 @@ "dev": true, "license": "CC0-1.0" }, - "node_modules/swr": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.6.tgz", - "integrity": "sha512-wfHRmHWk/isGNMwlLGlZX5Gzz/uTgo0o2IRuTMcf4CPuPFJZlq0rDaKUx+ozB5nBOReNV1kiOyzMfj+MBMikLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "dequal": "^2.0.3", - "use-sync-external-store": "^1.4.0" - }, - "peerDependencies": { - "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, "node_modules/sync-child-process": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", @@ -25949,34 +17244,6 @@ "dev": true, "license": "MIT" }, - "node_modules/tabtab": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tabtab/-/tabtab-3.0.2.tgz", - "integrity": "sha512-jANKmUe0sIQc/zTALTBy186PoM/k6aPrh3A7p6AaAfF6WPSbTx1JYeGIGH162btpH+mmVEXln+UxwViZHO2Jhg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.0.1", - "es6-promisify": "^6.0.0", - "inquirer": "^6.0.0", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "untildify": "^3.0.3" - } - }, - "node_modules/tabtab/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/tapable": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", @@ -26003,142 +17270,6 @@ "node": ">=18" } }, - "node_modules/tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/tar-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/tar-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/tar-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/tempfile": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", - "integrity": "sha512-ZOn6nJUgvgC09+doCEF3oB+r3ag7kUvlsXEGX069QRD60p+P3uP7XG9N2/at+EyIRGSN//ZY3LyEotA1YpmjuA==", - "dev": true, - "license": "MIT", - "dependencies": { - "temp-dir": "^1.0.0", - "uuid": "^3.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tempfile/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/tempy": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.1.0.tgz", - "integrity": "sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-stream": "^3.0.0", - "temp-dir": "^3.0.0", - "type-fest": "^2.12.2", - "unique-string": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/temp-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", - "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - } - }, "node_modules/terser": { "version": "5.39.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", @@ -26231,13 +17362,6 @@ "dev": true, "license": "MIT" }, - "node_modules/text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "dev": true, - "license": "MIT" - }, "node_modules/thingies": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.5.0.tgz", @@ -26255,13 +17379,6 @@ "tslib": "^2" } }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true, - "license": "MIT" - }, "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", @@ -26269,32 +17386,6 @@ "dev": true, "license": "MIT" }, - "node_modules/time-span": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/time-span/-/time-span-5.1.0.tgz", - "integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "convert-hrtime": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/tinyglobby": { "version": "0.2.14", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", @@ -26311,26 +17402,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true, - "license": "MIT" - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -26352,24 +17423,6 @@ "node": ">=0.6" } }, - "node_modules/token-types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.0.0.tgz", - "integrity": "sha512-lbDrTLVsHhOMljPscd0yitpozq7Ga2M5Cvez5AjGg8GASBjtt6iERCAJ93yommPmz62fb45oFIXHEZ3u9bfJEA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tokenizer/token": "^0.3.0", - "ieee754": "^1.2.1" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, "node_modules/totalist": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", @@ -26406,82 +17459,6 @@ "tree-kill": "cli.js" } }, - "node_modules/trim-lines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", - "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/trim-repeated": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", - "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/trim-repeated/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/trim-trailing-lines": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-2.1.0.tgz", - "integrity": "sha512-5UR5Biq4VlVOtzqkm2AZlgvSlDJtME46uV0br0gENbwN4l5+mMKT4b9gJKqWtuL2zAIqajGJGuvbCbcAJUZqBg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/triple-beam": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", - "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/truncate-utf8-bytes": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", - "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==", - "dev": true, - "license": "WTFPL", - "dependencies": { - "utf8-byte-length": "^1.0.1" - } - }, "node_modules/ts-api-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", @@ -26544,19 +17521,6 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -26719,19 +17683,6 @@ "node": ">=14.17" } }, - "node_modules/uint8array-extras": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.4.0.tgz", - "integrity": "sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", @@ -26751,42 +17702,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "node_modules/unbzip2-stream/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "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", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/undici-types": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", @@ -26849,157 +17764,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unified/node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unist-builder": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-4.0.0.tgz", - "integrity": "sha512-wmRFnH+BLpZnTKpc5L7O67Kac89s9HMrtELpnNaE6TAobq5DTZZs5YaTQfAZBA9bFPECx2uVAPO31c+GVug8mg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-find-after": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", - "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", - "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", @@ -27019,16 +17783,6 @@ "node": ">= 0.8" } }, - "node_modules/untildify": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", - "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", @@ -27070,46 +17824,6 @@ "punycode": "^2.1.0" } }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/url-to-options": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", - "integrity": "sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/use-sync-external-store": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", - "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/utf8-byte-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz", - "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==", - "dev": true, - "license": "(WTFPL OR MIT)" - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -27153,51 +17867,6 @@ "node": ">= 0.8" } }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-location": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", - "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", - "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/vscode-css-languageservice": { "version": "6.3.7", "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.3.7.tgz", @@ -27251,16 +17920,6 @@ "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", "license": "MIT" }, - "node_modules/warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, "node_modules/watchpack": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", @@ -27285,31 +17944,6 @@ "minimalistic-assert": "^1.0.0" } }, - "node_modules/web-features": { - "version": "2.41.1", - "resolved": "https://registry.npmjs.org/web-features/-/web-features-2.41.1.tgz", - "integrity": "sha512-RDqAoYOiCnIoUCI0rbDuIG2HHzO6fCcQ2fmelMRgHt08eOOEo+RYk7PimHiSSox7iQEMxWdlQrnhIZY4tgkKFw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/web-namespaces": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", - "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/web-specs": { - "version": "3.54.0", - "resolved": "https://registry.npmjs.org/web-specs/-/web-specs-3.54.0.tgz", - "integrity": "sha512-naq1hNFEjq12XyfjbRLr6TOAANCemoxJn8VVbex+5UK0pWoa3XTGiyfra2FsOZvlhpCm7HOjxK1ivlqF+KfCkw==", - "dev": true, - "license": "CC0-1.0" - }, "node_modules/web-streams-polyfill": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", @@ -28100,57 +18734,6 @@ "dev": true, "license": "MIT" }, - "node_modules/winston": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", - "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.2", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.7.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.9.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/winston-transport": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", - "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "logform": "^2.7.0", - "readable-stream": "^3.6.2", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/winston/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -28235,29 +18818,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/xml-js": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", - "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "sax": "^1.2.4" - }, - "bin": { - "xml-js": "bin/cli.js" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -28337,30 +18897,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/yoctocolors-cjs": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", - "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zwitch": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", - "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } } } } diff --git a/package.json b/package.json index e20247ae3..b20074784 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "start": "node --env-file=.env scripts/server.js", "dev": "node --env-file=.env ./server.js", "build": "rspack build", + "build:legacy": "cd vendor/yari && yarn --frozen-lockfile && yarn build:legacy:prepare && yarn prepack", "preview": "NODE_ENV=production node ./server.js", "ssr": "node build/ssr.js", "lit-analyzer": "npx @jackolope/lit-analyzer --rules.no-incompatible-type-binding off", @@ -74,7 +75,6 @@ "@jackolope/lit-analyzer": "^3.2.0", "@jackolope/ts-lit-plugin": "^3.1.6", "@mdn/browser-compat-data": "^7.1.9", - "@mdn/yari": "^5.1.2", "@rsdoctor/rspack-plugin": "^1.2.3", "@rspack/cli": "^1.5.7", "@rspack/core": "^1.5.7", diff --git a/rspack.config.js b/rspack.config.js index 877bf98ce..743bf2a5a 100644 --- a/rspack.config.js +++ b/rspack.config.js @@ -424,7 +424,7 @@ const legacyConfig = merge( name: "legacy", entry: { index: "./legacy/index.tsx", - yari: "./node_modules/@mdn/yari/client/src/index.tsx", + yari: "./vendor/yari/client/src/index.tsx", }, output: { filename: "[name].[contenthash].js", @@ -436,7 +436,7 @@ const legacyConfig = merge( alias: { [path.resolve( __dirname, - "node_modules/@mdn/yari/client/src/document/toolbar/index.tsx", + "vendor/yari/client/src/document/toolbar/index.tsx", )]: false, }, }, @@ -465,7 +465,7 @@ const legacyConfig = merge( inject: true, chunks: ["yari"], filename: "index.[contenthash].html", - template: "node_modules/@mdn/yari/client/public/index.html", + template: "vendor/yari/client/public/index.html", }), new RspackManifestPlugin({ fileName: "asset-manifest.json", diff --git a/vendor/yari/.editorconfig b/vendor/yari/.editorconfig new file mode 100644 index 000000000..da0925031 --- /dev/null +++ b/vendor/yari/.editorconfig @@ -0,0 +1,15 @@ +# EditorConfig is awesome: https://EditorConfig.org + +# top-most EditorConfig file +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.py] +indent_size = 4 diff --git a/vendor/yari/.env-dist b/vendor/yari/.env-dist new file mode 100644 index 000000000..bcb00ecc0 --- /dev/null +++ b/vendor/yari/.env-dist @@ -0,0 +1,9 @@ +CONTENT_ROOT=../content/files +#CONTENT_TRANSLATED_ROOT=../translated-content/files +#CONTRIBUTOR_SPOTLIGHT_ROOT=../mdn-contributor-spotlight/contributors +#GENERIC_CONTENT_ROOT=../generic-content/files + +REACT_APP_DEV_MODE=true + +# See documentation in docs/envvars.md for more information about this +#BUILD_FLAW_LEVELS=broken_links:error, macros:ignore diff --git a/vendor/yari/.env.testing b/vendor/yari/.env.testing new file mode 100644 index 000000000..d9097039e --- /dev/null +++ b/vendor/yari/.env.testing @@ -0,0 +1,38 @@ +# THERE ARE NO SECRETS IN THIS FILE. +# This file exists exclusively for running the functional tests. +# These values are deliberately hardcoded. + +# The relative path trick is necessary because `yarn build` will +# be running from the `./build/` directory. + +CONTENT_ROOT=testing/content/files +CONTENT_TRANSLATED_ROOT=testing/translated-content/files + +# Because you never benefit from the progressbar when doing mass builds in +# testing environment. And in CI, it's always disabled anyway. +BUILD_NO_PROGRESSBAR=true + +BUILD_LIVE_SAMPLES_BASE_URL=http://localhost:5042 + +# As of right now (Nov 2020), the auto-complete search is disabled. +# It's just a temporary thing whilst MDN becomes partially Kuma and +# partially Yari. +# But all the testing is done for the auto-complete search which +# is disabled by default. This environment variable reverses that +# default. +REACT_APP_AUTOCOMPLETE_SEARCH_WIDGET=true + +# These are set to fake values just to make sure the paths that +# injects the relevant script tags actually run in end-to-end testing. +BUILD_GOOGLE_ANALYTICS_MEASUREMENT_ID=G-XXXXXXXX + +# The functional tests are done in a production'y way as if it had +# to go into full production mode. +BUILD_ALWAYS_ALLOW_ROBOTS=true + +# Always true for testing +REACT_APP_ENABLE_PLUS=true + +REACT_APP_FXA_SIGNIN_URL=/users/fxa/login/authenticate/ + +BASE_URL="https://developer.mozilla.org" diff --git a/vendor/yari/.eslintignore b/vendor/yari/.eslintignore new file mode 100644 index 000000000..b2321855a --- /dev/null +++ b/vendor/yari/.eslintignore @@ -0,0 +1,11 @@ +*.min.js +client/build/ +dist/ +ssr/dist/ +libs/ +client/public/service-worker.js +client/public/ +client/src/document/*.js +mdn/content/ +tool/*.js +bins/*.mjs diff --git a/vendor/yari/.eslintrc.cjs b/vendor/yari/.eslintrc.cjs new file mode 100644 index 000000000..a3c1be2c2 --- /dev/null +++ b/vendor/yari/.eslintrc.cjs @@ -0,0 +1,104 @@ +// @ts-check +const path = require("node:path"); +const { readGitignoreFiles } = require("eslint-gitignore"); + +/** @type {string[]} */ +let ignores = []; +try { + ignores = readGitignoreFiles({ + cwd: path.join(".git", "info"), + patterns: ["exclude"], + }); +} catch (error) { + if (error.code === "ENOTDIR") { + console.log( + `${path.join( + ".git", + "info", + "exclude" + )} dir doesn't exist, we're probably a submodule` + ); + } else { + throw error; + } +} + +module.exports = { + ignorePatterns: ignores, + env: { + browser: false, + commonjs: true, + es2020: true, + "jest/globals": true, + }, + extends: ["eslint:recommended", "plugin:n/recommended"], + plugins: ["jest", "unicorn"], + globals: { + Atomics: "readonly", + SharedArrayBuffer: "readonly", + }, + parserOptions: { + ecmaVersion: 2020, + }, + rules: { + "one-var": ["error", "never"], + "unicorn/prefer-node-protocol": "error", + }, + reportUnusedDisableDirectives: true, + overrides: [ + { + files: ["**/*.ts", "**/*.tsx"], + parser: "@typescript-eslint/parser", + extends: [ + "plugin:@typescript-eslint/recommended", + //"plugin:@typescript-eslint/stylistic", + ], + rules: { + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-unused-vars": [ + "warn", + { ignoreRestSiblings: true }, + ], + "n/no-deprecated-api": "off", + "n/no-extraneous-import": [ + "error", + { + allowModules: ["@jest/globals"], + }, + ], + "n/no-missing-import": "off", + "n/no-unpublished-import": "off", + "n/hashbang": "off", + }, + }, + { + files: ["testing/**/*.js"], + globals: { + page: "readonly", + document: "readonly", + }, + }, + { + files: ["**/cli.js"], + rules: { + "n/shebang": 0, + "no-process-exit": 0, + }, + }, + { + files: ["ssr/**/*.js"], + parserOptions: { + sourceType: "module", + }, + rules: { + "n/no-unsupported-features/es-syntax": [ + "error", + { + ignores: ["modules"], + }, + ], + "n/no-unpublished-import": "off", + }, + }, + ], +}; diff --git a/vendor/yari/.flake8 b/vendor/yari/.flake8 new file mode 100644 index 000000000..edc79836b --- /dev/null +++ b/vendor/yari/.flake8 @@ -0,0 +1,7 @@ +[flake8] +# Black recommends 88-char lines and ignoring the following lints: +# - E203 - whitespace before ':' +# - E501 - line too long +# - W503 - line break before binary operator +max-line-length=88 +ignore = E203, E501, W503 diff --git a/vendor/yari/.gitattributes b/vendor/yari/.gitattributes new file mode 100644 index 000000000..8a592bd09 --- /dev/null +++ b/vendor/yari/.gitattributes @@ -0,0 +1,2 @@ +build/** linguist-generated=false + diff --git a/vendor/yari/.gitignore b/vendor/yari/.gitignore new file mode 100644 index 000000000..c7e7d3454 --- /dev/null +++ b/vendor/yari/.gitignore @@ -0,0 +1,102 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +node_modules/ +/.pnp +.pnp.js + +# testing +/coverage +/mdn/content/ + +# pwa +/client/public/service-worker.js + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local +/.env +/client/.env +__pycache__/ +.idea/ +tsconfig.tsbuildinfo + +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +/testing/node_modules/ +/build/*.js.map +/client/build +/client/src/**/*.js.map +/content/*.js.map +/markdown/*.js.map +/server/*.js.map +/ssr/dist/ +/ssr/*.js.map +/tool/*.js.map + +# These are an effect of the dumper still producing all locales +# We haven't decided what to do with them but for now we're *not* +# going to check them into git. +/content/files/ar/ +/content/files/bg/ +/content/files/bn/ +/content/files/ca/ +/content/files/de/ +/content/files/el/ +/content/files/es/ +/content/files/fa/ +/content/files/fi/ +/content/files/fr/ +/content/files/he/ +/content/files/hi-in/ +/content/files/hu/ +/content/files/id/ +/content/files/it/ +/content/files/ja/ +/content/files/kab/ +/content/files/ko/ +/content/files/ms/ +/content/files/my/ +/content/files/nl/ +/content/files/pl/ +/content/files/pt-br/ +/content/files/pt-pt/ +/content/files/ru/ +/content/files/sv-se/ +/content/files/th/ +/content/files/tr/ +/content/files/uk/ +/content/files/vi/ +/content/files/zh-cn/ +/content/files/zh-tw/ + +/deployer/upload.log +/deployer/src/deployer.egg-info/ +fake-v1-api/ +mdn-yari-*.tgz +function.zip +md-conversion-problems-report*.md + +testing/content/files/en-us/_githistory.json +testing/translated-content/files/**/_githistory.json + +testing/content/files/en-us/markdown/tool/h2m/index.md +testing/content/files/en-us/markdown/tool/m2h/index.html +# eslintcache +client/.eslintcache +popularities.json +source-commit.json +source-commit-invalid-report.txt + +client/src/.linaria_cache +ssr/.linaria-cache/ + +client/venv + +.eslintcache +.stylelintcache diff --git a/vendor/yari/.lefthook.yml b/vendor/yari/.lefthook.yml new file mode 100644 index 000000000..50a30d3ab --- /dev/null +++ b/vendor/yari/.lefthook.yml @@ -0,0 +1,59 @@ +pre-commit: + parallel: true + jobs: + - name: prettier + run: npx prettier --write --cache --ignore-unknown {staged_files} + stage_fixed: true + + - name: eslint + run: npx eslint --fix --cache {staged_files} + glob: + - "*.js" + - "*.jsx" + - "*.ts" + - "*.tsx" + stage_fixed: true + + - name: eslint (global) + run: npx eslint --fix --cache . + glob: .eslintrc.cjs + stage_fixed: true + + - name: stylelint + run: npx stylelint --fix --cache {staged_files} + glob: "*.scss" + stage_fixed: true + + - name: stylelint (global) + run: npx stylelint --fix '**/*.scss' --cache --ignore-path .gitignore + glob: .stylelintrc.json + stage_fixed: true + +pre-push: + piped: true + jobs: + - run: yarn install + + - name: lint + group: + parrallel: true + jobs: + - name: eslint + run: npx eslint --cache + - name: stylelint + run: npx stylelint '**/*.scss' --cache --ignore-path .gitignore + - name: tsc + run: yarn check:tsc + +post-merge: + only: + - ref: main + commands: + yarn-install: + run: yarn install --ignore-scripts + rari-postinstall: + run: npm run postinstall --prefix node_modules/@mdn/rari + +output: + - summary + - failure diff --git a/vendor/yari/.npmignore b/vendor/yari/.npmignore new file mode 100644 index 000000000..52d537833 --- /dev/null +++ b/vendor/yari/.npmignore @@ -0,0 +1,43 @@ +# In GitHub Actions, all the content of the .gitignore gets added to +# this file. +# If there's both a `.gitignore` *and* `.npmignore` file, and a file +# might mentioned in `.gitignore` but not in `.npmignore` it will be +# included. +# And we don't want to have maintain both. So right before it runs the +# `npm publish` step it will combine these two files. + +/node_modules/ +client/node_modules/ +ssr/node_modules/ +content/node_modules/ +server/node_modules/ + +# This won't be relevant or needed once the content is gone. +/content/files/en-us/ + +/client/venv/ +testing/ +import/ +/mdn-web-docs.svg +.github/ +/docs/ +README.md +client/search-experimentation.js +yarn-error.log +content/files/ + +# Build/Dev files +.eslint* +.prettier* +.stylelint* +.flake8 +tsconfig.json +Procfile.* +webpack.config.js +jest.config.js +*.test.js +.storybook/ +.nvmrc + +# Don't pack the build. +mdn-yari-*.tgz diff --git a/vendor/yari/.nvmrc b/vendor/yari/.nvmrc new file mode 100644 index 000000000..53d1c14db --- /dev/null +++ b/vendor/yari/.nvmrc @@ -0,0 +1 @@ +v22 diff --git a/vendor/yari/.prettierignore b/vendor/yari/.prettierignore new file mode 100644 index 000000000..600c554a7 --- /dev/null +++ b/vendor/yari/.prettierignore @@ -0,0 +1,34 @@ +# Backup files +*~ +# exclude these files +*.ejs +.release-please-manifest.json +CHANGELOG.md +Dockerfile +Makefile +Procfile +content/_all-titles.json +_githistory.json +/client/src/serviceWorker.js +/fake-v1-api/*.json +# exclude these directories +/client/build/ +/client/src/document/*.js +/filecheck/*.js +/ssr/dist/ +/tool/*.js +/node_modules/ +/server/node_modules/ +/client/node_modules/ +/content/node_modules/ +/cli/node_modules/ +/deployment/node_modules/ +/client/src/water.css/ +/content/files/ +/testing/content/ +/ssr/mozilla.dnthelper.min.js +/mdn/content +popularities.json +/client/public/service-worker.js +/cloud-function/src/internal/ +/cloud-function/**/*.js diff --git a/vendor/yari/.prettierrc b/vendor/yari/.prettierrc new file mode 100644 index 000000000..1db08dcc9 --- /dev/null +++ b/vendor/yari/.prettierrc @@ -0,0 +1,17 @@ +{ + "trailingComma": "es5", + "overrides": [ + { + "files": ["**/package.json"], + "options": { + "plugins": ["prettier-plugin-packagejson"] + } + }, + { + "files": ["**/*.md"], + "options": { + "proseWrap": "always" + } + } + ] +} diff --git a/vendor/yari/.release-please-manifest.json b/vendor/yari/.release-please-manifest.json new file mode 100644 index 000000000..5ceda3aab --- /dev/null +++ b/vendor/yari/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "5.1.2" +} diff --git a/vendor/yari/.stylelintignore b/vendor/yari/.stylelintignore new file mode 100644 index 000000000..4d4c0c2d5 --- /dev/null +++ b/vendor/yari/.stylelintignore @@ -0,0 +1 @@ +**/*.css diff --git a/vendor/yari/.stylelintrc.json b/vendor/yari/.stylelintrc.json new file mode 100644 index 000000000..11312580f --- /dev/null +++ b/vendor/yari/.stylelintrc.json @@ -0,0 +1,52 @@ +{ + "extends": [ + "stylelint-config-recommended", + "stylelint-config-sass-guidelines", + "stylelint-a11y/recommended", + "stylelint-prettier/recommended", + "stylelint-config-prettier" + ], + "plugins": ["stylelint-scss", "stylelint-order"], + "rules": { + "a11y/media-prefers-reduced-motion": null, + "a11y/no-outline-none": null, + "a11y/selector-pseudo-class-focus": null, + "declaration-property-value-disallowed-list": null, + "font-family-no-missing-generic-family-keyword": null, + "max-nesting-depth": null, + "media-query-no-invalid": null, + "no-descending-specificity": null, + "no-invalid-position-at-import-rule": null, + "no-irregular-whitespace": null, + "order/order": [ + [ + "custom-properties", + "dollar-variables", + "declarations", + { + "type": "at-rule", + "name": "extend" + }, + { + "type": "at-rule", + "name": "include", + "hasBlock": false + }, + { + "type": "at-rule", + "name": "include", + "hasBlock": true + }, + "rules" + ] + ], + "order/properties-alphabetical-order": true, + "property-no-vendor-prefix": null, + "selector-class-pattern": null, + "selector-max-compound-selectors": null, + "selector-max-id": null, + "selector-no-qualifying-type": null, + "selector-pseudo-element-colon-notation": null, + "scss/dollar-variable-colon-space-after": null + } +} diff --git a/vendor/yari/CHANGELOG.md b/vendor/yari/CHANGELOG.md new file mode 100644 index 000000000..8cb077f96 --- /dev/null +++ b/vendor/yari/CHANGELOG.md @@ -0,0 +1,4860 @@ +# Changelog + +## [5.1.2](https://github.com/mdn/yari/compare/v5.1.1...v5.1.2) (2025-09-17) + + +### Miscellaneous + +* **cloud-function:** send `X-Robots-Tag: noindex` on pimg ([#13503](https://github.com/mdn/yari/issues/13503)) ([517fed4](https://github.com/mdn/yari/commit/517fed44762d2af70f0bfd750125aaba0e48dfd4)) +* **cloud-function:** set "Referrer-Policy: no-referrer" on ad clicks ([#13496](https://github.com/mdn/yari/issues/13496)) ([f6a4a35](https://github.com/mdn/yari/commit/f6a4a3541bcff180d411724e682c864ce6f40cb7)) +* **cloud-function:** set "X-Robots-Tag: noindex, nofollow" on ad clicks ([#13497](https://github.com/mdn/yari/issues/13497)) ([9db77ff](https://github.com/mdn/yari/commit/9db77ff66c62305d2bcdf7c5819fb71508b35032)) +* **cloud-function:** set Referrer-Policy explicitly ([#13489](https://github.com/mdn/yari/issues/13489)) ([b102a3d](https://github.com/mdn/yari/commit/b102a3dc5b577d3f24f0864963110821ec94717c)) +* **dependabot:** reduce interval, add groups, fix directory ([#13478](https://github.com/mdn/yari/issues/13478)) ([8bd92b2](https://github.com/mdn/yari/commit/8bd92b23edffe2531bd0d201035c7df416200941)) +* **deps:** bump @adzerk/decision-sdk from 1.0.0-beta.20 to 1.0.0-beta.27 in /libs/pong ([#13493](https://github.com/mdn/yari/issues/13493)) ([f27debf](https://github.com/mdn/yari/commit/f27debfcaa18a706331662aef82fee68cb869024)) +* **deps:** relax @mdn/rari version range ([#13490](https://github.com/mdn/yari/issues/13490)) ([861351f](https://github.com/mdn/yari/commit/861351f45c3fd5e1cf47b57d9185980b9c0f3080)) +* **pong:** filter clicks by referer + missing code param ([#13499](https://github.com/mdn/yari/issues/13499)) ([41b7111](https://github.com/mdn/yari/commit/41b711162c8b6d390c2dff5b43aab66d331bc793)) + +## [5.1.1](https://github.com/mdn/yari/compare/v5.1.0...v5.1.1) (2025-09-09) + + +### Miscellaneous + +* **deps-dev:** bump @babel/core from 7.28.3 to 7.28.4 ([#13475](https://github.com/mdn/yari/issues/13475)) ([7d35008](https://github.com/mdn/yari/commit/7d3500835757b3b04bc497b0e41ec7583d25e5f6)) +* **deps-dev:** bump @babel/eslint-parser from 7.28.0 to 7.28.4 ([#13477](https://github.com/mdn/yari/issues/13477)) ([718362a](https://github.com/mdn/yari/commit/718362afdb3bf825cdd815276adb21328f4b6c3a)) +* **deps-dev:** bump lefthook from 1.12.3 to 1.12.4 ([#13474](https://github.com/mdn/yari/issues/13474)) ([675f4f8](https://github.com/mdn/yari/commit/675f4f8bdbef5501cf4802cacbeb573905854c82)) +* **deps-dev:** bump pytest from 8.4.1 to 8.4.2 in /deployer in the dependencies group ([#13470](https://github.com/mdn/yari/issues/13470)) ([faaab2b](https://github.com/mdn/yari/commit/faaab2b949a1b9fa73a3e090adce0e90be0db78e)) +* **deps-dev:** bump sass from 1.92.0 to 1.92.1 ([#13476](https://github.com/mdn/yari/issues/13476)) ([0c8665a](https://github.com/mdn/yari/commit/0c8665a81950ef1f14617278c5fc435a961e2c43)) +* **deps:** bump @mdn/rari from 0.1.48 to 0.1.49 ([#13488](https://github.com/mdn/yari/issues/13488)) ([4c54f1b](https://github.com/mdn/yari/commit/4c54f1b45e3d4848242042805204f488a7524fa5)) +* **deps:** bump pytest from 8.4.1 to 8.4.2 in /testing/integration in the dependencies group ([#13472](https://github.com/mdn/yari/issues/13472)) ([00d39b1](https://github.com/mdn/yari/commit/00d39b1d420a56bcb466dfb203fdbb4da703a928)) +* update CSP hash for fred entry.inline.js ([#13443](https://github.com/mdn/yari/issues/13443)) ([cf0a652](https://github.com/mdn/yari/commit/cf0a65236d476fd5e35880f9d136e9b1c1b4e5b2)) + +## [5.1.0](https://github.com/mdn/yari/compare/v5.0.3...v5.1.0) (2025-09-05) + + +### Features + +* **build:** launch fred ([#13398](https://github.com/mdn/yari/issues/13398)) ([d1272dd](https://github.com/mdn/yari/commit/d1272dda98ce8c19a749964422c967d637fba709)) +* **placement:** sidedoor scheme ([#13416](https://github.com/mdn/yari/issues/13416)) ([66021d3](https://github.com/mdn/yari/commit/66021d3e3911f280b133aad6b474af5bc4131b06)) + + +### Bug Fixes + +* **build:** copy public/assets to $BUILD_OUT_ROOT ([#13419](https://github.com/mdn/yari/issues/13419)) ([1e2b29c](https://github.com/mdn/yari/commit/1e2b29cf4f715b27fd8902294a60c506824a1a50)) +* **plus:** update staging/test base URLs for subscription platform ([#13401](https://github.com/mdn/yari/issues/13401)) ([2dd5fe1](https://github.com/mdn/yari/commit/2dd5fe1f759689eb1b4b0235c2f71a08c8660ac0)) + + +### Miscellaneous + +* **deps-dev:** bump @babel/core from 7.28.0 to 7.28.3 ([#13403](https://github.com/mdn/yari/issues/13403)) ([6f7964d](https://github.com/mdn/yari/commit/6f7964da0f885dbc3060747370fd3e085437361b)) +* **deps-dev:** bump @babel/preset-env from 7.28.0 to 7.28.3 ([#13402](https://github.com/mdn/yari/issues/13402)) ([dd362ba](https://github.com/mdn/yari/commit/dd362bac2b4adf37d5e38815d3b8ea5e7466c646)) +* **deps-dev:** bump @swc/core from 1.13.3 to 1.13.4 ([#13420](https://github.com/mdn/yari/issues/13420)) ([a759a1c](https://github.com/mdn/yari/commit/a759a1cc7288b6defccf68dfb3788c479b4a63f9)) +* **deps-dev:** bump @swc/core from 1.13.4 to 1.13.5 ([#13431](https://github.com/mdn/yari/issues/13431)) ([4fd5bd6](https://github.com/mdn/yari/commit/4fd5bd6b95750bf48945e51f4fb5f3667df07618)) +* **deps-dev:** bump babel-jest from 30.0.4 to 30.1.0 ([#13439](https://github.com/mdn/yari/issues/13439)) ([3d5c813](https://github.com/mdn/yari/commit/3d5c813da801851ba13520b5939c615904d3a22f)) +* **deps-dev:** bump browserslist from 4.25.1 to 4.25.2 ([#13383](https://github.com/mdn/yari/issues/13383)) ([04e811c](https://github.com/mdn/yari/commit/04e811ce853419c33b8713401b53e7a75267255a)) +* **deps-dev:** bump browserslist from 4.25.2 to 4.25.3 ([#13409](https://github.com/mdn/yari/issues/13409)) ([93c5de8](https://github.com/mdn/yari/commit/93c5de8c24582e2487e2eab5fa04a68ae36c6428)) +* **deps-dev:** bump browserslist from 4.25.3 to 4.25.4 ([#13446](https://github.com/mdn/yari/issues/13446)) ([c54a9c8](https://github.com/mdn/yari/commit/c54a9c8dba1d9caf18cead1b4c15c19a35251d78)) +* **deps-dev:** bump cssnano from 7.1.0 to 7.1.1 ([#13427](https://github.com/mdn/yari/issues/13427)) ([13492f6](https://github.com/mdn/yari/commit/13492f6c05a37a4117ba01539b59a3a8f25c63fe)) +* **deps-dev:** bump html-webpack-plugin from 5.6.3 to 5.6.4 ([#13395](https://github.com/mdn/yari/issues/13395)) ([68c79a3](https://github.com/mdn/yari/commit/68c79a30c135cbdfd86ea4552c597fbdec356705)) +* **deps-dev:** bump jest-environment-jsdom from 30.0.4 to 30.0.5 ([#13330](https://github.com/mdn/yari/issues/13330)) ([d313d4a](https://github.com/mdn/yari/commit/d313d4a60ca8891582b218ff4d68dd65a4336ec6)) +* **deps-dev:** bump jest-environment-jsdom from 30.0.5 to 30.1.1 ([#13440](https://github.com/mdn/yari/issues/13440)) ([9f00143](https://github.com/mdn/yari/commit/9f00143e58a26b5d18fe4fe1570586660b254cc4)) +* **deps-dev:** bump jest-environment-jsdom from 30.1.1 to 30.1.2 ([#13454](https://github.com/mdn/yari/issues/13454)) ([5d49409](https://github.com/mdn/yari/commit/5d494092c2fcc54e7f0de377446856a613ede429)) +* **deps-dev:** bump jest-resolve from 30.0.5 to 30.1.0 ([#13436](https://github.com/mdn/yari/issues/13436)) ([d553ae1](https://github.com/mdn/yari/commit/d553ae1e46dc9ea52fe6ae1f58019768c9544f8e)) +* **deps-dev:** bump jest-resolve from 30.1.0 to 30.1.3 ([#13458](https://github.com/mdn/yari/issues/13458)) ([0f865a7](https://github.com/mdn/yari/commit/0f865a70f502fb48f869fca47c7875e9f358e4f2)) +* **deps-dev:** bump lefthook from 1.12.2 to 1.12.3 ([#13392](https://github.com/mdn/yari/issues/13392)) ([20b2d70](https://github.com/mdn/yari/commit/20b2d70d4d256a8d86a746f07ebec5f077a492c0)) +* **deps-dev:** bump mini-css-extract-plugin from 2.9.3 to 2.9.4 ([#13387](https://github.com/mdn/yari/issues/13387)) ([fbd27eb](https://github.com/mdn/yari/commit/fbd27eba4b2b22f3a43b4440ebf666908532f3dc)) +* **deps-dev:** bump postcss-loader from 8.1.1 to 8.2.0 ([#13455](https://github.com/mdn/yari/issues/13455)) ([7ed7760](https://github.com/mdn/yari/commit/7ed77601c1db705674c461139b4d881941c7c97c)) +* **deps-dev:** bump postcss-preset-env from 10.2.4 to 10.3.0 ([#13428](https://github.com/mdn/yari/issues/13428)) ([e817f3d](https://github.com/mdn/yari/commit/e817f3d698c3e26ec8dc76719884281cd2a6f4df)) +* **deps-dev:** bump postcss-preset-env from 10.3.0 to 10.3.1 ([#13441](https://github.com/mdn/yari/issues/13441)) ([5ec568a](https://github.com/mdn/yari/commit/5ec568ae57f535aee52e83f0133c042b13c7850c)) +* **deps-dev:** bump sass from 1.90.0 to 1.91.0 ([#13433](https://github.com/mdn/yari/issues/13433)) ([c99d6aa](https://github.com/mdn/yari/commit/c99d6aad572aabeaf3965ac05185b227821cb32a)) +* **deps-dev:** bump sass from 1.91.0 to 1.92.0 ([#13461](https://github.com/mdn/yari/issues/13461)) ([f96d43d](https://github.com/mdn/yari/commit/f96d43dd10951c45f8efba76784908d60ee9e2a2)) +* **deps-dev:** bump ts-loader from 9.5.2 to 9.5.4 ([#13430](https://github.com/mdn/yari/issues/13430)) ([a3b4bdb](https://github.com/mdn/yari/commit/a3b4bdb18f4bf2cee9a1aecb0a49565ad4103e3a)) +* **deps-dev:** bump ts-loader from 9.5.2 to 9.5.4 in /client/pwa ([#13424](https://github.com/mdn/yari/issues/13424)) ([56c2c3a](https://github.com/mdn/yari/commit/56c2c3a35d2effd82a7bab39208b88c8c9e6d296)) +* **deps-dev:** bump typescript-eslint from 8.39.0 to 8.39.1 ([#13388](https://github.com/mdn/yari/issues/13388)) ([57c140f](https://github.com/mdn/yari/commit/57c140f5607d6c31f2fe01d13689b164a52f465c)) +* **deps-dev:** bump typescript-eslint from 8.39.1 to 8.40.0 ([#13414](https://github.com/mdn/yari/issues/13414)) ([9e96c53](https://github.com/mdn/yari/commit/9e96c53bddf880e991e5226ce842474b7268b381)) +* **deps-dev:** bump typescript-eslint from 8.40.0 to 8.41.0 ([#13434](https://github.com/mdn/yari/issues/13434)) ([e8b199a](https://github.com/mdn/yari/commit/e8b199aac610a604ae941f51b9e4a831f32f48b4)) +* **deps-dev:** bump webpack from 5.101.0 to 5.101.1 ([#13394](https://github.com/mdn/yari/issues/13394)) ([2c37b53](https://github.com/mdn/yari/commit/2c37b53f9b2725e1d75793a9036aa6551592377f)) +* **deps-dev:** bump webpack from 5.101.0 to 5.101.1 in /client/pwa ([#13393](https://github.com/mdn/yari/issues/13393)) ([021941f](https://github.com/mdn/yari/commit/021941f76eb221cbf8db6cc14ce0c0fe0152c6c1)) +* **deps-dev:** bump webpack from 5.101.1 to 5.101.2 ([#13404](https://github.com/mdn/yari/issues/13404)) ([761e5e7](https://github.com/mdn/yari/commit/761e5e7173a23a3113a3ba27d805cdb3972a6e30)) +* **deps-dev:** bump webpack from 5.101.2 to 5.101.3 ([#13415](https://github.com/mdn/yari/issues/13415)) ([5def85c](https://github.com/mdn/yari/commit/5def85c0c123a6feb709c7944d146dd6bbed5ede)) +* **deps-dev:** bump webpack from 5.101.2 to 5.101.3 in /client/pwa ([#13412](https://github.com/mdn/yari/issues/13412)) ([9392097](https://github.com/mdn/yari/commit/93920970864adf42436ecc913727ca70dd3c2d00)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.71 to 2.7.72 in /client/pwa ([#13366](https://github.com/mdn/yari/issues/13366)) ([22f9190](https://github.com/mdn/yari/commit/22f91903e5e27af8fffe23ab0b44712f2ece384a)) +* **deps:** bump @inquirer/prompts from 7.8.0 to 7.8.1 ([#13381](https://github.com/mdn/yari/issues/13381)) ([a09f1fe](https://github.com/mdn/yari/commit/a09f1fe3d7c7f77ed8c863cc5e181440eaff564e)) +* **deps:** bump @inquirer/prompts from 7.8.1 to 7.8.2 ([#13397](https://github.com/mdn/yari/issues/13397)) ([52f4d18](https://github.com/mdn/yari/commit/52f4d18151209354016f04b2c144bbe9f18e4119)) +* **deps:** bump @inquirer/prompts from 7.8.2 to 7.8.3 ([#13408](https://github.com/mdn/yari/issues/13408)) ([9177f0c](https://github.com/mdn/yari/commit/9177f0c8498a070bd338bbb3d1dff0de16d4f475)) +* **deps:** bump @inquirer/prompts from 7.8.3 to 7.8.4 ([#13423](https://github.com/mdn/yari/issues/13423)) ([4fa6c73](https://github.com/mdn/yari/commit/4fa6c736a404fbc8307ecf94fcb41f9f7cccb912)) +* **deps:** bump @mdn/rari from 0.1.46 to 0.1.48 ([#13390](https://github.com/mdn/yari/issues/13390)) ([af9e5b7](https://github.com/mdn/yari/commit/af9e5b7fd1c8bdc8112d8f0842f73e654688dad1)) +* **deps:** bump @stripe/stripe-js from 7.8.0 to 7.9.0 ([#13432](https://github.com/mdn/yari/issues/13432)) ([b57c456](https://github.com/mdn/yari/commit/b57c456de4c6852b7af8f32cf98f57d970b417c3)) +* **deps:** bump actions/checkout from 4 to 5 ([#13389](https://github.com/mdn/yari/issues/13389)) ([37230c2](https://github.com/mdn/yari/commit/37230c21b24f9b485da99e41a5d529c26d22a0fd)) +* **deps:** bump actions/download-artifact from 4 to 5 ([#13370](https://github.com/mdn/yari/issues/13370)) ([b3a2043](https://github.com/mdn/yari/commit/b3a2043e2bb5a5fcd2517742ded8373fd24d9eee)) +* **deps:** bump chalk from 5.5.0 to 5.6.0 ([#13413](https://github.com/mdn/yari/issues/13413)) ([409c879](https://github.com/mdn/yari/commit/409c879f15dade2c8b30a94f1e8bc88022a9599d)) +* **deps:** bump concurrently from 9.2.0 to 9.2.1 ([#13429](https://github.com/mdn/yari/issues/13429)) ([0a33e1d](https://github.com/mdn/yari/commit/0a33e1d3a835b47085260b17b462fc7b501ae300)) +* **deps:** bump dayjs from 1.11.13 to 1.11.14 ([#13438](https://github.com/mdn/yari/issues/13438)) ([a2fecf9](https://github.com/mdn/yari/commit/a2fecf953cdd0878e816edae6bdb6c29ca50fe95)) +* **deps:** bump dayjs from 1.11.14 to 1.11.15 ([#13442](https://github.com/mdn/yari/issues/13442)) ([b0fa139](https://github.com/mdn/yari/commit/b0fa1391a37ee23015576cb2bf76a3b41eab5a46)) +* **deps:** bump dayjs from 1.11.15 to 1.11.18 ([#13456](https://github.com/mdn/yari/issues/13456)) ([629b492](https://github.com/mdn/yari/commit/629b49264e5b98960c14b18e3cade234f94cdb54)) +* **deps:** bump dexie from 4.0.11 to 4.2.0 ([#13410](https://github.com/mdn/yari/issues/13410)) ([3eb6e19](https://github.com/mdn/yari/commit/3eb6e196944d3afef8144289da5a68a26dd8c284)) +* **deps:** bump dexie from 4.0.11 to 4.2.0 in /client/pwa ([#13411](https://github.com/mdn/yari/issues/13411)) ([a49a212](https://github.com/mdn/yari/commit/a49a212fc83f4ac94ecc0eb7a28ce64ee7aec6b6)) +* **deps:** bump dotenv from 17.2.0 to 17.2.1 ([#13336](https://github.com/mdn/yari/issues/13336)) ([bcf520d](https://github.com/mdn/yari/commit/bcf520dc1a0fac15a2bd2d7e3395c2e489ebfb6f)) +* **deps:** bump dotenv from 17.2.1 to 17.2.2 ([#13462](https://github.com/mdn/yari/issues/13462)) ([237b513](https://github.com/mdn/yari/commit/237b51383d2f9dd73529e4fc16c29c283ab14c54)) +* **deps:** bump fdir from 6.4.6 to 6.5.0 ([#13405](https://github.com/mdn/yari/issues/13405)) ([cd2e458](https://github.com/mdn/yari/commit/cd2e4581f7e57135f3693dfd2ab63b5c2869f370)) +* **deps:** bump google-github-actions/auth from 2 to 3 ([#13444](https://github.com/mdn/yari/issues/13444)) ([d395e34](https://github.com/mdn/yari/commit/d395e34736203a2e8b7ed3782b99f0a34043503b)) +* **deps:** bump google-github-actions/setup-gcloud from 2 to 3 ([#13445](https://github.com/mdn/yari/issues/13445)) ([ed38470](https://github.com/mdn/yari/commit/ed3847067a570d78cb5259b512a1f383b9c147ff)) +* **deps:** bump google-github-actions/upload-cloud-storage from 2 to 3 ([#13459](https://github.com/mdn/yari/issues/13459)) ([dbff0b9](https://github.com/mdn/yari/commit/dbff0b9e4bdf1d0a37031ecf51e8b832e1d69ef2)) +* **deps:** bump mdn-data from 2.23.0 to 2.24.0 ([#13396](https://github.com/mdn/yari/issues/13396)) ([4239ada](https://github.com/mdn/yari/commit/4239ada4abeb05a30e589d9ca8b790fa6907471b)) +* **deps:** bump openai from 5.12.1 to 5.12.2 ([#13384](https://github.com/mdn/yari/issues/13384)) ([a0ecafc](https://github.com/mdn/yari/commit/a0ecafc2bbb3922f0859800af25244c52e9572be)) +* **deps:** bump openai from 5.12.2 to 5.13.1 ([#13417](https://github.com/mdn/yari/issues/13417)) ([3ccca26](https://github.com/mdn/yari/commit/3ccca26fc11024229eeedf29769435b42e527d8a)) +* **deps:** bump openai from 5.13.1 to 5.15.0 ([#13421](https://github.com/mdn/yari/issues/13421)) ([2a8415d](https://github.com/mdn/yari/commit/2a8415d0c62325355ad76e26ccc977e227ce844c)) +* **deps:** bump openai from 5.15.0 to 5.16.0 ([#13435](https://github.com/mdn/yari/issues/13435)) ([eb9becd](https://github.com/mdn/yari/commit/eb9becd13220b1610136984b21c98f035c0a132d)) +* **deps:** bump openai from 5.16.0 to 5.18.1 ([#13460](https://github.com/mdn/yari/issues/13460)) ([745b59b](https://github.com/mdn/yari/commit/745b59b4ab569d7982750c4e6b240a42c15c3a78)) +* **deps:** bump requests from 2.32.4 to 2.32.5 in /testing/integration in the dependencies group ([#13425](https://github.com/mdn/yari/issues/13425)) ([1e9015b](https://github.com/mdn/yari/commit/1e9015b5d2a64644c70d1d488b6aee7890ba553e)) +* **deps:** bump selectolax from 0.3.32 to 0.3.33 in /deployer in the dependencies group ([#13382](https://github.com/mdn/yari/issues/13382)) ([028c969](https://github.com/mdn/yari/commit/028c969381a0db6e05a30c1b969dd44b7b698bff)) +* **deps:** bump selectolax from 0.3.33 to 0.3.34 in /deployer in the dependencies group ([#13451](https://github.com/mdn/yari/issues/13451)) ([6c88438](https://github.com/mdn/yari/commit/6c884389c1c7cdb6ce6165677696e49041dfa61f)) +* **deps:** bump sse.js from 2.6.0 to 2.7.0 ([#13447](https://github.com/mdn/yari/issues/13447)) ([c3d937b](https://github.com/mdn/yari/commit/c3d937b95cf80fe1e3e5def1437a5f40ac954bfd)) +* **deps:** bump swr from 2.3.4 to 2.3.5 ([#13379](https://github.com/mdn/yari/issues/13379)) ([4076bf9](https://github.com/mdn/yari/commit/4076bf9d1c968ea8fa3517b9820137abb465bc0a)) +* **deps:** bump swr from 2.3.5 to 2.3.6 ([#13391](https://github.com/mdn/yari/issues/13391)) ([e63d531](https://github.com/mdn/yari/commit/e63d53101c115721af12fa7c77257cc817e29344)) +* **deps:** bump the react-router group with 2 updates ([#13407](https://github.com/mdn/yari/issues/13407)) ([17fcf0b](https://github.com/mdn/yari/commit/17fcf0bc4729049932cab8fb8f71f72abc4babb5)) +* **deps:** bump the react-router group with 2 updates ([#13426](https://github.com/mdn/yari/issues/13426)) ([4b7c94d](https://github.com/mdn/yari/commit/4b7c94dd8cc328b54b78119fd5820bd598b59f61)) +* **telemetry:** renew metrics (and remove some) ([#13468](https://github.com/mdn/yari/issues/13468)) ([b05dfd9](https://github.com/mdn/yari/commit/b05dfd9845c8b2d08906493179fed1866cb7710c)) + +## [5.0.3](https://github.com/mdn/yari/compare/v5.0.2...v5.0.3) (2025-08-11) + + +### Bug Fixes + +* **cloud function:** allow main and live samples origin for requests to shared assets ([#13353](https://github.com/mdn/yari/issues/13353)) ([0b63838](https://github.com/mdn/yari/commit/0b63838f9137b1d4f4868b410c04fab63f4bceda)) +* **collections:** prevent space-only collection names ([#13360](https://github.com/mdn/yari/issues/13360)) ([55e7b2a](https://github.com/mdn/yari/commit/55e7b2ae0cb1e6de1a4d1cb2bac8cd977f9ebaf7)) + + +### Miscellaneous + +* add prod-cloud-deploy workflow ([#13369](https://github.com/mdn/yari/issues/13369)) ([9d8bf45](https://github.com/mdn/yari/commit/9d8bf45080409e4f301e19c8762f1e9828a41150)) +* **deps-dev:** bump @swc/core from 1.13.2 to 1.13.3 ([#13346](https://github.com/mdn/yari/issues/13346)) ([4c8f380](https://github.com/mdn/yari/commit/4c8f380d76fb8cb58d9cb5c14345b62ffe6ff845)) +* **deps-dev:** bump @types/async from 3.2.24 to 3.2.25 in the types group ([#13358](https://github.com/mdn/yari/issues/13358)) ([6038fb0](https://github.com/mdn/yari/commit/6038fb043a2bcc3933095337f0381130d0674a8a)) +* **deps-dev:** bump cssnano from 7.0.7 to 7.1.0 ([#13302](https://github.com/mdn/yari/issues/13302)) ([271af85](https://github.com/mdn/yari/commit/271af8508031ecfd2b3380a5c6fa7d1e34d9cb2d)) +* **deps-dev:** bump mini-css-extract-plugin from 2.9.2 to 2.9.3 ([#13364](https://github.com/mdn/yari/issues/13364)) ([20c7528](https://github.com/mdn/yari/commit/20c7528a628d4c1532508f488824fee8756bd630)) +* **deps-dev:** bump sass from 1.89.2 to 1.90.0 ([#13373](https://github.com/mdn/yari/issues/13373)) ([831c749](https://github.com/mdn/yari/commit/831c749d0b01f93d9c04e127a0f996a884d44cc8)) +* **deps-dev:** bump typescript from 5.8.3 to 5.9.2 ([#13371](https://github.com/mdn/yari/issues/13371)) ([e3146fd](https://github.com/mdn/yari/commit/e3146fd85a01e1603a9ca9579887398407905780)) +* **deps-dev:** bump typescript from 5.8.3 to 5.9.2 in /client/pwa ([#13352](https://github.com/mdn/yari/issues/13352)) ([3130520](https://github.com/mdn/yari/commit/313052061bc19f9f67fc1f9ac30d9e15389e79c9)) +* **deps-dev:** bump typescript-eslint from 8.37.0 to 8.38.0 ([#13329](https://github.com/mdn/yari/issues/13329)) ([67920c4](https://github.com/mdn/yari/commit/67920c4dc120a1751ec2c51a15b2b3384416cd75)) +* **deps-dev:** bump typescript-eslint from 8.38.0 to 8.39.0 ([#13367](https://github.com/mdn/yari/issues/13367)) ([5f77c9b](https://github.com/mdn/yari/commit/5f77c9b4b864bce0a6ecfdc42a71f8dc54390bd0)) +* **deps-dev:** bump webpack from 5.100.2 to 5.101.0 ([#13341](https://github.com/mdn/yari/issues/13341)) ([d94ec06](https://github.com/mdn/yari/commit/d94ec06cec3ef4a87a39dbd2a1ee149dd828bde0)) +* **deps-dev:** bump webpack from 5.100.2 to 5.101.0 in /client/pwa ([#13339](https://github.com/mdn/yari/issues/13339)) ([44cf605](https://github.com/mdn/yari/commit/44cf6052f99264dd837519989f43393ad582f304)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.68 to 2.7.69 in /client/pwa ([#13338](https://github.com/mdn/yari/issues/13338)) ([f8bb4ed](https://github.com/mdn/yari/commit/f8bb4ed47c2c7ed31fc8d99555edb8a6beb6a2b3)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.69 to 2.7.70 in /client/pwa ([#13347](https://github.com/mdn/yari/issues/13347)) ([e26a716](https://github.com/mdn/yari/commit/e26a7164ec431a0d92efe530faea427a8fcb9821)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.70 to 2.7.71 in /client/pwa ([#13351](https://github.com/mdn/yari/issues/13351)) ([93defa5](https://github.com/mdn/yari/commit/93defa564404e3e6357d633b044572d48ca309a0)) +* **deps:** bump @fast-csv/parse from 5.0.2 to 5.0.5 ([#13363](https://github.com/mdn/yari/issues/13363)) ([fc671fd](https://github.com/mdn/yari/commit/fc671fd5bab26af442b6df688c02da0a17e5973f)) +* **deps:** bump @inquirer/prompts from 7.7.1 to 7.8.0 ([#13345](https://github.com/mdn/yari/issues/13345)) ([2c5b9cb](https://github.com/mdn/yari/commit/2c5b9cb9fac5d81ff3087e2fa7e6c29b6c511db5)) +* **deps:** bump @stripe/stripe-js from 7.5.0 to 7.7.0 ([#13343](https://github.com/mdn/yari/issues/13343)) ([1be5589](https://github.com/mdn/yari/commit/1be558918bbe1d2f8fde9df8ed4459ea25874f5e)) +* **deps:** bump @stripe/stripe-js from 7.7.0 to 7.8.0 ([#13362](https://github.com/mdn/yari/issues/13362)) ([cc135d6](https://github.com/mdn/yari/commit/cc135d686d378d161fcc81f4e7eb2390a2b9e1d0)) +* **deps:** bump chalk from 5.4.1 to 5.5.0 ([#13359](https://github.com/mdn/yari/issues/13359)) ([6eed0d1](https://github.com/mdn/yari/commit/6eed0d10e0a14b6501b34e8df3bcbed218417dd2)) +* **deps:** bump form-data from 2.5.1 to 2.5.5 in /libs/pong ([#13324](https://github.com/mdn/yari/issues/13324)) ([4a4bca1](https://github.com/mdn/yari/commit/4a4bca12f47bf5bef0d7c0d8e48c61f6da83e017)) +* **deps:** bump mdn-data from 2.22.0 to 2.23.0 ([#13322](https://github.com/mdn/yari/issues/13322)) ([9cd7215](https://github.com/mdn/yari/commit/9cd72154371eab264767a721ece4f913b2492e23)) +* **deps:** bump openai from 5.10.1 to 5.11.0 ([#13348](https://github.com/mdn/yari/issues/13348)) ([6f0f4ca](https://github.com/mdn/yari/commit/6f0f4cad18c07f21fd921070a919330733b9db0a)) +* **deps:** bump openai from 5.11.0 to 5.12.0 ([#13374](https://github.com/mdn/yari/issues/13374)) ([f0aebf7](https://github.com/mdn/yari/commit/f0aebf7f7225d94dcba6e2d19cd807ffcb484109)) +* **deps:** bump openai from 5.12.0 to 5.12.1 ([#13377](https://github.com/mdn/yari/issues/13377)) ([10b59b2](https://github.com/mdn/yari/commit/10b59b253daa3267700a6dcbdc6b5dec75a79891)) +* **deps:** bump the react-router group with 2 updates ([#13310](https://github.com/mdn/yari/issues/13310)) ([792e3e7](https://github.com/mdn/yari/commit/792e3e7bb4a98075ac20302fae82d10d01e3542d)) +* **fred:** re-enable offline settings ([#13378](https://github.com/mdn/yari/issues/13378)) ([f418550](https://github.com/mdn/yari/commit/f418550dba0dfe18162497f884559034a1eacf17)) +* **workflows:** add nonprod cloud deploy actions ([#13355](https://github.com/mdn/yari/issues/13355)) ([f56c9c7](https://github.com/mdn/yari/commit/f56c9c70bda6f27f4a2f780cbbf740914f88babb)) +* **workflows:** fix nonprod cloud function actions after testing ([#13357](https://github.com/mdn/yari/issues/13357)) ([46cdb12](https://github.com/mdn/yari/commit/46cdb129b730d06d65c8530c19748961ef62f2a4)) + +## [5.0.2](https://github.com/mdn/yari/compare/v5.0.1...v5.0.2) (2025-07-24) + +### Bug Fixes + +* **test-build:** add sp3 env vars ([#13306](https://github.com/mdn/yari/issues/13306)) ([216d3df](https://github.com/mdn/yari/commit/216d3df7c01f74fc9802b15979f22838917f8243)) + + +### Miscellaneous + +* **deps-dev:** bump @swc/core from 1.12.11 to 1.12.14 ([#13299](https://github.com/mdn/yari/issues/13299)) ([e274234](https://github.com/mdn/yari/commit/e274234cb0f0b8b4f19ea7211fe3156fdc5642b4)) +* **deps-dev:** bump @swc/core from 1.12.14 to 1.13.2 ([#13333](https://github.com/mdn/yari/issues/13333)) ([a590341](https://github.com/mdn/yari/commit/a5903413d31bd248da342bd98514a63389e05800)) +* **deps-dev:** bump jest-resolve from 30.0.2 to 30.0.5 ([#13328](https://github.com/mdn/yari/issues/13328)) ([df6d74c](https://github.com/mdn/yari/commit/df6d74c5343c037e25a4b8965740b7099c097876)) +* **deps-dev:** bump lefthook from 1.12.1 to 1.12.2 ([#13295](https://github.com/mdn/yari/issues/13295)) ([c5a28e3](https://github.com/mdn/yari/commit/c5a28e3b43145cb3ea4bcf4eed97d7175aed5b1f)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.5.18 to 2.5.19 ([#13319](https://github.com/mdn/yari/issues/13319)) ([f227346](https://github.com/mdn/yari/commit/f227346c4b77a3a5f214713bc0ba73bde4043049)) +* **deps-dev:** bump typescript-eslint from 8.36.0 to 8.37.0 ([#13304](https://github.com/mdn/yari/issues/13304)) ([1e77c9a](https://github.com/mdn/yari/commit/1e77c9ad71e91409a5f823dfb639745909c77c60)) +* **deps-dev:** bump webpack from 5.100.0 to 5.100.1 in /client/pwa ([#13297](https://github.com/mdn/yari/issues/13297)) ([6889898](https://github.com/mdn/yari/commit/688989811201d5df15c245091763689ef9e93e6b)) +* **deps-dev:** bump webpack from 5.100.1 to 5.100.2 ([#13308](https://github.com/mdn/yari/issues/13308)) ([40b60fd](https://github.com/mdn/yari/commit/40b60fda746bb1ae80e1c0b6b5f8e547a1afa8e5)) +* **deps-dev:** bump webpack from 5.100.1 to 5.100.2 in /client/pwa ([#13309](https://github.com/mdn/yari/issues/13309)) ([b3ff337](https://github.com/mdn/yari/commit/b3ff337d934e906f26dbb3f439459c358c2e5b3c)) +* **deps-dev:** bump webpack from 5.99.9 to 5.100.1 ([#13301](https://github.com/mdn/yari/issues/13301)) ([89697d6](https://github.com/mdn/yari/commit/89697d6daf3a5256d334ba1b58b690559f50e33e)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.62 to 2.7.64 in /client/pwa ([#13315](https://github.com/mdn/yari/issues/13315)) ([4ba3841](https://github.com/mdn/yari/commit/4ba384180da83a843c206a012ebb6312e2f03f9d)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.64 to 2.7.66 in /client/pwa ([#13325](https://github.com/mdn/yari/issues/13325)) ([c528be5](https://github.com/mdn/yari/commit/c528be5ee5f8d4498aa99c0b44fa1949609526d0)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.66 to 2.7.68 in /client/pwa ([#13335](https://github.com/mdn/yari/issues/13335)) ([9fcd280](https://github.com/mdn/yari/commit/9fcd280515ca0a36d55f4f57695fab538d245023)) +* **deps:** bump @inquirer/prompts from 7.6.0 to 7.7.0 ([#13321](https://github.com/mdn/yari/issues/13321)) ([98502a6](https://github.com/mdn/yari/commit/98502a6ae1370c7cd9a2115eff5f041306c158b0)) +* **deps:** bump @inquirer/prompts from 7.7.0 to 7.7.1 ([#13327](https://github.com/mdn/yari/issues/13327)) ([b452eed](https://github.com/mdn/yari/commit/b452eedceecf88ec14417bbb9f02725194f7d9c9)) +* **deps:** bump @lit/react from 1.0.7 to 1.0.8 ([#13294](https://github.com/mdn/yari/issues/13294)) ([5ac574b](https://github.com/mdn/yari/commit/5ac574b19f1deb4fa242e13f5fa960c8e8939351)) +* **deps:** bump @lit/task from 1.0.2 to 1.0.3 ([#13293](https://github.com/mdn/yari/issues/13293)) ([0547804](https://github.com/mdn/yari/commit/05478040c27a536f47a7b71e84bf31e8aa0abbaa)) +* **deps:** bump @mdn/rari from 0.1.45 to 0.1.46 ([#13291](https://github.com/mdn/yari/issues/13291)) ([42377fb](https://github.com/mdn/yari/commit/42377fbda3eea858492ec273dce83337a3aa2756)) +* **deps:** bump @mozilla/glean from 5.0.4 to 5.0.5 ([#13318](https://github.com/mdn/yari/issues/13318)) ([7848174](https://github.com/mdn/yari/commit/78481745b4771e9c79157ef0fddf2f9a18453ce9)) +* **deps:** bump @stripe/stripe-js from 7.4.0 to 7.5.0 ([#13312](https://github.com/mdn/yari/issues/13312)) ([1229d43](https://github.com/mdn/yari/commit/1229d43846f0cb73e89a2dea2228c0d60d9f3ab7)) +* **deps:** bump compression from 1.8.0 to 1.8.1 ([#13317](https://github.com/mdn/yari/issues/13317)) ([46a1ece](https://github.com/mdn/yari/commit/46a1ece847dfc1db531f76d6955ce8b8083ef147)) +* **deps:** bump lit from 3.3.0 to 3.3.1 ([#13296](https://github.com/mdn/yari/issues/13296)) ([f877368](https://github.com/mdn/yari/commit/f8773682464b2b0c53ceea7b74d3532124d54ba9)) +* **deps:** bump open from 10.1.2 to 10.2.0 ([#13303](https://github.com/mdn/yari/issues/13303)) ([5c5c354](https://github.com/mdn/yari/commit/5c5c354e4e369e220c4c196b6680bbdb3b526eb9)) +* **deps:** bump openai from 5.8.2 to 5.9.0 ([#13290](https://github.com/mdn/yari/issues/13290)) ([3407969](https://github.com/mdn/yari/commit/34079690a09683618ddb7cb4c5a57241d9621e85)) +* **deps:** bump openai from 5.9.0 to 5.9.2 ([#13307](https://github.com/mdn/yari/issues/13307)) ([a8d4137](https://github.com/mdn/yari/commit/a8d4137080b9545fcf962d3f2a702a76ede8b0b3)) +* **deps:** bump openai from 5.9.2 to 5.10.1 ([#13311](https://github.com/mdn/yari/issues/13311)) ([958495e](https://github.com/mdn/yari/commit/958495e4ab4fba451263c43f9a501bcee8700612)) +* **deps:** bump selectolax from 0.3.31 to 0.3.32 in /deployer in the dependencies group ([#13323](https://github.com/mdn/yari/issues/13323)) ([d1a7416](https://github.com/mdn/yari/commit/d1a74160d797b0328e5091ecac8ff47f32065939)) +* **deps:** bump swr from 2.3.3 to 2.3.4 ([#13263](https://github.com/mdn/yari/issues/13263)) ([b7aa5bd](https://github.com/mdn/yari/commit/b7aa5bd24c052ad1d7e3aa0e638ead11db7d9855)) +* **plus:** remove deprecated offline from copy and feature list ([#13314](https://github.com/mdn/yari/issues/13314)) ([ddee7fb](https://github.com/mdn/yari/commit/ddee7fb5f8be3b2950bd768515a2306530605fd5)) + +## [5.0.1](https://github.com/mdn/yari/compare/v5.0.0...v5.0.1) (2025-07-10) + + +### Bug Fixes + +* **plus:** replace ads free "Get started" link ([#13270](https://github.com/mdn/yari/issues/13270)) ([7c1d152](https://github.com/mdn/yari/commit/7c1d15258a75613320098644d333eef2c0a3cf18)) + + +### Enhancements + +* **scrim:** survey option for the scrim component ([b73585b](https://github.com/mdn/yari/commit/b73585b94a5a576bde44b05a92f81945509b7398)) + + +### Miscellaneous + +* **deps-dev:** bump @swc/core from 1.12.9 to 1.12.11 ([#13278](https://github.com/mdn/yari/issues/13278)) ([d9aa5c3](https://github.com/mdn/yari/commit/d9aa5c38d442129a12434f0d919dd24caaba012d)) +* **deps-dev:** bump babel-jest from 30.0.2 to 30.0.4 ([#13261](https://github.com/mdn/yari/issues/13261)) ([6c45fb2](https://github.com/mdn/yari/commit/6c45fb208192a31607d91635e7f72829474f2aaa)) +* **deps-dev:** bump eslint-plugin-n from 17.20.0 to 17.21.0 ([#13267](https://github.com/mdn/yari/issues/13267)) ([c7a1aca](https://github.com/mdn/yari/commit/c7a1aca4d092b8123ad34448c462897982fc8c18)) +* **deps-dev:** bump jest-environment-jsdom from 30.0.2 to 30.0.4 ([#13265](https://github.com/mdn/yari/issues/13265)) ([3846972](https://github.com/mdn/yari/commit/3846972503a3cb9c0d64d02f545c158543677df8)) +* **deps-dev:** bump lefthook from 1.11.15 to 1.11.16 ([#13269](https://github.com/mdn/yari/issues/13269)) ([90c50f4](https://github.com/mdn/yari/commit/90c50f4930d616a396597994708dde598c7c39dd)) +* **deps-dev:** bump lefthook from 1.11.16 to 1.12.1 ([#13284](https://github.com/mdn/yari/issues/13284)) ([d2770d9](https://github.com/mdn/yari/commit/d2770d96c2ec6bb1b7b76dbd5281ca26bc1e6180)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.5.17 to 2.5.18 ([#13268](https://github.com/mdn/yari/issues/13268)) ([b2ac28e](https://github.com/mdn/yari/commit/b2ac28e9e9f04c749ba17f6616c912fd4c9d0dc8)) +* **deps-dev:** bump typescript-eslint from 8.35.1 to 8.36.0 ([#13279](https://github.com/mdn/yari/issues/13279)) ([e53bdc6](https://github.com/mdn/yari/commit/e53bdc6eba9f94bf0bdad99d0bd2ae3245ac3c70)) +* **deps-dev:** bump webpack from 5.99.9 to 5.100.0 in /client/pwa ([#13285](https://github.com/mdn/yari/issues/13285)) ([186a773](https://github.com/mdn/yari/commit/186a773a3f805a4f1d33528e7e7984022eaf78aa)) +* **deps:** bump dotenv from 17.0.1 to 17.2.0 ([#13288](https://github.com/mdn/yari/issues/13288)) ([32f0412](https://github.com/mdn/yari/commit/32f041223d4073902a00970cb9e0a589b2a0937c)) +* **deps:** bump is-svg from 6.0.0 to 6.1.0 ([#13281](https://github.com/mdn/yari/issues/13281)) ([eb98f22](https://github.com/mdn/yari/commit/eb98f228621fc3395aed07de3ce3dd2ad07a2b1a)) +* **deps:** bump selectolax from 0.3.30 to 0.3.31 in /deployer in the dependencies group ([#13273](https://github.com/mdn/yari/issues/13273)) ([510f44b](https://github.com/mdn/yari/commit/510f44b630a2a4e39d8e26b7dbb59d9172430b3c)) + +## [5.0.0](https://github.com/mdn/yari/compare/v4.12.6...v5.0.0) (2025-07-03) + + +### ⚠ BREAKING CHANGES + +* **deps:** bump NodeJS from v20 to v22 ([#13223](https://github.com/mdn/yari/issues/13223)) + +### Miscellaneous + +* **deps:** bump NodeJS from v20 to v22 ([#13223](https://github.com/mdn/yari/issues/13223)) ([c28dc84](https://github.com/mdn/yari/commit/c28dc84390d87ec8c534217b06acdb66d8c52620)) + +## [4.12.6](https://github.com/mdn/yari/compare/v4.12.5...v4.12.6) (2025-07-03) + + +### Miscellaneous + +* **deps-dev:** bump @types/node from 18.19.115 to 20.19.4 ([#13257](https://github.com/mdn/yari/issues/13257)) ([5e20816](https://github.com/mdn/yari/commit/5e208163a3db35f10bf06b998f4d5efc1aaabd34)) +* **deps:** bump @inquirer/prompts from 7.5.3 to 7.6.0 ([#13247](https://github.com/mdn/yari/issues/13247)) ([16afb67](https://github.com/mdn/yari/commit/16afb67c660e15704ae5006911e8937f99b090b3)) +* **lint:** migrate to lefthook from lint-staged + husky ([#13259](https://github.com/mdn/yari/issues/13259)) ([6ac1b5f](https://github.com/mdn/yari/commit/6ac1b5f69858738b97e58a283e6c3339f3e15338)) + +## [4.12.5](https://github.com/mdn/yari/compare/v4.12.4...v4.12.5) (2025-07-02) + + +### Bug Fixes + +* **dotenv:** set `quiet: true` everywhere ([#13255](https://github.com/mdn/yari/issues/13255)) ([5ee510c](https://github.com/mdn/yari/commit/5ee510cc108af998e6856a5b9b28cbf0fd78b7ac)) + + +### Miscellaneous + +* **deps-dev:** bump @babel/core from 7.27.7 to 7.28.0 ([#13251](https://github.com/mdn/yari/issues/13251)) ([6196c1a](https://github.com/mdn/yari/commit/6196c1afa92adba12ae1387626b19a96e876e115)) +* **deps-dev:** bump @babel/eslint-parser from 7.27.5 to 7.28.0 ([#13249](https://github.com/mdn/yari/issues/13249)) ([0536f5e](https://github.com/mdn/yari/commit/0536f5e8ed7655b168694ba79e617b0e69b67b03)) +* **deps-dev:** bump @babel/preset-env from 7.27.2 to 7.28.0 ([#13252](https://github.com/mdn/yari/issues/13252)) ([4ca0704](https://github.com/mdn/yari/commit/4ca0704dd1a0292745b39814048e2d007d29207c)) +* **deps-dev:** bump @types/node from 18.19.113 to 18.19.115 in the types group ([#13246](https://github.com/mdn/yari/issues/13246)) ([dd88a99](https://github.com/mdn/yari/commit/dd88a99ed8fa767b52fea1ca5ecf618654da1937)) +* **deps:** bump @mdn/browser-compat-data from 6.0.27 to 6.0.28 ([#13248](https://github.com/mdn/yari/issues/13248)) ([60c1467](https://github.com/mdn/yari/commit/60c1467d1d5d5fe7e1593ea21ea05cdff03c4bb5)) +* **deps:** bump dotenv from 17.0.0 to 17.0.1 ([#13250](https://github.com/mdn/yari/issues/13250)) ([b699446](https://github.com/mdn/yari/commit/b6994466b107c5f2c13b073c2b71b50c5fcf22ee)) + +## [4.12.4](https://github.com/mdn/yari/compare/v4.12.3...v4.12.4) (2025-07-01) + + +### Bug Fixes + +* **playground:** center login button vertically ([#12841](https://github.com/mdn/yari/issues/12841)) ([0b26109](https://github.com/mdn/yari/commit/0b2610914f5c0b895bffe1c296d144a91b31ed9b)) +* **plus/offer-overview:** fix typo on MDN Plus page ([#13240](https://github.com/mdn/yari/issues/13240)) ([bdb7ee8](https://github.com/mdn/yari/commit/bdb7ee85aa8eb9d41485ee331243ddba25f7fc0d)) +* **plus:** fix use sp3 ([#13205](https://github.com/mdn/yari/issues/13205)) ([a11e5b3](https://github.com/mdn/yari/commit/a11e5b3bd1e08efdf85bbeab87dca6b5eed9c1ba)) +* **plus:** subplat3 configuration logic ([#13206](https://github.com/mdn/yari/issues/13206)) ([f6f2642](https://github.com/mdn/yari/commit/f6f2642c31a8ebf05eb6e578d8dddb4fcdfeb136)) +* **workflows:** assign explicit permissions ([#13241](https://github.com/mdn/yari/issues/13241)) ([3d5676e](https://github.com/mdn/yari/commit/3d5676e7f8a94d33a2ca2de6230ca56245228b23)) + + +### Enhancements + +* **libs/play:** add logging + refine runner errors ([#12645](https://github.com/mdn/yari/issues/12645)) ([2baf9bd](https://github.com/mdn/yari/commit/2baf9bdd877ad3a13a8762a25bb5ac81a7e8e2cf)) + + +### Miscellaneous + +* **deps-dev:** bump @babel/core from 7.27.4 to 7.27.7 ([#13222](https://github.com/mdn/yari/issues/13222)) ([03d3948](https://github.com/mdn/yari/commit/03d394862272e8714cd3219432e67e66da29dd82)) +* **deps-dev:** bump @pmmmwh/react-refresh-webpack-plugin from 0.6.0 to 0.6.1 ([#13211](https://github.com/mdn/yari/issues/13211)) ([288389e](https://github.com/mdn/yari/commit/288389ef5bd3d41c762511191dbea6fc2b9ad2ee)) +* **deps-dev:** bump @swc/core from 1.12.3 to 1.12.4 ([#13188](https://github.com/mdn/yari/issues/13188)) ([5d6954b](https://github.com/mdn/yari/commit/5d6954b8c3cfea66e2b11ed5be1beee012cd2b83)) +* **deps-dev:** bump @swc/core from 1.12.4 to 1.12.5 ([#13192](https://github.com/mdn/yari/issues/13192)) ([431148a](https://github.com/mdn/yari/commit/431148a93a09518f0a3e15f44ab81d0dfa5352e8)) +* **deps-dev:** bump @swc/core from 1.12.5 to 1.12.7 ([#13213](https://github.com/mdn/yari/issues/13213)) ([3702bcd](https://github.com/mdn/yari/commit/3702bcd5c9dfa1b2a9c7829af6473a6f2f2896c7)) +* **deps-dev:** bump @swc/core from 1.12.7 to 1.12.9 ([#13236](https://github.com/mdn/yari/issues/13236)) ([a6d965d](https://github.com/mdn/yari/commit/a6d965d52f041c52e480e44a2cd512acabbbc73a)) +* **deps-dev:** bump @types/node from 18.19.111 to 18.19.112 in the types group ([#13185](https://github.com/mdn/yari/issues/13185)) ([c63a3fb](https://github.com/mdn/yari/commit/c63a3fb451353f1ad288358859f26a55d00f104a)) +* **deps-dev:** bump @types/node from 18.19.112 to 18.19.113 in the types group ([#13227](https://github.com/mdn/yari/issues/13227)) ([6a5ef81](https://github.com/mdn/yari/commit/6a5ef81493da9451b7062bfa9dbd1d6312f60424)) +* **deps-dev:** bump browserslist from 4.25.0 to 4.25.1 ([#13209](https://github.com/mdn/yari/issues/13209)) ([2e39556](https://github.com/mdn/yari/commit/2e3955645242d95f2c7c08890e3c9c5048eae9f0)) +* **deps-dev:** bump eslint-plugin-import from 2.31.0 to 2.32.0 ([#13193](https://github.com/mdn/yari/issues/13193)) ([3cb058e](https://github.com/mdn/yari/commit/3cb058ebab581ba1b6c7eebc0da86cc673895fc4)) +* **deps-dev:** bump lint-staged from 15.2.10 to 16.1.2 ([#13156](https://github.com/mdn/yari/issues/13156)) ([edd57e9](https://github.com/mdn/yari/commit/edd57e9843c136a9c77755f3793f3cd8507ade1a)) +* **deps-dev:** bump postcss-preset-env from 10.2.3 to 10.2.4 ([#13218](https://github.com/mdn/yari/issues/13218)) ([b0a8b2f](https://github.com/mdn/yari/commit/b0a8b2f327868c352979767441964f303b5c04e4)) +* **deps-dev:** bump prettier from 3.5.3 to 3.6.1 ([#13208](https://github.com/mdn/yari/issues/13208)) ([22ecfca](https://github.com/mdn/yari/commit/22ecfca597bd7d00fe3043e32681b689cda566fb)) +* **deps-dev:** bump prettier from 3.6.1 to 3.6.2 ([#13219](https://github.com/mdn/yari/issues/13219)) ([76c2dde](https://github.com/mdn/yari/commit/76c2dde5fd423c581161e134fa471a59fd8f4a74)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.5.15 to 2.5.16 ([#13212](https://github.com/mdn/yari/issues/13212)) ([7a9403e](https://github.com/mdn/yari/commit/7a9403e290107946d1e6284b820a4f24eb9509ae)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.5.16 to 2.5.17 ([#13231](https://github.com/mdn/yari/issues/13231)) ([e407f19](https://github.com/mdn/yari/commit/e407f19a4193def7f13fc740bf85839c678b21c0)) +* **deps-dev:** bump style-loader from 3.3.4 to 4.0.0 ([#10879](https://github.com/mdn/yari/issues/10879)) ([47941f2](https://github.com/mdn/yari/commit/47941f203da11a3124cbb9be58ab5528ecba81d6)) +* **deps-dev:** bump the dependencies group in /deployer with 2 updates ([#13196](https://github.com/mdn/yari/issues/13196)) ([bad3221](https://github.com/mdn/yari/commit/bad3221c39bf2c03fd213d0a00227da6c66034fd)) +* **deps-dev:** bump typescript-eslint from 8.34.1 to 8.35.0 ([#13204](https://github.com/mdn/yari/issues/13204)) ([e0b13c0](https://github.com/mdn/yari/commit/e0b13c027cdd14d3cf8451c8b4f58d565fafc27e)) +* **deps-dev:** bump typescript-eslint from 8.35.0 to 8.35.1 ([#13235](https://github.com/mdn/yari/issues/13235)) ([0a8ab4e](https://github.com/mdn/yari/commit/0a8ab4e2a17ab6e1b9aa195bd995006b923a09f8)) +* **deps:** bump @mdn/browser-compat-data from 6.0.24 to 6.0.25 ([#13194](https://github.com/mdn/yari/issues/13194)) ([af1f53b](https://github.com/mdn/yari/commit/af1f53b9525e5029982b8027e85746137a29aa41)) +* **deps:** bump @mdn/browser-compat-data from 6.0.25 to 6.0.26 ([#13207](https://github.com/mdn/yari/issues/13207)) ([59ddfd5](https://github.com/mdn/yari/commit/59ddfd50e492e0ba4bbe237e8f7d5930255ca5e9)) +* **deps:** bump @mdn/browser-compat-data from 6.0.26 to 6.0.27 ([#13233](https://github.com/mdn/yari/issues/13233)) ([1ec3bdf](https://github.com/mdn/yari/commit/1ec3bdf666d87c389d9653f8fb6ac8452404bb4e)) +* **deps:** bump @mdn/rari from 0.1.43 to 0.1.44 ([#13186](https://github.com/mdn/yari/issues/13186)) ([78fcdf7](https://github.com/mdn/yari/commit/78fcdf7556ce9aaf009a5815ccfabc837ea79afd)) +* **deps:** bump @mdn/rari from 0.1.44 to 0.1.45 ([#13215](https://github.com/mdn/yari/issues/13215)) ([b9c3de4](https://github.com/mdn/yari/commit/b9c3de40e60b2d1d13eb420ea95bd065e6a8a2f4)) +* **deps:** bump @sentry/node from 8.54.0 to 8.55.0 in the sentry group ([#13217](https://github.com/mdn/yari/issues/13217)) ([c1d1370](https://github.com/mdn/yari/commit/c1d13707f2be7301932e94a17da207352f6a5ba7)) +* **deps:** bump @stripe/stripe-js from 6.1.0 to 7.4.0 ([#13202](https://github.com/mdn/yari/issues/13202)) ([16563f1](https://github.com/mdn/yari/commit/16563f1ded705805f75c95a5da26de39ad733577)) +* **deps:** bump concurrently from 9.1.2 to 9.2.0 ([#13191](https://github.com/mdn/yari/issues/13191)) ([8fc6d66](https://github.com/mdn/yari/commit/8fc6d6663bf438ac968dee033f016f5bd36b74ea)) +* **deps:** bump dotenv from 16.5.0 to 16.6.0 ([#13220](https://github.com/mdn/yari/issues/13220)) ([473d230](https://github.com/mdn/yari/commit/473d230a84c04d69fcb74eac552befd72f7167d7)) +* **deps:** bump dotenv from 16.x to 17.0.0 ([#13228](https://github.com/mdn/yari/issues/13228)) ([958d8f1](https://github.com/mdn/yari/commit/958d8f1906f6268ee6dd5dd4ce755de71eaa6220)) +* **deps:** bump file-type from 19.6.0 to 21.0.0 ([#13073](https://github.com/mdn/yari/issues/13073)) ([d73eee8](https://github.com/mdn/yari/commit/d73eee8715921d3aef9e0d0b80b3616dfb40455f)) +* **deps:** bump mdn-data from 2.21.0 to 2.22.0 ([#13210](https://github.com/mdn/yari/issues/13210)) ([8db7e53](https://github.com/mdn/yari/commit/8db7e536e48dfb0af6f9fafdcb5f17d5d3294834)) +* **deps:** bump openai from 4.103.0 to 5.7.0 ([#13203](https://github.com/mdn/yari/issues/13203)) ([4089b1e](https://github.com/mdn/yari/commit/4089b1e3cd739496d93db40b68746193a0ff0431)) +* **deps:** bump openai from 5.7.0 to 5.8.1 ([#13221](https://github.com/mdn/yari/issues/13221)) ([4c7df8c](https://github.com/mdn/yari/commit/4c7df8c9e5a4cd2de2b71c92981de73df871612d)) +* **deps:** bump openai from 5.8.1 to 5.8.2 ([#13229](https://github.com/mdn/yari/issues/13229)) ([f4a83f8](https://github.com/mdn/yari/commit/f4a83f8691442ba3fe12e4c81f7a31abdc8d5072)) +* **deps:** bump pg from 8.16.1 to 8.16.2 ([#13187](https://github.com/mdn/yari/issues/13187)) ([a246f74](https://github.com/mdn/yari/commit/a246f7414670fb0bb484345a4aed8ddc086126d0)) +* **deps:** bump pg from 8.16.2 to 8.16.3 ([#13232](https://github.com/mdn/yari/issues/13232)) ([37469a3](https://github.com/mdn/yari/commit/37469a3560c91c44af70eb32109f8425bc22d049)) +* **deps:** bump the dependencies group in /testing/integration with 2 updates ([#13198](https://github.com/mdn/yari/issues/13198)) ([5465a64](https://github.com/mdn/yari/commit/5465a64478c25a19119f1d70152a20b318eae531)) +* **deps:** bump the react-router group with 2 updates ([#13230](https://github.com/mdn/yari/issues/13230)) ([d075034](https://github.com/mdn/yari/commit/d075034b270d1ad41240130213aeeb77d7c59c18)) +* **deps:** bump web-features from 2.39.0 to 2.40.0 ([#13201](https://github.com/mdn/yari/issues/13201)) ([8066d35](https://github.com/mdn/yari/commit/8066d35323b3475e823805910d218fb5b7c5c7de)) +* **deps:** bump web-features from 2.40.0 to 2.40.1 ([#13214](https://github.com/mdn/yari/issues/13214)) ([a7b802a](https://github.com/mdn/yari/commit/a7b802a288412de86ce2f621b797e28f0cbb4e55)) +* **deps:** bump web-features from 2.40.1 to 2.40.2 ([#13237](https://github.com/mdn/yari/issues/13237)) ([c8a2561](https://github.com/mdn/yari/commit/c8a256157d8495bb0719488e337e76df29f37ea4)) +* **deps:** remove `@vscode/ripgrep` ([#13226](https://github.com/mdn/yari/issues/13226)) ([0017c1a](https://github.com/mdn/yari/commit/0017c1a083b3817869ad156c5ff92c9469428841)) +* **deps:** replace got with fetch ([#13225](https://github.com/mdn/yari/issues/13225)) ([e6117d8](https://github.com/mdn/yari/commit/e6117d8dca98222a19c144bf92145f5e251e95e5)) +* **filecheck:** ignore .gitignore/jsonc/yaml ([#13216](https://github.com/mdn/yari/issues/13216)) ([9d1c9d7](https://github.com/mdn/yari/commit/9d1c9d7668123daa7033445d10c6764c0549797e)) +* **observatory:** update HTTP Headers links ([#13148](https://github.com/mdn/yari/issues/13148)) ([78ade99](https://github.com/mdn/yari/commit/78ade9910b3e1240710dd4d4db3551ff41615dbc)) +* **plus:** upgrade to SubPlat 3.0 ([#13199](https://github.com/mdn/yari/issues/13199)) ([a2db291](https://github.com/mdn/yari/commit/a2db291ab5843be909463693b1b5da67923158d7)) +* **pride:** revert logo + homepage ([716ff8c](https://github.com/mdn/yari/commit/716ff8cc00a429c687bcf8915319e0ff16090aac)) + +## [4.12.3](https://github.com/mdn/yari/compare/v4.12.2...v4.12.3) (2025-06-19) + + +### Bug Fixes + +* **plus:** remove PR from plans ([#13164](https://github.com/mdn/yari/issues/13164)) ([4f9de54](https://github.com/mdn/yari/commit/4f9de54102e5dcf25e520b914d677ce39a0f9b02)) + + +### Miscellaneous + +* **deps-dev:** bump @swc/core from 1.12.1 to 1.12.3 ([#13175](https://github.com/mdn/yari/issues/13175)) ([c19e6b2](https://github.com/mdn/yari/commit/c19e6b287487b1c8e77921ccc0843b7547dedaa9)) +* **deps-dev:** bump babel-jest from 29.7.0 to 30.0.2 ([#13174](https://github.com/mdn/yari/issues/13174)) ([aa8138b](https://github.com/mdn/yari/commit/aa8138bf2637b60900eae10adc4204d902a9ac89)) +* **deps-dev:** bump eslint-plugin-jest from 28.14.0 to 29.0.1 ([#13173](https://github.com/mdn/yari/issues/13173)) ([44180ae](https://github.com/mdn/yari/commit/44180ae35913b7047e3bf0ee579404e8a9a066a8)) +* **deps-dev:** bump jest-environment-jsdom from 29.7.0 to 30.0.2 ([#13180](https://github.com/mdn/yari/issues/13180)) ([94da228](https://github.com/mdn/yari/commit/94da228cecda5fcf5464a98c30b36ca9a2b66624)) +* **deps-dev:** bump jest-resolve from 29.7.0 to 30.0.2 ([#13177](https://github.com/mdn/yari/issues/13177)) ([0046c90](https://github.com/mdn/yari/commit/0046c904f3c347eee627910114d5528ea34e5d5f)) +* **deps-dev:** bump postcss from 8.5.5 to 8.5.6 ([#13161](https://github.com/mdn/yari/issues/13161)) ([b2b6997](https://github.com/mdn/yari/commit/b2b6997d55d28ed5f2b502bec9a9082c5ff8c8d1)) +* **deps-dev:** bump sass from 1.89.1 to 1.89.2 ([#13131](https://github.com/mdn/yari/issues/13131)) ([48f2c1e](https://github.com/mdn/yari/commit/48f2c1eb7b2051f96aa6fdd174a34a27bcb0483d)) +* **deps-dev:** bump typescript-eslint from 8.34.0 to 8.34.1 ([#13162](https://github.com/mdn/yari/issues/13162)) ([b2c9566](https://github.com/mdn/yari/commit/b2c95668e4dc5d4956e630191abcfb304e762449)) +* **deps:** bump @codemirror/theme-one-dark from 6.1.2 to 6.1.3 ([#13182](https://github.com/mdn/yari/issues/13182)) ([526dc2e](https://github.com/mdn/yari/commit/526dc2ea6b5594a30326cfd5f82d6f91d5a5e030)) +* **deps:** bump @mdn/browser-compat-data from 6.0.23 to 6.0.24 ([#13165](https://github.com/mdn/yari/issues/13165)) ([2a9a5a8](https://github.com/mdn/yari/commit/2a9a5a8681d3cb4edfa5d250d78c1e2974454ee1)) +* **deps:** bump @mdn/rari from 0.1.42 to 0.1.43 ([#13184](https://github.com/mdn/yari/issues/13184)) ([66eaa67](https://github.com/mdn/yari/commit/66eaa678044df8b2a3b91f2b749c4c2da09d1baf)) +* **deps:** bump codemirror from 6.0.1 to 6.0.2 ([#13183](https://github.com/mdn/yari/issues/13183)) ([14a4889](https://github.com/mdn/yari/commit/14a4889abb748605544f615bec24aca2e98d8c10)) +* **deps:** bump pg from 8.16.0 to 8.16.1 ([#13181](https://github.com/mdn/yari/issues/13181)) ([68d01ef](https://github.com/mdn/yari/commit/68d01efd99ed6bf8482d1eee4ce71ff49dbd6b95)) +* **deps:** bump web-features from 2.38.0 to 2.39.0 ([#13176](https://github.com/mdn/yari/issues/13176)) ([aa19825](https://github.com/mdn/yari/commit/aa198255602cd72158e8d25b72bdead7a25d2678)) +* **deps:** bump web-specs from 3.53.0 to 3.54.0 ([#13179](https://github.com/mdn/yari/issues/13179)) ([bbeea77](https://github.com/mdn/yari/commit/bbeea77666dbfad51ba7d5080b513dccff06ff3b)) + +## [4.12.2](https://github.com/mdn/yari/compare/v4.12.1...v4.12.2) (2025-06-17) + + +### Enhancements + +* **deps:** require exact rari version ([#13168](https://github.com/mdn/yari/issues/13168)) ([0c613c3](https://github.com/mdn/yari/commit/0c613c33bc47ed6ee959c93a36cf5585569f7c92)) + + +### Miscellaneous + +* **deps-dev:** bump eslint-plugin-jest from 28.13.5 to 28.14.0 ([#13158](https://github.com/mdn/yari/issues/13158)) ([3af3df0](https://github.com/mdn/yari/commit/3af3df0b200600481d61e7c10e8b13faf8f508f6)) +* **deps:** bump @mdn/browser-compat-data from 6.0.22 to 6.0.23 ([#13159](https://github.com/mdn/yari/issues/13159)) ([989f0da](https://github.com/mdn/yari/commit/989f0da30007de7ea7ff8879d83f09e0fca25049)) +* **deps:** bump @mdn/rari from 0.1.40 to 0.1.42 ([#13166](https://github.com/mdn/yari/issues/13166)) ([283701b](https://github.com/mdn/yari/commit/283701bc9a664beb19351a4a47942765f47c5afb)) +* **deps:** bump selectolax from 0.3.29 to 0.3.30 in /deployer in the dependencies group ([#13154](https://github.com/mdn/yari/issues/13154)) ([1310cc6](https://github.com/mdn/yari/commit/1310cc6a21491d6f7ad8320ccc0b1b10ee6b8e18)) + +## [4.12.1](https://github.com/mdn/yari/compare/v4.12.0...v4.12.1) (2025-06-13) + + +### Bug Fixes + +* various fixes when using yari in fred ([#13142](https://github.com/mdn/yari/issues/13142)) ([7b30036](https://github.com/mdn/yari/commit/7b30036398cd6dad03851e340a3feeeca92c368a)) + + +### Miscellaneous + +* **deps-dev:** bump @swc/core from 1.12.0 to 1.12.1 ([#13149](https://github.com/mdn/yari/issues/13149)) ([cbe9533](https://github.com/mdn/yari/commit/cbe9533d3f41ee2418d3e51dd6655fc679776e70)) +* **deps-dev:** bump eslint-plugin-jest from 28.13.3 to 28.13.5 ([#13150](https://github.com/mdn/yari/issues/13150)) ([1f898cb](https://github.com/mdn/yari/commit/1f898cb4d02accd8cca138338aa224c1e3219057)) +* **deps-dev:** bump eslint-plugin-n from 17.19.0 to 17.20.0 ([#13152](https://github.com/mdn/yari/issues/13152)) ([25f3e66](https://github.com/mdn/yari/commit/25f3e66506c5bc457ba7ac19fe197f39741d364e)) +* **deps-dev:** bump postcss from 8.5.4 to 8.5.5 ([#13145](https://github.com/mdn/yari/issues/13145)) ([ecbd83c](https://github.com/mdn/yari/commit/ecbd83c438e22c728720c9baf4961a0be737e4da)) +* **deps:** bump @mdn/rari from 0.1.39 to 0.1.40 ([#13151](https://github.com/mdn/yari/issues/13151)) ([80d3aee](https://github.com/mdn/yari/commit/80d3aeea36cc615ece16ef0ba839793dd496fb62)) +* **deps:** bump @vscode/ripgrep from 1.15.11 to 1.15.13 ([#13139](https://github.com/mdn/yari/issues/13139)) ([c2cd257](https://github.com/mdn/yari/commit/c2cd25798f1a081b8b4c47f5588a4d0ec9707fc0)) +* **plus/updates:** hide filters if not authenticated ([#13143](https://github.com/mdn/yari/issues/13143)) ([c7d2b32](https://github.com/mdn/yari/commit/c7d2b32bba9978cbc34adb9525f4102737493dcc)) + +## [4.12.0](https://github.com/mdn/yari/compare/v4.11.1...v4.12.0) (2025-06-11) + + +### Features + +* **npm:** modify package for use in fred ([#13133](https://github.com/mdn/yari/issues/13133)) ([a4fc897](https://github.com/mdn/yari/commit/a4fc897569cd302ab50b60f4620b62ccca305eb6)) + + +### Enhancements + +* **homepage:** add search placeholder ([#13111](https://github.com/mdn/yari/issues/13111)) ([37f772b](https://github.com/mdn/yari/commit/37f772b7c169777bad4b67e0c96e207d58eb0c5d)) + + +### Miscellaneous + +* **deps-dev:** bump @swc/core from 1.11.31 to 1.12.0 ([#13136](https://github.com/mdn/yari/issues/13136)) ([0ec887a](https://github.com/mdn/yari/commit/0ec887ab989784a80c57b29838b304eb136a612a)) +* **deps-dev:** bump @types/node from 18.19.110 to 18.19.111 in the types group ([#13112](https://github.com/mdn/yari/issues/13112)) ([05e287a](https://github.com/mdn/yari/commit/05e287a260ccc27b3533a6a540cec7ea97a77bb1)) +* **deps-dev:** bump eslint-plugin-jest from 28.12.0 to 28.13.0 ([#13122](https://github.com/mdn/yari/issues/13122)) ([8659c40](https://github.com/mdn/yari/commit/8659c409b697642895e35bee28ba2049e9a86e26)) +* **deps-dev:** bump eslint-plugin-jest from 28.13.0 to 28.13.3 ([#13140](https://github.com/mdn/yari/issues/13140)) ([fdcd31b](https://github.com/mdn/yari/commit/fdcd31bffc3ba7bb4e3b68ae42cb761848cefe1e)) +* **deps-dev:** bump postcss-preset-env from 10.2.1 to 10.2.2 ([#13128](https://github.com/mdn/yari/issues/13128)) ([db0e6bc](https://github.com/mdn/yari/commit/db0e6bc40fbcf1afa5f3d804dd1705e5243ca1d1)) +* **deps-dev:** bump postcss-preset-env from 10.2.2 to 10.2.3 ([#13134](https://github.com/mdn/yari/issues/13134)) ([c232c61](https://github.com/mdn/yari/commit/c232c610eb9632bcb7601db5b7310b2f40704159)) +* **deps-dev:** bump pytest from 8.3.5 to 8.4.0 in /deployer in the dependencies group ([#13119](https://github.com/mdn/yari/issues/13119)) ([864fbf4](https://github.com/mdn/yari/commit/864fbf4f4d2d69503c446e06fdc30f3091eadb98)) +* **deps-dev:** bump typescript-eslint from 8.33.1 to 8.34.0 ([#13129](https://github.com/mdn/yari/issues/13129)) ([74a27a5](https://github.com/mdn/yari/commit/74a27a5f77882aebf8af1a98b0d5bd0a2957eb8f)) +* **deps:** bump @mdn/browser-compat-data from 6.0.20 to 6.0.22 ([#13138](https://github.com/mdn/yari/issues/13138)) ([84ddfe0](https://github.com/mdn/yari/commit/84ddfe04a713c198f1f3b11efb0ca9f0f85eefc5)) +* **deps:** bump fdir from 6.4.5 to 6.4.6 ([#13124](https://github.com/mdn/yari/issues/13124)) ([b1f3feb](https://github.com/mdn/yari/commit/b1f3febd3154f3bf28062b5d3f3311301a4a7d5a)) +* **deps:** bump pytest from 8.3.5 to 8.4.0 in /testing/integration in the dependencies group ([#13120](https://github.com/mdn/yari/issues/13120)) ([98ba59e](https://github.com/mdn/yari/commit/98ba59ed5504702cfb0191c13b1a49443d4c1a99)) +* **deps:** bump requests from 2.32.3 to 2.32.4 in /testing/integration ([#13123](https://github.com/mdn/yari/issues/13123)) ([2251e82](https://github.com/mdn/yari/commit/2251e822441ac7bffabeef89f9e8588dc6c051c2)) +* **deps:** bump web-features from 2.37.0 to 2.38.0 ([#13141](https://github.com/mdn/yari/issues/13141)) ([f69aab9](https://github.com/mdn/yari/commit/f69aab92437128484394bfeaa03dadc88752edb3)) +* **main:** release 4.11.1 ([#13117](https://github.com/mdn/yari/issues/13117)) ([17f3d02](https://github.com/mdn/yari/commit/17f3d025298e162758f63818f170a8073b481e6e)) + +## [4.11.1](https://github.com/mdn/yari/compare/v4.11.0...v4.11.1) (2025-06-06) + + +### Bug Fixes + +* **scrims:** show outline on focus-visible ([#13110](https://github.com/mdn/yari/issues/13110)) ([731306d](https://github.com/mdn/yari/commit/731306d8af446e37edb4e3a3c78bcb1ebc72327c)) + + +### Miscellaneous + +* **deps-dev:** bump @swc/core from 1.11.29 to 1.11.31 ([#13109](https://github.com/mdn/yari/issues/13109)) ([b107fa1](https://github.com/mdn/yari/commit/b107fa198c8a70564eca8b7035ffff232bde2940)) +* **deps-dev:** bump diff from 7.0.0 to 8.0.2 ([#13068](https://github.com/mdn/yari/issues/13068)) ([0249fd7](https://github.com/mdn/yari/commit/0249fd78a421cbdc5bc3062bf36b52f10f8448e6)) +* **deps-dev:** bump postcss-preset-env from 10.2.0 to 10.2.1 ([#13114](https://github.com/mdn/yari/issues/13114)) ([4f5dc0d](https://github.com/mdn/yari/commit/4f5dc0da2de4008d62e56a768c5152b6a2ce0193)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.5.14 to 2.5.15 ([#13094](https://github.com/mdn/yari/issues/13094)) ([805472c](https://github.com/mdn/yari/commit/805472c37db552d52cf32b3e6c8bddbb627dd98c)) +* **deps-dev:** bump the react-router group with 2 updates ([#13104](https://github.com/mdn/yari/issues/13104)) ([a6e5235](https://github.com/mdn/yari/commit/a6e5235224102c39a06ba8d43eb51bd390a7d3ce)) +* **deps-dev:** bump webpack-dev-server from 5.2.1 to 5.2.2 ([#13105](https://github.com/mdn/yari/issues/13105)) ([254a298](https://github.com/mdn/yari/commit/254a298e3ca3e0ac101030a71a21c86238dba738)) +* **deps:** bump @mdn/browser-compat-data from 6.0.19 to 6.0.20 ([#13107](https://github.com/mdn/yari/issues/13107)) ([937b2b0](https://github.com/mdn/yari/commit/937b2b0bdc2fa0335bbcc3b9690ff0087691d306)) +* **deps:** bump @mdn/rari from 0.1.38 to 0.1.39 ([#13116](https://github.com/mdn/yari/issues/13116)) ([d5d0b76](https://github.com/mdn/yari/commit/d5d0b76e932ce745c94d5a59461e2bb3d79ec78a)) +* **deps:** bump web-features from 2.36.1 to 2.37.0 ([#13115](https://github.com/mdn/yari/issues/13115)) ([3d96610](https://github.com/mdn/yari/commit/3d966100f0f982a3de212187d0a98ee6bd255c9c)) +* **main:** release 4.11.1 ([#13108](https://github.com/mdn/yari/issues/13108)) ([10df1a1](https://github.com/mdn/yari/commit/10df1a14b1a14ed6df7ff6d2fe93d9310427c894)) + +## [4.11.0](https://github.com/mdn/yari/compare/v4.10.1...v4.11.0) (2025-06-03) + + +### Features + +* **pride:** pride 2025 ([#13065](https://github.com/mdn/yari/issues/13065)) ([18c67b3](https://github.com/mdn/yari/commit/18c67b3f6854b728fe72e9ca41b64cba4659de85)) + + +### Miscellaneous + +* **compat-table:** replace "Released" with "Release date" to account for upcoming releases ([#13060](https://github.com/mdn/yari/issues/13060)) ([a734077](https://github.com/mdn/yari/commit/a73407786efa5c1e149d8aee481abdc25c758ff8)) +* **deps-dev:** bump @babel/core from 7.27.3 to 7.27.4 ([#13096](https://github.com/mdn/yari/issues/13096)) ([764d2d9](https://github.com/mdn/yari/commit/764d2d988003c4fc7ec21489c7ff1257dcd59996)) +* **deps-dev:** bump @babel/eslint-parser from 7.27.1 to 7.27.5 ([#13102](https://github.com/mdn/yari/issues/13102)) ([58bb276](https://github.com/mdn/yari/commit/58bb276c1842f0b58238aaa971c5d01a6cbff994)) +* **deps-dev:** bump @types/node from 18.19.104 to 18.19.105 in the types group ([#13087](https://github.com/mdn/yari/issues/13087)) ([8cb07de](https://github.com/mdn/yari/commit/8cb07ded7d812109ed8ec3e08eeed3af7c7cd771)) +* **deps-dev:** bump @types/node from 18.19.108 to 18.19.110 in the types group ([#13093](https://github.com/mdn/yari/issues/13093)) ([00e4ca4](https://github.com/mdn/yari/commit/00e4ca488bd58835ad8ca15db32abf2c6b9bc4e8)) +* **deps-dev:** bump browserslist from 4.24.5 to 4.25.0 ([#13089](https://github.com/mdn/yari/issues/13089)) ([3c642be](https://github.com/mdn/yari/commit/3c642be51cc7ec4121c0606f294caebfb415ee11)) +* **deps-dev:** bump eslint-plugin-jest from 28.11.1 to 28.12.0 ([#13092](https://github.com/mdn/yari/issues/13092)) ([9497559](https://github.com/mdn/yari/commit/94975595f1397783bc5dcbc71583ef9755341bea)) +* **deps-dev:** bump eslint-plugin-n from 17.18.0 to 17.19.0 ([#13099](https://github.com/mdn/yari/issues/13099)) ([fd705f9](https://github.com/mdn/yari/commit/fd705f96722ee821ab5f4c7eeab8ace65b230997)) +* **deps-dev:** bump postcss from 8.5.3 to 8.5.4 ([#13088](https://github.com/mdn/yari/issues/13088)) ([12100b5](https://github.com/mdn/yari/commit/12100b55cb1768d5ab7bf2661dd1caf1348a0880)) +* **deps-dev:** bump sass from 1.89.0 to 1.89.1 ([#13098](https://github.com/mdn/yari/issues/13098)) ([2ca899b](https://github.com/mdn/yari/commit/2ca899b85498df29367b756a1c7360fa64505f8f)) +* **deps-dev:** bump typescript-eslint from 8.33.0 to 8.33.1 ([#13100](https://github.com/mdn/yari/issues/13100)) ([589ac5a](https://github.com/mdn/yari/commit/589ac5a86ee4d1bc145fa92cfcf65a9827557cfc)) +* **deps:** bump @mdn/browser-compat-data from 6.0.18 to 6.0.19 ([#13095](https://github.com/mdn/yari/issues/13095)) ([6dea8a8](https://github.com/mdn/yari/commit/6dea8a84e6c3fe934b67cf9eb03c0686468289a7)) +* **deps:** bump is-svg from 5.1.0 to 6.0.0 ([#12975](https://github.com/mdn/yari/issues/12975)) ([17beed3](https://github.com/mdn/yari/commit/17beed3fa56657e0cc1e999237b1e5aafb87f86a)) +* **deps:** bump web-features from 2.36.0 to 2.36.1 ([#13097](https://github.com/mdn/yari/issues/13097)) ([6c8d6aa](https://github.com/mdn/yari/commit/6c8d6aac50e4535c4b0676ec6d55c3404f6ca01d)) +* **deps:** bump web-specs from 3.52.0 to 3.53.0 ([#13103](https://github.com/mdn/yari/issues/13103)) ([8272048](https://github.com/mdn/yari/commit/8272048accf41d862faae7370a13669debaaed62)) + +## [4.10.1](https://github.com/mdn/yari/compare/v4.10.0...v4.10.1) (2025-05-28) + + +### Bug Fixes + +* **bcd:** limit length of long bcd tables ([#13061](https://github.com/mdn/yari/issues/13061)) ([c5bf81d](https://github.com/mdn/yari/commit/c5bf81d30516a4ebc63e768b12648af74801b5a3)) +* **compat-table:** reduce features progressively ([#13066](https://github.com/mdn/yari/issues/13066)) ([2072d08](https://github.com/mdn/yari/commit/2072d085b409726f8468487770b7cea1bfad9657)) +* **scrim-inline:** load within Prose only if it contains the element ([#13067](https://github.com/mdn/yari/issues/13067)) ([7d12422](https://github.com/mdn/yari/commit/7d124222e042a86a52bdef6f783ffb85bdb7b40c)) + + +### Miscellaneous + +* **cloud-function:** support Glean for Fred ([#13054](https://github.com/mdn/yari/issues/13054)) ([4fac06d](https://github.com/mdn/yari/commit/4fac06d3d145820c2186a9f1281cb99e7eabc78d)) +* **csp:** allow incoming.telemetry.m.o ([4fac06d](https://github.com/mdn/yari/commit/4fac06d3d145820c2186a9f1281cb99e7eabc78d)) +* **deps-dev:** bump @babel/core from 7.27.1 to 7.27.3 ([#13076](https://github.com/mdn/yari/issues/13076)) ([17ab712](https://github.com/mdn/yari/commit/17ab71259ad668a3e803d66f11b9e5d19f06ac7a)) +* **deps-dev:** bump @swc/core from 1.11.24 to 1.11.29 ([#13063](https://github.com/mdn/yari/issues/13063)) ([0df3f98](https://github.com/mdn/yari/commit/0df3f98f73d465e8f4e4df4404d1e94b347a3cbb)) +* **deps-dev:** bump @types/node from 18.19.103 to 18.19.104 in the types group ([#13078](https://github.com/mdn/yari/issues/13078)) ([619d0d3](https://github.com/mdn/yari/commit/619d0d3b7c7f8662a87d08ae616c4eee91b877cb)) +* **deps-dev:** bump eslint-plugin-jest from 28.11.0 to 28.11.1 ([#13084](https://github.com/mdn/yari/issues/13084)) ([d2f937b](https://github.com/mdn/yari/commit/d2f937bf6d2b7a92a7e6f95847901944b8fd555a)) +* **deps-dev:** bump postcss-preset-env from 10.1.6 to 10.2.0 ([#13082](https://github.com/mdn/yari/issues/13082)) ([f69f9d0](https://github.com/mdn/yari/commit/f69f9d0ce25ef6f410a0b7dad10ac4d4404f8d62)) +* **deps-dev:** bump the react-router group with 2 updates ([#13071](https://github.com/mdn/yari/issues/13071)) ([ed61d9d](https://github.com/mdn/yari/commit/ed61d9d8541615ea7a8fd0e5e3a9e3e1ba98b1a2)) +* **deps-dev:** bump typescript-eslint from 8.32.1 to 8.33.0 ([#13083](https://github.com/mdn/yari/issues/13083)) ([6c3912f](https://github.com/mdn/yari/commit/6c3912ffaa9476040e116f19d8a516a0c109105d)) +* **deps:** bump @inquirer/prompts from 7.5.1 to 7.5.3 ([#13072](https://github.com/mdn/yari/issues/13072)) ([d84118c](https://github.com/mdn/yari/commit/d84118c2bcce1f756a4f9033325e41aa21b2070b)) +* **deps:** bump @mdn/browser-compat-data from 6.0.16 to 6.0.17 ([#13070](https://github.com/mdn/yari/issues/13070)) ([77c3fe0](https://github.com/mdn/yari/commit/77c3fe05491ba5d549b38e9d05bd9877e99c6795)) +* **deps:** bump @mdn/browser-compat-data from 6.0.17 to 6.0.18 ([#13079](https://github.com/mdn/yari/issues/13079)) ([352e5a9](https://github.com/mdn/yari/commit/352e5a9c525c188a1e3b0393be5da30319b17aa7)) +* **deps:** bump click from 8.2.0 to 8.2.1 in /deployer in the dependencies group ([#13074](https://github.com/mdn/yari/issues/13074)) ([9e99506](https://github.com/mdn/yari/commit/9e995062bc4620005d30b0023c800c1b842c1e3a)) +* **deps:** bump fdir from 6.4.4 to 6.4.5 ([#13086](https://github.com/mdn/yari/issues/13086)) ([ed870fc](https://github.com/mdn/yari/commit/ed870fcfa7e5b96f93a429de14baf82550f5ff94)) +* **deps:** bump openai from 4.100.0 to 4.102.0 ([#13062](https://github.com/mdn/yari/issues/13062)) ([0ea908d](https://github.com/mdn/yari/commit/0ea908dea1b9f30e5050993ef4086b31ec83df92)) +* **deps:** bump openai from 4.102.0 to 4.103.0 ([#13069](https://github.com/mdn/yari/issues/13069)) ([6b733ea](https://github.com/mdn/yari/commit/6b733ea02789f9936144d82fec76a28cce087bce)) +* **deps:** bump pgvector from 0.2.0 to 0.2.1 ([#13056](https://github.com/mdn/yari/issues/13056)) ([0c31ee5](https://github.com/mdn/yari/commit/0c31ee5367757441d4e160c619ff983514df3fc4)) +* **deps:** bump web-features from 2.35.2 to 2.35.3 ([#13064](https://github.com/mdn/yari/issues/13064)) ([b842ffc](https://github.com/mdn/yari/commit/b842ffcc1e27fa10d5a3e742120036edf3e8a1ea)) +* **deps:** bump web-features from 2.35.3 to 2.36.0 ([#13075](https://github.com/mdn/yari/issues/13075)) ([df69b88](https://github.com/mdn/yari/commit/df69b882de5ddde8089f4455b6077226794f2ae9)) +* **deps:** bump web-specs from 3.51.0 to 3.52.0 ([#13081](https://github.com/mdn/yari/issues/13081)) ([621a0bc](https://github.com/mdn/yari/commit/621a0bc6870fb1ae907d1615329db65bffccded6)) + +## [4.10.0](https://github.com/mdn/yari/compare/v4.9.1...v4.10.0) (2025-05-21) + + +### Features + +* **surveys:** add Italian locale survey ([#13031](https://github.com/mdn/yari/issues/13031)) ([b54e5dd](https://github.com/mdn/yari/commit/b54e5dd167b5e1ebccd489cfa9da22b7dcabdae7)) + + +### Bug Fixes + +* **cloud-function:** proxy blog assets for live samples incl. avif ([#12994](https://github.com/mdn/yari/issues/12994)) ([a43979b](https://github.com/mdn/yari/commit/a43979bfedeceb5a65c3314cc700dcce2c73cc83)) +* **meta:** remove hreflang attr from Blog RSS feed ([#13049](https://github.com/mdn/yari/issues/13049)) ([aa2d7e9](https://github.com/mdn/yari/commit/aa2d7e9052dfcf50614a81d921204474d8706386)) +* **server:** wrap rariBin in quotes ([#13012](https://github.com/mdn/yari/issues/13012)) ([f6ad2aa](https://github.com/mdn/yari/commit/f6ad2aa049dbb34f5fce6d7dae41ce5b7496b910)) +* **workflows:** disable cache in privileged workflows ([#13037](https://github.com/mdn/yari/issues/13037)) ([5a048f5](https://github.com/mdn/yari/commit/5a048f5498eff4b45dc8709dc48c7a9735da46ed)) + + +### Enhancements + +* **cloud-function:** refine `cache-control` header ([#12987](https://github.com/mdn/yari/issues/12987)) ([95bd4c2](https://github.com/mdn/yari/commit/95bd4c29c9b9ac23b7578b2be86e8b3f034b9e8e)) +* **seo:** improve favicon ([#13036](https://github.com/mdn/yari/issues/13036)) ([47e9cf5](https://github.com/mdn/yari/commit/47e9cf55b0e2a21c5fce0a48654b19668631bb68)) + + +### Miscellaneous + +* **deps-dev:** bump @babel/preset-env from 7.27.1 to 7.27.2 ([#12999](https://github.com/mdn/yari/issues/12999)) ([277f3f8](https://github.com/mdn/yari/commit/277f3f82e29ca0460dc90e97cf2dc1ae57ac1cb4)) +* **deps-dev:** bump @types/node from 18.19.100 to 18.19.101 in the types group ([#13040](https://github.com/mdn/yari/issues/13040)) ([41c108d](https://github.com/mdn/yari/commit/41c108d4d2f88a70e41f95c408395fc734af4246)) +* **deps-dev:** bump @types/node from 18.19.101 to 18.19.103 in the types group ([#13055](https://github.com/mdn/yari/issues/13055)) ([01aa310](https://github.com/mdn/yari/commit/01aa3107b29ac378f6f5841aa40bc0db163b032c)) +* **deps-dev:** bump @types/node from 18.19.87 to 18.19.96 in the types group ([#12995](https://github.com/mdn/yari/issues/12995)) ([defc209](https://github.com/mdn/yari/commit/defc2096b53f454e46568a1231349591f661bbdc)) +* **deps-dev:** bump @types/node from 18.19.99 to 18.19.100 in the types group ([#13007](https://github.com/mdn/yari/issues/13007)) ([548ca88](https://github.com/mdn/yari/commit/548ca88acb1dd9dc14167753173031406792187b)) +* **deps-dev:** bump browserslist from 4.24.4 to 4.24.5 ([#12990](https://github.com/mdn/yari/issues/12990)) ([ccb0629](https://github.com/mdn/yari/commit/ccb06296bab986a54605f89d99652abfb8dd214b)) +* **deps-dev:** bump cssnano from 7.0.6 to 7.0.7 ([#12998](https://github.com/mdn/yari/issues/12998)) ([603009f](https://github.com/mdn/yari/commit/603009fb41c776824e0f1e2b70e46b0f443e61ab)) +* **deps-dev:** bump eslint-plugin-n from 17.17.0 to 17.18.0 ([#13009](https://github.com/mdn/yari/issues/13009)) ([e627690](https://github.com/mdn/yari/commit/e6276908cd636fe126aea0afe890f90a4a5f2784)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.5.10 to 2.5.11 ([#12997](https://github.com/mdn/yari/issues/12997)) ([43893d2](https://github.com/mdn/yari/commit/43893d291fbeac298023232d6242c8f8d075f0b8)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.5.11 to 2.5.12 ([#13017](https://github.com/mdn/yari/issues/13017)) ([95c1bd8](https://github.com/mdn/yari/commit/95c1bd82e439ed6b793354c113f6fc1510a76744)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.5.12 to 2.5.13 ([#13032](https://github.com/mdn/yari/issues/13032)) ([1f6814a](https://github.com/mdn/yari/commit/1f6814a798bdc6e07e7d54be7be591b77b9c8d2c)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.5.13 to 2.5.14 ([#13043](https://github.com/mdn/yari/issues/13043)) ([1c073cd](https://github.com/mdn/yari/commit/1c073cd615b639394c64faf791f6314309546422)) +* **deps-dev:** bump sass from 1.87.0 to 1.88.0 ([#13019](https://github.com/mdn/yari/issues/13019)) ([282eb5f](https://github.com/mdn/yari/commit/282eb5fa569aa06e167f6946fcac80a872e55131)) +* **deps-dev:** bump sass from 1.88.0 to 1.89.0 ([#13038](https://github.com/mdn/yari/issues/13038)) ([b3c3146](https://github.com/mdn/yari/commit/b3c3146590eedeb8babcccc5566141b27bc1c9e0)) +* **deps-dev:** bump the react-router group with 2 updates ([#13006](https://github.com/mdn/yari/issues/13006)) ([0408917](https://github.com/mdn/yari/commit/04089172f180984950607d07105b0a2e7c26e4cb)) +* **deps-dev:** bump typescript-eslint from 8.31.0 to 8.32.0 ([#12996](https://github.com/mdn/yari/issues/12996)) ([a4dcdfb](https://github.com/mdn/yari/commit/a4dcdfbc49f271df842cb35156004447018b84a5)) +* **deps-dev:** bump typescript-eslint from 8.32.0 to 8.32.1 ([#13027](https://github.com/mdn/yari/issues/13027)) ([512e413](https://github.com/mdn/yari/commit/512e41334aa3b4cb2e4ba2318f61e9337e655092)) +* **deps-dev:** bump webpack from 5.99.7 to 5.99.8 ([#13002](https://github.com/mdn/yari/issues/13002)) ([3cf42f5](https://github.com/mdn/yari/commit/3cf42f5086b221a191d0bb6edbfd69a7c4d636fb)) +* **deps-dev:** bump webpack from 5.99.7 to 5.99.8 in /client/pwa ([#13003](https://github.com/mdn/yari/issues/13003)) ([fcb6927](https://github.com/mdn/yari/commit/fcb69278438e9ddf55f5b82b1c1939b9152c9d3d)) +* **deps-dev:** bump webpack from 5.99.8 to 5.99.9 ([#13057](https://github.com/mdn/yari/issues/13057)) ([c948203](https://github.com/mdn/yari/commit/c9482033eadb6cddd61d2db4bf999d87d64bc325)) +* **deps-dev:** bump webpack from 5.99.8 to 5.99.9 in /client/pwa ([#13052](https://github.com/mdn/yari/issues/13052)) ([c0d1688](https://github.com/mdn/yari/commit/c0d16886cfa1149a801de875b8690882e7bea9f3)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.60 to 2.7.62 in /client/pwa ([#13051](https://github.com/mdn/yari/issues/13051)) ([76b1567](https://github.com/mdn/yari/commit/76b156785f283983bbeb45e67f422cb40bc51b24)) +* **deps:** bump @codemirror/lang-javascript from 6.2.3 to 6.2.4 ([#13030](https://github.com/mdn/yari/issues/13030)) ([a588b8a](https://github.com/mdn/yari/commit/a588b8aeddc911942eaf7e50e292e28f0ee62157)) +* **deps:** bump @inquirer/prompts from 7.5.0 to 7.5.1 ([#13026](https://github.com/mdn/yari/issues/13026)) ([c0138bf](https://github.com/mdn/yari/commit/c0138bfd72452e4ca3514aafaba96d1dc959a8f0)) +* **deps:** bump @mdn/browser-compat-data from 6.0.10 to 6.0.11 ([#12989](https://github.com/mdn/yari/issues/12989)) ([a0df31f](https://github.com/mdn/yari/commit/a0df31fac3a73a384ad46949b7a91534ea96b74f)) +* **deps:** bump @mdn/browser-compat-data from 6.0.11 to 6.0.12 ([#13000](https://github.com/mdn/yari/issues/13000)) ([de04c00](https://github.com/mdn/yari/commit/de04c00513282107412bdf4299d14e6e15ea520b)) +* **deps:** bump @mdn/browser-compat-data from 6.0.12 to 6.0.13 ([#13018](https://github.com/mdn/yari/issues/13018)) ([e844704](https://github.com/mdn/yari/commit/e844704130972729407809277d2b2bf969451d8e)) +* **deps:** bump @mdn/browser-compat-data from 6.0.13 to 6.0.14 ([#13028](https://github.com/mdn/yari/issues/13028)) ([fdbd197](https://github.com/mdn/yari/commit/fdbd197b981c1eb532c633acff15662ad0df001e)) +* **deps:** bump @mdn/browser-compat-data from 6.0.14 to 6.0.15 ([#13042](https://github.com/mdn/yari/issues/13042)) ([feb418c](https://github.com/mdn/yari/commit/feb418ced577264782c453d5ec354d48ca832c31)) +* **deps:** bump @mdn/browser-compat-data from 6.0.15 to 6.0.16 ([#13058](https://github.com/mdn/yari/issues/13058)) ([141b015](https://github.com/mdn/yari/commit/141b01566652dc673715701af3af09e55b5d87d3)) +* **deps:** bump @mdn/rari from 0.1.36 to 0.1.37 ([#13035](https://github.com/mdn/yari/issues/13035)) ([f2e4ab9](https://github.com/mdn/yari/commit/f2e4ab9421a8b76a706819ec22b553a0ce34e548)) +* **deps:** bump @mdn/rari from 0.1.37 to 0.1.38 ([#13047](https://github.com/mdn/yari/issues/13047)) ([ab7282c](https://github.com/mdn/yari/commit/ab7282c329c5d060c0999e6a744456bad0f37517)) +* **deps:** bump click from 8.1.8 to 8.2.0 in /deployer in the dependencies group ([#13013](https://github.com/mdn/yari/issues/13013)) ([5ec55c7](https://github.com/mdn/yari/commit/5ec55c79b4df68134d23e821df2ee63b2069ea90)) +* **deps:** bump open from 10.1.1 to 10.1.2 ([#12984](https://github.com/mdn/yari/issues/12984)) ([bcbc1fa](https://github.com/mdn/yari/commit/bcbc1fa95bb4440b53d4ee5bb9a20f2868372c2f)) +* **deps:** bump openai from 4.96.0 to 4.96.2 ([#12977](https://github.com/mdn/yari/issues/12977)) ([2b660d1](https://github.com/mdn/yari/commit/2b660d1a984706bae15c9041f3ce63c73285a183)) +* **deps:** bump openai from 4.96.2 to 4.97.0 ([#12991](https://github.com/mdn/yari/issues/12991)) ([867e406](https://github.com/mdn/yari/commit/867e4062ffc65691504cb7562e6cd197287447ac)) +* **deps:** bump openai from 4.97.0 to 4.98.0 ([#13008](https://github.com/mdn/yari/issues/13008)) ([ee89987](https://github.com/mdn/yari/commit/ee8998712a34ad77069e0174b6d526cf138ff55e)) +* **deps:** bump openai from 4.98.0 to 4.100.0 ([#13041](https://github.com/mdn/yari/issues/13041)) ([e9bdb07](https://github.com/mdn/yari/commit/e9bdb0746dd853ed5753788a63dc2e37d82c5463)) +* **deps:** bump pg from 8.15.6 to 8.16.0 ([#13025](https://github.com/mdn/yari/issues/13025)) ([ca7ea23](https://github.com/mdn/yari/commit/ca7ea23337a28d87c73a438e05e3b5793dabdfa0)) +* **deps:** bump pytest-rerunfailures from 15.0 to 15.1 in /testing/integration in the dependencies group ([#13014](https://github.com/mdn/yari/issues/13014)) ([e63b1d8](https://github.com/mdn/yari/commit/e63b1d8902f668020532e2e8aa227287fbc3a20a)) +* **deps:** bump selectolax from 0.3.28 to 0.3.29 in /deployer in the dependencies group ([#12993](https://github.com/mdn/yari/issues/12993)) ([69507fe](https://github.com/mdn/yari/commit/69507fe5499313dfd1e210fda53d060a0f5c6591)) +* **deps:** bump web-features from 2.34.2 to 2.35.0 ([#13024](https://github.com/mdn/yari/issues/13024)) ([aaedf76](https://github.com/mdn/yari/commit/aaedf760eb5894ec5831b8eacfe002d8183316aa)) +* **deps:** bump web-features from 2.35.0 to 2.35.1 ([#13034](https://github.com/mdn/yari/issues/13034)) ([b0fdf26](https://github.com/mdn/yari/commit/b0fdf26995d91c53d0476aad86ba51658e6f87d1)) +* **deps:** bump web-features from 2.35.1 to 2.35.2 ([#13046](https://github.com/mdn/yari/issues/13046)) ([16e0f24](https://github.com/mdn/yari/commit/16e0f24a3f30b7414861e3082af23fffc0388628)) +* **deps:** bump web-specs from 3.49.0 to 3.50.0 ([#13023](https://github.com/mdn/yari/issues/13023)) ([7b2d2eb](https://github.com/mdn/yari/commit/7b2d2eb3e0212565fb394650f0a2deb3ca17cac6)) +* **deps:** bump web-specs from 3.50.0 to 3.51.0 ([#13045](https://github.com/mdn/yari/issues/13045)) ([e0fb092](https://github.com/mdn/yari/commit/e0fb092b05a0b334eed518e6805759f15b602cc2)) +* **surveys:** remove Italian locale survey ([#13053](https://github.com/mdn/yari/issues/13053)) ([07885c8](https://github.com/mdn/yari/commit/07885c8ba852c1dffb28316d79635ae2540eeea9)) + +## [4.9.1](https://github.com/mdn/yari/compare/v4.9.0...v4.9.1) (2025-04-30) + + +### Bug Fixes + +* **cloud-function:** serve `favicon.icon` + `robots.txt` ([#12913](https://github.com/mdn/yari/issues/12913)) ([f5471bc](https://github.com/mdn/yari/commit/f5471bc084d7cdbfcd9541649f6439d0a92660d2)) +* **interactive-examples:** focus choice on click ([#12914](https://github.com/mdn/yari/issues/12914)) ([2d013b6](https://github.com/mdn/yari/commit/2d013b690cb5fd5984dd9ffea91225cc7bca043c)) +* **play/console:** prevent spaces from being collapsed ([#12927](https://github.com/mdn/yari/issues/12927)) ([19c57ee](https://github.com/mdn/yari/commit/19c57ee414cc4a943ee420f448370eb2a900efff)) +* **survey:** show JavaScript proposals survey only to 5% ([#12904](https://github.com/mdn/yari/issues/12904)) ([4d6a046](https://github.com/mdn/yari/commit/4d6a0467e1030377d0bfac8d86d575737346c2c6)) + + +### Enhancements + +* **play:** log empty array values as `<1 empty slot>` / `<2 empty slots>` ([#12944](https://github.com/mdn/yari/issues/12944)) ([f1a4f3d](https://github.com/mdn/yari/commit/f1a4f3d9ebceb79006abd7e4f8a819348e895d94)) + + +### Miscellaneous + +* **compat:** port BCD table view measurement ([#12823](https://github.com/mdn/yari/issues/12823)) ([4d6a670](https://github.com/mdn/yari/commit/4d6a6700e335abf15ef88f484efa8b53bba4b82c)) +* **deps-dev:** bump @babel/core from 7.26.10 to 7.27.1 ([#12983](https://github.com/mdn/yari/issues/12983)) ([ad02226](https://github.com/mdn/yari/commit/ad0222658dddeac116b711c41e78c98b2f676f77)) +* **deps-dev:** bump @babel/eslint-parser from 7.27.0 to 7.27.1 ([#12982](https://github.com/mdn/yari/issues/12982)) ([0fa4ea1](https://github.com/mdn/yari/commit/0fa4ea1faf259b4b0e029cdeb3193859930f50e3)) +* **deps-dev:** bump @babel/preset-env from 7.26.9 to 7.27.1 ([#12981](https://github.com/mdn/yari/issues/12981)) ([d53c51f](https://github.com/mdn/yari/commit/d53c51f6bf6e68452c8ad969f1b115873fa2690b)) +* **deps-dev:** bump @playwright/test from 1.51.1 to 1.52.0 ([#12936](https://github.com/mdn/yari/issues/12936)) ([c7d38c3](https://github.com/mdn/yari/commit/c7d38c3efb8589eb4752ba9ee2ce074542c91222)) +* **deps-dev:** bump @pmmmwh/react-refresh-webpack-plugin from 0.5.16 to 0.6.0 ([#12973](https://github.com/mdn/yari/issues/12973)) ([e2eb6fe](https://github.com/mdn/yari/commit/e2eb6fe3b01143b87f4ec194b11d135774fd3d8b)) +* **deps-dev:** bump @swc/core from 1.11.18 to 1.11.20 ([#12909](https://github.com/mdn/yari/issues/12909)) ([bf585a8](https://github.com/mdn/yari/commit/bf585a825d30e599d261906a7246990343286c9b)) +* **deps-dev:** bump @swc/core from 1.11.20 to 1.11.21 ([#12915](https://github.com/mdn/yari/issues/12915)) ([e3ead81](https://github.com/mdn/yari/commit/e3ead8122b9cb991766525b26a4f91c31cdc5b3e)) +* **deps-dev:** bump @swc/core from 1.11.21 to 1.11.22 ([#12955](https://github.com/mdn/yari/issues/12955)) ([ea97094](https://github.com/mdn/yari/commit/ea97094cbd5aa26f99b12165ab131071b37a2b09)) +* **deps-dev:** bump @swc/core from 1.11.22 to 1.11.24 ([#12978](https://github.com/mdn/yari/issues/12978)) ([d182c86](https://github.com/mdn/yari/commit/d182c8607290fa4b2d4ca87fd4f3bad8def8f18b)) +* **deps-dev:** bump @types/node from 18.19.86 to 18.19.87 in the types group ([#12962](https://github.com/mdn/yari/issues/12962)) ([2f10df6](https://github.com/mdn/yari/commit/2f10df6c7d377caaf75a36506bde4aeb859fedc1)) +* **deps-dev:** bump jsdom from 26.0.0 to 26.1.0 ([#12918](https://github.com/mdn/yari/issues/12918)) ([8345140](https://github.com/mdn/yari/commit/83451406bf088b0d5cfa0e1c5559dd80afa7d328)) +* **deps-dev:** bump postcss-preset-env from 10.1.5 to 10.1.6 ([#12940](https://github.com/mdn/yari/issues/12940)) ([271098a](https://github.com/mdn/yari/commit/271098adffb0e215b0d6f18d759f94358fcefc3d)) +* **deps-dev:** bump sass from 1.86.3 to 1.87.0 ([#12945](https://github.com/mdn/yari/issues/12945)) ([ff5157c](https://github.com/mdn/yari/commit/ff5157cf56a8191f517e3fa6166a5eea28d82e98)) +* **deps-dev:** bump the react-router group with 2 updates ([#12933](https://github.com/mdn/yari/issues/12933)) ([3a09c2e](https://github.com/mdn/yari/commit/3a09c2e3fe9f583d4ceb50cfdd78c200e5a6efae)) +* **deps-dev:** bump the react-router group with 2 updates ([#12961](https://github.com/mdn/yari/issues/12961)) ([3a46abb](https://github.com/mdn/yari/commit/3a46abb05baa113a93e98427e5510aa6c7f8d63c)) +* **deps-dev:** bump the react-router group with 2 updates ([#12972](https://github.com/mdn/yari/issues/12972)) ([b91938b](https://github.com/mdn/yari/commit/b91938be3405e821dc8a8b37f727eefcb313f26a)) +* **deps-dev:** bump typescript-eslint from 8.29.1 to 8.31.0 ([#12947](https://github.com/mdn/yari/issues/12947)) ([c52929d](https://github.com/mdn/yari/commit/c52929d38e0a019e6bf2daaa5c830f857c34d5de)) +* **deps-dev:** bump webpack from 5.98.0 to 5.99.5 ([#12899](https://github.com/mdn/yari/issues/12899)) ([2ecbde7](https://github.com/mdn/yari/commit/2ecbde75d1a6bca5351debc7f880562b5bef07ff)) +* **deps-dev:** bump webpack from 5.99.5 to 5.99.6 ([#12941](https://github.com/mdn/yari/issues/12941)) ([3bd532f](https://github.com/mdn/yari/commit/3bd532f198851b271f489d1c21e71d93775a6459)) +* **deps-dev:** bump webpack from 5.99.5 to 5.99.6 in /client/pwa ([#12938](https://github.com/mdn/yari/issues/12938)) ([42bfc34](https://github.com/mdn/yari/commit/42bfc348670ff2f87edf1a54b273c5da22979e08)) +* **deps-dev:** bump webpack from 5.99.6 to 5.99.7 ([#12963](https://github.com/mdn/yari/issues/12963)) ([a60fabe](https://github.com/mdn/yari/commit/a60fabedb8a14b66196c3eab807ef841cf7c02c1)) +* **deps-dev:** bump webpack from 5.99.6 to 5.99.7 in /client/pwa ([#12966](https://github.com/mdn/yari/issues/12966)) ([90878cb](https://github.com/mdn/yari/commit/90878cb28d5db4b072295d7de254d176977a40ed)) +* **deps:** bump @inquirer/prompts from 7.4.1 to 7.5.0 ([#12954](https://github.com/mdn/yari/issues/12954)) ([362c1fe](https://github.com/mdn/yari/commit/362c1fee7a3ece8184b163c412f744e526e202ba)) +* **deps:** bump @mdn/browser-compat-data from 6.0.4 to 6.0.5 ([#12917](https://github.com/mdn/yari/issues/12917)) ([545d132](https://github.com/mdn/yari/commit/545d1322bad798392bff786411e0161f66396da2)) +* **deps:** bump @mdn/browser-compat-data from 6.0.5 to 6.0.6 ([#12931](https://github.com/mdn/yari/issues/12931)) ([f6b27f2](https://github.com/mdn/yari/commit/f6b27f2d0f88f0331767ee5c249d03153deb6ff3)) +* **deps:** bump @mdn/browser-compat-data from 6.0.6 to 6.0.7 ([#12939](https://github.com/mdn/yari/issues/12939)) ([b45839d](https://github.com/mdn/yari/commit/b45839d2dc8d29afeea24d530c80943c549f3794)) +* **deps:** bump @mdn/browser-compat-data from 6.0.7 to 6.0.8 ([#12949](https://github.com/mdn/yari/issues/12949)) ([b95a2b3](https://github.com/mdn/yari/commit/b95a2b31f0c5da2da0dce14da191af3273c9b451)) +* **deps:** bump @mdn/browser-compat-data from 6.0.8 to 6.0.9 ([#12970](https://github.com/mdn/yari/issues/12970)) ([05254f9](https://github.com/mdn/yari/commit/05254f950300403e2518fd5504dbb5893146234b)) +* **deps:** bump @mdn/browser-compat-data from 6.0.9 to 6.0.10 ([#12976](https://github.com/mdn/yari/issues/12976)) ([8d2d5d7](https://github.com/mdn/yari/commit/8d2d5d7fefb137a9cca31a7b42ab2aa3d39aec29)) +* **deps:** bump @mdn/rari from 0.1.33 to 0.1.35 ([#12921](https://github.com/mdn/yari/issues/12921)) ([5458d72](https://github.com/mdn/yari/commit/5458d720defd31472cdb9e36380e7cff4b2392f0)) +* **deps:** bump @mdn/rari from 0.1.35 to 0.1.36 ([#12980](https://github.com/mdn/yari/issues/12980)) ([98061cf](https://github.com/mdn/yari/commit/98061cfe4ffc46ff783ad26289f71a037f347069)) +* **deps:** bump dependencies in /cloud-function ([#12953](https://github.com/mdn/yari/issues/12953)) ([b6708eb](https://github.com/mdn/yari/commit/b6708eba4d23086eb842f1e62736febb3f0d6261)) +* **deps:** bump dotenv from 16.4.7 to 16.5.0 ([#12912](https://github.com/mdn/yari/issues/12912)) ([2213eee](https://github.com/mdn/yari/commit/2213eeee563f08c16934da61554e15b78401a03e)) +* **deps:** bump fdir from 6.4.3 to 6.4.4 ([#12937](https://github.com/mdn/yari/issues/12937)) ([a2eae3f](https://github.com/mdn/yari/commit/a2eae3f5fed5b0dbc2d02200f2abceb9a09feed7)) +* **deps:** bump http-proxy-middleware from 2.0.7 to 2.0.8 ([#12906](https://github.com/mdn/yari/issues/12906)) ([5b550f4](https://github.com/mdn/yari/commit/5b550f4bd1b59f46e0570b953d131829ed7e26ad)) +* **deps:** bump http-proxy-middleware from 2.0.8 to 2.0.9 ([#12910](https://github.com/mdn/yari/issues/12910)) ([c525f3f](https://github.com/mdn/yari/commit/c525f3faeb6ed0f6e3563b31e0a5c2271c7691c4)) +* **deps:** bump lit from 3.2.1 to 3.3.0 ([#12916](https://github.com/mdn/yari/issues/12916)) ([feb2959](https://github.com/mdn/yari/commit/feb29595e432971b925b977e64b18e0d3d9cf6eb)) +* **deps:** bump mdn-data from 2.20.0 to 2.21.0 ([#12919](https://github.com/mdn/yari/issues/12919)) ([838687e](https://github.com/mdn/yari/commit/838687e39571eee6e8b7946268ea8da142555930)) +* **deps:** bump open from 10.1.0 to 10.1.1 ([#12923](https://github.com/mdn/yari/issues/12923)) ([e69f3f9](https://github.com/mdn/yari/commit/e69f3f975beb7257e162acfcd6edcddc4b5f0fd8)) +* **deps:** bump openai from 4.93.0 to 4.94.0 ([#12920](https://github.com/mdn/yari/issues/12920)) ([55edb64](https://github.com/mdn/yari/commit/55edb6413e9beb3ad8bd4038f0448202e64fff2a)) +* **deps:** bump openai from 4.94.0 to 4.95.0 ([#12932](https://github.com/mdn/yari/issues/12932)) ([7557b06](https://github.com/mdn/yari/commit/7557b0674e1b51e074c05c1d3e360ac26b0b6f0e)) +* **deps:** bump openai from 4.95.0 to 4.95.1 ([#12942](https://github.com/mdn/yari/issues/12942)) ([ad2957d](https://github.com/mdn/yari/commit/ad2957d506f3dc60b3785c6ee13a9e219a38fc9d)) +* **deps:** bump openai from 4.95.1 to 4.96.0 ([#12958](https://github.com/mdn/yari/issues/12958)) ([8cbe394](https://github.com/mdn/yari/commit/8cbe3942e9a03bfd58656a0824222e217aeee383)) +* **deps:** bump pg from 8.14.1 to 8.15.1 ([#12950](https://github.com/mdn/yari/issues/12950)) ([5c65f0f](https://github.com/mdn/yari/commit/5c65f0f5991e9a800ee47bd584facddab0fd6c4a)) +* **deps:** bump pg from 8.15.1 to 8.15.5 ([#12956](https://github.com/mdn/yari/issues/12956)) ([18892be](https://github.com/mdn/yari/commit/18892bed18875a653ed7b33041a61eee09db1766)) +* **deps:** bump pg from 8.15.5 to 8.15.6 ([#12969](https://github.com/mdn/yari/issues/12969)) ([b4b8dd2](https://github.com/mdn/yari/commit/b4b8dd2a43f36d1f5ec8dc85a5ce44d0cc97bbeb)) +* **deps:** bump web-features from 2.32.0 to 2.33.0 ([#12911](https://github.com/mdn/yari/issues/12911)) ([f55e600](https://github.com/mdn/yari/commit/f55e6002dbad1382dda5dbb216efefd8dd6ce4bf)) +* **deps:** bump web-features from 2.33.0 to 2.34.0 ([#12934](https://github.com/mdn/yari/issues/12934)) ([ad04254](https://github.com/mdn/yari/commit/ad04254426fe69b5c619918bd83a5d845bba9f4a)) +* **deps:** bump web-features from 2.34.0 to 2.34.1 ([#12959](https://github.com/mdn/yari/issues/12959)) ([481a4f9](https://github.com/mdn/yari/commit/481a4f96633625b105a3a02ae8a4b5a31e9b6e53)) +* **deps:** bump web-features from 2.34.1 to 2.34.2 ([#12979](https://github.com/mdn/yari/issues/12979)) ([06ba7f7](https://github.com/mdn/yari/commit/06ba7f77aa89b45f3a21bd135d53f8fb5742ff7e)) +* **deps:** bump web-specs from 3.46.0 to 3.47.0 ([#12935](https://github.com/mdn/yari/issues/12935)) ([d7d39e4](https://github.com/mdn/yari/commit/d7d39e469847a40b8d9900d8e6e24a3c4e8fa6da)) +* **deps:** bump web-specs from 3.47.0 to 3.48.0 ([#12957](https://github.com/mdn/yari/issues/12957)) ([5e51ec8](https://github.com/mdn/yari/commit/5e51ec800840be6b94f1708889a62f414c50830b)) +* **deps:** bump web-specs from 3.48.0 to 3.48.1 ([#12964](https://github.com/mdn/yari/issues/12964)) ([904f7e6](https://github.com/mdn/yari/commit/904f7e62e739f3a3688fdd97798430eced19422d)) +* **deps:** bump web-specs from 3.48.1 to 3.49.0 ([#12971](https://github.com/mdn/yari/issues/12971)) ([0815eb5](https://github.com/mdn/yari/commit/0815eb5e051edf6decc41eedc7d74b5e7b4588bd)) +* **survey:** fix js proposals survey rate ([4d6a046](https://github.com/mdn/yari/commit/4d6a0467e1030377d0bfac8d86d575737346c2c6)) + +## [4.9.0](https://github.com/mdn/yari/compare/v4.8.0...v4.9.0) (2025-04-09) + + +### Features + +* **formal-syntax:** add sytling for css formal syntax footer ([#12861](https://github.com/mdn/yari/issues/12861)) ([10de999](https://github.com/mdn/yari/commit/10de9990d8762a19b26553063d5d637818f2a999)) +* **survey:** add JavaScript proposals survey ([#12839](https://github.com/mdn/yari/issues/12839)) ([fc6bbf2](https://github.com/mdn/yari/commit/fc6bbf2ef4458bd5e22dcd82538c1501ecf49f00)) +* **syntax-highlight:** alias wat to wasm ([#12903](https://github.com/mdn/yari/issues/12903)) ([d504be8](https://github.com/mdn/yari/commit/d504be88e842c6342fec539dfe2e0639177f1ddc)) + + +### Miscellaneous + +* **dependabot:** update react-router* together ([ad21afd](https://github.com/mdn/yari/commit/ad21afd41525bcfdf7da2277a8e6f615c7d0a930)) +* **deps-dev:** bump @babel/eslint-parser from 7.26.10 to 7.27.0 ([#12824](https://github.com/mdn/yari/issues/12824)) ([712deeb](https://github.com/mdn/yari/commit/712deebf183e03c0e7ce0fbb92f4867e03920324)) +* **deps-dev:** bump @pmmmwh/react-refresh-webpack-plugin from 0.5.15 to 0.5.16 ([#12843](https://github.com/mdn/yari/issues/12843)) ([a118be7](https://github.com/mdn/yari/commit/a118be7f5dcab19673f0930cc992073ba776cafd)) +* **deps-dev:** bump @swc/core from 1.11.13 to 1.11.15 ([#12854](https://github.com/mdn/yari/issues/12854)) ([6a386bb](https://github.com/mdn/yari/commit/6a386bb9867ae940d0e0d7c9841945011dba05a4)) +* **deps-dev:** bump @swc/core from 1.11.15 to 1.11.16 ([#12863](https://github.com/mdn/yari/issues/12863)) ([75ac014](https://github.com/mdn/yari/commit/75ac014eb7b8ed27886324d6fb13a4887aaf13ac)) +* **deps-dev:** bump @swc/core from 1.11.16 to 1.11.18 ([#12883](https://github.com/mdn/yari/issues/12883)) ([58c59ff](https://github.com/mdn/yari/commit/58c59ffd103c60179c05bca3403859ab8c27436e)) +* **deps-dev:** bump @types/node from 18.19.83 to 18.19.84 in the types group ([#12834](https://github.com/mdn/yari/issues/12834)) ([a5bceff](https://github.com/mdn/yari/commit/a5bceff3976acf1b8c36245e89d4839ae4b430c7)) +* **deps-dev:** bump @types/node from 18.19.84 to 18.19.85 in the types group ([#12851](https://github.com/mdn/yari/issues/12851)) ([407b001](https://github.com/mdn/yari/commit/407b00122fdaf21df09f600763ea0993a5e9b3fc)) +* **deps-dev:** bump @types/node from 18.19.85 to 18.19.86 in the types group ([#12862](https://github.com/mdn/yari/issues/12862)) ([37c4966](https://github.com/mdn/yari/commit/37c496670ec6d08c0536933507e1a156c83f1ff9)) +* **deps-dev:** bump eslint-plugin-n from 17.16.2 to 17.17.0 ([#12833](https://github.com/mdn/yari/issues/12833)) ([5c0c817](https://github.com/mdn/yari/commit/5c0c8178eb2f3a0fa2d8e9d18650b5cd2f382e33)) +* **deps-dev:** bump eslint-plugin-react from 7.37.4 to 7.37.5 ([#12875](https://github.com/mdn/yari/issues/12875)) ([a9450a4](https://github.com/mdn/yari/commit/a9450a49559b64a226420f8b3dc8380fc55d00b2)) +* **deps-dev:** bump flake8 from 7.1.2 to 7.2.0 in /deployer in the dependencies group ([#12850](https://github.com/mdn/yari/issues/12850)) ([87e1e97](https://github.com/mdn/yari/commit/87e1e97d70bc44fa34bb6075607d81be2591479a)) +* **deps-dev:** bump flake8 from 7.1.2 to 7.2.0 in /testing/integration in the dependencies group ([#12842](https://github.com/mdn/yari/issues/12842)) ([8647746](https://github.com/mdn/yari/commit/864774643257d21692c3c185ef7a93554ac27e2b)) +* **deps-dev:** bump fork-ts-checker-webpack-plugin from 9.0.2 to 9.0.3 ([#12844](https://github.com/mdn/yari/issues/12844)) ([339de59](https://github.com/mdn/yari/commit/339de598bc99e94a6f8fa40f7e3b59087f1f556d)) +* **deps-dev:** bump fork-ts-checker-webpack-plugin from 9.0.3 to 9.1.0 ([#12878](https://github.com/mdn/yari/issues/12878)) ([2eb7c77](https://github.com/mdn/yari/commit/2eb7c772fb1649c5832f941716f6ee9bdc4953a2)) +* **deps-dev:** bump react-refresh from 0.16.0 to 0.17.0 ([#12845](https://github.com/mdn/yari/issues/12845)) ([6f03513](https://github.com/mdn/yari/commit/6f0351369adecd0262703b44585cec89302929ee)) +* **deps-dev:** bump react-router-dom from 7.4.0 to 7.4.1 ([#12848](https://github.com/mdn/yari/issues/12848)) ([6b2a319](https://github.com/mdn/yari/commit/6b2a31947908499b3dd492149dad7534ff4b9448)) +* **deps-dev:** bump react-router-dom from 7.4.1 to 7.5.0 ([#12887](https://github.com/mdn/yari/issues/12887)) ([196ac43](https://github.com/mdn/yari/commit/196ac438c765c206bf741bcd3efc25a97a4e2a97)) +* **deps-dev:** bump sass from 1.86.0 to 1.86.1 ([#12860](https://github.com/mdn/yari/issues/12860)) ([b02024a](https://github.com/mdn/yari/commit/b02024a2e7ff6ae90d3b3fcb491d9d61c1b013a0)) +* **deps-dev:** bump sass from 1.86.1 to 1.86.2 ([#12873](https://github.com/mdn/yari/issues/12873)) ([543096c](https://github.com/mdn/yari/commit/543096cee62ebe950611fd52b5edef336664024a)) +* **deps-dev:** bump sass from 1.86.2 to 1.86.3 ([#12876](https://github.com/mdn/yari/issues/12876)) ([f2831c6](https://github.com/mdn/yari/commit/f2831c6d9d0482e00a06895330a059b6ef1d5401)) +* **deps-dev:** bump typescript from 5.8.2 to 5.8.3 ([#12889](https://github.com/mdn/yari/issues/12889)) ([d3628a2](https://github.com/mdn/yari/commit/d3628a25eaa15e4164c1ff527d427010978380d3)) +* **deps-dev:** bump typescript from 5.8.2 to 5.8.3 in /client/pwa ([#12882](https://github.com/mdn/yari/issues/12882)) ([0acbbc0](https://github.com/mdn/yari/commit/0acbbc02babf0b992eb680feefa87fb74b942d9d)) +* **deps-dev:** bump typescript-eslint from 8.27.0 to 8.28.0 ([#12826](https://github.com/mdn/yari/issues/12826)) ([50b0ccc](https://github.com/mdn/yari/commit/50b0ccc882f834141e41f61bf1fc0cfc08c799a2)) +* **deps-dev:** bump typescript-eslint from 8.28.0 to 8.29.0 ([#12858](https://github.com/mdn/yari/issues/12858)) ([3d7e33e](https://github.com/mdn/yari/commit/3d7e33e246c3937695328afff2cf2d4b44d200be)) +* **deps-dev:** bump typescript-eslint from 8.29.0 to 8.29.1 ([#12894](https://github.com/mdn/yari/issues/12894)) ([f92a8b5](https://github.com/mdn/yari/commit/f92a8b549a2c269bc969a8060f50789607028833)) +* **deps-dev:** bump webpack from 5.98.0 to 5.99.0 in /client/pwa ([#12891](https://github.com/mdn/yari/issues/12891)) ([4189b83](https://github.com/mdn/yari/commit/4189b83cfaf30bda7d986443f337db3240db68e7)) +* **deps-dev:** bump webpack from 5.99.0 to 5.99.2 in /client/pwa ([#12897](https://github.com/mdn/yari/issues/12897)) ([361e347](https://github.com/mdn/yari/commit/361e347a0d738e523c5f9af622be2af9d22f5a4b)) +* **deps-dev:** bump webpack from 5.99.2 to 5.99.5 in /client/pwa ([#12898](https://github.com/mdn/yari/issues/12898)) ([0107d1a](https://github.com/mdn/yari/commit/0107d1a0fef9e85750d11ed9c1937b8a5eeda2c2)) +* **deps-dev:** bump webpack-dev-server from 5.2.0 to 5.2.1 ([#12837](https://github.com/mdn/yari/issues/12837)) ([93e2d69](https://github.com/mdn/yari/commit/93e2d6989b2e6150ff9312ea72c2c18194d997bd)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.57 to 2.7.60 in /client/pwa ([#12849](https://github.com/mdn/yari/issues/12849)) ([7a2e287](https://github.com/mdn/yari/commit/7a2e287dd0fa4da382475048ef18b5cedc0cf801)) +* **deps:** bump @inquirer/prompts from 7.4.0 to 7.4.1 ([#12874](https://github.com/mdn/yari/issues/12874)) ([87bdb63](https://github.com/mdn/yari/commit/87bdb639cf3b72fe6cb3fa156c66d995afe950e7)) +* **deps:** bump @mdn/bcd-utils-api from 0.0.7 to 0.0.8 ([#12832](https://github.com/mdn/yari/issues/12832)) ([683d894](https://github.com/mdn/yari/commit/683d89491a88d1ad2b7da35997015c37c3b96e4b)) +* **deps:** bump @mdn/browser-compat-data from 5.7.5 to 5.7.6 ([#12828](https://github.com/mdn/yari/issues/12828)) ([b21bfb7](https://github.com/mdn/yari/commit/b21bfb7487d3cac1c62d39bc7535a480e7b4021a)) +* **deps:** bump @mdn/browser-compat-data from 5.7.6 to 6.0.0 ([#12831](https://github.com/mdn/yari/issues/12831)) ([29c6369](https://github.com/mdn/yari/commit/29c636921f4e42a0c6c52eb90b13947319322607)) +* **deps:** bump @mdn/browser-compat-data from 6.0.0 to 6.0.1 ([#12847](https://github.com/mdn/yari/issues/12847)) ([1498679](https://github.com/mdn/yari/commit/14986796def36f1f4774d98ee49ea3c7ead34f85)) +* **deps:** bump @mdn/browser-compat-data from 6.0.1 to 6.0.3 ([#12886](https://github.com/mdn/yari/issues/12886)) ([1895aa5](https://github.com/mdn/yari/commit/1895aa58f7a6494b388296db42bdec85a8ab57b8)) +* **deps:** bump @mdn/browser-compat-data from 6.0.3 to 6.0.4 ([#12900](https://github.com/mdn/yari/issues/12900)) ([c1938a0](https://github.com/mdn/yari/commit/c1938a03db9a525aa058f14c9d3138e5c0d2c391)) +* **deps:** bump @mdn/rari from 0.1.30 to 0.1.31 ([#12829](https://github.com/mdn/yari/issues/12829)) ([e696f9a](https://github.com/mdn/yari/commit/e696f9a428ef7766ad47683c965fd0293e55d8d8)) +* **deps:** bump @mdn/rari from 0.1.31 to 0.1.32 ([#12871](https://github.com/mdn/yari/issues/12871)) ([dc2b487](https://github.com/mdn/yari/commit/dc2b487ae16e62bbaa34f308e304551753017317)) +* **deps:** bump @mdn/rari from 0.1.32 to 0.1.33 ([#12901](https://github.com/mdn/yari/issues/12901)) ([72aaae9](https://github.com/mdn/yari/commit/72aaae9372046314aa4469f4d1cc8958aad64b69)) +* **deps:** bump @mozilla/glean from 5.0.3 to 5.0.4 ([#12870](https://github.com/mdn/yari/issues/12870)) ([acb275b](https://github.com/mdn/yari/commit/acb275b80b6ec95780e956671d5290b9b937140f)) +* **deps:** bump compute-baseline from 0.3.0 to 0.3.1 ([#12855](https://github.com/mdn/yari/issues/12855)) ([511ea35](https://github.com/mdn/yari/commit/511ea35194ef227858c9231318eb0d568cac1eff)) +* **deps:** bump image-size from 1.2.0 to 1.2.1 ([#12867](https://github.com/mdn/yari/issues/12867)) ([c6fb8e8](https://github.com/mdn/yari/commit/c6fb8e813a078a0bc1ea9293e21ab806381b1d48)) +* **deps:** bump mdn-data from 2.18.0 to 2.19.0 ([#12864](https://github.com/mdn/yari/issues/12864)) ([fd45c99](https://github.com/mdn/yari/commit/fd45c9969f99ffbc5aa2b2d6fd3a400a9c76d596)) +* **deps:** bump mdn-data from 2.19.0 to 2.20.0 ([#12885](https://github.com/mdn/yari/issues/12885)) ([cce6516](https://github.com/mdn/yari/commit/cce651676f2a9735864895c7d31cb532bd4ee475)) +* **deps:** bump mozilla-actions/sccache-action from 0.0.8 to 0.0.9 ([#12838](https://github.com/mdn/yari/issues/12838)) ([5bdaa65](https://github.com/mdn/yari/commit/5bdaa65dd57152ec81a69c1c031111b16b400364)) +* **deps:** bump openai from 4.89.0 to 4.89.1 ([#12835](https://github.com/mdn/yari/issues/12835)) ([591ee24](https://github.com/mdn/yari/commit/591ee24c9cb5c21c12bc8d77a5cce96240c98744)) +* **deps:** bump openai from 4.89.1 to 4.90.0 ([#12840](https://github.com/mdn/yari/issues/12840)) ([cc37844](https://github.com/mdn/yari/commit/cc37844afff661040f86d8dc38d020e3c010eaaf)) +* **deps:** bump openai from 4.90.0 to 4.91.0 ([#12852](https://github.com/mdn/yari/issues/12852)) ([9ab3d50](https://github.com/mdn/yari/commit/9ab3d503539cc27c531258c6fdf287ef8a4ab3fb)) +* **deps:** bump openai from 4.91.0 to 4.91.1 ([#12865](https://github.com/mdn/yari/issues/12865)) ([875d030](https://github.com/mdn/yari/commit/875d0309f3be8299597b03ad6bb5594cbed47178)) +* **deps:** bump openai from 4.91.1 to 4.92.0 ([#12888](https://github.com/mdn/yari/issues/12888)) ([8c2c850](https://github.com/mdn/yari/commit/8c2c85024b6cfb2dbaecd96f517d302cb3704c05)) +* **deps:** bump openai from 4.92.0 to 4.92.1 ([#12895](https://github.com/mdn/yari/issues/12895)) ([ceb636e](https://github.com/mdn/yari/commit/ceb636e12488469dcd45947e3fd8ef9e7e77bef8)) +* **deps:** bump openai from 4.92.1 to 4.93.0 ([#12902](https://github.com/mdn/yari/issues/12902)) ([0a731e9](https://github.com/mdn/yari/commit/0a731e96996e2babbde767f6de1115c94130915c)) +* **deps:** bump rehype-remark from 10.0.0 to 10.0.1 ([#12868](https://github.com/mdn/yari/issues/12868)) ([2fa40e6](https://github.com/mdn/yari/commit/2fa40e621f50a38145247311def3e1610422d547)) +* **deps:** bump remark-rehype from 11.1.1 to 11.1.2 ([#12869](https://github.com/mdn/yari/issues/12869)) ([3289ae5](https://github.com/mdn/yari/commit/3289ae5905051a7d2d76a013cf38495c937824cc)) +* **deps:** bump send from 1.1.0 to 1.2.0 ([#12836](https://github.com/mdn/yari/issues/12836)) ([a6a2953](https://github.com/mdn/yari/commit/a6a2953742b58d0b6527db7e9aeb1358c73a001b)) +* **deps:** bump web-features from 2.29.1 to 2.30.0 ([#12830](https://github.com/mdn/yari/issues/12830)) ([d8dd256](https://github.com/mdn/yari/commit/d8dd256d3a11676a823e2d6e902f360702935541)) +* **deps:** bump web-features from 2.30.0 to 2.31.0 ([#12853](https://github.com/mdn/yari/issues/12853)) ([96a81ae](https://github.com/mdn/yari/commit/96a81aed0d6e84587c04bc00300f987fe63da05a)) +* **deps:** bump web-features from 2.31.0 to 2.32.0 ([#12877](https://github.com/mdn/yari/issues/12877)) ([340d1d7](https://github.com/mdn/yari/commit/340d1d7fa566b04587c40a9714d0b3cac754ba1f)) +* **deps:** bump web-specs from 3.43.0 to 3.44.0 ([#12825](https://github.com/mdn/yari/issues/12825)) ([1231c3c](https://github.com/mdn/yari/commit/1231c3c700480171555240c230e7a024eb285009)) +* **deps:** bump web-specs from 3.44.0 to 3.46.0 ([#12859](https://github.com/mdn/yari/issues/12859)) ([496f0d0](https://github.com/mdn/yari/commit/496f0d0a091662a17ea4ab3cb32a7e1f26c7555c)) + +## [4.8.0](https://github.com/mdn/yari/compare/v4.7.2...v4.8.0) (2025-03-24) + + +### Features + +* **compat:** migrate BCD table to Web Component ([#12580](https://github.com/mdn/yari/issues/12580)) ([1944a86](https://github.com/mdn/yari/commit/1944a867adac86286b7ec7f6f42fb65b372a301d)) + + +### Bug Fixes + +* **compat:** hide erraneous "Support unknown" notes + avoid history wrap ([#12822](https://github.com/mdn/yari/issues/12822)) ([ca3d90f](https://github.com/mdn/yari/commit/ca3d90f194a502925f1a51bcb7a36f34202c0c32)) +* **compat:** refine BCD table style ([#12808](https://github.com/mdn/yari/issues/12808)) ([ae1c174](https://github.com/mdn/yari/commit/ae1c174bfd305d55ff605a17ed940d0cbab0e833)) +* **interactive-example:** select choice on focus ([#12777](https://github.com/mdn/yari/issues/12777)) ([2d55e51](https://github.com/mdn/yari/commit/2d55e51a895df0a4ae980d2fdb4075ccab695078)) +* **libs/play:** avoid `clear-site-data: cache` in Chrome browsers ([#12803](https://github.com/mdn/yari/issues/12803)) ([c3d57d9](https://github.com/mdn/yari/commit/c3d57d90132017efb3ddd800fb52b3bcd8b4bfe9)) +* **lit:** polyfill Constructable Stylesheet Objects ([#12811](https://github.com/mdn/yari/issues/12811)) ([399970d](https://github.com/mdn/yari/commit/399970d54d7d3c9f7c1125a3fe57e1443dee27b7)) +* **tables:** backport table-container css ([#12816](https://github.com/mdn/yari/issues/12816)) ([b5b37a8](https://github.com/mdn/yari/commit/b5b37a8c15b1526fd895fb1d92728fa93e0c7a65)) + + +### Miscellaneous + +* **deps-dev:** bump @swc/core from 1.11.11 to 1.11.13 ([#12819](https://github.com/mdn/yari/issues/12819)) ([57c7f4e](https://github.com/mdn/yari/commit/57c7f4e9d56e0a7d98482875f875f4948675a345)) +* **deps-dev:** bump @types/node from 18.19.80 to 18.19.81 in the types group ([#12812](https://github.com/mdn/yari/issues/12812)) ([d88f702](https://github.com/mdn/yari/commit/d88f7022b93a72214399f28da11b39dfd06e5f9b)) +* **deps-dev:** bump @types/node from 18.19.81 to 18.19.83 in the types group ([#12818](https://github.com/mdn/yari/issues/12818)) ([fc76a2d](https://github.com/mdn/yari/commit/fc76a2d1e46bc8e2509c96dcb18c1838fe3c8656)) +* **deps-dev:** bump babel-loader from 9.2.1 to 10.0.0 ([#12691](https://github.com/mdn/yari/issues/12691)) ([77a9211](https://github.com/mdn/yari/commit/77a9211c36622323203081d9919c5428b265e9a9)) +* **deps-dev:** bump react-router-dom from 7.3.0 to 7.4.0 ([#12807](https://github.com/mdn/yari/issues/12807)) ([c43db7d](https://github.com/mdn/yari/commit/c43db7d6e6883f4b85790aaafe4e40f317f0eb43)) +* **deps-dev:** bump typescript-eslint from 8.26.1 to 8.27.0 ([#12805](https://github.com/mdn/yari/issues/12805)) ([2d34c05](https://github.com/mdn/yari/commit/2d34c059e8bf4a82f12ffabf06a9ccfc47b17be4)) +* **deps:** bump @mdn/browser-compat-data from 5.7.3 to 5.7.4 ([#12801](https://github.com/mdn/yari/issues/12801)) ([a3ba371](https://github.com/mdn/yari/commit/a3ba3713f73d05fc59895924c54b14ec775ada89)) +* **deps:** bump @mdn/browser-compat-data from 5.7.4 to 5.7.5 ([#12820](https://github.com/mdn/yari/issues/12820)) ([418ec18](https://github.com/mdn/yari/commit/418ec18817cb29e9da1f288e994adac0fd7c94a6)) +* **deps:** bump @stripe/stripe-js from 5.10.0 to 6.1.0 ([#12788](https://github.com/mdn/yari/issues/12788)) ([9c63681](https://github.com/mdn/yari/commit/9c63681ecfcdeafe10943020cf8ce28641db2987)) +* **deps:** bump openai from 4.87.3 to 4.87.4 ([#12799](https://github.com/mdn/yari/issues/12799)) ([13bc013](https://github.com/mdn/yari/commit/13bc013e404c9018f603b617c0cb2bfe74401fdb)) +* **deps:** bump openai from 4.87.4 to 4.88.0 ([#12806](https://github.com/mdn/yari/issues/12806)) ([fe62c00](https://github.com/mdn/yari/commit/fe62c004803169e49a944abc5dfd105ba5bd9590)) +* **deps:** bump openai from 4.88.0 to 4.89.0 ([#12813](https://github.com/mdn/yari/issues/12813)) ([858c2d1](https://github.com/mdn/yari/commit/858c2d1f88e1d6a4367a1b0b55c9aaae82000dde)) +* **scrim:** add embed parameter ([#12815](https://github.com/mdn/yari/issues/12815)) ([3507171](https://github.com/mdn/yari/commit/35071719089b32a1ddda229d5799b2ae35a8a24e)) + +## [4.7.2](https://github.com/mdn/yari/compare/v4.7.1...v4.7.2) (2025-03-18) + + +### Miscellaneous + +* **deployer:** remove unused parts ([#12773](https://github.com/mdn/yari/issues/12773)) ([382bd02](https://github.com/mdn/yari/commit/382bd02fa9772f60c5efd02320f5109ede16207f)) +* **deps-dev:** bump @playwright/test from 1.51.0 to 1.51.1 ([#12792](https://github.com/mdn/yari/issues/12792)) ([a4c52bf](https://github.com/mdn/yari/commit/a4c52bf3a260dd1c694cbff9bc5eca4dc4042f34)) +* **deps-dev:** bump @swc/core from 1.11.10 to 1.11.11 ([#12790](https://github.com/mdn/yari/issues/12790)) ([ab80054](https://github.com/mdn/yari/commit/ab80054c2d7c2d20442a8e07ee8ebe5923dc984a)) +* **deps-dev:** bump @swc/core from 1.11.9 to 1.11.10 ([#12785](https://github.com/mdn/yari/issues/12785)) ([f1ef314](https://github.com/mdn/yari/commit/f1ef3145b59af39d1392cff493f4bba9e249c965)) +* **deps-dev:** bump sass from 1.85.1 to 1.86.0 ([#12789](https://github.com/mdn/yari/issues/12789)) ([0c8c288](https://github.com/mdn/yari/commit/0c8c28877ae91362829dd9288c0e76749961771d)) +* **deps:** bump @inquirer/prompts from 7.3.3 to 7.4.0 ([#12781](https://github.com/mdn/yari/issues/12781)) ([5da9424](https://github.com/mdn/yari/commit/5da9424f37db4b06c419fb052d7ec751d81ba40a)) +* **deps:** bump @mdn/browser-compat-data from 5.7.2 to 5.7.3 ([#12783](https://github.com/mdn/yari/issues/12783)) ([1828682](https://github.com/mdn/yari/commit/1828682ed6edccb53fddabfb606eaee45da91791)) +* **deps:** bump @mdn/rari from 0.1.29 to 0.1.30 ([#12784](https://github.com/mdn/yari/issues/12784)) ([c4ecda4](https://github.com/mdn/yari/commit/c4ecda48fcf2ba91eca71435820c44cad8b73f88)) +* **deps:** bump boto3 from 1.37.9 to 1.37.13 in /deployer in the dependencies group ([#12779](https://github.com/mdn/yari/issues/12779)) ([f41f5e1](https://github.com/mdn/yari/commit/f41f5e1171112b1cfbad45c1cbbe98896caa8e59)) +* **deps:** bump pg from 8.14.0 to 8.14.1 ([#12791](https://github.com/mdn/yari/issues/12791)) ([667dbb9](https://github.com/mdn/yari/commit/667dbb98cc36428e72c83987673753edf613b5a5)) +* **deps:** bump web-features from 2.28.0 to 2.29.1 ([#12782](https://github.com/mdn/yari/issues/12782)) ([d5c1ad2](https://github.com/mdn/yari/commit/d5c1ad2d80824af27790548a7c712091e04bee3e)) + +## [4.7.1](https://github.com/mdn/yari/compare/v4.7.0...v4.7.1) (2025-03-13) + + +### Bug Fixes + +* **play:** avoid double-slash in runner URL ([#12655](https://github.com/mdn/yari/issues/12655)) ([7992d2d](https://github.com/mdn/yari/commit/7992d2dd42105ae4ddc6dc5ab95fe6acb5a7457e)) + + +### Miscellaneous + +* **deps-dev:** bump @babel/core from 7.26.9 to 7.26.10 ([#12762](https://github.com/mdn/yari/issues/12762)) ([0a34a7f](https://github.com/mdn/yari/commit/0a34a7f6ca334c598474e4b9a2ebfc14171f76c9)) +* **deps-dev:** bump @babel/eslint-parser from 7.26.8 to 7.26.10 ([#12761](https://github.com/mdn/yari/issues/12761)) ([dc66375](https://github.com/mdn/yari/commit/dc663750e5ba866ae51bc34044f9da7daf40e317)) +* **deps-dev:** bump @swc/core from 1.11.7 to 1.11.8 ([#12748](https://github.com/mdn/yari/issues/12748)) ([bdac646](https://github.com/mdn/yari/commit/bdac646213979afd14e65348d05d8e2ff1bc4597)) +* **deps-dev:** bump @swc/core from 1.11.8 to 1.11.9 ([#12771](https://github.com/mdn/yari/issues/12771)) ([04585cb](https://github.com/mdn/yari/commit/04585cbf48376544bd4ee5fb2978969098f8133a)) +* **deps-dev:** bump @types/node from 18.19.79 to 18.19.80 in the types group ([#12745](https://github.com/mdn/yari/issues/12745)) ([2e12db8](https://github.com/mdn/yari/commit/2e12db8388d00f09d528f07a01b8205ca18814bc)) +* **deps-dev:** bump typescript-eslint from 8.26.0 to 8.26.1 ([#12755](https://github.com/mdn/yari/issues/12755)) ([3f66153](https://github.com/mdn/yari/commit/3f6615330859fe4efbfedfbbf25c5b1324a98396)) +* **deps-dev:** bump webpack-manifest-plugin from 5.0.0 to 5.0.1 ([#12758](https://github.com/mdn/yari/issues/12758)) ([5074275](https://github.com/mdn/yari/commit/5074275acaac6edff7c1fca9e6bb25b902a46692)) +* **deps:** bump @inquirer/prompts from 7.3.2 to 7.3.3 ([#12747](https://github.com/mdn/yari/issues/12747)) ([5a01b53](https://github.com/mdn/yari/commit/5a01b532a666bdebe75066bdc37961068d461c4d)) +* **deps:** bump @mdn/browser-compat-data from 5.7.1 to 5.7.2 ([#12760](https://github.com/mdn/yari/issues/12760)) ([b7bb8b7](https://github.com/mdn/yari/commit/b7bb8b7ab3f0de5dbf8372b7a7c50e91bf54d5ed)) +* **deps:** bump @mdn/rari from 0.1.26 to 0.1.27 ([#12756](https://github.com/mdn/yari/issues/12756)) ([c3efeb0](https://github.com/mdn/yari/commit/c3efeb03e91b85f210715a8b238ee5e9666e9125)) +* **deps:** bump @mdn/rari from 0.1.27 to 0.1.28 ([#12770](https://github.com/mdn/yari/issues/12770)) ([6827684](https://github.com/mdn/yari/commit/68276848dd212ac81e9adb9f78da028461f05267)) +* **deps:** bump @mdn/rari from 0.1.28 to 0.1.29 ([#12774](https://github.com/mdn/yari/issues/12774)) ([5dbe51f](https://github.com/mdn/yari/commit/5dbe51f46fe5dceae4b7261509e3af9aa491abb5)) +* **deps:** bump @vscode/ripgrep from 1.15.10 to 1.15.11 ([#12746](https://github.com/mdn/yari/issues/12746)) ([3c3c663](https://github.com/mdn/yari/commit/3c3c66383d6aeff82996dd94cfece28b335f0c39)) +* **deps:** bump boto3 from 1.37.4 to 1.37.9 in /deployer in the dependencies group ([#12749](https://github.com/mdn/yari/issues/12749)) ([2d294a5](https://github.com/mdn/yari/commit/2d294a5d029d953430f72f7382066a7bc44b5db7)) +* **deps:** bump compute-baseline from 0.1.1 to 0.3.0 ([#12765](https://github.com/mdn/yari/issues/12765)) ([9c1231f](https://github.com/mdn/yari/commit/9c1231f1e900b774e1767262dfc2acd047ec093d)) +* **deps:** bump mdn-data from 2.17.0 to 2.18.0 ([#12764](https://github.com/mdn/yari/issues/12764)) ([6a1f313](https://github.com/mdn/yari/commit/6a1f313e18a6774b45312a55eefc2a8e9eb47fbe)) +* **deps:** bump mozilla-actions/sccache-action from 0.0.7 to 0.0.8 ([#12743](https://github.com/mdn/yari/issues/12743)) ([c2e7c52](https://github.com/mdn/yari/commit/c2e7c5292b6fe3bef23a3daee3f58f26b7e39af8)) +* **deps:** bump openai from 4.86.2 to 4.87.3 ([#12759](https://github.com/mdn/yari/issues/12759)) ([2a07701](https://github.com/mdn/yari/commit/2a0770130b631afdca632bcdbc05e6e4d12813c6)) +* **deps:** bump pg from 8.13.3 to 8.14.0 ([#12763](https://github.com/mdn/yari/issues/12763)) ([959493c](https://github.com/mdn/yari/commit/959493cb0d7461bd11cdb9a1f258896cb59d6b55)) +* **deps:** bump prismjs from 1.29.0 to 1.30.0 ([#12751](https://github.com/mdn/yari/issues/12751)) ([e6190ce](https://github.com/mdn/yari/commit/e6190ce6d60afc1d8ecdc019fa7d893018663109)) +* **deps:** bump web-features from 2.27.0 to 2.28.0 ([#12750](https://github.com/mdn/yari/issues/12750)) ([ae1f3fb](https://github.com/mdn/yari/commit/ae1f3fbcf8bda5bdaf247208c8c07ca14f565414)) +* **deps:** bump web-specs from 3.42.0 to 3.42.1 ([#12753](https://github.com/mdn/yari/issues/12753)) ([de02f1a](https://github.com/mdn/yari/commit/de02f1aa2bc1f83134cc73cbe38ba96f1d1b8290)) +* **deps:** bump web-specs from 3.42.1 to 3.43.0 ([#12769](https://github.com/mdn/yari/issues/12769)) ([900d73f](https://github.com/mdn/yari/commit/900d73fb5ec1595c43f09ee3b4db1160943644f7)) +* **pong:** update cc2ip ([#12766](https://github.com/mdn/yari/issues/12766)) ([d4d1332](https://github.com/mdn/yari/commit/d4d1332857501d3ba24ab15b5d5232faa4dba288)) + +## [4.7.0](https://github.com/mdn/yari/compare/v4.6.2...v4.7.0) (2025-03-10) + + +### Features + +* **cloud-function:** setup review environment ([#12694](https://github.com/mdn/yari/issues/12694)) ([e6548af](https://github.com/mdn/yari/commit/e6548afa9d83f32912dfab33c50ebd01aa8d0a39)) +* **interactive-examples:** support CSS examples ([#12664](https://github.com/mdn/yari/issues/12664)) ([84f797a](https://github.com/mdn/yari/commit/84f797a3364777be2e4b21346f68ce66689105fc)) + + +### Bug Fixes + +* **cloud-function:** improve 404 fallback handling ([#12730](https://github.com/mdn/yari/issues/12730)) ([8803deb](https://github.com/mdn/yari/commit/8803deb8db2d01bc741fdce4149b8860b7115e99)) +* **cloud-function:** override Cache-Control for Review environment ([#12742](https://github.com/mdn/yari/issues/12742)) ([d2b1e31](https://github.com/mdn/yari/commit/d2b1e31a41b489cc8b436a02057eea91892cf57e)) +* **cloud-function:** run with non default service account ([#12723](https://github.com/mdn/yari/issues/12723)) ([d4f472f](https://github.com/mdn/yari/commit/d4f472ff73de9537406da77bf923629c11ec6674)) + + +### Miscellaneous + +* **deps-dev:** bump @playwright/test from 1.50.1 to 1.51.0 ([#12734](https://github.com/mdn/yari/issues/12734)) ([9e40b4f](https://github.com/mdn/yari/commit/9e40b4f15d9374b0eb52813ccd5d6647bc0f2c4a)) +* **deps-dev:** bump @swc/core from 1.11.5 to 1.11.6 ([#12717](https://github.com/mdn/yari/issues/12717)) ([17b5edd](https://github.com/mdn/yari/commit/17b5edd39bc661bbc3d15d31f900c5c4de930ff6)) +* **deps-dev:** bump @swc/core from 1.11.6 to 1.11.7 ([#12720](https://github.com/mdn/yari/issues/12720)) ([ecaaf44](https://github.com/mdn/yari/commit/ecaaf442572dd8784fe9060373dfbc223df3362c)) +* **deps-dev:** bump @types/node from 18.19.78 to 18.19.79 in the types group ([#12713](https://github.com/mdn/yari/issues/12713)) ([635c0bb](https://github.com/mdn/yari/commit/635c0bb1218d98d62cf2c28b42af17650a90dfaf)) +* **deps-dev:** bump css-minimizer-webpack-plugin from 7.0.0 to 7.0.2 ([#12736](https://github.com/mdn/yari/issues/12736)) ([a7ce49c](https://github.com/mdn/yari/commit/a7ce49cbe959b5dd7b45d2ec6e3b6c06c9de4142)) +* **deps-dev:** bump eslint-plugin-n from 17.16.1 to 17.16.2 ([#12719](https://github.com/mdn/yari/issues/12719)) ([3ac37bd](https://github.com/mdn/yari/commit/3ac37bd1cb6fed13d9e15c0bd93fbef2ce246d46)) +* **deps-dev:** bump prettier from 3.4.2 to 3.5.3 ([#12706](https://github.com/mdn/yari/issues/12706)) ([888452c](https://github.com/mdn/yari/commit/888452c64ceca5e6944b3759c6be968c02e38f9c)) +* **deps-dev:** bump react-router-dom from 7.2.0 to 7.3.0 ([#12738](https://github.com/mdn/yari/issues/12738)) ([cf463e8](https://github.com/mdn/yari/commit/cf463e876c262cc6c94d8a6f1f7975125399ff45)) +* **deps-dev:** bump swr from 2.3.2 to 2.3.3 ([#12731](https://github.com/mdn/yari/issues/12731)) ([cb6e455](https://github.com/mdn/yari/commit/cb6e45536485bf38346416127c282149ade1f730)) +* **deps-dev:** bump terser-webpack-plugin from 5.3.12 to 5.3.13 ([#12725](https://github.com/mdn/yari/issues/12725)) ([99827a6](https://github.com/mdn/yari/commit/99827a6e43e67a6dbc9b18c534455df514d1ed80)) +* **deps-dev:** bump terser-webpack-plugin from 5.3.13 to 5.3.14 ([#12739](https://github.com/mdn/yari/issues/12739)) ([69f413f](https://github.com/mdn/yari/commit/69f413f8902a0c50c7cf597819107d5855a7b83b)) +* **deps-dev:** bump typescript from 5.7.3 to 5.8.2 ([#12722](https://github.com/mdn/yari/issues/12722)) ([23ad5e8](https://github.com/mdn/yari/commit/23ad5e8de25fac3573e86605f6409d0b5eb25593)) +* **deps-dev:** bump typescript-eslint from 8.25.0 to 8.26.0 ([#12714](https://github.com/mdn/yari/issues/12714)) ([e19002e](https://github.com/mdn/yari/commit/e19002e91d787363e65dc30c144cbed92ac90d19)) +* **deps:** bump @mdn/browser-compat-data from 5.6.43 to 5.7.0 ([#12721](https://github.com/mdn/yari/issues/12721)) ([9a363bd](https://github.com/mdn/yari/commit/9a363bde8ef74a7ff3e6454df2f4dd9fa0981d9c)) +* **deps:** bump @mdn/browser-compat-data from 5.7.0 to 5.7.1 ([#12737](https://github.com/mdn/yari/issues/12737)) ([337e8c6](https://github.com/mdn/yari/commit/337e8c6c36fbc714374f829c79170febfc252829)) +* **deps:** bump @mdn/watify from 1.0.1 to 1.1.3 ([#12716](https://github.com/mdn/yari/issues/12716)) ([39cfa91](https://github.com/mdn/yari/commit/39cfa9191fe1049fd90c94449baf917680808080)) +* **deps:** bump @stripe/stripe-js from 5.7.0 to 5.8.0 ([#12715](https://github.com/mdn/yari/issues/12715)) ([007433a](https://github.com/mdn/yari/commit/007433a1d7160b3c07db132c1e12a5fc88fd692d)) +* **deps:** bump @stripe/stripe-js from 5.8.0 to 5.9.2 ([#12727](https://github.com/mdn/yari/issues/12727)) ([25a50a6](https://github.com/mdn/yari/commit/25a50a6809b233a6888fa5fc2bd10b7bb2698ada)) +* **deps:** bump @stripe/stripe-js from 5.9.2 to 5.10.0 ([#12740](https://github.com/mdn/yari/issues/12740)) ([a020676](https://github.com/mdn/yari/commit/a020676b65d733acc1d148a4285ccfd0c7d2f81b)) +* **deps:** bump cryptography from 43.0.1 to 44.0.1 in /deployer ([#12604](https://github.com/mdn/yari/issues/12604)) ([daa4f59](https://github.com/mdn/yari/commit/daa4f596d65a6d7a3632045f94a8e3701a91a8a8)) +* **deps:** bump imagemin from 9.0.0 to 9.0.1 ([#12733](https://github.com/mdn/yari/issues/12733)) ([97b8cb5](https://github.com/mdn/yari/commit/97b8cb58ba8569a595ce447deee37ee97bdb3dc2)) +* **deps:** bump openai from 4.86.1 to 4.86.2 ([#12726](https://github.com/mdn/yari/issues/12726)) ([0e0fadf](https://github.com/mdn/yari/commit/0e0fadf5402b09c7027ad21151b0d588405a25b3)) +* **deps:** bump react-markdown from 10.0.1 to 10.1.0 ([#12732](https://github.com/mdn/yari/issues/12732)) ([d8765fc](https://github.com/mdn/yari/commit/d8765fc66127abb504cda315515f10387df0b1f6)) +* **deps:** bump web-features from 2.26.0 to 2.27.0 ([#12718](https://github.com/mdn/yari/issues/12718)) ([d54d665](https://github.com/mdn/yari/commit/d54d66529cf9b779b30fe1c4516dd2ac526dfbae)) +* **deps:** bump web-specs from 3.41.0 to 3.42.0 ([#12728](https://github.com/mdn/yari/issues/12728)) ([98eeb09](https://github.com/mdn/yari/commit/98eeb099d58052cb98a1a7d3b423a20f70e44f9f)) +* **play:** allow new review host ([#12711](https://github.com/mdn/yari/issues/12711)) ([bf727cb](https://github.com/mdn/yari/commit/bf727cbd610bca35d5b63a0b392359c23e3cc7e9)) + +## [4.6.2](https://github.com/mdn/yari/compare/v4.6.1...v4.6.2) (2025-03-03) + + +### Bug Fixes + +* **deps:** replace watify with @mdn/watify ([#12689](https://github.com/mdn/yari/issues/12689)) ([b586f9d](https://github.com/mdn/yari/commit/b586f9d06b0e7bb07cb2562dd821f7451be88b10)) +* **interactive-example:** isolate messages to runner origin ([#12688](https://github.com/mdn/yari/issues/12688)) ([1ab55fc](https://github.com/mdn/yari/commit/1ab55fceafdba10e5ea1a7d8e7e349b1a34ef46b)) + + +### Miscellaneous + +* **deps-dev:** bump @swc/core from 1.11.1 to 1.11.4 ([#12681](https://github.com/mdn/yari/issues/12681)) ([c2358ae](https://github.com/mdn/yari/commit/c2358ae11dd201b41ad1b8ea8b1ac3afd1fdd180)) +* **deps-dev:** bump @swc/core from 1.11.4 to 1.11.5 ([#12701](https://github.com/mdn/yari/issues/12701)) ([cb2b4a9](https://github.com/mdn/yari/commit/cb2b4a90f7b170260ead39e263929593fbe83bdf)) +* **deps-dev:** bump @types/node from 18.19.76 to 18.19.78 in the types group ([#12698](https://github.com/mdn/yari/issues/12698)) ([7946d76](https://github.com/mdn/yari/commit/7946d76a33a0d545f81eed778908a35880fb42ea)) +* **deps-dev:** bump eslint-plugin-n from 17.15.1 to 17.16.1 ([#12705](https://github.com/mdn/yari/issues/12705)) ([3973821](https://github.com/mdn/yari/commit/39738215337b794c61f6b5f4fc2bea0141efec07)) +* **deps-dev:** bump eslint-plugin-react-hooks from 5.1.0 to 5.2.0 ([#12704](https://github.com/mdn/yari/issues/12704)) ([30eb3a7](https://github.com/mdn/yari/commit/30eb3a70b595d7ea654c3ee22ba0b07ca277c633)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.5.8 to 2.5.9 ([#12692](https://github.com/mdn/yari/issues/12692)) ([f8df2d8](https://github.com/mdn/yari/commit/f8df2d807989cc422c340f2ac8fc127849fb6571)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.5.9 to 2.5.10 ([#12703](https://github.com/mdn/yari/issues/12703)) ([7a6e4d2](https://github.com/mdn/yari/commit/7a6e4d275cff5c0cfde89fb3479aa91d93a49689)) +* **deps-dev:** bump terser-webpack-plugin from 5.3.11 to 5.3.12 ([#12684](https://github.com/mdn/yari/issues/12684)) ([b95a1b7](https://github.com/mdn/yari/commit/b95a1b70b91a96393d43f2cf83a98ee977c2bdfe)) +* **deps-dev:** bump typescript from 5.7.3 to 5.8.2 in /client/pwa ([#12700](https://github.com/mdn/yari/issues/12700)) ([a9d8967](https://github.com/mdn/yari/commit/a9d896721ac21f6068e94473ab85f4fa57edd980)) +* **deps-dev:** bump webpack from 5.97.1 to 5.98.0 ([#12613](https://github.com/mdn/yari/issues/12613)) ([a01251f](https://github.com/mdn/yari/commit/a01251fd3e3f2c792fe1e59f475a3a7ead531d54)) +* **deps:** bump @mdn/browser-compat-data from 5.6.42 to 5.6.43 ([#12699](https://github.com/mdn/yari/issues/12699)) ([44dc3fe](https://github.com/mdn/yari/commit/44dc3fe53d6f6dbf1d2428d4f42ee0f864dabce9)) +* **deps:** bump @mdn/rari from 0.1.25 to 0.1.26 ([#12680](https://github.com/mdn/yari/issues/12680)) ([c98aa14](https://github.com/mdn/yari/commit/c98aa142902c9dc8a26ecdf30ff7a64347730dda)) +* **deps:** bump mdn-data from 2.15.0 to 2.17.0 ([#12682](https://github.com/mdn/yari/issues/12682)) ([fa8ccd1](https://github.com/mdn/yari/commit/fa8ccd181562591eb734b1c8f4b34a206c6733a9)) +* **deps:** bump openai from 4.85.4 to 4.86.1 ([#12693](https://github.com/mdn/yari/issues/12693)) ([0116b5e](https://github.com/mdn/yari/commit/0116b5e576102c065edb379d8307e2c2a63a3497)) +* **deps:** bump pytest from 8.3.4 to 8.3.5 in /testing/integration in the dependencies group ([#12708](https://github.com/mdn/yari/issues/12708)) ([7bcc06c](https://github.com/mdn/yari/commit/7bcc06c029cf2c31df09238c31144dde07ded94e)) +* **deps:** bump react-markdown from 10.0.0 to 10.0.1 ([#12702](https://github.com/mdn/yari/issues/12702)) ([d5ef1f2](https://github.com/mdn/yari/commit/d5ef1f2ea058cacf4eeb07fc159d4afdf5bf5ee1)) +* **deps:** bump the dependencies group in /deployer with 2 updates ([#12697](https://github.com/mdn/yari/issues/12697)) ([8c9fe66](https://github.com/mdn/yari/commit/8c9fe66cbfb7cc4a933b64b1126df76938dcf95d)) +* **deps:** bump web-features from 2.24.0 to 2.25.0 ([#12685](https://github.com/mdn/yari/issues/12685)) ([e3680de](https://github.com/mdn/yari/commit/e3680de6a29989fb9d0e27d0df3f40760a04062a)) +* **deps:** bump web-features from 2.25.0 to 2.26.0 ([#12690](https://github.com/mdn/yari/issues/12690)) ([f905e51](https://github.com/mdn/yari/commit/f905e51bae7b2272eabe1149a80d1376be31e922)) + +## [4.6.1](https://github.com/mdn/yari/compare/v4.6.0...v4.6.1) (2025-02-27) + + +### Bug Fixes + +* **deps:** use the published watify package ([#12678](https://github.com/mdn/yari/issues/12678)) ([cbc21d9](https://github.com/mdn/yari/commit/cbc21d95942a7f3d12cbe1887deb0c51343325aa)) +* **interactive-examples:** allow wasm in csp ([#12676](https://github.com/mdn/yari/issues/12676)) ([084814b](https://github.com/mdn/yari/commit/084814bb4128a8648affe12690892f7f3f97edf2)) + + +### Miscellaneous + +* **deps:** bump @inquirer/prompts from 7.3.1 to 7.3.2 ([#12626](https://github.com/mdn/yari/issues/12626)) ([7aae272](https://github.com/mdn/yari/commit/7aae272de1da1790fe65d77b97ccba0253d2b544)) +* **deps:** bump web-features from 2.23.0 to 2.24.0 ([#12656](https://github.com/mdn/yari/issues/12656)) ([79c4a5e](https://github.com/mdn/yari/commit/79c4a5ef6b2807e52b851ec4b54f0def71b0f319)) +* **footer:** add Bluesky link ([#12538](https://github.com/mdn/yari/issues/12538)) ([c698ef5](https://github.com/mdn/yari/commit/c698ef514a147830443fdb7b4d5d6db304645323)) + +## [4.6.0](https://github.com/mdn/yari/compare/v4.5.1...v4.6.0) (2025-02-26) + + +### Features + +* **interactive-examples:** add support for tabbed css examples ([#12665](https://github.com/mdn/yari/issues/12665)) ([d0e71f5](https://github.com/mdn/yari/commit/d0e71f57f43b8439f9975d03c2fd0ab6f34e8340)) +* **interactive-examples:** add support for WAT examples ([#12654](https://github.com/mdn/yari/issues/12654)) ([4ecd702](https://github.com/mdn/yari/commit/4ecd702cc333dc14a6846d54f928e41ad9442bb8)) + + +### Bug Fixes + +* **playground:** remove duplicate editor scrollbar ([#12653](https://github.com/mdn/yari/issues/12653)) ([f366927](https://github.com/mdn/yari/commit/f366927ecd86c9bfb05af724c914c144eba9409f)) + + +### Miscellaneous + +* **deps-dev:** bump @swc/core from 1.10.18 to 1.11.1 ([#12668](https://github.com/mdn/yari/issues/12668)) ([384413e](https://github.com/mdn/yari/commit/384413e504d336d9605930cf965f4dcc47e52fd7)) +* **deps-dev:** bump postcss-preset-env from 10.1.4 to 10.1.5 ([#12661](https://github.com/mdn/yari/issues/12661)) ([31bc124](https://github.com/mdn/yari/commit/31bc124786c71626fe2cf996c52ddb50f34f1b74)) +* **deps-dev:** bump sass from 1.85.0 to 1.85.1 ([#12672](https://github.com/mdn/yari/issues/12672)) ([a600ba1](https://github.com/mdn/yari/commit/a600ba1a65356dd7d422d71b5817f1d7000018a2)) +* **deps-dev:** bump ts-jest from 29.2.5 to 29.2.6 ([#12658](https://github.com/mdn/yari/issues/12658)) ([1c7e810](https://github.com/mdn/yari/commit/1c7e8109e9b40904b9ee59f3dc8f9724a6a2d209)) +* **deps-dev:** bump typescript-eslint from 8.24.1 to 8.25.0 ([#12669](https://github.com/mdn/yari/issues/12669)) ([d768223](https://github.com/mdn/yari/commit/d768223823ebde9cb1f9f8a35bc49e4c1c7347f2)) +* **deps:** bump @mdn/browser-compat-data from 5.6.40 to 5.6.41 ([#12659](https://github.com/mdn/yari/issues/12659)) ([1db4172](https://github.com/mdn/yari/commit/1db41723a46e681087b34714e958ffe214411be0)) +* **deps:** bump @mdn/browser-compat-data from 5.6.41 to 5.6.42 ([#12673](https://github.com/mdn/yari/issues/12673)) ([7872c6f](https://github.com/mdn/yari/commit/7872c6f0cfbab22d45aea2d57638b9cb92e51d26)) +* **deps:** bump @stripe/stripe-js from 5.6.0 to 5.7.0 ([#12670](https://github.com/mdn/yari/issues/12670)) ([87ca405](https://github.com/mdn/yari/commit/87ca40572364cafba6e82d1f11a985883d0b024e)) +* **deps:** bump dependencies in /cloud-function ([#12563](https://github.com/mdn/yari/issues/12563)) ([85030a9](https://github.com/mdn/yari/commit/85030a9ec09e2b73947dd08d116b3eba5f767fb1)) +* **deps:** bump openai from 4.85.3 to 4.85.4 ([#12657](https://github.com/mdn/yari/issues/12657)) ([72cf655](https://github.com/mdn/yari/commit/72cf655dc91a1d7085d79861faab672ff42ab065)) +* **deps:** bump the dependencies group in /deployer with 2 updates ([#12662](https://github.com/mdn/yari/issues/12662)) ([ecb1459](https://github.com/mdn/yari/commit/ecb1459131aeb7fe5c4aba9ba4dfecd9a0798af4)) + +## [4.5.1](https://github.com/mdn/yari/compare/v4.5.0...v4.5.1) (2025-02-21) + + +### Bug Fixes + +* **interactive-examples:** open targetless `<area>`s in parent window ([#12652](https://github.com/mdn/yari/issues/12652)) ([29c55f2](https://github.com/mdn/yari/commit/29c55f2fbea3437447ad306c8220346511aa4847)) +* **play:** access blank runner on subdomain ([#12643](https://github.com/mdn/yari/issues/12643)) ([7fa3147](https://github.com/mdn/yari/commit/7fa3147fe550af88980900412d8aab0d703debd6)) + + +### Enhancements + +* **libs/play:** allow runner embedded on review pages ([#12647](https://github.com/mdn/yari/issues/12647)) ([59beb9e](https://github.com/mdn/yari/commit/59beb9eb6b1e32fab1db51d0a7e51516ef799b0f)) + + +### Miscellaneous + +* **deps-dev:** bump eslint-plugin-wc from 2.2.0 to 2.2.1 ([#12650](https://github.com/mdn/yari/issues/12650)) ([6d2ee39](https://github.com/mdn/yari/commit/6d2ee392c0a289e4776c2c983c0fac0b62611e20)) +* **deps:** bump openai from 4.85.2 to 4.85.3 ([#12649](https://github.com/mdn/yari/issues/12649)) ([7301f54](https://github.com/mdn/yari/commit/7301f54b1e120ba7374745000fc12c7b9c95df2b)) +* **deps:** bump react-markdown from 9.1.0 to 10.0.0 ([#12648](https://github.com/mdn/yari/issues/12648)) ([17e73c6](https://github.com/mdn/yari/commit/17e73c601cfabee5454abacedaad1b025643b68f)) +* **deps:** bump web-specs from 3.40.0 to 3.41.0 ([#12651](https://github.com/mdn/yari/issues/12651)) ([2cc9e2d](https://github.com/mdn/yari/commit/2cc9e2d69d4e689506c25ee794b6752a83ef7148)) + +## [4.5.0](https://github.com/mdn/yari/compare/v4.4.1...v4.5.0) (2025-02-20) + + +### Features + +* **interactive-examples:** support HTML examples ([#12633](https://github.com/mdn/yari/issues/12633)) ([7cd08a7](https://github.com/mdn/yari/commit/7cd08a73a4c964cc8dfd5ffb33ea93e80b22ae16)) + + +### Miscellaneous + +* **deps-dev:** bump @swc/core from 1.10.17 to 1.10.18 ([#12637](https://github.com/mdn/yari/issues/12637)) ([6b6349d](https://github.com/mdn/yari/commit/6b6349d1c1d363f6b6e509871ab28b50c44e2b14)) +* **deps-dev:** bump postcss from 8.5.2 to 8.5.3 ([#12641](https://github.com/mdn/yari/issues/12641)) ([b87fa89](https://github.com/mdn/yari/commit/b87fa89dfc8b7443b9ac609f4d0e6e44b30c7701)) +* **deps-dev:** bump react-router-dom from 7.1.5 to 7.2.0 ([#12638](https://github.com/mdn/yari/issues/12638)) ([c83c18b](https://github.com/mdn/yari/commit/c83c18b796ab7967999f7f2cce64550b575662b1)) +* **deps:** bump @mdn/browser-compat-data from 5.6.39 to 5.6.40 ([#12635](https://github.com/mdn/yari/issues/12635)) ([d5c54fa](https://github.com/mdn/yari/commit/d5c54fa14633d26a63c5e28a6fa1ef1fdbbcb4f2)) +* **deps:** bump openai from 4.85.1 to 4.85.2 ([#12636](https://github.com/mdn/yari/issues/12636)) ([cb83ac8](https://github.com/mdn/yari/commit/cb83ac89c40463a78b1038a90dd0359c36d0d84f)) +* **deps:** bump react-markdown from 9.0.3 to 9.1.0 ([#12642](https://github.com/mdn/yari/issues/12642)) ([6c7fbec](https://github.com/mdn/yari/commit/6c7fbeca27e1c0cc9f5f0be9b5058e87453188bb)) +* **deps:** bump web-specs from 3.39.0 to 3.40.0 ([#12634](https://github.com/mdn/yari/issues/12634)) ([f0ef278](https://github.com/mdn/yari/commit/f0ef2786ca5299a93174815522c5eb96f6131084)) +* **placements:** consolidate placement's ad overlay design ([#12104](https://github.com/mdn/yari/issues/12104)) ([31765c8](https://github.com/mdn/yari/commit/31765c82006b132bfc325f9c9c9739567744fa9a)) +* **workflows/build:** use static robots.txt ([#12495](https://github.com/mdn/yari/issues/12495)) ([02cb25b](https://github.com/mdn/yari/commit/02cb25bf2c6cc61c2ff17c2e0785cd356ccb4443)) + +## [4.4.1](https://github.com/mdn/yari/compare/v4.4.0...v4.4.1) (2025-02-18) + + +### Bug Fixes + +* **playground:** workaround for safari not sending referer header when starting off from `about:blank` ([#12630](https://github.com/mdn/yari/issues/12630)) ([bfb93f5](https://github.com/mdn/yari/commit/bfb93f509e7df80efb282ab918ac243b698aafb4)) +* **play:** use correct code font across locales ([#12605](https://github.com/mdn/yari/issues/12605)) ([da775ab](https://github.com/mdn/yari/commit/da775ab491b88131ec8758a1818e43585c3b904c)) + + +### Enhancements + +* **bcd:** prefix titles with browser name (and version) ([#12303](https://github.com/mdn/yari/issues/12303)) ([b92f409](https://github.com/mdn/yari/commit/b92f409b2c1257e626fd32557ee62b16e744a439)) + + +### Miscellaneous + +* **deps-dev:** bump @babel/core from 7.26.7 to 7.26.9 ([#12618](https://github.com/mdn/yari/issues/12618)) ([002839d](https://github.com/mdn/yari/commit/002839d7ecff1f1eeeffa651e537690cc0ebb3c9)) +* **deps-dev:** bump @babel/preset-env from 7.26.8 to 7.26.9 ([#12615](https://github.com/mdn/yari/issues/12615)) ([e94b1a5](https://github.com/mdn/yari/commit/e94b1a51c3aad603bb3d4aaad7be56f7b121818e)) +* **deps-dev:** bump @swc/core from 1.10.15 to 1.10.17 ([#12632](https://github.com/mdn/yari/issues/12632)) ([4c41f0e](https://github.com/mdn/yari/commit/4c41f0eeb00baecbf9a9e84fcb6b6e0a22ddf14f)) +* **deps-dev:** bump @types/node from 18.19.75 to 18.19.76 in the types group ([#12612](https://github.com/mdn/yari/issues/12612)) ([7d001e8](https://github.com/mdn/yari/commit/7d001e823a8be95fed00cf3a6feba51a5b8b5ac6)) +* **deps-dev:** bump babel-preset-react-app from 10.0.1 to 10.1.0 ([#12623](https://github.com/mdn/yari/issues/12623)) ([bc9eb47](https://github.com/mdn/yari/commit/bc9eb47429cb9d23b1cf9b16b965629aafbc01d0)) +* **deps-dev:** bump flake8 from 7.1.1 to 7.1.2 in /testing/integration in the dependencies group ([#12629](https://github.com/mdn/yari/issues/12629)) ([6fe7016](https://github.com/mdn/yari/commit/6fe7016ea8a873820a6369b6742405cc77b139d0)) +* **deps-dev:** bump postcss-preset-env from 10.1.3 to 10.1.4 ([#12609](https://github.com/mdn/yari/issues/12609)) ([21166ca](https://github.com/mdn/yari/commit/21166ca37b4368d8d59260c4dc42d4593bc8f22b)) +* **deps-dev:** bump sass from 1.84.0 to 1.85.0 ([#12616](https://github.com/mdn/yari/issues/12616)) ([29b1258](https://github.com/mdn/yari/commit/29b1258555c7baa57ce4ec404c101b7367eef4a5)) +* **deps-dev:** bump sass-loader from 16.0.4 to 16.0.5 ([#12628](https://github.com/mdn/yari/issues/12628)) ([cec7330](https://github.com/mdn/yari/commit/cec7330ab364716178a8e0e11c9bca9f9f692d56)) +* **deps-dev:** bump typescript-eslint from 8.24.0 to 8.24.1 ([#12631](https://github.com/mdn/yari/issues/12631)) ([fd4f980](https://github.com/mdn/yari/commit/fd4f98020fa01a91dd297369c300fee0bcf71d3d)) +* **deps-dev:** bump webpack from 5.97.1 to 5.98.0 in /client/pwa ([#12610](https://github.com/mdn/yari/issues/12610)) ([737a4e3](https://github.com/mdn/yari/commit/737a4e36c43985a12b98cddbb7aa7d137a4de1fc)) +* **deps:** bump @codemirror/lang-javascript from 6.2.2 to 6.2.3 ([#12602](https://github.com/mdn/yari/issues/12602)) ([2290d5f](https://github.com/mdn/yari/commit/2290d5fd3e688fbb83853f0a1fc35a7a45b4a46c)) +* **deps:** bump @mdn/browser-compat-data from 5.6.37 to 5.6.38 ([#12601](https://github.com/mdn/yari/issues/12601)) ([c429b79](https://github.com/mdn/yari/commit/c429b794fb53b06a489d50b5ea5487f99e3f646d)) +* **deps:** bump @mdn/browser-compat-data from 5.6.38 to 5.6.39 ([#12625](https://github.com/mdn/yari/issues/12625)) ([fd298ab](https://github.com/mdn/yari/commit/fd298abe5c99a9ee296be2318773bc54419d2523)) +* **deps:** bump @mdn/rari from 0.1.24 to 0.1.25 ([#12624](https://github.com/mdn/yari/issues/12624)) ([725e682](https://github.com/mdn/yari/commit/725e682f5ddd3cedb35ccf23fc5d12a6f9cd3a6b)) +* **deps:** bump openai from 4.83.0 to 4.84.0 ([#12608](https://github.com/mdn/yari/issues/12608)) ([8c306f9](https://github.com/mdn/yari/commit/8c306f91ee199dde2e8991aa7a5d2a62aaae4293)) +* **deps:** bump openai from 4.84.0 to 4.85.0 ([#12620](https://github.com/mdn/yari/issues/12620)) ([22939a0](https://github.com/mdn/yari/commit/22939a0d2d5a37650cf191e1ceda2979dacbe74e)) +* **deps:** bump openai from 4.85.0 to 4.85.1 ([#12627](https://github.com/mdn/yari/issues/12627)) ([af4c7b5](https://github.com/mdn/yari/commit/af4c7b5c8f47efe8e63b5292fa8ac5fa8070e192)) +* **deps:** bump pg from 8.13.1 to 8.13.2 ([#12600](https://github.com/mdn/yari/issues/12600)) ([501de9d](https://github.com/mdn/yari/commit/501de9d40156d22720ccc1fcb492e1a04b74312b)) +* **deps:** bump pg from 8.13.2 to 8.13.3 ([#12607](https://github.com/mdn/yari/issues/12607)) ([fad57ef](https://github.com/mdn/yari/commit/fad57ef5d93dbc2c105b3cf43e72e74d5b78b61e)) +* **deps:** bump sse.js from 2.5.0 to 2.6.0 ([#12617](https://github.com/mdn/yari/issues/12617)) ([cd2df63](https://github.com/mdn/yari/commit/cd2df63fc28c6d161254851f6e6131fa75757a91)) +* **deps:** bump the dependencies group in /deployer with 2 updates ([#12622](https://github.com/mdn/yari/issues/12622)) ([10d7e47](https://github.com/mdn/yari/commit/10d7e477d452f534f920d1fced2b2c046f7e35df)) +* **deps:** bump web-specs from 3.38.0 to 3.39.0 ([#12619](https://github.com/mdn/yari/issues/12619)) ([c602606](https://github.com/mdn/yari/commit/c602606245e2345ed63093d7411ef76742712f53)) + +## [4.4.0](https://github.com/mdn/yari/compare/v4.3.1...v4.4.0) (2025-02-11) + + +### Features + +* **interactive-examples:** get ready for JS migration ([#12570](https://github.com/mdn/yari/issues/12570)) ([33de34d](https://github.com/mdn/yari/commit/33de34d9df9f57f3afe9577403bcf6007507be63)) + + +### Miscellaneous + +* **deps-dev:** bump postcss from 8.5.1 to 8.5.2 ([#12596](https://github.com/mdn/yari/issues/12596)) ([a5c825c](https://github.com/mdn/yari/commit/a5c825c27eb36c18a63a0df14a17b1ac9aa9b68c)) +* **deps-dev:** bump typescript-eslint from 8.23.0 to 8.24.0 ([#12598](https://github.com/mdn/yari/issues/12598)) ([79f6f72](https://github.com/mdn/yari/commit/79f6f72447a8fd6df38b830a083b61f335c64634)) +* **deps:** bump aws-actions/configure-aws-credentials from 4.0.3 to 4.1.0 ([#12593](https://github.com/mdn/yari/issues/12593)) ([66bdb39](https://github.com/mdn/yari/commit/66bdb39d9588656f4841835accee16b7fae24a33)) +* **deps:** bump compression from 1.7.5 to 1.8.0 ([#12595](https://github.com/mdn/yari/issues/12595)) ([171907e](https://github.com/mdn/yari/commit/171907ee7005bb01d597d21c57d675ec577e339a)) +* **deps:** bump remark-gfm from 4.0.0 to 4.0.1 ([#12597](https://github.com/mdn/yari/issues/12597)) ([39933db](https://github.com/mdn/yari/commit/39933db5291caf7fcde40ccc2e2746f7a8f19b8f)) +* **deps:** bump serialize-javascript from 6.0.1 to 6.0.2 in /client/pwa ([#12591](https://github.com/mdn/yari/issues/12591)) ([4b19573](https://github.com/mdn/yari/commit/4b195730cd06d2396cd1a6a19a50a2f30b1d54fa)) +* **deps:** bump web-features from 2.22.0 to 2.23.0 ([#12594](https://github.com/mdn/yari/issues/12594)) ([535e1eb](https://github.com/mdn/yari/commit/535e1eb5a619ecd3ccbe540417fae36727905313)) + +## [4.3.1](https://github.com/mdn/yari/compare/v4.3.0...v4.3.1) (2025-02-10) + + +### Bug Fixes + +* **deployer:** avoid GitHub mentions ([#12429](https://github.com/mdn/yari/issues/12429)) ([fa24e84](https://github.com/mdn/yari/commit/fa24e84cbb2f6ab5c3b8e77545d3009dd6cdaaed)) +* **footer:** fix fill color of Mozilla logo in dark mode ([8bf21b2](https://github.com/mdn/yari/commit/8bf21b2777d381a4c5f9c54bf43b7f94cfbdfd78)) +* **footer:** use currentColor for Mozilla logo ([#12541](https://github.com/mdn/yari/issues/12541)) ([8bf21b2](https://github.com/mdn/yari/commit/8bf21b2777d381a4c5f9c54bf43b7f94cfbdfd78)) +* **ui:** check for `addEventListener` on `MediaQueryList` ([#12448](https://github.com/mdn/yari/issues/12448)) ([cd92674](https://github.com/mdn/yari/commit/cd926749032b54fabe5ebb05b760c0e8841c6c41)) + + +### Miscellaneous + +* **deployer:** migrate to dependency groups ([#12516](https://github.com/mdn/yari/issues/12516)) ([57d1385](https://github.com/mdn/yari/commit/57d1385ec3057d1d196788a9da24e1e5b4d97f7e)) +* **deps-dev:** bump @babel/eslint-parser from 7.26.5 to 7.26.8 ([#12588](https://github.com/mdn/yari/issues/12588)) ([b3fbb99](https://github.com/mdn/yari/commit/b3fbb99788c7c16b855f08a205e0a7bd1ccb7999)) +* **deps-dev:** bump @babel/preset-env from 7.26.7 to 7.26.8 ([#12586](https://github.com/mdn/yari/issues/12586)) ([af40797](https://github.com/mdn/yari/commit/af407974da0393a4b2ef005e13647fad1b896525)) +* **deps-dev:** bump @playwright/test from 1.50.0 to 1.50.1 ([#12560](https://github.com/mdn/yari/issues/12560)) ([213de80](https://github.com/mdn/yari/commit/213de803c6f4b93023b59a20c9fdc5fc09199488)) +* **deps-dev:** bump @swc/core from 1.10.11 to 1.10.12 ([#12544](https://github.com/mdn/yari/issues/12544)) ([d054ee9](https://github.com/mdn/yari/commit/d054ee9cd42144da030f7174ffefecc0d98008b3)) +* **deps-dev:** bump @swc/core from 1.10.12 to 1.10.14 ([#12569](https://github.com/mdn/yari/issues/12569)) ([dcc8d35](https://github.com/mdn/yari/commit/dcc8d350bb8a95a2b13d5a1c2d41699c36d9525b)) +* **deps-dev:** bump @swc/core from 1.10.14 to 1.10.15 ([#12590](https://github.com/mdn/yari/issues/12590)) ([79521ae](https://github.com/mdn/yari/commit/79521ae4089592d62bc271d0b07252c1bfda3413)) +* **deps-dev:** bump @types/node from 18.19.74 to 18.19.75 in the types group ([#12565](https://github.com/mdn/yari/issues/12565)) ([e29f489](https://github.com/mdn/yari/commit/e29f489bd221f824821059d096e07081e5da404a)) +* **deps-dev:** bump black from 24.10.0 to 25.1.0 in /deployer ([#12551](https://github.com/mdn/yari/issues/12551)) ([9dcc6fe](https://github.com/mdn/yari/commit/9dcc6fed55feb1b26812360e43837e0ff1f6397f)) +* **deps-dev:** bump black from 24.10.0 to 25.1.0 in /testing/integration ([#12552](https://github.com/mdn/yari/issues/12552)) ([834e4a0](https://github.com/mdn/yari/commit/834e4a0b7e0079c2cd91625cd41da3601ba5e9ac)) +* **deps-dev:** bump react-router-dom from 7.1.3 to 7.1.4 ([#12546](https://github.com/mdn/yari/issues/12546)) ([b2bf2e3](https://github.com/mdn/yari/commit/b2bf2e39b1a3ecc06a143d2873c05f4d18b2935a)) +* **deps-dev:** bump react-router-dom from 7.1.4 to 7.1.5 ([#12557](https://github.com/mdn/yari/issues/12557)) ([76049ff](https://github.com/mdn/yari/commit/76049ff98db8882115333d533588af3f246e7870)) +* **deps-dev:** bump sass from 1.83.4 to 1.84.0 ([#12579](https://github.com/mdn/yari/issues/12579)) ([ce554ea](https://github.com/mdn/yari/commit/ce554ea8d3c5453d36fd658d4728bb720f4200ff)) +* **deps-dev:** bump swr from 2.3.0 to 2.3.1 ([#12574](https://github.com/mdn/yari/issues/12574)) ([8e41c30](https://github.com/mdn/yari/commit/8e41c3047b150a7d5846aede1d083421878feea6)) +* **deps-dev:** bump swr from 2.3.1 to 2.3.2 ([#12577](https://github.com/mdn/yari/issues/12577)) ([acf6f8e](https://github.com/mdn/yari/commit/acf6f8e02efd69e662fac1042717af6372401e73)) +* **deps-dev:** bump typescript-eslint from 8.22.0 to 8.23.0 ([#12568](https://github.com/mdn/yari/issues/12568)) ([034288d](https://github.com/mdn/yari/commit/034288d1eab1e346343b33dad338ebca425e3d8b)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.54 to 2.7.57 in /client/pwa ([#12549](https://github.com/mdn/yari/issues/12549)) ([6072a86](https://github.com/mdn/yari/commit/6072a8664836cdc7feba291ed91f7e114284b338)) +* **deps:** bump @codemirror/state from 6.5.1 to 6.5.2 ([#12567](https://github.com/mdn/yari/issues/12567)) ([348117d](https://github.com/mdn/yari/commit/348117d620c1b14978e34c20c73bb3072a3bd84e)) +* **deps:** bump @inquirer/prompts from 7.2.4 to 7.3.1 ([#12559](https://github.com/mdn/yari/issues/12559)) ([c962d54](https://github.com/mdn/yari/commit/c962d541cb79b9e823eb0864b82949b6f15a00cd)) +* **deps:** bump @mdn/browser-compat-data from 5.6.33 to 5.6.34 ([#12535](https://github.com/mdn/yari/issues/12535)) ([29731cf](https://github.com/mdn/yari/commit/29731cf77dc186b409002573571875aeb78cf8e0)) +* **deps:** bump @mdn/browser-compat-data from 5.6.34 to 5.6.35 ([#12558](https://github.com/mdn/yari/issues/12558)) ([db644e8](https://github.com/mdn/yari/commit/db644e8072537cd942e051a1fa6cda83e0c4b510)) +* **deps:** bump @mdn/browser-compat-data from 5.6.35 to 5.6.36 ([#12573](https://github.com/mdn/yari/issues/12573)) ([02db263](https://github.com/mdn/yari/commit/02db263ea839586020848be254400fa3107ce9cd)) +* **deps:** bump @mdn/browser-compat-data from 5.6.36 to 5.6.37 ([#12585](https://github.com/mdn/yari/issues/12585)) ([f789122](https://github.com/mdn/yari/commit/f78912297ecd6150020527038520548087da7667)) +* **deps:** bump @mdn/rari from 0.1.21 to 0.1.22 ([#12566](https://github.com/mdn/yari/issues/12566)) ([757746b](https://github.com/mdn/yari/commit/757746b9491957776fc063537f8786f641ab48d4)) +* **deps:** bump @mdn/rari from 0.1.22 to 0.1.23 ([#12576](https://github.com/mdn/yari/issues/12576)) ([798d244](https://github.com/mdn/yari/commit/798d244edf315402f7570ec3463fcffdb35d2584)) +* **deps:** bump @mdn/rari from 0.1.23 to 0.1.24 ([#12582](https://github.com/mdn/yari/issues/12582)) ([b7ccf76](https://github.com/mdn/yari/commit/b7ccf76206e3675f959ce3ade116fc1892dba3b3)) +* **deps:** bump @sentry/node from 8.52.0 to 8.53.0 in the sentry group ([#12545](https://github.com/mdn/yari/issues/12545)) ([0fec5f4](https://github.com/mdn/yari/commit/0fec5f42e325242c59dfdbbecd0d6d70e0601139)) +* **deps:** bump @sentry/node from 8.53.0 to 8.54.0 in the sentry group ([#12553](https://github.com/mdn/yari/issues/12553)) ([feb12f7](https://github.com/mdn/yari/commit/feb12f7f8793ba3196bfb7085a1d192ea4ba8ac9)) +* **deps:** bump boto3 from 1.36.11 to 1.36.16 in /deployer in the dependencies group ([#12583](https://github.com/mdn/yari/issues/12583)) ([6c4a2a7](https://github.com/mdn/yari/commit/6c4a2a7815e7f31112ed1dc8b643ab030c097363)) +* **deps:** bump boto3 from 1.36.6 to 1.36.11 in /deployer in the dependencies group ([#12550](https://github.com/mdn/yari/issues/12550)) ([9388823](https://github.com/mdn/yari/commit/9388823f94616b45ba26b46ec01432cd69f62796)) +* **deps:** bump openai from 4.80.1 to 4.82.0 ([#12555](https://github.com/mdn/yari/issues/12555)) ([0e8ba12](https://github.com/mdn/yari/commit/0e8ba12b8055f18168489b2e6b89895c9dec41e1)) +* **deps:** bump openai from 4.82.0 to 4.83.0 ([#12575](https://github.com/mdn/yari/issues/12575)) ([3b47ebd](https://github.com/mdn/yari/commit/3b47ebdd0bbd8696cba22c60545e8799f84adcef)) +* **deps:** bump web-features from 2.20.0 to 2.21.0 ([#12547](https://github.com/mdn/yari/issues/12547)) ([108f30c](https://github.com/mdn/yari/commit/108f30ce1c6cb50ea5987cedb58c43b70fc6a432)) +* **deps:** bump web-features from 2.21.0 to 2.22.0 ([#12581](https://github.com/mdn/yari/issues/12581)) ([2e6c261](https://github.com/mdn/yari/commit/2e6c26171a282397463ad00e76be9789458f3736)) +* **deps:** bump web-specs from 3.36.0 to 3.37.0 ([#12556](https://github.com/mdn/yari/issues/12556)) ([8b622b7](https://github.com/mdn/yari/commit/8b622b745807975ccd71059fcfbde6bbc9908b7b)) +* **deps:** bump web-specs from 3.37.0 to 3.38.0 ([#12578](https://github.com/mdn/yari/issues/12578)) ([0e54a59](https://github.com/mdn/yari/commit/0e54a599c21dae592bc1c4649a358961821368e9)) +* **test-build:** allow specifiying translated-content ref ([#12562](https://github.com/mdn/yari/issues/12562)) ([d683516](https://github.com/mdn/yari/commit/d683516e1d9a2205e7b016a7eccbb42ebe520a50)) + +## [4.3.0](https://github.com/mdn/yari/compare/v4.2.2...v4.3.0) (2025-01-29) + + +### Features + +* **newletter:** deprecate newsletter ([#12499](https://github.com/mdn/yari/issues/12499)) ([3d7e4da](https://github.com/mdn/yari/commit/3d7e4da3e1a0718c5f3ba75942386a7a9fd5ba5a)) + + +### Miscellaneous + +* **deps-dev:** bump typescript-eslint from 8.21.0 to 8.22.0 ([#12530](https://github.com/mdn/yari/issues/12530)) ([13af06a](https://github.com/mdn/yari/commit/13af06ae3a2315b89474c30646c9904cb0368d0f)) +* **deps:** bump @inquirer/prompts from 7.2.3 to 7.2.4 ([#12534](https://github.com/mdn/yari/issues/12534)) ([14c57b7](https://github.com/mdn/yari/commit/14c57b77cd5780dbe619f96158811232370582f5)) +* **deps:** bump @mdn/rari from 0.1.20 to 0.1.21 ([#12539](https://github.com/mdn/yari/issues/12539)) ([ae48fe7](https://github.com/mdn/yari/commit/ae48fe7bfd40c54ab8c7748eed5d67d659b54cfc)) +* **deps:** bump @sentry/node from 8.51.0 to 8.52.0 in the sentry group ([#12532](https://github.com/mdn/yari/issues/12532)) ([5c9f068](https://github.com/mdn/yari/commit/5c9f068b60588ef67b4f6f8934c35f9f8385e54a)) +* **deps:** bump @stripe/stripe-js from 5.5.0 to 5.6.0 ([#12533](https://github.com/mdn/yari/issues/12533)) ([05fb7d8](https://github.com/mdn/yari/commit/05fb7d81eaeabfba2d5d4216a69ddd6aa0c4789b)) +* **deps:** bump aws-actions/configure-aws-credentials from 4.0.2 to 4.0.3 ([#12531](https://github.com/mdn/yari/issues/12531)) ([03290c3](https://github.com/mdn/yari/commit/03290c3222252732ed5a0339519436599310de1f)) +* **deps:** bump path-to-regex from 0.1.10 to 0.1.12 in /cloud-function ([#12525](https://github.com/mdn/yari/issues/12525)) ([0eafcf7](https://github.com/mdn/yari/commit/0eafcf73c248a36293b8c2dbe28321d099d381aa)) +* **deps:** bump web-features from 2.19.0 to 2.20.0 ([#12529](https://github.com/mdn/yari/issues/12529)) ([5383c21](https://github.com/mdn/yari/commit/5383c21becb65eef77d7d78af9302bc307572966)) +* **ui:** Update firefox.svg and simple-firefox.svg to use browser logo ([#12107](https://github.com/mdn/yari/issues/12107)) ([4d281b1](https://github.com/mdn/yari/commit/4d281b1c203885c4b342b2c5cddbc6309e458f22)) + +## [4.2.2](https://github.com/mdn/yari/compare/v4.2.1...v4.2.2) (2025-01-27) + + +### Bug Fixes + +* **csp:** allow images from prod (developer.mozilla.org) ([#12514](https://github.com/mdn/yari/issues/12514)) ([09ded00](https://github.com/mdn/yari/commit/09ded006a49cce576ca0e675b1547c1bbf52fab3)) + + +### Enhancements + +* **server:** retry rari fetch if ECONNREFUSED ([#12513](https://github.com/mdn/yari/issues/12513)) ([8cd0bd2](https://github.com/mdn/yari/commit/8cd0bd2ea7d9c87d809fa3d8cb85d25ad63a6ad3)) + + +### Miscellaneous + +* **bin:** deprecate yari bins + test rari bins ([#12517](https://github.com/mdn/yari/issues/12517)) ([82a690b](https://github.com/mdn/yari/commit/82a690b223330f102757b166342f183b1b5ad79f)) +* **deps-dev:** bump @babel/core from 7.26.0 to 7.26.7 ([#12522](https://github.com/mdn/yari/issues/12522)) ([4d38665](https://github.com/mdn/yari/commit/4d386651e8fbe4442d9ddfee92ef283e56b210b9)) +* **deps-dev:** bump @babel/preset-env from 7.26.0 to 7.26.7 ([#12521](https://github.com/mdn/yari/issues/12521)) ([818ce4a](https://github.com/mdn/yari/commit/818ce4a8b95dd33547356f68163a8132952db2a8)) +* **deps-dev:** bump @swc/core from 1.10.9 to 1.10.11 ([#12518](https://github.com/mdn/yari/issues/12518)) ([a74997c](https://github.com/mdn/yari/commit/a74997cead287c509e63dd74f2591fd535bbad4c)) +* **deps:** bump @mdn/browser-compat-data from 5.6.32 to 5.6.33 ([#12520](https://github.com/mdn/yari/issues/12520)) ([9d0dc90](https://github.com/mdn/yari/commit/9d0dc907aeba4ec7b8345db4cb745b2e23651e8b)) +* **deps:** bump boto3 from 1.36.2 to 1.36.6 in /deployer in the dependencies group ([#12524](https://github.com/mdn/yari/issues/12524)) ([f43a823](https://github.com/mdn/yari/commit/f43a823ca1292fc985a72242e68292e9ea200173)) +* **deps:** bump openai from 4.80.0 to 4.80.1 ([#12523](https://github.com/mdn/yari/issues/12523)) ([8e89246](https://github.com/mdn/yari/commit/8e89246b0edf53f67c1a84773c171fcc66d890b8)) +* **deps:** bump web-specs from 3.35.0 to 3.36.0 ([#12519](https://github.com/mdn/yari/issues/12519)) ([2bb0244](https://github.com/mdn/yari/commit/2bb0244bc4cf24761108b9e4666f436f6e1995a2)) + +## [4.2.1](https://github.com/mdn/yari/compare/v4.2.0...v4.2.1) (2025-01-24) + + +### Bug Fixes + +* **blog:** avoid overflow + double padding ([#12508](https://github.com/mdn/yari/issues/12508)) ([e484c48](https://github.com/mdn/yari/commit/e484c4859acb6625a37ac53f7eb853d495de3b1c)) + + +### Miscellaneous + +* **deps-dev:** bump @playwright/test from 1.49.1 to 1.50.0 ([#12512](https://github.com/mdn/yari/issues/12512)) ([9797452](https://github.com/mdn/yari/commit/97974522154dcbc12b136dba12deddc127795c98)) +* **deps-dev:** bump @types/node from 18.19.71 to 18.19.74 in the types group ([#12506](https://github.com/mdn/yari/issues/12506)) ([075216e](https://github.com/mdn/yari/commit/075216e7ac55dad6dc08d00d727e5fce853fcd16)) +* **deps-dev:** bump webpack-cli from 5.1.4 to 6.0.1 ([#12349](https://github.com/mdn/yari/issues/12349)) ([a13ae4d](https://github.com/mdn/yari/commit/a13ae4dd6a397ad7de7afc55f6c07696e159a518)) +* **deps-dev:** bump webpack-cli from 5.1.4 to 6.0.1 in /client/pwa ([#12362](https://github.com/mdn/yari/issues/12362)) ([21ba850](https://github.com/mdn/yari/commit/21ba850529980bc5cf4946f8a8b7bf44b90bf860)) +* **deps-dev:** remove react-is ([#12510](https://github.com/mdn/yari/issues/12510)) ([480da2d](https://github.com/mdn/yari/commit/480da2d6e07b2fca3d1e47087f02be2b62a7292d)) +* **deps:** bump @mdn/rari from 0.1.19 to 0.1.20 ([#12511](https://github.com/mdn/yari/issues/12511)) ([0e84431](https://github.com/mdn/yari/commit/0e8443183224cdd02d1e7468f97ce877fe048d62)) +* **icons:** update Deno logo ([#12505](https://github.com/mdn/yari/issues/12505)) ([0a9f2aa](https://github.com/mdn/yari/commit/0a9f2aaac01c6e50e61bd23da909ca68f88fffac)) + +## [4.2.0](https://github.com/mdn/yari/compare/v4.1.2...v4.2.0) (2025-01-22) + + +### Features + +* add <interactive-example> custom element ([#12413](https://github.com/mdn/yari/issues/12413)) ([c02c081](https://github.com/mdn/yari/commit/c02c081ff0805dce474b8efbfbc8047931c61a60)) + + +### Bug Fixes + +* add padding between specifications table and footer box ([bfec6a0](https://github.com/mdn/yari/commit/bfec6a02c23031066c1286b98f34d94a872a56ba)) +* **dev-server:** support contributor spotlight ([#12463](https://github.com/mdn/yari/issues/12463)) ([aff7038](https://github.com/mdn/yari/commit/aff70385ac2c3cd1f4fb8649ff5e818a178e09a7)) +* **layout:** add space between specifications table and footer box ([#12434](https://github.com/mdn/yari/issues/12434)) ([bfec6a0](https://github.com/mdn/yari/commit/bfec6a02c23031066c1286b98f34d94a872a56ba)) +* **playground:** separate "Legacy css" prologue from included variable ([#12467](https://github.com/mdn/yari/issues/12467)) ([5773469](https://github.com/mdn/yari/commit/5773469b948df046eab67fbf33f6ca71a26793d2)) + + +### Miscellaneous + +* **baseline:** change h2 in summary to div ([#12433](https://github.com/mdn/yari/issues/12433)) ([2a7aa70](https://github.com/mdn/yari/commit/2a7aa701aa063ec4537073385750e03197bc5ba6)) +* **deps-dev:** bump @babel/eslint-parser from 7.25.9 to 7.26.5 ([#12442](https://github.com/mdn/yari/issues/12442)) ([02be105](https://github.com/mdn/yari/commit/02be1059c37e096d96b2b92d593db81867e3e0fa)) +* **deps-dev:** bump @swc/core from 1.10.7 to 1.10.8 ([#12490](https://github.com/mdn/yari/issues/12490)) ([af850eb](https://github.com/mdn/yari/commit/af850eb3fe2f4c6f4c37edf27944d688ed54b3ee)) +* **deps-dev:** bump @swc/core from 1.10.8 to 1.10.9 ([#12498](https://github.com/mdn/yari/issues/12498)) ([19a8f76](https://github.com/mdn/yari/commit/19a8f76f73522d60284b952a82810a85192dabdf)) +* **deps-dev:** bump @types/imagemin from 9.0.0 to 9.0.1 in the types group ([#12484](https://github.com/mdn/yari/issues/12484)) ([ab0a302](https://github.com/mdn/yari/commit/ab0a3026916a6669a14fb3c13934c31aabcbce3e)) +* **deps-dev:** bump @types/node from 18.19.70 to 18.19.71 in the types group ([#12470](https://github.com/mdn/yari/issues/12470)) ([e4149ed](https://github.com/mdn/yari/commit/e4149ed8c8b258aa8d11353498f40a0cba3ba964)) +* **deps-dev:** bump eslint-plugin-jest from 28.10.0 to 28.11.0 ([#12460](https://github.com/mdn/yari/issues/12460)) ([c875c3d](https://github.com/mdn/yari/commit/c875c3df58dfef29782ba251311bd9f91dcb6bac)) +* **deps-dev:** bump eslint-plugin-react from 7.37.3 to 7.37.4 ([#12444](https://github.com/mdn/yari/issues/12444)) ([d089fe2](https://github.com/mdn/yari/commit/d089fe284817008c1601af287d0987f70e35391f)) +* **deps-dev:** bump jsdom from 25.0.1 to 26.0.0 ([#12421](https://github.com/mdn/yari/issues/12421)) ([9cb81c3](https://github.com/mdn/yari/commit/9cb81c3f8627c79ce43f0ef275633abe6bf4af69)) +* **deps-dev:** bump postcss from 8.4.49 to 8.5.1 ([#12451](https://github.com/mdn/yari/issues/12451)) ([e20dae9](https://github.com/mdn/yari/commit/e20dae9b10a3421e6989dc05e24f82df67d4788d)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.5.6 to 2.5.7 ([#12462](https://github.com/mdn/yari/issues/12462)) ([a31e278](https://github.com/mdn/yari/commit/a31e2781751e6ce5687425d938f4bfefd13cc75b)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.5.7 to 2.5.8 ([#12480](https://github.com/mdn/yari/issues/12480)) ([c779ac1](https://github.com/mdn/yari/commit/c779ac1ba6071c2010c3e108f78988ce1dd0a785)) +* **deps-dev:** bump react-router-dom from 7.1.1 to 7.1.2 ([#12482](https://github.com/mdn/yari/issues/12482)) ([5da095a](https://github.com/mdn/yari/commit/5da095a96e9aab2d269049ff2a8a39084fce89f8)) +* **deps-dev:** bump react-router-dom from 7.1.2 to 7.1.3 ([#12486](https://github.com/mdn/yari/issues/12486)) ([4d1cccb](https://github.com/mdn/yari/commit/4d1cccba1b489850fb26f9539489f0ff9c0d605d)) +* **deps-dev:** bump sass from 1.83.1 to 1.83.4 ([#12450](https://github.com/mdn/yari/issues/12450)) ([07b204b](https://github.com/mdn/yari/commit/07b204b97279ca5269ea5e9ca96ef79d1e76233c)) +* **deps-dev:** bump ts-loader from 9.5.1 to 9.5.2 ([#12445](https://github.com/mdn/yari/issues/12445)) ([ca45649](https://github.com/mdn/yari/commit/ca4564942045a0917a5f7836d5157e3076295b72)) +* **deps-dev:** bump ts-loader from 9.5.1 to 9.5.2 in /client/pwa ([#12447](https://github.com/mdn/yari/issues/12447)) ([202ffe8](https://github.com/mdn/yari/commit/202ffe856a853c82a37fdbfb13a465fb6b288cd2)) +* **deps-dev:** bump typescript from 5.7.2 to 5.7.3 in /client/pwa ([#12430](https://github.com/mdn/yari/issues/12430)) ([9b1bfa8](https://github.com/mdn/yari/commit/9b1bfa8f16a8b24d7eeaf09209a98bc9fd05cba4)) +* **deps-dev:** bump typescript-eslint from 8.19.1 to 8.20.0 ([#12449](https://github.com/mdn/yari/issues/12449)) ([04f5c62](https://github.com/mdn/yari/commit/04f5c62354672b2bacc9447df993359760478292)) +* **deps-dev:** bump typescript-eslint from 8.20.0 to 8.21.0 ([#12493](https://github.com/mdn/yari/issues/12493)) ([273d6c4](https://github.com/mdn/yari/commit/273d6c4edd4f3c422f3bae84b70d56ca8963032d)) +* **deps:** bump @inquirer/prompts from 7.2.1 to 7.2.2 ([#12443](https://github.com/mdn/yari/issues/12443)) ([c6e7322](https://github.com/mdn/yari/commit/c6e73220517ab502edf6d31713bdb27d26a8b324)) +* **deps:** bump @inquirer/prompts from 7.2.2 to 7.2.3 ([#12454](https://github.com/mdn/yari/issues/12454)) ([755788a](https://github.com/mdn/yari/commit/755788a7fc3eb0c4dde6abed90cf68f6ea88584a)) +* **deps:** bump @lit/react from 1.0.6 to 1.0.7 ([#12441](https://github.com/mdn/yari/issues/12441)) ([20952b4](https://github.com/mdn/yari/commit/20952b4737c9162f0d48732252efb0ed48e3fee8)) +* **deps:** bump @lit/task from 1.0.1 to 1.0.2 ([#12502](https://github.com/mdn/yari/issues/12502)) ([7399088](https://github.com/mdn/yari/commit/7399088bac5a7b559f286a8dd799369ee9d34eda)) +* **deps:** bump @mdn/browser-compat-data from 5.6.28 to 5.6.29 ([#12438](https://github.com/mdn/yari/issues/12438)) ([41488cc](https://github.com/mdn/yari/commit/41488cca736b4035889a1ac7832d0c743ccdc21c)) +* **deps:** bump @mdn/browser-compat-data from 5.6.29 to 5.6.30 ([#12461](https://github.com/mdn/yari/issues/12461)) ([175daec](https://github.com/mdn/yari/commit/175daec48163faa6e8bafd90b6498c5c381170fc)) +* **deps:** bump @mdn/browser-compat-data from 5.6.30 to 5.6.31 ([#12485](https://github.com/mdn/yari/issues/12485)) ([065d6c5](https://github.com/mdn/yari/commit/065d6c53e51cafda7aa7e7de64e1938891e65b9e)) +* **deps:** bump @mdn/browser-compat-data from 5.6.31 to 5.6.32 ([#12496](https://github.com/mdn/yari/issues/12496)) ([9c4d309](https://github.com/mdn/yari/commit/9c4d3095be0285572c175f41a0a1c723c256c701)) +* **deps:** bump @mdn/rari from 0.1.16 to 0.1.17 ([#12458](https://github.com/mdn/yari/issues/12458)) ([ccd0bce](https://github.com/mdn/yari/commit/ccd0bce1f903ffb2ad79248892bf6f22d20ba42c)) +* **deps:** bump @mdn/rari from 0.1.17 to 0.1.18 ([#12477](https://github.com/mdn/yari/issues/12477)) ([bd2fae4](https://github.com/mdn/yari/commit/bd2fae404af91d4ccd95f01ff1049bd5da71d760)) +* **deps:** bump @mdn/rari from 0.1.18 to 0.1.19 ([#12501](https://github.com/mdn/yari/issues/12501)) ([c525467](https://github.com/mdn/yari/commit/c525467b89c50ddca0da88d5e0be4414ee3b5789)) +* **deps:** bump @sentry/node from 8.48.0 to 8.49.0 in the sentry group ([#12457](https://github.com/mdn/yari/issues/12457)) ([321f62d](https://github.com/mdn/yari/commit/321f62d7ef31259a3b175020d0ade65e2a68f69a)) +* **deps:** bump @sentry/node from 8.49.0 to 8.50.0 in the sentry group ([#12469](https://github.com/mdn/yari/issues/12469)) ([de9cf6f](https://github.com/mdn/yari/commit/de9cf6ff5bfcd1e2417963818cd4393870cecace)) +* **deps:** bump @sentry/node from 8.50.0 to 8.51.0 in the sentry group ([#12500](https://github.com/mdn/yari/issues/12500)) ([f3ef62c](https://github.com/mdn/yari/commit/f3ef62c40545c4f26dea64b61125cabcf60afadd)) +* **deps:** bump @vscode/ripgrep from 1.15.9 to 1.15.10 ([#12440](https://github.com/mdn/yari/issues/12440)) ([fff82c4](https://github.com/mdn/yari/commit/fff82c44309c97e8f53a06116842ff3929551c4e)) +* **deps:** bump boto3 from 1.35.92 to 1.35.97 in /deployer in the dependencies group ([#12437](https://github.com/mdn/yari/issues/12437)) ([09256ec](https://github.com/mdn/yari/commit/09256ec50d4c361c5000bfdc5524df57c4765f2e)) +* **deps:** bump boto3 from 1.35.97 to 1.36.2 in /deployer in the dependencies group ([#12483](https://github.com/mdn/yari/issues/12483)) ([e742973](https://github.com/mdn/yari/commit/e74297356912ab9bb6d6f71bf541652aca64823f)) +* **deps:** bump dexie from 4.0.10 to 4.0.11 ([#12472](https://github.com/mdn/yari/issues/12472)) ([df1b4a5](https://github.com/mdn/yari/commit/df1b4a553df72488c973408e3ee035cf6627d612)) +* **deps:** bump dexie from 4.0.10 to 4.0.11 in /client/pwa ([#12468](https://github.com/mdn/yari/issues/12468)) ([3161d22](https://github.com/mdn/yari/commit/3161d226766ea45380d323dc74fa448bcb8d1982)) +* **deps:** bump fdir from 6.4.2 to 6.4.3 ([#12481](https://github.com/mdn/yari/issues/12481)) ([55c5362](https://github.com/mdn/yari/commit/55c5362139a2447a8a6934785abbf8e09ab2fe6d)) +* **deps:** bump fs-extra from 11.2.0 to 11.3.0 ([#12475](https://github.com/mdn/yari/issues/12475)) ([5e3a35f](https://github.com/mdn/yari/commit/5e3a35f45f3e4c4d5a6fabad8f4fd17da643927b)) +* **deps:** bump mdn-data from 2.14.0 to 2.15.0 ([#12471](https://github.com/mdn/yari/issues/12471)) ([e9483b3](https://github.com/mdn/yari/commit/e9483b39dc32e6ea2a91186792a5334861ef4edc)) +* **deps:** bump openai from 4.78.0 to 4.78.1 ([#12439](https://github.com/mdn/yari/issues/12439)) ([f40025c](https://github.com/mdn/yari/commit/f40025cc33c7a0125b5c7d4b591c048cd615a862)) +* **deps:** bump openai from 4.78.1 to 4.79.1 ([#12489](https://github.com/mdn/yari/issues/12489)) ([35a3bf8](https://github.com/mdn/yari/commit/35a3bf8b31955e067e148d836fb4c59d29db7c00)) +* **deps:** bump openai from 4.79.1 to 4.79.4 ([#12497](https://github.com/mdn/yari/issues/12497)) ([9d7517a](https://github.com/mdn/yari/commit/9d7517aca743a558d144b21f77c453dc2827c672)) +* **deps:** bump openai from 4.79.4 to 4.80.0 ([#12503](https://github.com/mdn/yari/issues/12503)) ([e8356f5](https://github.com/mdn/yari/commit/e8356f5251494262c22ae751b0a2b85404091303)) +* **deps:** bump web-features from 2.16.0 to 2.17.0 ([#12453](https://github.com/mdn/yari/issues/12453)) ([b69794d](https://github.com/mdn/yari/commit/b69794d217e2472f4808947394bcf8d6bf1f20f8)) +* **deps:** bump web-features from 2.17.0 to 2.18.0 ([#12473](https://github.com/mdn/yari/issues/12473)) ([e994c7a](https://github.com/mdn/yari/commit/e994c7a0fa20a3227abec098cc4bd3624ced08d5)) +* **deps:** bump web-features from 2.18.0 to 2.19.0 ([#12492](https://github.com/mdn/yari/issues/12492)) ([b2d9a6b](https://github.com/mdn/yari/commit/b2d9a6bfaa1fb2f1e3b1be8d6fded5f90064cd0b)) +* **deps:** bump web-specs from 3.32.0 to 3.33.0 ([#12452](https://github.com/mdn/yari/issues/12452)) ([93633ab](https://github.com/mdn/yari/commit/93633ab844030ea0cb21b72287ffbbad9e677a7d)) +* **deps:** bump web-specs from 3.33.0 to 3.33.1 ([#12459](https://github.com/mdn/yari/issues/12459)) ([fd67b21](https://github.com/mdn/yari/commit/fd67b216a8ae9ed9fd2b36abc44b1ef505386ed3)) +* **deps:** bump web-specs from 3.33.1 to 3.34.0 ([#12488](https://github.com/mdn/yari/issues/12488)) ([b98539c](https://github.com/mdn/yari/commit/b98539c4aad9637298f7dee09aa2564f310663f5)) +* **deps:** bump web-specs from 3.34.0 to 3.35.0 ([#12494](https://github.com/mdn/yari/issues/12494)) ([d10d71b](https://github.com/mdn/yari/commit/d10d71b0a5296263de5830f28d11ee81ec2ace7f)) +* **footer:** update mozilla logo ([#12478](https://github.com/mdn/yari/issues/12478)) ([b4131d1](https://github.com/mdn/yari/commit/b4131d14f093dc10488ece7868f6228985820cff)) +* **menu:** change accessibility menu items ([#12365](https://github.com/mdn/yari/issues/12365)) ([f5d3a10](https://github.com/mdn/yari/commit/f5d3a100ba28cadb0e4a2324d4da58884462b515)) +* **survey:** keep house survey a bit longer ([#12436](https://github.com/mdn/yari/issues/12436)) ([b24e706](https://github.com/mdn/yari/commit/b24e706ff8a4ff17471a13ae09a39bdac06b0249)) +* **test-build:** support specificying rari and content ref ([#12432](https://github.com/mdn/yari/issues/12432)) ([0c190a0](https://github.com/mdn/yari/commit/0c190a082c3e2ec6cfb24465b3fb6e62ece7ba10)) + +## [4.1.2](https://github.com/mdn/yari/compare/v4.1.1...v4.1.2) (2025-01-10) + + +### Miscellaneous + +* **deps-dev:** bump @swc/core from 1.10.6 to 1.10.7 ([#12425](https://github.com/mdn/yari/issues/12425)) ([bdaba43](https://github.com/mdn/yari/commit/bdaba431f45f6f7cebd129689aacae161f3d813b)) +* **deps-dev:** bump typescript from 5.7.2 to 5.7.3 ([#12417](https://github.com/mdn/yari/issues/12417)) ([6d1e257](https://github.com/mdn/yari/commit/6d1e257a0e3bdaa5cda387ad2127c50d6f9b110b)) +* **deps:** bump @codemirror/state from 6.5.0 to 6.5.1 ([#12428](https://github.com/mdn/yari/issues/12428)) ([7d20681](https://github.com/mdn/yari/commit/7d206813de22c9572c98320eccafa3cbcbdeb1bb)) +* **deps:** bump @mdn/rari from 0.1.15 to 0.1.16 ([#12427](https://github.com/mdn/yari/issues/12427)) ([ec381d0](https://github.com/mdn/yari/commit/ec381d0afc9d77e8c2408c96aff6193349dad684)) +* **deps:** bump openai from 4.77.4 to 4.78.0 ([#12426](https://github.com/mdn/yari/issues/12426)) ([4786e6d](https://github.com/mdn/yari/commit/4786e6d66d95d21807275f3df4db7497fe5adf24)) + +## [4.1.1](https://github.com/mdn/yari/compare/v4.1.0...v4.1.1) (2025-01-09) + + +### Bug Fixes + +* **npm-package:** use build:legacy:prepare ([#12422](https://github.com/mdn/yari/issues/12422)) ([b1f8d1c](https://github.com/mdn/yari/commit/b1f8d1c410863ebf26cdfdad480aab69d2971928)) + +## [4.1.0](https://github.com/mdn/yari/compare/v4.0.1...v4.1.0) (2025-01-09) + + +### Features + +* **baseline:** asterisk support for baseline ([#12415](https://github.com/mdn/yari/issues/12415)) ([fc39ed6](https://github.com/mdn/yari/commit/fc39ed6307fe23e11d42335a37ac12209863eeee)) + + +### Bug Fixes + +* **ci:** use legacy for whatsdeployed ([#12351](https://github.com/mdn/yari/issues/12351)) ([0d0643d](https://github.com/mdn/yari/commit/0d0643d04c53262d8b41d8950939f976c938a7b0)) +* **deployer:** stream bulk actions to avoid rate limit ([#12411](https://github.com/mdn/yari/issues/12411)) ([0b5276b](https://github.com/mdn/yari/commit/0b5276be8dc2b10992f1fe91ebdc8f7c0285430e)) +* **rari:** propagate rari exit code ([#12397](https://github.com/mdn/yari/issues/12397)) ([3865ef0](https://github.com/mdn/yari/commit/3865ef08ece590d53d14d4f93b27b47f9e467f7f)) + + +### Miscellaneous + +* **client:** remove unnecessary GA pageview event ([#12396](https://github.com/mdn/yari/issues/12396)) ([285cf0f](https://github.com/mdn/yari/commit/285cf0f2e7f015f1b7a5bd1905442f7e00b3d638)) +* **deps-dev:** bump @swc/core from 1.10.1 to 1.10.2 ([#12374](https://github.com/mdn/yari/issues/12374)) ([502a309](https://github.com/mdn/yari/commit/502a309342bb41b0bde6fe86127bb0ff1dcd5c73)) +* **deps-dev:** bump @swc/core from 1.10.2 to 1.10.4 ([#12379](https://github.com/mdn/yari/issues/12379)) ([c9ee25e](https://github.com/mdn/yari/commit/c9ee25e019ffdf7dba564e790a0096b9035c9268)) +* **deps-dev:** bump @swc/core from 1.10.4 to 1.10.6 ([#12409](https://github.com/mdn/yari/issues/12409)) ([1d8ea99](https://github.com/mdn/yari/commit/1d8ea999ff44d21c261b370b0ebbda0d7e6b0b7e)) +* **deps-dev:** bump @types/node from 18.19.68 to 18.19.69 in the types group ([#12383](https://github.com/mdn/yari/issues/12383)) ([32f054b](https://github.com/mdn/yari/commit/32f054b8c47420927ea6a7a5831b7494707517bb)) +* **deps-dev:** bump @types/node from 18.19.69 to 18.19.70 in the types group ([#12388](https://github.com/mdn/yari/issues/12388)) ([5653feb](https://github.com/mdn/yari/commit/5653feba1161899012965a409eb59ec81cd11a52)) +* **deps-dev:** bump browserslist from 4.24.3 to 4.24.4 ([#12420](https://github.com/mdn/yari/issues/12420)) ([a2e1f44](https://github.com/mdn/yari/commit/a2e1f44bafb8fe60f598d6c27771623d4abde9a9)) +* **deps-dev:** bump eslint-plugin-react from 7.37.2 to 7.37.3 ([#12372](https://github.com/mdn/yari/issues/12372)) ([d3e355e](https://github.com/mdn/yari/commit/d3e355eb3d601bfa601f44ade41bbee377f26bd8)) +* **deps-dev:** bump postcss-preset-env from 10.1.2 to 10.1.3 ([#12378](https://github.com/mdn/yari/issues/12378)) ([87463b5](https://github.com/mdn/yari/commit/87463b524f507a036d9f8daa10367bcfaaf6e7bf)) +* **deps-dev:** bump react-router-dom from 7.0.2 to 7.1.0 ([#12356](https://github.com/mdn/yari/issues/12356)) ([be09aa1](https://github.com/mdn/yari/commit/be09aa1099167906ec19fd76dcff0d87dcc079eb)) +* **deps-dev:** bump react-router-dom from 7.1.0 to 7.1.1 ([#12368](https://github.com/mdn/yari/issues/12368)) ([d02e97e](https://github.com/mdn/yari/commit/d02e97e7025f711c3c4a3c5cfbf2f8483b23b524)) +* **deps-dev:** bump sass from 1.83.0 to 1.83.1 ([#12390](https://github.com/mdn/yari/issues/12390)) ([156bf78](https://github.com/mdn/yari/commit/156bf78ec66b2f3a7921276dbab042f5edd1ade0)) +* **deps-dev:** bump swr from 2.2.5 to 2.3.0 ([#12370](https://github.com/mdn/yari/issues/12370)) ([8f33dc2](https://github.com/mdn/yari/commit/8f33dc2ab142f82b2b95ab23ea18825d7c7566ff)) +* **deps-dev:** bump typescript-eslint from 8.18.1 to 8.18.2 ([#12371](https://github.com/mdn/yari/issues/12371)) ([1ebac4b](https://github.com/mdn/yari/commit/1ebac4ba24c30ed61b3e72e6ee25ccf9b8c3fa59)) +* **deps-dev:** bump typescript-eslint from 8.18.2 to 8.19.0 ([#12381](https://github.com/mdn/yari/issues/12381)) ([cab191a](https://github.com/mdn/yari/commit/cab191afb1bd2f95f57d4c6232eb4ab14f659cc7)) +* **deps-dev:** bump typescript-eslint from 8.19.0 to 8.19.1 ([#12399](https://github.com/mdn/yari/issues/12399)) ([1043b96](https://github.com/mdn/yari/commit/1043b968e7e1210b39a7832c12a215220a7a47ce)) +* **deps:** bump @inquirer/prompts from 7.2.0 to 7.2.1 ([#12354](https://github.com/mdn/yari/issues/12354)) ([91fcfaa](https://github.com/mdn/yari/commit/91fcfaa5d66b282f394134edc43e94ff874c0972)) +* **deps:** bump @mdn/browser-compat-data from 5.6.26 to 5.6.27 ([#12389](https://github.com/mdn/yari/issues/12389)) ([83f14cc](https://github.com/mdn/yari/commit/83f14cc733363369c82520df1d483b4060ef5910)) +* **deps:** bump @mdn/browser-compat-data from 5.6.27 to 5.6.28 ([#12400](https://github.com/mdn/yari/issues/12400)) ([97897e7](https://github.com/mdn/yari/commit/97897e749bb5b814b7b62442e8883be6cf3263b9)) +* **deps:** bump @mdn/rari from 0.1.10 to 0.1.11 ([#12366](https://github.com/mdn/yari/issues/12366)) ([834630c](https://github.com/mdn/yari/commit/834630cab220cff7c2378f021e051a90b9a4a9fd)) +* **deps:** bump @mdn/rari from 0.1.11 to 0.1.12 ([#12377](https://github.com/mdn/yari/issues/12377)) ([8d8f2e6](https://github.com/mdn/yari/commit/8d8f2e64a09f80df4f4d89352bfc751c0bde2249)) +* **deps:** bump @mdn/rari from 0.1.12 to 0.1.13 ([#12384](https://github.com/mdn/yari/issues/12384)) ([8197ff9](https://github.com/mdn/yari/commit/8197ff9b10d04771c8649c90e2aab0bd38d9edb4)) +* **deps:** bump @mdn/rari from 0.1.13 to 0.1.14 ([#12407](https://github.com/mdn/yari/issues/12407)) ([84f2a80](https://github.com/mdn/yari/commit/84f2a80be617f7b66b0489000306415c5e44632b)) +* **deps:** bump @mdn/rari from 0.1.14 to 0.1.15 ([#12419](https://github.com/mdn/yari/issues/12419)) ([9b78ce0](https://github.com/mdn/yari/commit/9b78ce0517280a982fdbc284bebbc113e75ec71f)) +* **deps:** bump @sentry/node from 8.47.0 to 8.48.0 in the sentry group ([#12406](https://github.com/mdn/yari/issues/12406)) ([8dae013](https://github.com/mdn/yari/commit/8dae013920c9fc4e00fe81941b0277ff1bfe9cc3)) +* **deps:** bump @stripe/stripe-js from 5.4.0 to 5.5.0 ([#12408](https://github.com/mdn/yari/issues/12408)) ([3ccff9e](https://github.com/mdn/yari/commit/3ccff9ec609f5db57082c5cdf40283716d50ff44)) +* **deps:** bump boto3 from 1.35.86 to 1.35.92 in /deployer in the dependencies group across 1 directory ([#12395](https://github.com/mdn/yari/issues/12395)) ([bbe07c5](https://github.com/mdn/yari/commit/bbe07c528c6ab7376ca1f80896e83b9819a04bce)) +* **deps:** bump chalk from 5.3.0 to 5.4.1 ([#12353](https://github.com/mdn/yari/issues/12353)) ([94d918d](https://github.com/mdn/yari/commit/94d918d2abe9bfb8b0f2851885a7e7f761af34c3)) +* **deps:** bump concurrently from 9.1.0 to 9.1.1 ([#12376](https://github.com/mdn/yari/issues/12376)) ([06dc27a](https://github.com/mdn/yari/commit/06dc27a9a9deaccac07abefb0bac56bee921f8a7)) +* **deps:** bump concurrently from 9.1.1 to 9.1.2 ([#12382](https://github.com/mdn/yari/issues/12382)) ([21e9ac9](https://github.com/mdn/yari/commit/21e9ac9885591d7a6e4b6e6878086ec8cd9795b9)) +* **deps:** bump elasticsearch from 7.17.9 to 7.17.12 in /deployer ([#12412](https://github.com/mdn/yari/issues/12412)) ([c3da70b](https://github.com/mdn/yari/commit/c3da70bc03e3e3a91aac3aaa678ba56c35b3719f)) +* **deps:** bump image-size from 1.1.1 to 1.2.0 ([#12357](https://github.com/mdn/yari/issues/12357)) ([1919108](https://github.com/mdn/yari/commit/1919108d4085af701e15fdc68a5fa073608882fb)) +* **deps:** bump open-editor from 5.0.0 to 5.1.0 ([#12355](https://github.com/mdn/yari/issues/12355)) ([097eb74](https://github.com/mdn/yari/commit/097eb742a6a6d438f29083dc8319a2c1a308e47a)) +* **deps:** bump openai from 4.77.0 to 4.77.3 ([#12393](https://github.com/mdn/yari/issues/12393)) ([cb7f69a](https://github.com/mdn/yari/commit/cb7f69a87b98287b56e40f40e13a9f989be3d03a)) +* **deps:** bump openai from 4.77.3 to 4.77.4 ([#12418](https://github.com/mdn/yari/issues/12418)) ([6f19693](https://github.com/mdn/yari/commit/6f19693bc0c23f6e6f1195e8ee78000728adbf04)) +* **deps:** bump react-markdown from 9.0.1 to 9.0.2 ([#12392](https://github.com/mdn/yari/issues/12392)) ([bf798bc](https://github.com/mdn/yari/commit/bf798bc9d2a88d46434013032a6adda7d9ce49be)) +* **deps:** bump react-markdown from 9.0.2 to 9.0.3 ([#12401](https://github.com/mdn/yari/issues/12401)) ([210442b](https://github.com/mdn/yari/commit/210442be76dc420ad8d5d9e70520dfe77fe24679)) +* **deps:** bump the dependencies group in /deployer with 2 updates ([#12363](https://github.com/mdn/yari/issues/12363)) ([e735486](https://github.com/mdn/yari/commit/e735486ddc357860973f63d8952a137f50d24b34)) +* **deps:** bump web-features from 2.14.0 to 2.15.0 ([#12360](https://github.com/mdn/yari/issues/12360)) ([883708f](https://github.com/mdn/yari/commit/883708f4ef6f336aad0d517bef39e8755e9d97f3)) +* **deps:** bump web-features from 2.15.0 to 2.16.0 ([#12416](https://github.com/mdn/yari/issues/12416)) ([313a665](https://github.com/mdn/yari/commit/313a6655d1101eeb8a16bc9a211983d6ba02e9fe)) +* **deps:** bump web-specs from 3.31.0 to 3.32.0 ([#12391](https://github.com/mdn/yari/issues/12391)) ([7cb574c](https://github.com/mdn/yari/commit/7cb574c789369d00821e2ca03f9667708ad5df3e)) +* **lit:** move into separate folder and make tsconfig stricter ([#12398](https://github.com/mdn/yari/issues/12398)) ([e6a4bf4](https://github.com/mdn/yari/commit/e6a4bf4f9f34af49c41bb3cbe8ed69d34023eea2)) +* **placement:** change statimp -> statview ([#12404](https://github.com/mdn/yari/issues/12404)) ([1189820](https://github.com/mdn/yari/commit/1189820941b2fc8b7d314748a9745d050bbcea20)) +* **placement:** update Scrimba banner ([#12385](https://github.com/mdn/yari/issues/12385)) ([7a2639a](https://github.com/mdn/yari/commit/7a2639ae83d7fe5045500708268a380bfaef2421)) + +## [4.0.1](https://github.com/mdn/yari/compare/v4.0.0...v4.0.1) (2024-12-20) + + +### Miscellaneous + +* **deps-dev:** bump eslint-plugin-jest from 28.9.0 to 28.10.0 ([#12340](https://github.com/mdn/yari/issues/12340)) ([a0db3a4](https://github.com/mdn/yari/commit/a0db3a47f28807a0208663feb485bcd48f230075)) +* **deps-dev:** bump eslint-plugin-n from 17.15.0 to 17.15.1 ([#12345](https://github.com/mdn/yari/issues/12345)) ([7850cad](https://github.com/mdn/yari/commit/7850cad797d5e70a38c8da9e93f09c02bf831a3b)) +* **deps-dev:** bump resolve from 1.22.9 to 1.22.10 ([#12342](https://github.com/mdn/yari/issues/12342)) ([18cef57](https://github.com/mdn/yari/commit/18cef57e1e7285c913fbf06397be4d251f9eebc9)) +* **deps:** bump @mdn/browser-compat-data from 5.6.25 to 5.6.26 ([#12348](https://github.com/mdn/yari/issues/12348)) ([d1d253e](https://github.com/mdn/yari/commit/d1d253ef30082cbd5573780eda61f8ff228f76a0)) +* **deps:** bump @mdn/rari from 0.1.8 to 0.1.9 ([#12341](https://github.com/mdn/yari/issues/12341)) ([e1c20ea](https://github.com/mdn/yari/commit/e1c20eaa5c812ffa5185e10f8e640bf6764d01c5)) +* **deps:** bump @mdn/rari from 0.1.9 to 0.1.10 ([#12350](https://github.com/mdn/yari/issues/12350)) ([bc7e5a1](https://github.com/mdn/yari/commit/bc7e5a12a649ef9a713c77cddb572d612c6fd163)) +* **deps:** bump @stripe/stripe-js from 5.3.0 to 5.4.0 ([#12346](https://github.com/mdn/yari/issues/12346)) ([d0271a4](https://github.com/mdn/yari/commit/d0271a44f7db58afda99577ba3eaa470bf82474b)) +* **deps:** bump web-specs from 3.30.0 to 3.31.0 ([#12347](https://github.com/mdn/yari/issues/12347)) ([cd15a4a](https://github.com/mdn/yari/commit/cd15a4a4b4621ee4d0de0575fb21bdb60cffb3d2)) + +## [4.0.0](https://github.com/mdn/yari/compare/v3.1.0...v4.0.0) (2024-12-19) + + +### ⚠ BREAKING CHANGES + +* **rari:** rari is used by default use :legacy commands for yari + +### Features + +* **rari:** use rari as default ([#12322](https://github.com/mdn/yari/issues/12322)) ([e3da99d](https://github.com/mdn/yari/commit/e3da99d34e53c64da74f74c59c395ca6ee09e723)) + + +### Bug Fixes + +* **ci:** fix prod deployment ([#12323](https://github.com/mdn/yari/issues/12323)) ([abad977](https://github.com/mdn/yari/commit/abad97728fbcd3a59808d60e7af5018bd3d882f1)) +* **cloud-function:** fix en-us asset fallback ([#12335](https://github.com/mdn/yari/issues/12335)) ([64b6287](https://github.com/mdn/yari/commit/64b6287007f0b055ddc6da8bd6a8fdb8d37e9b19)) +* **dev-server:** fix top level assets with rari ([#12304](https://github.com/mdn/yari/issues/12304)) ([4c199f2](https://github.com/mdn/yari/commit/4c199f2a89274c177a9c5bc653a05086f931ba98)) +* **placement:** fix pattern regex ([#12317](https://github.com/mdn/yari/issues/12317)) ([18a1b26](https://github.com/mdn/yari/commit/18a1b2686943863e3f1e63827784269d170b1d2d)) +* **scripts/reorder-search-index:** no null values ([#12270](https://github.com/mdn/yari/issues/12270)) ([a5577ff](https://github.com/mdn/yari/commit/a5577ffd6d27904b5271d8d38d4f71ea20509409)) + + +### Miscellaneous + +* **deps-dev:** bump browserslist from 4.24.2 to 4.24.3 ([#12309](https://github.com/mdn/yari/issues/12309)) ([321030b](https://github.com/mdn/yari/commit/321030b0afd8b2d115f285f94e786cb6a9fd0d8a)) +* **deps-dev:** bump html-validate from 8.27.0 to 8.28.0 ([#12336](https://github.com/mdn/yari/issues/12336)) ([af80a8b](https://github.com/mdn/yari/commit/af80a8b24910d050c68f95796e9a64ffc313c301)) +* **deps-dev:** bump postcss-preset-env from 10.1.1 to 10.1.2 ([#12307](https://github.com/mdn/yari/issues/12307)) ([a1506d4](https://github.com/mdn/yari/commit/a1506d4c8361ff701c1daa6fe41fca4ebf6d7f45)) +* **deps-dev:** bump resolve from 1.22.8 to 1.22.9 ([#12311](https://github.com/mdn/yari/issues/12311)) ([c02dfb7](https://github.com/mdn/yari/commit/c02dfb7cf892fa04d2a78a7e20f752733787d0e4)) +* **deps-dev:** bump sass from 1.82.0 to 1.83.0 ([#12301](https://github.com/mdn/yari/issues/12301)) ([2a1e4e0](https://github.com/mdn/yari/commit/2a1e4e0efa20e06b63289a4238b57782adcb567f)) +* **deps-dev:** bump terser-webpack-plugin from 5.3.10 to 5.3.11 ([#12312](https://github.com/mdn/yari/issues/12312)) ([376b805](https://github.com/mdn/yari/commit/376b8059560e51b258c042211388bdbb6b653e86)) +* **deps-dev:** bump typescript-eslint from 8.18.0 to 8.18.1 ([#12318](https://github.com/mdn/yari/issues/12318)) ([d58f7d0](https://github.com/mdn/yari/commit/d58f7d0c280b3ebb02d5456b87a607ae6bc9bfc0)) +* **deps:** bump @mdn/browser-compat-data from 5.6.23 to 5.6.24 ([#12299](https://github.com/mdn/yari/issues/12299)) ([0133803](https://github.com/mdn/yari/commit/0133803b81979f7fbc8c30477a8ed57bb00b4566)) +* **deps:** bump @mdn/browser-compat-data from 5.6.24 to 5.6.25 ([#12326](https://github.com/mdn/yari/issues/12326)) ([d926bae](https://github.com/mdn/yari/commit/d926bae45f46502fc7da50b4e80982b701eadc03)) +* **deps:** bump @mdn/rari from 0.1.2 to 0.1.3 ([#12306](https://github.com/mdn/yari/issues/12306)) ([aaad1bd](https://github.com/mdn/yari/commit/aaad1bda828a9b12a0de89a5a19b0d0223fdd4d5)) +* **deps:** bump @mdn/rari from 0.1.3 to 0.1.4 ([#12316](https://github.com/mdn/yari/issues/12316)) ([4aeeddf](https://github.com/mdn/yari/commit/4aeeddf647cea13803de1759a6ecdc72bcd76521)) +* **deps:** bump @mdn/rari from 0.1.4 to 0.1.5 ([#12321](https://github.com/mdn/yari/issues/12321)) ([31e4a55](https://github.com/mdn/yari/commit/31e4a55c2eb376b9f991ae2f2156c63bb732b9d3)) +* **deps:** bump @mdn/rari from 0.1.5 to 0.1.6 ([#12329](https://github.com/mdn/yari/issues/12329)) ([e74416d](https://github.com/mdn/yari/commit/e74416df0bd24a1f339f2305c0a894186e4ac9e0)) +* **deps:** bump @mdn/rari from 0.1.6 to 0.1.7 ([#12333](https://github.com/mdn/yari/issues/12333)) ([893f02b](https://github.com/mdn/yari/commit/893f02bb6fabd9587ef7cee1e6f46540a8a1d50f)) +* **deps:** bump @mdn/rari from 0.1.7 to 0.1.8 ([#12338](https://github.com/mdn/yari/issues/12338)) ([b4a7dbd](https://github.com/mdn/yari/commit/b4a7dbdef414e7e8e24a0125a2d8318462642b3b)) +* **deps:** bump @sentry/node from 8.44.0 to 8.45.0 in the sentry group ([#12305](https://github.com/mdn/yari/issues/12305)) ([e63066f](https://github.com/mdn/yari/commit/e63066fe5cd73c014ff39898fd1140e2d383ca9c)) +* **deps:** bump @sentry/node from 8.45.0 to 8.45.1 in the sentry group ([#12314](https://github.com/mdn/yari/issues/12314)) ([1a102d1](https://github.com/mdn/yari/commit/1a102d19b04b6396fb2445bcb1524060fc93d444)) +* **deps:** bump @sentry/node from 8.45.1 to 8.46.0 in the sentry group ([#12319](https://github.com/mdn/yari/issues/12319)) ([615f68d](https://github.com/mdn/yari/commit/615f68d54531859463f121ab8e0a6cc511cfbb69)) +* **deps:** bump @sentry/node from 8.46.0 to 8.47.0 in the sentry group ([#12332](https://github.com/mdn/yari/issues/12332)) ([661efd3](https://github.com/mdn/yari/commit/661efd357f1e1ba435f3b9a1c101dfead2b30c66)) +* **deps:** bump @stripe/stripe-js from 5.2.0 to 5.3.0 ([#12298](https://github.com/mdn/yari/issues/12298)) ([f4dc50b](https://github.com/mdn/yari/commit/f4dc50ba565afdba09dcc8f98818c51c5930f3a2)) +* **deps:** bump mdn-data from 2.13.0 to 2.14.0 ([#12325](https://github.com/mdn/yari/issues/12325)) ([616c055](https://github.com/mdn/yari/commit/616c0550efd475d516834cf6cd9e3d3ccc4ee94a)) +* **deps:** bump openai from 4.76.1 to 4.76.2 ([#12300](https://github.com/mdn/yari/issues/12300)) ([7506fd2](https://github.com/mdn/yari/commit/7506fd2c36386d6ed116f68ece1e7529ec4563c4)) +* **deps:** bump openai from 4.76.2 to 4.76.3 ([#12308](https://github.com/mdn/yari/issues/12308)) ([d6351b2](https://github.com/mdn/yari/commit/d6351b25fc066e5f030971432ae0b7a0e67dfbdb)) +* **deps:** bump openai from 4.76.3 to 4.77.0 ([#12327](https://github.com/mdn/yari/issues/12327)) ([8740e44](https://github.com/mdn/yari/commit/8740e4493c1ea6c0cdc773eca60dd5cfe8f5e12b)) +* **deps:** bump react-modal from 3.16.1 to 3.16.3 ([#12328](https://github.com/mdn/yari/issues/12328)) ([17b9153](https://github.com/mdn/yari/commit/17b9153b7dba71e55b1432c355d4aa54bfe83518)) +* **deps:** bump the dependencies group in /deployer with 2 updates ([#12313](https://github.com/mdn/yari/issues/12313)) ([cdc52ad](https://github.com/mdn/yari/commit/cdc52ad575339fdcb0b8623456d05cb0cdce9f6a)) +* **deps:** bump web-features from 2.11.0 to 2.13.0 ([#12310](https://github.com/mdn/yari/issues/12310)) ([f93c95d](https://github.com/mdn/yari/commit/f93c95d14731e0a0fcb624fdbd1273add0dbde00)) +* **deps:** bump web-features from 2.13.0 to 2.14.0 ([#12330](https://github.com/mdn/yari/issues/12330)) ([f289637](https://github.com/mdn/yari/commit/f28963719e2b481b795d7b899b8922d1d7ed5987)) +* **deps:** bump web-specs from 3.29.0 to 3.30.0 ([#12315](https://github.com/mdn/yari/issues/12315)) ([4f9f8ef](https://github.com/mdn/yari/commit/4f9f8efd32a169eabf012c75df69d0beeab74ffd)) + +## [3.1.0](https://github.com/mdn/yari/compare/v3.0.1...v3.1.0) (2024-12-12) + + +### Features + +* new about page ([#12069](https://github.com/mdn/yari/issues/12069)) ([c9437ce](https://github.com/mdn/yari/commit/c9437ce4412874b66cf4429162c07524c67109e8)) +* **observatory:** cookies tab rework ([#12203](https://github.com/mdn/yari/issues/12203)) ([6c3977c](https://github.com/mdn/yari/commit/6c3977cb47f9de79e16c5cb551bb41150e1daa41)) +* **spas:** streamline 404 ([#12248](https://github.com/mdn/yari/issues/12248)) ([6646831](https://github.com/mdn/yari/commit/6646831b8d89f7dfeddb892a801942909de7031a)) + + +### Bug Fixes + +* **about:** small fixes ([#12269](https://github.com/mdn/yari/issues/12269)) ([bb3f8ec](https://github.com/mdn/yari/commit/bb3f8ec5ea9310ce255b50674c7bdb43704c18ca)) +* add border on search input field on home page hero so that input is more visible on safari mobile ([c2dc988](https://github.com/mdn/yari/commit/c2dc9888be46ef6a8c9de0155e79e62d8f5e6c4e)) +* **css:** set border color on home page search input field ([#11931](https://github.com/mdn/yari/issues/11931)) ([c2dc988](https://github.com/mdn/yari/commit/c2dc9888be46ef6a8c9de0155e79e62d8f5e6c4e)) +* **deployer:** limit comment length ([#12294](https://github.com/mdn/yari/issues/12294)) ([e36c538](https://github.com/mdn/yari/commit/e36c538d8c8eb82435ff133df287483749ae1cb8)) +* **i10n:** localize secureContext header and inline text in ko ([#12183](https://github.com/mdn/yari/issues/12183)) ([3e781a0](https://github.com/mdn/yari/commit/3e781a096f76db4efd7237458a7ab41dcf3fdd8b)) +* **layout:** avoid sticky header gap ([#11644](https://github.com/mdn/yari/issues/11644)) ([ee6c092](https://github.com/mdn/yari/commit/ee6c0922a186729eef873f21eadee6560da7fde9)) +* **playground:** run code even if it doesn't change ([#12224](https://github.com/mdn/yari/issues/12224)) ([a52bb26](https://github.com/mdn/yari/commit/a52bb2610b4460c994bb0820bdb6412bb9b50fa9)) +* **playground:** use localhost if on localhost ([#12227](https://github.com/mdn/yari/issues/12227)) ([e11f62e](https://github.com/mdn/yari/commit/e11f62e3aff0c4ffcf6a9f26d01656cd8bcf6d95)) +* **play:** proxy `/runner.html` locally, not just subpaths ([#12282](https://github.com/mdn/yari/issues/12282)) ([4e9c442](https://github.com/mdn/yari/commit/4e9c442a7150256f2807abc05983e7cd88186a67)) +* **rari:** adopt to rari changes ([#12257](https://github.com/mdn/yari/issues/12257)) ([4cc84ca](https://github.com/mdn/yari/commit/4cc84ca6913ea8b8d237e0afb4ce58e3cba49bbb)) +* **rari:** fix blog and add .env support ([#12268](https://github.com/mdn/yari/issues/12268)) ([2b5fb1b](https://github.com/mdn/yari/commit/2b5fb1b67f1f1012ee75e856560bd8914efe4b4a)) +* **search-index:** use en-US popularities for German ([#12212](https://github.com/mdn/yari/issues/12212)) ([8efafd6](https://github.com/mdn/yari/commit/8efafd60af38abe1b719dbe09bcb82fd14149f70)) +* **tsconfig:** don't allow importing ts extensions in pwa ([#12258](https://github.com/mdn/yari/issues/12258)) ([b47a1a8](https://github.com/mdn/yari/commit/b47a1a87798e11e2c85f0b1b1c96d58591e4d379)) + + +### Miscellaneous + +* **deps-dev:** bump @playwright/test from 1.49.0 to 1.49.1 ([#12279](https://github.com/mdn/yari/issues/12279)) ([43e240b](https://github.com/mdn/yari/commit/43e240b882304ef40b3b7df49a0ecba3f180fad4)) +* **deps-dev:** bump @swc/core from 1.10.0 to 1.10.1 ([#12272](https://github.com/mdn/yari/issues/12272)) ([0070b8b](https://github.com/mdn/yari/commit/0070b8b58b387d950f63538fa7189ed7fd6e71f6)) +* **deps-dev:** bump @swc/core from 1.9.3 to 1.10.0 ([#12239](https://github.com/mdn/yari/issues/12239)) ([938a19f](https://github.com/mdn/yari/commit/938a19f58cfe34370a4a2c85bf1484854847c303)) +* **deps-dev:** bump @types/node from 18.19.67 to 18.19.68 in the types group ([#12285](https://github.com/mdn/yari/issues/12285)) ([143546a](https://github.com/mdn/yari/commit/143546a55c299ed8f0b5b95e4da0b43d36bc9509)) +* **deps-dev:** bump @types/react from 18.3.12 to 18.3.13 in the types group ([#12249](https://github.com/mdn/yari/issues/12249)) ([6ee580e](https://github.com/mdn/yari/commit/6ee580e7a6841224a12c466bb7480d657dcf670c)) +* **deps-dev:** bump eslint-plugin-n from 17.14.0 to 17.15.0 ([#12278](https://github.com/mdn/yari/issues/12278)) ([c579a03](https://github.com/mdn/yari/commit/c579a03f9d567073a200d91fc6b37129a4747574)) +* **deps-dev:** bump eslint-plugin-react-hooks from 5.0.0 to 5.1.0 ([#12264](https://github.com/mdn/yari/issues/12264)) ([800396f](https://github.com/mdn/yari/commit/800396f80b4d53d9f3671951c30e56cfc2b7e01e)) +* **deps-dev:** bump prettier from 3.4.1 to 3.4.2 ([#12241](https://github.com/mdn/yari/issues/12241)) ([cd0d02d](https://github.com/mdn/yari/commit/cd0d02de14148a5e3817c8315d744df6d594d37a)) +* **deps-dev:** bump react-refresh from 0.14.2 to 0.16.0 ([#12260](https://github.com/mdn/yari/issues/12260)) ([d236378](https://github.com/mdn/yari/commit/d2363783247d475e5efe692484198b969e3e7066)) +* **deps-dev:** bump react-router[-dom] from 6.28.0 to 7.0.2 ([#12247](https://github.com/mdn/yari/issues/12247)) ([11a675c](https://github.com/mdn/yari/commit/11a675cca2f7a8683b67d201bf44ea9df3e171a3)) +* **deps-dev:** bump sass from 1.81.0 to 1.81.1 ([#12235](https://github.com/mdn/yari/issues/12235)) ([4323603](https://github.com/mdn/yari/commit/432360300be040872f029429e3e11104858d724e)) +* **deps-dev:** bump sass from 1.81.1 to 1.82.0 ([#12242](https://github.com/mdn/yari/issues/12242)) ([417bd61](https://github.com/mdn/yari/commit/417bd61dce8eff6a66afc0f05149311f9505f765)) +* **deps-dev:** bump sass-loader from 16.0.3 to 16.0.4 ([#12243](https://github.com/mdn/yari/issues/12243)) ([caf02a9](https://github.com/mdn/yari/commit/caf02a950b0586bbc4b80cfa8f59617e2601a9b2)) +* **deps-dev:** bump typescript from 5.6.3 to 5.7.2 ([#12179](https://github.com/mdn/yari/issues/12179)) ([10faab1](https://github.com/mdn/yari/commit/10faab1594b3ae89613f1a59774f746c08d93d11)) +* **deps-dev:** bump typescript-eslint from 8.16.0 to 8.17.0 ([#12233](https://github.com/mdn/yari/issues/12233)) ([9c42e64](https://github.com/mdn/yari/commit/9c42e64f936ad53dc74072f2ff27b7ec34e2180f)) +* **deps-dev:** bump typescript-eslint from 8.17.0 to 8.18.0 ([#12276](https://github.com/mdn/yari/issues/12276)) ([cc13e67](https://github.com/mdn/yari/commit/cc13e672503d27907e2429fe031797fb342f1f30)) +* **deps-dev:** bump webpack from 5.96.1 to 5.97.0 ([#12240](https://github.com/mdn/yari/issues/12240)) ([84ef860](https://github.com/mdn/yari/commit/84ef8605ef880f0765cfd9ccbaddc68070781bd0)) +* **deps-dev:** bump webpack from 5.96.1 to 5.97.0 in /client/pwa ([#12238](https://github.com/mdn/yari/issues/12238)) ([4142b9e](https://github.com/mdn/yari/commit/4142b9eb49619654374c4b0784053a5ec2d3b5f9)) +* **deps-dev:** bump webpack from 5.97.0 to 5.97.1 ([#12253](https://github.com/mdn/yari/issues/12253)) ([5068fdc](https://github.com/mdn/yari/commit/5068fdc8a7d1774b9e70d60aceeec2fbc3cfdc42)) +* **deps-dev:** bump webpack from 5.97.0 to 5.97.1 in /client/pwa ([#12266](https://github.com/mdn/yari/issues/12266)) ([8c5d1c9](https://github.com/mdn/yari/commit/8c5d1c956654d888e07f228246c732dac6fb39ae)) +* **deps-dev:** bump webpack-dev-server from 5.1.0 to 5.2.0 ([#12293](https://github.com/mdn/yari/issues/12293)) ([c4b8639](https://github.com/mdn/yari/commit/c4b86399bfdea813b7634e79afb21a51753e7f38)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.53 to 2.7.54 in /client/pwa ([#12265](https://github.com/mdn/yari/issues/12265)) ([ca2b58d](https://github.com/mdn/yari/commit/ca2b58dcce4566e6edafcb12b08054f5a9bac063)) +* **deps:** bump @codemirror/state from 6.4.1 to 6.5.0 ([#12280](https://github.com/mdn/yari/issues/12280)) ([1aa2f76](https://github.com/mdn/yari/commit/1aa2f7642fa9ffae34938c2924a72a62e4c38632)) +* **deps:** bump @inquirer/prompts from 7.1.0 to 7.2.0 ([#12274](https://github.com/mdn/yari/issues/12274)) ([57c2172](https://github.com/mdn/yari/commit/57c217219cc257b14d5b5395c47b191df00b8bf5)) +* **deps:** bump @mdn/browser-compat-data from 5.6.20 to 5.6.21 ([#12246](https://github.com/mdn/yari/issues/12246)) ([31b3640](https://github.com/mdn/yari/commit/31b3640348600018bfbc0fc33254f052754bb6e1)) +* **deps:** bump @mdn/browser-compat-data from 5.6.21 to 5.6.22 ([#12273](https://github.com/mdn/yari/issues/12273)) ([fbd7618](https://github.com/mdn/yari/commit/fbd76184051ca1942a5aac6f6b0203f8932fca94)) +* **deps:** bump @mdn/browser-compat-data from 5.6.22 to 5.6.23 ([#12289](https://github.com/mdn/yari/issues/12289)) ([275eab7](https://github.com/mdn/yari/commit/275eab76ddd688ecbb118bda08a4b37ce239822c)) +* **deps:** bump @mdn/rari from 0.0.26 to 0.1.0 ([#12254](https://github.com/mdn/yari/issues/12254)) ([5f63108](https://github.com/mdn/yari/commit/5f63108ba7bbfe2ae425b61062c74cb62a4e3bb8)) +* **deps:** bump @mdn/rari from 0.1.0 to 0.1.2 ([#12292](https://github.com/mdn/yari/issues/12292)) ([1e9134b](https://github.com/mdn/yari/commit/1e9134b7d5e9de690a2409af2c98a6f80a9a707c)) +* **deps:** bump @sentry/node from 8.41.0 to 8.42.0 in the sentry group ([#12229](https://github.com/mdn/yari/issues/12229)) ([f21084a](https://github.com/mdn/yari/commit/f21084a85564aa9e572438e8437dc8872d231b32)) +* **deps:** bump @sentry/node from 8.42.0 to 8.43.0 in the sentry group ([#12284](https://github.com/mdn/yari/issues/12284)) ([b8a904b](https://github.com/mdn/yari/commit/b8a904b4e906236ee8c3540ba7afeb05fb5006c3)) +* **deps:** bump @sentry/node from 8.43.0 to 8.44.0 in the sentry group ([#12295](https://github.com/mdn/yari/issues/12295)) ([edf147b](https://github.com/mdn/yari/commit/edf147bec98b36fce089ae3ad9e9a53e559630fc)) +* **deps:** bump @stripe/stripe-js from 4.10.0 to 5.2.0 ([#12154](https://github.com/mdn/yari/issues/12154)) ([b75fd00](https://github.com/mdn/yari/commit/b75fd0009950cf0390dfec4754eb686a2405af6b)) +* **deps:** bump @webref/css from 6.17.4 to 6.17.5 ([#12250](https://github.com/mdn/yari/issues/12250)) ([aeb1c1d](https://github.com/mdn/yari/commit/aeb1c1d4f8f0bd11ca10cdcf96dae8f2e0430879)) +* **deps:** bump boto3 from 1.35.72 to 1.35.76 in /deployer in the dependencies group ([#12271](https://github.com/mdn/yari/issues/12271)) ([e39a8cc](https://github.com/mdn/yari/commit/e39a8cc0c8aa97e6ab742edbad787e7bd4e8d78e)) +* **deps:** bump dotenv from 16.4.5 to 16.4.6 ([#12234](https://github.com/mdn/yari/issues/12234)) ([14057b3](https://github.com/mdn/yari/commit/14057b3b9f8be96a8c2ac893a9582f694d624e9f)) +* **deps:** bump dotenv from 16.4.6 to 16.4.7 ([#12245](https://github.com/mdn/yari/issues/12245)) ([070d6cb](https://github.com/mdn/yari/commit/070d6cbffb9d7f30656eff757903535731476ad8)) +* **deps:** bump express from 4.21.1 to 4.21.2 ([#12263](https://github.com/mdn/yari/issues/12263)) ([dfa235c](https://github.com/mdn/yari/commit/dfa235ccd419012fecb3a52f4bd7f4d2ff9b548d)) +* **deps:** bump mdn-data from 2.12.2 to 2.13.0 ([#12259](https://github.com/mdn/yari/issues/12259)) ([63a7244](https://github.com/mdn/yari/commit/63a7244e18220d5bfca5fc18bbbc12c348bf4728)) +* **deps:** bump nanoid from 3.3.7 to 3.3.8 ([#12281](https://github.com/mdn/yari/issues/12281)) ([c52e26f](https://github.com/mdn/yari/commit/c52e26f1b7c9f9e7afba7a4e5c51ee42a9667e83)) +* **deps:** bump openai from 4.73.1 to 4.74.0 ([#12232](https://github.com/mdn/yari/issues/12232)) ([62daae6](https://github.com/mdn/yari/commit/62daae624352146f79dbde386266688634fe400d)) +* **deps:** bump openai from 4.74.0 to 4.75.0 ([#12244](https://github.com/mdn/yari/issues/12244)) ([c6bb72e](https://github.com/mdn/yari/commit/c6bb72e3c1b9cd15b0f4aa9bc0a6660fc3d7cc7c)) +* **deps:** bump openai from 4.75.0 to 4.76.0 ([#12262](https://github.com/mdn/yari/issues/12262)) ([e213087](https://github.com/mdn/yari/commit/e21308788df86c45fa0e8b347cc0c8646f0ead48)) +* **deps:** bump openai from 4.76.0 to 4.76.1 ([#12286](https://github.com/mdn/yari/issues/12286)) ([f194598](https://github.com/mdn/yari/commit/f19459869e3c1d0e1f9210f0bac57da3d1a5d398)) +* **deps:** bump pytest from 8.3.3 to 8.3.4 in /testing/integration in the dependencies group ([#12223](https://github.com/mdn/yari/issues/12223)) ([c896d1c](https://github.com/mdn/yari/commit/c896d1c1d940ad92a5eebc3491b1d8e2108943f0)) +* **deps:** bump pytest-rerunfailures from 14.0 to 15.0 in /testing/integration ([#12173](https://github.com/mdn/yari/issues/12173)) ([cc34e67](https://github.com/mdn/yari/commit/cc34e6775bb195ec6a07ae5e9370d745b58f1a68)) +* **deps:** bump send from 0.19.0 to 1.1.0 ([#11946](https://github.com/mdn/yari/issues/11946)) ([475eb73](https://github.com/mdn/yari/commit/475eb73c04dd06dc223b8639bb1ef70e6de08bbd)) +* **deps:** bump the dependencies group in /deployer with 2 updates ([#12222](https://github.com/mdn/yari/issues/12222)) ([78c4077](https://github.com/mdn/yari/commit/78c407722c651d8887f4a112f827b98600fa7ab6)) +* **deps:** bump web-features from 2.10.0 to 2.11.0 ([#12255](https://github.com/mdn/yari/issues/12255)) ([f3801ff](https://github.com/mdn/yari/commit/f3801ffec8015f2240998caf7ddcf6ea20188fd8)) +* **deps:** bump web-features from 2.8.0 to 2.10.0 ([#12231](https://github.com/mdn/yari/issues/12231)) ([0b1e24a](https://github.com/mdn/yari/commit/0b1e24a304997b560092c46bf8227c661238ee7a)) +* **deps:** bump web-specs from 3.28.0 to 3.29.0 ([#12277](https://github.com/mdn/yari/issues/12277)) ([13c44cc](https://github.com/mdn/yari/commit/13c44cc0e5e72c28c590d9c55d486f063bcf7b22)) +* **footer:** update Mastodon link ([#12267](https://github.com/mdn/yari/issues/12267)) ([5f63c83](https://github.com/mdn/yari/commit/5f63c83a2fa3f45862a5454b687adb8fe8617727)) +* **lit:** add linting and fix ([#12221](https://github.com/mdn/yari/issues/12221)) ([3d403a9](https://github.com/mdn/yari/commit/3d403a98caede73783b10afd3d8f2832c51a7791)) +* move copy to external generic-content repo ([#12068](https://github.com/mdn/yari/issues/12068)) ([c3cdab2](https://github.com/mdn/yari/commit/c3cdab20aae41ac05b926ce6567b6dd5ce1af3a0)) +* **placement:** add hpTop ([#12228](https://github.com/mdn/yari/issues/12228)) ([a31ba5f](https://github.com/mdn/yari/commit/a31ba5fba3569a83a20a20934639034488f0668a)) +* **playground:** add comment to keep in sync ([#12275](https://github.com/mdn/yari/issues/12275)) ([10a8d7d](https://github.com/mdn/yari/commit/10a8d7d38067e1937260b84a4492c5d534db5cf8)) +* **playground:** migrate console to web component ([#12251](https://github.com/mdn/yari/issues/12251)) ([a9daa1f](https://github.com/mdn/yari/commit/a9daa1fdb92401521bfb3e3ab4693c68957320c7)) +* **scrimba:** remove past banner and update link ([#12237](https://github.com/mdn/yari/issues/12237)) ([54caba3](https://github.com/mdn/yari/commit/54caba3a3874408b6a8428ee51fd0bab163eebed)) +* **survey:** keep hp survey a bit longer ([#12256](https://github.com/mdn/yari/issues/12256)) ([4897328](https://github.com/mdn/yari/commit/4897328aa1ba6dea619bb2dc51d2b0677e33b902)) + +## [3.0.1](https://github.com/mdn/yari/compare/v3.0.0...v3.0.1) (2024-12-01) + + +### Bug Fixes + +* **bcd:** use Safari icon for iOS WebView ([#12214](https://github.com/mdn/yari/issues/12214)) ([f800c24](https://github.com/mdn/yari/commit/f800c248a6b6a5dcd7a504b44235d1407fe0780e)) +* **livesamples:** livesamples must not use port from parent ([#12216](https://github.com/mdn/yari/issues/12216)) ([1c12a81](https://github.com/mdn/yari/commit/1c12a81da823e6bcdc378f8d93386b36bdd82ac8)) +* **stage-build:** abort main merge on conflict ([#12206](https://github.com/mdn/yari/issues/12206)) ([ab03594](https://github.com/mdn/yari/commit/ab035949340ede06b7f615c24fc76e28ffa2b44f)) + + +### Enhancements + +* **layout:** add margin for "(en-US)" indicator ([#12204](https://github.com/mdn/yari/issues/12204)) ([450e433](https://github.com/mdn/yari/commit/450e433f9c555cfb566573e9d6799061f7d9d870)) + + +### Miscellaneous + +* **ai-help:** use index.json instead of plain.html for embedding sources ([#12182](https://github.com/mdn/yari/issues/12182)) ([ab93f16](https://github.com/mdn/yari/commit/ab93f163ac378bded4c4dafac7a2f79db24b3ec1)) +* **deps-dev:** bump html-validate from 8.26.0 to 8.27.0 ([#12217](https://github.com/mdn/yari/issues/12217)) ([f9bf33e](https://github.com/mdn/yari/commit/f9bf33e91e2adc367f19efd631f62b6125cc9bc4)) +* **deps:** bump @mdn/browser-compat-data from 5.6.19 to 5.6.20 ([#12218](https://github.com/mdn/yari/issues/12218)) ([7732f91](https://github.com/mdn/yari/commit/7732f91bef0f08ae0bbb4222259749f3a99402ee)) +* **deps:** bump @mdn/rari from 0.0.25 to 0.0.26 ([#12219](https://github.com/mdn/yari/issues/12219)) ([faab651](https://github.com/mdn/yari/commit/faab6515d8394ce7cffcbcefc1091e29cefe072d)) +* **deps:** bump concurrently from 9.0.1 to 9.1.0 ([#12209](https://github.com/mdn/yari/issues/12209)) ([8e0d1f9](https://github.com/mdn/yari/commit/8e0d1f9a7afd96bbef3e3abb550bd496ee4f30f0)) +* **ssr:** let search engines index German locale ([#12210](https://github.com/mdn/yari/issues/12210)) ([5340802](https://github.com/mdn/yari/commit/53408027c2728cd952d194b0b0db059ef87497e0)) +* **workflows:** remove test-de build ([#12207](https://github.com/mdn/yari/issues/12207)) ([50b72fc](https://github.com/mdn/yari/commit/50b72fc78c93e9f48e548124d1684b1c8c1888b1)) + +## [3.0.0](https://github.com/mdn/yari/compare/v2.65.1...v3.0.0) (2024-11-29) + + +### ⚠ BREAKING CHANGES + +* **deps:** bump NodeJS from v18 to v20 ([#12052](https://github.com/mdn/yari/issues/12052)) + +### Features + +* **de:** launch German translation experiment ([#12033](https://github.com/mdn/yari/issues/12033)) ([22d6890](https://github.com/mdn/yari/commit/22d6890571155ed7d99d8fa37edcc78ca1001981)) +* **placement:** new gradient ([#12197](https://github.com/mdn/yari/issues/12197)) ([6f891d9](https://github.com/mdn/yari/commit/6f891d955d11655d155734df846beb67e3e2ef12)) +* **playground:** playground backend v2 ([#12136](https://github.com/mdn/yari/issues/12136)) ([f1417ae](https://github.com/mdn/yari/commit/f1417ae2af856fdb1f5627f065604a50f0aa557f)) +* **playground:** support state param in playground ([#12168](https://github.com/mdn/yari/issues/12168)) ([4390f8c](https://github.com/mdn/yari/commit/4390f8cbcb678a399ab249c2e9456f6107afd6bb)) +* **rari:** support rari as beta feature and new popularities ([#12051](https://github.com/mdn/yari/issues/12051)) ([1feb487](https://github.com/mdn/yari/commit/1feb4871957305eba3f654ad4e3749399e874cdc)) +* **survey:** homepage survey 2024 ([#12115](https://github.com/mdn/yari/issues/12115)) ([55158d8](https://github.com/mdn/yari/commit/55158d864af2072af1f3eaa251343697ddf0f4ed)) +* **survey:** webdx editing survey ([#12132](https://github.com/mdn/yari/issues/12132)) ([ecf6b9e](https://github.com/mdn/yari/commit/ecf6b9e80c17490ad6ee654be96d59bc2c678d8e)) + + +### Bug Fixes + +* **article-footer:** fix typo ([#12098](https://github.com/mdn/yari/issues/12098)) ([fa9cb13](https://github.com/mdn/yari/commit/fa9cb130d4302b03e0c206558de4a5145ca6ff7c)) +* **css:** fix upside-down rendering of CJK characters in translation ([#11922](https://github.com/mdn/yari/issues/11922)) ([2a0d85c](https://github.com/mdn/yari/commit/2a0d85ce53244f07cd716ea3c3f1c28dcacac416)) +* **flaws:** re-add href to broken links as data ([#12131](https://github.com/mdn/yari/issues/12131)) ([052dae6](https://github.com/mdn/yari/commit/052dae6bd5dd719380fba33d15837dc4542201a1)) +* **flaws:** shared assets images must no be flaws ([#12133](https://github.com/mdn/yari/issues/12133)) ([b3013f9](https://github.com/mdn/yari/commit/b3013f9bc3f77529fde52d051909682f6649c892)) +* **font:** disable contextual variant ligatures in headings ([#12134](https://github.com/mdn/yari/issues/12134)) ([5261286](https://github.com/mdn/yari/commit/52612867279431ca0ac9a3215647324343248fb6)) +* **livesamples:** fix data attribute for path ([#12169](https://github.com/mdn/yari/issues/12169)) ([2abd073](https://github.com/mdn/yari/commit/2abd073df738d99366a7d7bb11ac58fadade23a1)) +* **playground:** fix chrome canary ([#12137](https://github.com/mdn/yari/issues/12137)) ([1302e48](https://github.com/mdn/yari/commit/1302e483d0a5106d4dafa7f29f486d0f44e0c6bd)) +* **playground:** fix layout in chrome when all editors are collapsed ([#12162](https://github.com/mdn/yari/issues/12162)) ([8dbd410](https://github.com/mdn/yari/commit/8dbd4100fb402009af30b06a33a2726f5a5646bd)) +* **release:** correct the filename of the `ssr` cli ([#12205](https://github.com/mdn/yari/issues/12205)) ([2c8fff2](https://github.com/mdn/yari/commit/2c8fff211e516edf16804736a556f0660b9cefef)) +* **ssr:** ensure locale is set ([#12096](https://github.com/mdn/yari/issues/12096)) ([8f780a8](https://github.com/mdn/yari/commit/8f780a8ca6802e9248a3bc8c398286dc1e679138)) +* **tool/gather-git-history:** skip German locale ([#12120](https://github.com/mdn/yari/issues/12120)) ([c78bd6d](https://github.com/mdn/yari/commit/c78bd6d27310d65be328467313e36ff2990b69cf)) + + +### Enhancements + +* **a11y-nav:** fix background and padding ([#12121](https://github.com/mdn/yari/issues/12121)) ([10a819c](https://github.com/mdn/yari/commit/10a819ca175ea9bc8ba87a96d18b34a7d29f300b)) +* **telemetry:** measure BCD table views, link clicks, cell expansions ([#12030](https://github.com/mdn/yari/issues/12030)) ([a33ce9c](https://github.com/mdn/yari/commit/a33ce9cae8f2eaf988f6226eb293ca609f369151)) + + +### Miscellaneous + +* **deps-dev:** bump @playwright/test from 1.48.2 to 1.49.0 ([#12149](https://github.com/mdn/yari/issues/12149)) ([7b52352](https://github.com/mdn/yari/commit/7b52352784036080e4e4019a667ed1df698748df)) +* **deps-dev:** bump @swc/core from 1.7.40 to 1.7.42 ([#12065](https://github.com/mdn/yari/issues/12065)) ([17939b0](https://github.com/mdn/yari/commit/17939b01a90b750b236253c372554f868ddc8317)) +* **deps-dev:** bump @swc/core from 1.7.42 to 1.8.0 ([#12082](https://github.com/mdn/yari/issues/12082)) ([5a5d16f](https://github.com/mdn/yari/commit/5a5d16fcfb97632356d7e38e0602c5dea88897d4)) +* **deps-dev:** bump @swc/core from 1.8.0 to 1.9.0 ([#12094](https://github.com/mdn/yari/issues/12094)) ([e50e40f](https://github.com/mdn/yari/commit/e50e40f51dbd3bf2e5bd80fc14e928b8c68d9efb)) +* **deps-dev:** bump @swc/core from 1.9.0 to 1.9.1 ([#12102](https://github.com/mdn/yari/issues/12102)) ([cca0abb](https://github.com/mdn/yari/commit/cca0abbd6f804a78db27dbeb0686184ef4de34f3)) +* **deps-dev:** bump @swc/core from 1.9.1 to 1.9.2 ([#12114](https://github.com/mdn/yari/issues/12114)) ([d738bf9](https://github.com/mdn/yari/commit/d738bf9305750451f53412fcb9334ff2c533ac2c)) +* **deps-dev:** bump @swc/core from 1.9.2 to 1.9.3 ([#12166](https://github.com/mdn/yari/issues/12166)) ([986c406](https://github.com/mdn/yari/commit/986c406216c666de0c127d76b73a23118b15e645)) +* **deps-dev:** bump @types/node from 18.19.61 to 18.19.62 in the types group ([#12062](https://github.com/mdn/yari/issues/12062)) ([6181b8c](https://github.com/mdn/yari/commit/6181b8cccb6ff8bbf01b9311d6b8fb00360b3abd)) +* **deps-dev:** bump @types/node from 18.19.62 to 18.19.63 in the types group ([#12071](https://github.com/mdn/yari/issues/12071)) ([fd234b8](https://github.com/mdn/yari/commit/fd234b811d331f63fc3682b7ad28c4e8dea64036)) +* **deps-dev:** bump @types/node from 18.19.63 to 18.19.64 in the types group ([#12079](https://github.com/mdn/yari/issues/12079)) ([30ee2a5](https://github.com/mdn/yari/commit/30ee2a577418812c06e8e44c9244249d4240c4dc)) +* **deps-dev:** bump @types/node from 18.19.64 to 18.19.65 in the types group ([#12175](https://github.com/mdn/yari/issues/12175)) ([afe7605](https://github.com/mdn/yari/commit/afe76057912a39ad80d36a6f20a87aa086ed727f)) +* **deps-dev:** bump @types/node from 18.19.65 to 18.19.66 in the types group ([#12185](https://github.com/mdn/yari/issues/12185)) ([2c0d6c2](https://github.com/mdn/yari/commit/2c0d6c2104b0a6de68d6036ccde00bd3b7ca689e)) +* **deps-dev:** bump @types/node from 18.19.66 to 18.19.67 in the types group ([#12200](https://github.com/mdn/yari/issues/12200)) ([2b95347](https://github.com/mdn/yari/commit/2b95347b75079c3a38874be4783a170e9d0be8e3)) +* **deps-dev:** bump cross-spawn from 6.0.5 to 6.0.6 in /cloud-function ([#12198](https://github.com/mdn/yari/issues/12198)) ([982044c](https://github.com/mdn/yari/commit/982044cd6c819951a7566e9e044e9e24f66b2d2b)) +* **deps-dev:** bump eslint-plugin-jest from 28.8.3 to 28.9.0 ([#12095](https://github.com/mdn/yari/issues/12095)) ([871fa6c](https://github.com/mdn/yari/commit/871fa6c1b486ccd5bd80a995ef090704afaa6e6c)) +* **deps-dev:** bump eslint-plugin-n from 17.12.0 to 17.13.0 ([#12099](https://github.com/mdn/yari/issues/12099)) ([58283c9](https://github.com/mdn/yari/commit/58283c999539494a7a6ea5a546f1e5ff5243e4c7)) +* **deps-dev:** bump eslint-plugin-n from 17.13.0 to 17.13.1 ([#12105](https://github.com/mdn/yari/issues/12105)) ([f8419bc](https://github.com/mdn/yari/commit/f8419bc539c59b0714654d46f9aa6d4cea24aee5)) +* **deps-dev:** bump eslint-plugin-n from 17.13.1 to 17.13.2 ([#12130](https://github.com/mdn/yari/issues/12130)) ([cff300f](https://github.com/mdn/yari/commit/cff300fa548c437c77eae687f64cb11eb7058ce6)) +* **deps-dev:** bump eslint-plugin-react-hooks from 4.6.2 to 5.0.0 ([#11961](https://github.com/mdn/yari/issues/11961)) ([6642167](https://github.com/mdn/yari/commit/6642167d27f58b6be08d8bf39ab7cc824040d3d4)) +* **deps-dev:** bump eslint-plugin-unicorn from 56.0.0 to 56.0.1 ([#12150](https://github.com/mdn/yari/issues/12150)) ([098c36d](https://github.com/mdn/yari/commit/098c36d7b0f8248634b480d2f92d87f7bd3f2cc7)) +* **deps-dev:** bump html-validate from 8.24.2 to 8.25.0 ([#12111](https://github.com/mdn/yari/issues/12111)) ([66fb8b3](https://github.com/mdn/yari/commit/66fb8b335d2e0a909014ee182f1d7bb2e16a7a1f)) +* **deps-dev:** bump html-validate from 8.25.0 to 8.26.0 ([#12196](https://github.com/mdn/yari/issues/12196)) ([a5cb491](https://github.com/mdn/yari/commit/a5cb4910d311536a506f271c6510471bdf4e3101)) +* **deps-dev:** bump husky from 9.1.6 to 9.1.7 ([#12148](https://github.com/mdn/yari/issues/12148)) ([6741830](https://github.com/mdn/yari/commit/6741830faf8f4f2f37976011a94b12e99b6f5ec9)) +* **deps-dev:** bump lint-staged from 13.2.3 to 15.2.10 ([#12146](https://github.com/mdn/yari/issues/12146)) ([50e85ec](https://github.com/mdn/yari/commit/50e85ec23c3d5c19ab59a0b03dff9dab72970a35)) +* **deps-dev:** bump mini-css-extract-plugin from 2.9.1 to 2.9.2 ([#12073](https://github.com/mdn/yari/issues/12073)) ([5c7da92](https://github.com/mdn/yari/commit/5c7da928d1ca6ee9dcbe50e70fb7091db72f939b)) +* **deps-dev:** bump peggy from 4.1.1 to 4.2.0 ([#12153](https://github.com/mdn/yari/issues/12153)) ([cf6e784](https://github.com/mdn/yari/commit/cf6e7840352f5fa34ad748e6c14b4fe7eee67978)) +* **deps-dev:** bump postcss from 8.4.47 to 8.4.48 ([#12113](https://github.com/mdn/yari/issues/12113)) ([b9d8fe3](https://github.com/mdn/yari/commit/b9d8fe34692bc4d2f4ff63fc907d61552b7baed4)) +* **deps-dev:** bump postcss from 8.4.48 to 8.4.49 ([#12117](https://github.com/mdn/yari/issues/12117)) ([d066494](https://github.com/mdn/yari/commit/d066494c45f81add60b7241c1a17958893cad2d1)) +* **deps-dev:** bump postcss-preset-env from 10.0.8 to 10.0.9 ([#12084](https://github.com/mdn/yari/issues/12084)) ([3e9525f](https://github.com/mdn/yari/commit/3e9525fab1154e9defae47df373e5eca7e0e4f09)) +* **deps-dev:** bump postcss-preset-env from 10.0.9 to 10.1.0 ([#12112](https://github.com/mdn/yari/issues/12112)) ([e0a2d8a](https://github.com/mdn/yari/commit/e0a2d8aadaa6710bd5bcca030e3c1d8c3a81c978)) +* **deps-dev:** bump postcss-preset-env from 10.1.0 to 10.1.1 ([#12139](https://github.com/mdn/yari/issues/12139)) ([c764569](https://github.com/mdn/yari/commit/c7645699dd341f508f00a1eae3088fc5519bbd22)) +* **deps-dev:** bump prettier from 3.3.3 to 3.4.1 ([#12192](https://github.com/mdn/yari/issues/12192)) ([040f52f](https://github.com/mdn/yari/commit/040f52ffc0f5a2ea46ac64af9f507dfaabc6a81d)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.5.3 to 2.5.5 ([#12156](https://github.com/mdn/yari/issues/12156)) ([a6aee6a](https://github.com/mdn/yari/commit/a6aee6a4e459c6eb321e9942ec7702815d33defe)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.5.5 to 2.5.6 ([#12178](https://github.com/mdn/yari/issues/12178)) ([a37cfea](https://github.com/mdn/yari/commit/a37cfea9c486a8e3cee9f4659b40a998b8996aab)) +* **deps-dev:** bump react-router-dom from 6.27.0 to 6.28.0 ([#12103](https://github.com/mdn/yari/issues/12103)) ([0c1c7c3](https://github.com/mdn/yari/commit/0c1c7c3939cbed621a8471b262ca0f041644a10a)) +* **deps-dev:** bump sass from 1.80.5 to 1.80.6 ([#12080](https://github.com/mdn/yari/issues/12080)) ([dda43ef](https://github.com/mdn/yari/commit/dda43efb0d0c450982d2ba3c285ada34d1218acd)) +* **deps-dev:** bump sass from 1.80.6 to 1.80.7 ([#12123](https://github.com/mdn/yari/issues/12123)) ([cdf0471](https://github.com/mdn/yari/commit/cdf0471ada6b808b056c42ddceb23feaf8b2ac68)) +* **deps-dev:** bump sass from 1.80.7 to 1.81.0 ([#12129](https://github.com/mdn/yari/issues/12129)) ([ab1d92f](https://github.com/mdn/yari/commit/ab1d92ff461897e4020063c60fbdc4a00918e171)) +* **deps-dev:** bump sass-loader from 16.0.2 to 16.0.3 ([#12072](https://github.com/mdn/yari/issues/12072)) ([e63c453](https://github.com/mdn/yari/commit/e63c4538db73e0df4f85e24c397b931819459ca6)) +* **deps-dev:** bump typescript from 5.6.3 to 5.7.2 in /client/pwa ([#12174](https://github.com/mdn/yari/issues/12174)) ([043f305](https://github.com/mdn/yari/commit/043f305f27933dc7679aac59f920077ee7b341e3)) +* **deps-dev:** bump typescript-eslint from 8.12.2 to 8.13.0 ([#12088](https://github.com/mdn/yari/issues/12088)) ([19be759](https://github.com/mdn/yari/commit/19be7593c42c4fd528e7e6754a999638ed879640)) +* **deps-dev:** bump typescript-eslint from 8.13.0 to 8.14.0 ([#12119](https://github.com/mdn/yari/issues/12119)) ([99b6e62](https://github.com/mdn/yari/commit/99b6e622140c918f51b25b134dbdfeb8fd5cee43)) +* **deps-dev:** bump typescript-eslint from 8.14.0 to 8.15.0 ([#12147](https://github.com/mdn/yari/issues/12147)) ([73d917f](https://github.com/mdn/yari/commit/73d917fa798fb4f0ff123544f53b3efe5fa992d5)) +* **deps-dev:** bump typescript-eslint from 8.15.0 to 8.16.0 ([#12190](https://github.com/mdn/yari/issues/12190)) ([6b3440b](https://github.com/mdn/yari/commit/6b3440b3fa1ab1773e6cea8889a5015d164ed686)) +* **deps-dev:** bump webpack from 5.95.0 to 5.96.1 ([#12075](https://github.com/mdn/yari/issues/12075)) ([8478e4a](https://github.com/mdn/yari/commit/8478e4a7cf5387e2d65e78c24fc0af56f20c351b)) +* **deps-dev:** bump webpack from 5.95.0 to 5.96.1 in /client/pwa ([#12070](https://github.com/mdn/yari/issues/12070)) ([425dd62](https://github.com/mdn/yari/commit/425dd6276a524c597a17cddca6c500fa89f64026)) +* **deps-dev:** remove bfj ([#12086](https://github.com/mdn/yari/issues/12086)) ([a71ff18](https://github.com/mdn/yari/commit/a71ff184f955e358615e6b5232acd07c905c1967)) +* **deps:** bump @codemirror/lang-css from 6.3.0 to 6.3.1 ([#12189](https://github.com/mdn/yari/issues/12189)) ([7b29e97](https://github.com/mdn/yari/commit/7b29e9785dfc0a81c7ecebb7acb7b3135307060e)) +* **deps:** bump @inquirer/prompts from 7.0.1 to 7.1.0 ([#12116](https://github.com/mdn/yari/issues/12116)) ([98e2459](https://github.com/mdn/yari/commit/98e24592046486a486d5bbc33fa4e8d3b89e3cff)) +* **deps:** bump @mdn/browser-compat-data from 5.6.11 to 5.6.12 ([#12081](https://github.com/mdn/yari/issues/12081)) ([6919fb1](https://github.com/mdn/yari/commit/6919fb1c5120df37e77cda3e40a8a79b4939bd3b)) +* **deps:** bump @mdn/browser-compat-data from 5.6.12 to 5.6.13 ([#12092](https://github.com/mdn/yari/issues/12092)) ([42714a8](https://github.com/mdn/yari/commit/42714a8004596238c87e9488d7c6f2e70879f747)) +* **deps:** bump @mdn/browser-compat-data from 5.6.13 to 5.6.14 ([#12110](https://github.com/mdn/yari/issues/12110)) ([0de61fc](https://github.com/mdn/yari/commit/0de61fc70265c105da6649a68034ecae789be628)) +* **deps:** bump @mdn/browser-compat-data from 5.6.14 to 5.6.15 ([#12125](https://github.com/mdn/yari/issues/12125)) ([25a6fea](https://github.com/mdn/yari/commit/25a6fea90f8c5038d992b70e7d1511e6615ba38f)) +* **deps:** bump @mdn/browser-compat-data from 5.6.15 to 5.6.16 ([#12141](https://github.com/mdn/yari/issues/12141)) ([40d15a8](https://github.com/mdn/yari/commit/40d15a8a75bf72655b1bbc33bef9fb4d3eef7f6c)) +* **deps:** bump @mdn/browser-compat-data from 5.6.16 to 5.6.17 ([#12155](https://github.com/mdn/yari/issues/12155)) ([fb71240](https://github.com/mdn/yari/commit/fb71240c8d74e100ce305505e81c935beb6ffcf2)) +* **deps:** bump @mdn/browser-compat-data from 5.6.17 to 5.6.18 ([#12177](https://github.com/mdn/yari/issues/12177)) ([34623b5](https://github.com/mdn/yari/commit/34623b505d731202f2e8acde3b44ad025f4b5893)) +* **deps:** bump @mdn/browser-compat-data from 5.6.18 to 5.6.19 ([#12195](https://github.com/mdn/yari/issues/12195)) ([cc88837](https://github.com/mdn/yari/commit/cc88837be032178a602afa74ca211a811bca9ac5)) +* **deps:** bump @sentry/node from 8.35.0 to 8.36.0 in the sentry group ([#12061](https://github.com/mdn/yari/issues/12061)) ([7304e5f](https://github.com/mdn/yari/commit/7304e5faa6d7b3f622568fcff2927db52c3f772d)) +* **deps:** bump @sentry/node from 8.36.0 to 8.37.1 in the sentry group ([#12091](https://github.com/mdn/yari/issues/12091)) ([e5948e9](https://github.com/mdn/yari/commit/e5948e955a8d1029e9165d4bbafc319c82f79fb4)) +* **deps:** bump @sentry/node from 8.37.1 to 8.38.0 in the sentry group ([#12122](https://github.com/mdn/yari/issues/12122)) ([dfcc9c2](https://github.com/mdn/yari/commit/dfcc9c24bbfecda3c4a19c9f2c4782e7a8824ad2)) +* **deps:** bump @sentry/node from 8.38.0 to 8.39.0 in the sentry group ([#12152](https://github.com/mdn/yari/issues/12152)) ([2559a4f](https://github.com/mdn/yari/commit/2559a4f517e551f5a062665664d62030eaaaa5e8)) +* **deps:** bump @sentry/node from 8.39.0 to 8.40.0 in the sentry group ([#12163](https://github.com/mdn/yari/issues/12163)) ([14b02ec](https://github.com/mdn/yari/commit/14b02ec53588d42a5c3de8213c252e35fdef64fe)) +* **deps:** bump @sentry/node from 8.40.0 to 8.41.0 in the sentry group ([#12199](https://github.com/mdn/yari/issues/12199)) ([16dae32](https://github.com/mdn/yari/commit/16dae3228960ebe47c1eeefb972f2b5e45f9869f)) +* **deps:** bump @stripe/stripe-js from 4.9.0 to 4.10.0 ([#12118](https://github.com/mdn/yari/issues/12118)) ([29289ca](https://github.com/mdn/yari/commit/29289ca05f7778b7e593e6241997ca95aaa8b4cb)) +* **deps:** bump @webref/css from 6.17.0 to 6.17.1 ([#12089](https://github.com/mdn/yari/issues/12089)) ([4b26208](https://github.com/mdn/yari/commit/4b262081995f09938f5b51a9600b6bf591c595e0)) +* **deps:** bump @webref/css from 6.17.1 to 6.17.2 ([#12128](https://github.com/mdn/yari/issues/12128)) ([4fd2437](https://github.com/mdn/yari/commit/4fd2437a72b21c6c461888e16ac6a7edced166b1)) +* **deps:** bump @webref/css from 6.17.2 to 6.17.3 ([#12158](https://github.com/mdn/yari/issues/12158)) ([a427759](https://github.com/mdn/yari/commit/a4277597206c354fafb196537f1ee7b43d8c2e2d)) +* **deps:** bump @webref/css from 6.17.3 to 6.17.4 ([#12194](https://github.com/mdn/yari/issues/12194)) ([a0fffb1](https://github.com/mdn/yari/commit/a0fffb15ae509167ba9c983f01515fd8ecb7e82f)) +* **deps:** bump boto3 from 1.35.49 to 1.35.54 in /deployer in the dependencies group ([#12085](https://github.com/mdn/yari/issues/12085)) ([fdbd7ad](https://github.com/mdn/yari/commit/fdbd7ad17099adbe2347fdc3719c6af350466d48)) +* **deps:** bump boto3 from 1.35.54 to 1.35.57 in /deployer in the dependencies group ([#12108](https://github.com/mdn/yari/issues/12108)) ([73c5870](https://github.com/mdn/yari/commit/73c58707855fa899c33226a815ca0ccff6aa09eb)) +* **deps:** bump boto3 from 1.35.63 to 1.35.68 in /deployer in the dependencies group ([#12181](https://github.com/mdn/yari/issues/12181)) ([1810ad0](https://github.com/mdn/yari/commit/1810ad074f73b4239de6b8257fcbd118f70a4842)) +* **deps:** bump compression from 1.7.4 to 1.7.5 ([#12074](https://github.com/mdn/yari/issues/12074)) ([81af8fb](https://github.com/mdn/yari/commit/81af8fb4abdcf5a22f1da3f5567aa9352e08a4f4)) +* **deps:** bump cross-spawn from 7.0.3 to 7.0.5 in /client/pwa ([#12138](https://github.com/mdn/yari/issues/12138)) ([c0aed7e](https://github.com/mdn/yari/commit/c0aed7e8ec99942a147d5459f3213bdf4e5a0c03)) +* **deps:** bump dexie from 4.0.9 to 4.0.10 ([#12142](https://github.com/mdn/yari/issues/12142)) ([1f9b769](https://github.com/mdn/yari/commit/1f9b769f8a182d2254a5212bf48b4e80a238130b)) +* **deps:** bump dexie from 4.0.9 to 4.0.10 in /client/pwa ([#12143](https://github.com/mdn/yari/issues/12143)) ([1f030a2](https://github.com/mdn/yari/commit/1f030a23c46d08bf1d11be86e55d88d6ae41b603)) +* **deps:** bump mdn-data from 2.12.1 to 2.12.2 ([#12090](https://github.com/mdn/yari/issues/12090)) ([dfaba03](https://github.com/mdn/yari/commit/dfaba03ed549f52e8522b6581f34343f1ff8f089)) +* **deps:** bump NodeJS from v18 to v20 ([#12052](https://github.com/mdn/yari/issues/12052)) ([263f4a2](https://github.com/mdn/yari/commit/263f4a202b7a89df7a1a552983c3c96bc249aac0)) +* **deps:** bump openai from 4.68.4 to 4.69.0 ([#12064](https://github.com/mdn/yari/issues/12064)) ([13b5e2c](https://github.com/mdn/yari/commit/13b5e2cf7fee4ef9dbabf7318529c9039fe3d116)) +* **deps:** bump openai from 4.69.0 to 4.70.2 ([#12083](https://github.com/mdn/yari/issues/12083)) ([7a2af2d](https://github.com/mdn/yari/commit/7a2af2d27995d3dbe40876a59747a11ac4843865)) +* **deps:** bump openai from 4.70.2 to 4.71.0 ([#12087](https://github.com/mdn/yari/issues/12087)) ([6ccdb3f](https://github.com/mdn/yari/commit/6ccdb3f8bbf870c88150fa800e3ee88b7ef73739)) +* **deps:** bump openai from 4.71.0 to 4.71.1 ([#12100](https://github.com/mdn/yari/issues/12100)) ([ec3d3af](https://github.com/mdn/yari/commit/ec3d3af680735b25673e8b22d51fdd2ebb1c3047)) +* **deps:** bump openai from 4.71.1 to 4.72.0 ([#12126](https://github.com/mdn/yari/issues/12126)) ([6dfcb5d](https://github.com/mdn/yari/commit/6dfcb5d5021d8c5b6d2830154e3a6203c188d8f5)) +* **deps:** bump openai from 4.72.0 to 4.73.0 ([#12157](https://github.com/mdn/yari/issues/12157)) ([0135449](https://github.com/mdn/yari/commit/01354498df071efc7c352931c305e4acb9fd7c5e)) +* **deps:** bump openai from 4.73.0 to 4.73.1 ([#12186](https://github.com/mdn/yari/issues/12186)) ([ec4f588](https://github.com/mdn/yari/commit/ec4f5888562e0670608f58e97212675c401a5d67)) +* **deps:** bump the dependencies group in /deployer with 2 updates ([#12144](https://github.com/mdn/yari/issues/12144)) ([b1a4f2b](https://github.com/mdn/yari/commit/b1a4f2b969d1e644c37c181b226f38dd5a992515)) +* **deps:** bump web-features from 2.3.0 to 2.4.0 ([#12063](https://github.com/mdn/yari/issues/12063)) ([2ba4209](https://github.com/mdn/yari/commit/2ba42098885a90d8f1c7e6bf5f288650b509e4b1)) +* **deps:** bump web-features from 2.4.0 to 2.5.0 ([#12106](https://github.com/mdn/yari/issues/12106)) ([63110ac](https://github.com/mdn/yari/commit/63110ac7bfa62a6928297cb280b95f453eefcfb7)) +* **deps:** bump web-features from 2.5.0 to 2.6.1 ([#12124](https://github.com/mdn/yari/issues/12124)) ([cd3ed52](https://github.com/mdn/yari/commit/cd3ed526ba242fa4091b704252eaa07543252a03)) +* **deps:** bump web-features from 2.6.1 to 2.7.0 ([#12160](https://github.com/mdn/yari/issues/12160)) ([4390b61](https://github.com/mdn/yari/commit/4390b61bc0e6578621f7a2b45b05448aa6f9f302)) +* **deps:** bump web-features from 2.7.0 to 2.8.0 ([#12188](https://github.com/mdn/yari/issues/12188)) ([12bd1ee](https://github.com/mdn/yari/commit/12bd1ee295b6c55bd01307ba5c6ae571e15583e2)) +* **deps:** bump web-specs from 3.23.0 to 3.24.0 ([#12093](https://github.com/mdn/yari/issues/12093)) ([bbf8a22](https://github.com/mdn/yari/commit/bbf8a22814e804e883a02c0caa116e22d104407b)) +* **deps:** bump web-specs from 3.24.0 to 3.25.0 ([#12109](https://github.com/mdn/yari/issues/12109)) ([0c14c62](https://github.com/mdn/yari/commit/0c14c6254a252aea1b4b53dddd7ab958c255bf33)) +* **deps:** bump web-specs from 3.25.0 to 3.26.0 ([#12127](https://github.com/mdn/yari/issues/12127)) ([22e3c94](https://github.com/mdn/yari/commit/22e3c943849b3aa02a4d862fd811afb7e6366734)) +* **deps:** bump web-specs from 3.26.0 to 3.27.0 ([#12161](https://github.com/mdn/yari/issues/12161)) ([5f3a672](https://github.com/mdn/yari/commit/5f3a672c07507b1ed18f2c8751945313531c7dc5)) +* **deps:** bump web-specs from 3.27.0 to 3.28.0 ([#12191](https://github.com/mdn/yari/issues/12191)) ([ca49d0c](https://github.com/mdn/yari/commit/ca49d0c39425953211aec7eb5417238b204777e1)) +* **deps:** run yarn upgrade ([#12145](https://github.com/mdn/yari/issues/12145)) ([bebabf7](https://github.com/mdn/yari/commit/bebabf704e6d5debf339c64225aa3b49f4fe0e70)) +* **deps:** udpate cloud-function deps ([#12135](https://github.com/mdn/yari/issues/12135)) ([68cc532](https://github.com/mdn/yari/commit/68cc532510d3fbf35e89701146def2f7f46e765b)) +* **scrimba:** add end of year banners ([#12184](https://github.com/mdn/yari/issues/12184)) ([2a7945a](https://github.com/mdn/yari/commit/2a7945a74c385f8493bde987456c88f7d6414b1b)) +* **survey:** keep hp survey one more week ([#12193](https://github.com/mdn/yari/issues/12193)) ([63491d3](https://github.com/mdn/yari/commit/63491d319696910dd87ea924d866f260f1578025)) + +## [2.65.1](https://github.com/mdn/yari/compare/v2.65.0...v2.65.1) (2024-10-30) + + +### Bug Fixes + +* **macros:** correct anchor-link encoding ([#12059](https://github.com/mdn/yari/issues/12059)) ([05f5591](https://github.com/mdn/yari/commit/05f5591955f020960ba7972bfb12bdc063364561)) +* **npm-publish:** use default github token ([#12058](https://github.com/mdn/yari/issues/12058)) ([807bdc0](https://github.com/mdn/yari/commit/807bdc0729d6637afd3458fc655de4bbfb16dc5e)) +* **placement:** fix on site search ([#12029](https://github.com/mdn/yari/issues/12029)) ([3853560](https://github.com/mdn/yari/commit/385356082c392b815af4350937e158620ea66632)) +* **placement:** hide ad-free link if plus isn't available ([#12010](https://github.com/mdn/yari/issues/12010)) ([55dcf6f](https://github.com/mdn/yari/commit/55dcf6fe840f9d9b883e1979e86810519f92a43b)) +* **search:** pass key as prop ([#12009](https://github.com/mdn/yari/issues/12009)) ([08ec90c](https://github.com/mdn/yari/commit/08ec90c13361b7d32f152cbc8705ac59b1025a3f)) +* **utils:** hash-awareness of url-to-folder-path ([#11980](https://github.com/mdn/yari/issues/11980)) ([b0fcbca](https://github.com/mdn/yari/commit/b0fcbcab2f16d5275e0500f494390594b036b45c)) +* **various:** small fixes from diffing with rari ([#12045](https://github.com/mdn/yari/issues/12045)) ([4fd6331](https://github.com/mdn/yari/commit/4fd6331f77a17478f40ee8497df316aff99bce6b)) + + +### Enhancements + +* **telemetry:** measure all external link clicks ([#11981](https://github.com/mdn/yari/issues/11981)) ([2a79c01](https://github.com/mdn/yari/commit/2a79c01628214e733cd5e156864667b74b5b97bd)) +* **telemetry:** measure search source + change ([#12000](https://github.com/mdn/yari/issues/12000)) ([3ec66c2](https://github.com/mdn/yari/commit/3ec66c2b26162786ed47159ae769559d7c2a4443)) + + +### Miscellaneous + +* **curriculum:** add metrics to measure scrimba funnel ([#11972](https://github.com/mdn/yari/issues/11972)) ([8d51b73](https://github.com/mdn/yari/commit/8d51b7333169d510ab04fe909baf64738dda71d9)) +* **deps-dev:** bump @babel/core from 7.25.8 to 7.25.9 ([#12017](https://github.com/mdn/yari/issues/12017)) ([d9c026f](https://github.com/mdn/yari/commit/d9c026fe1a90ef67a0ae516dd4be89d4d25dabe3)) +* **deps-dev:** bump @babel/core from 7.25.9 to 7.26.0 ([#12038](https://github.com/mdn/yari/issues/12038)) ([9c5b3bc](https://github.com/mdn/yari/commit/9c5b3bca33ef9ff9037e4c249f6a051a361a622e)) +* **deps-dev:** bump @babel/eslint-parser from 7.25.8 to 7.25.9 ([#12020](https://github.com/mdn/yari/issues/12020)) ([0dea955](https://github.com/mdn/yari/commit/0dea955fde53732cd7600fe15222e09bc8cfa423)) +* **deps-dev:** bump @babel/preset-env from 7.25.8 to 7.25.9 ([#12016](https://github.com/mdn/yari/issues/12016)) ([1a0fcde](https://github.com/mdn/yari/commit/1a0fcde67f0af8fbd6dc0c28dbc7d23707bd4cf9)) +* **deps-dev:** bump @babel/preset-env from 7.25.9 to 7.26.0 ([#12037](https://github.com/mdn/yari/issues/12037)) ([bc078ea](https://github.com/mdn/yari/commit/bc078ea95e86245e8d307536a0ba2a6f629f4aba)) +* **deps-dev:** bump @playwright/test from 1.48.1 to 1.48.2 ([#12040](https://github.com/mdn/yari/issues/12040)) ([b5acb82](https://github.com/mdn/yari/commit/b5acb82600121e5566192843799db1cce3dc6948)) +* **deps-dev:** bump @swc/core from 1.7.36 to 1.7.39 ([#12005](https://github.com/mdn/yari/issues/12005)) ([ae239ef](https://github.com/mdn/yari/commit/ae239ef2cb335337ad756c9480d986d933046a5d)) +* **deps-dev:** bump @swc/core from 1.7.39 to 1.7.40 ([#12043](https://github.com/mdn/yari/issues/12043)) ([e6f9525](https://github.com/mdn/yari/commit/e6f9525c1ac32048ae221f08e3698bf02a78e1d9)) +* **deps-dev:** bump @types/dexie from 1.3.1 to 1.3.35 in /client/pwa ([#12011](https://github.com/mdn/yari/issues/12011)) ([370a76f](https://github.com/mdn/yari/commit/370a76fc63d7792016c5e32bbe77b8417deeab2b)) +* **deps-dev:** bump @types/node from 18.19.56 to 18.19.57 in the types group ([#11993](https://github.com/mdn/yari/issues/11993)) ([76a99d4](https://github.com/mdn/yari/commit/76a99d4df9dbd9746fae3aa9265c92e9e92b9370)) +* **deps-dev:** bump @types/node from 18.19.57 to 18.19.58 in the types group ([#12003](https://github.com/mdn/yari/issues/12003)) ([d32fccb](https://github.com/mdn/yari/commit/d32fccb6881a602d6664d247de2ee1d178001c0f)) +* **deps-dev:** bump @types/node from 18.19.59 to 18.19.60 in the types group ([#12046](https://github.com/mdn/yari/issues/12046)) ([d19dcf7](https://github.com/mdn/yari/commit/d19dcf755c3d06c6fd35945a4073a31861ea8e6e)) +* **deps-dev:** bump @types/node from 18.19.60 to 18.19.61 in the types group ([#12053](https://github.com/mdn/yari/issues/12053)) ([fc243cb](https://github.com/mdn/yari/commit/fc243cbc716d09dcae7751a4fef891bdf4d484c8)) +* **deps-dev:** bump browserslist from 4.24.0 to 4.24.2 ([#12008](https://github.com/mdn/yari/issues/12008)) ([c8e8a65](https://github.com/mdn/yari/commit/c8e8a6563529721d82410ef27b6b6c3450b02d4e)) +* **deps-dev:** bump eslint-plugin-jsx-a11y from 6.10.0 to 6.10.1 ([#11994](https://github.com/mdn/yari/issues/11994)) ([6d4f509](https://github.com/mdn/yari/commit/6d4f50902064c61fe3aca70086128834e5f7a570)) +* **deps-dev:** bump eslint-plugin-jsx-a11y from 6.10.1 to 6.10.2 ([#12044](https://github.com/mdn/yari/issues/12044)) ([543fa5c](https://github.com/mdn/yari/commit/543fa5c0faa0fab00004a9325b8462059222c80d)) +* **deps-dev:** bump eslint-plugin-n from 17.11.1 to 17.12.0 ([#12054](https://github.com/mdn/yari/issues/12054)) ([d979450](https://github.com/mdn/yari/commit/d9794502075987db2c1f97eb78e932ff949c8c0f)) +* **deps-dev:** bump eslint-plugin-react from 7.37.1 to 7.37.2 ([#12018](https://github.com/mdn/yari/issues/12018)) ([58386bc](https://github.com/mdn/yari/commit/58386bc0db2e0db661a257ed9ddc23dd37cb6530)) +* **deps-dev:** bump html-webpack-plugin from 5.6.2 to 5.6.3 ([#12015](https://github.com/mdn/yari/issues/12015)) ([d3c3ccf](https://github.com/mdn/yari/commit/d3c3ccf36fa8769d69f0634a7bd568d0ff1f58ba)) +* **deps-dev:** bump postcss-preset-env from 10.0.7 to 10.0.8 ([#12026](https://github.com/mdn/yari/issues/12026)) ([4ed0058](https://github.com/mdn/yari/commit/4ed0058e35c1615e95e452cb0fa1e744a26d72f0)) +* **deps-dev:** bump sass from 1.79.5 to 1.80.4 ([#12027](https://github.com/mdn/yari/issues/12027)) ([02d5ec9](https://github.com/mdn/yari/commit/02d5ec9e6c14d17302ce763fee131e19ec75a3aa)) +* **deps-dev:** bump sass from 1.80.4 to 1.80.5 ([#12056](https://github.com/mdn/yari/issues/12056)) ([4a91901](https://github.com/mdn/yari/commit/4a919016bca72a1ee9de71ef94b032f2ce1d61b6)) +* **deps-dev:** bump the types group with 4 updates ([#12012](https://github.com/mdn/yari/issues/12012)) ([ddda441](https://github.com/mdn/yari/commit/ddda441be124515254a7eb0ed947a7b4426640d7)) +* **deps-dev:** bump typescript-eslint from 8.10.0 to 8.11.0 ([#12007](https://github.com/mdn/yari/issues/12007)) ([8ee3aef](https://github.com/mdn/yari/commit/8ee3aefdc30628072eb8923df77533719b51289d)) +* **deps-dev:** bump typescript-eslint from 8.11.0 to 8.12.1 ([#12048](https://github.com/mdn/yari/issues/12048)) ([9874ce2](https://github.com/mdn/yari/commit/9874ce2b4bd9a3e76393b2b1644bd440e967e6c4)) +* **deps-dev:** bump typescript-eslint from 8.12.1 to 8.12.2 ([#12055](https://github.com/mdn/yari/issues/12055)) ([e72103e](https://github.com/mdn/yari/commit/e72103eee439500e4aeb428b72e31efe77d1e170)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.52 to 2.7.53 in /client/pwa ([#12050](https://github.com/mdn/yari/issues/12050)) ([d825c3e](https://github.com/mdn/yari/commit/d825c3e2c7c469a0a5ec01095576a125c0f95aeb)) +* **deps:** bump @fast-csv/parse from 5.0.0 to 5.0.2 ([#12021](https://github.com/mdn/yari/issues/12021)) ([ab00fa0](https://github.com/mdn/yari/commit/ab00fa020a8f9c2fe990f5982eed773af33336e8)) +* **deps:** bump @inquirer/prompts from 7.0.0 to 7.0.1 ([#12035](https://github.com/mdn/yari/issues/12035)) ([20ba662](https://github.com/mdn/yari/commit/20ba662e4ee2a5bc94fa375c2fe37a1585483f09)) +* **deps:** bump @mdn/browser-compat-data from 5.6.10 to 5.6.11 ([#12057](https://github.com/mdn/yari/issues/12057)) ([3338d9c](https://github.com/mdn/yari/commit/3338d9c70758fe6df45f3f98155443b81ee1abc7)) +* **deps:** bump @mdn/browser-compat-data from 5.6.7 to 5.6.8 ([#11995](https://github.com/mdn/yari/issues/11995)) ([5ba8d08](https://github.com/mdn/yari/commit/5ba8d08bc683ad075a564b26fff3b728a496d8bd)) +* **deps:** bump @mdn/browser-compat-data from 5.6.8 to 5.6.9 ([#12014](https://github.com/mdn/yari/issues/12014)) ([b4fab54](https://github.com/mdn/yari/commit/b4fab54d949a8d45c659b0fd916ae714e2e4f549)) +* **deps:** bump @mdn/browser-compat-data from 5.6.9 to 5.6.10 ([#12036](https://github.com/mdn/yari/issues/12036)) ([6aec3c3](https://github.com/mdn/yari/commit/6aec3c312fe8e3ce0be4a251b6a7f26b4393f3fe)) +* **deps:** bump @sentry/node from 8.34.0 to 8.35.0 in the sentry group ([#12002](https://github.com/mdn/yari/issues/12002)) ([b388e53](https://github.com/mdn/yari/commit/b388e53fae9598433677e87ae8d7cb2b682005ac)) +* **deps:** bump @stripe/stripe-js from 4.8.0 to 4.9.0 ([#12004](https://github.com/mdn/yari/issues/12004)) ([50518f3](https://github.com/mdn/yari/commit/50518f34ec31d7f209c3ea0f9bd52c2ffa15fa50)) +* **deps:** bump boto3 from 1.35.39 to 1.35.44 in /deployer in the dependencies group ([#11992](https://github.com/mdn/yari/issues/11992)) ([ca39b7a](https://github.com/mdn/yari/commit/ca39b7ac6940b5571cc5ee8cfd5556ad9c897a15)) +* **deps:** bump dexie from 4.0.8 to 4.0.9 ([#12006](https://github.com/mdn/yari/issues/12006)) ([fe4d1f8](https://github.com/mdn/yari/commit/fe4d1f8cbbc911fe335eb1a16323ff2fb3ecf8bb)) +* **deps:** bump dexie from 4.0.8 to 4.0.9 in /client/pwa ([#12001](https://github.com/mdn/yari/issues/12001)) ([7544c06](https://github.com/mdn/yari/commit/7544c068573920ba63e2af6c063c1a7d3fbce248)) +* **deps:** bump mdast-util-from-markdown from 2.0.1 to 2.0.2 ([#12041](https://github.com/mdn/yari/issues/12041)) ([81c719c](https://github.com/mdn/yari/commit/81c719c8d226b45b5a39326e6dab5b089ad6d3f9)) +* **deps:** bump mdn-data from 2.11.1 to 2.12.0 ([#12042](https://github.com/mdn/yari/issues/12042)) ([fd241bf](https://github.com/mdn/yari/commit/fd241bf2c8eeaf70978ee4615166f59d4b8491a6)) +* **deps:** bump mdn-data from 2.12.0 to 2.12.1 ([#12049](https://github.com/mdn/yari/issues/12049)) ([31ce945](https://github.com/mdn/yari/commit/31ce945276b11ee7fde96019d5cf48e871f422b8)) +* **deps:** bump openai from 4.68.0 to 4.68.1 ([#11996](https://github.com/mdn/yari/issues/11996)) ([e1b7b5f](https://github.com/mdn/yari/commit/e1b7b5f05780b7180a5b655d38cc47cff6a2d469)) +* **deps:** bump openai from 4.68.1 to 4.68.2 ([#12013](https://github.com/mdn/yari/issues/12013)) ([0b06466](https://github.com/mdn/yari/commit/0b0646689caffe0fb2b45bd76f62c7c827645cd4)) +* **deps:** bump openai from 4.68.2 to 4.68.4 ([#12025](https://github.com/mdn/yari/issues/12025)) ([97f590b](https://github.com/mdn/yari/commit/97f590b579eefab90acacfae77381f60884e7473)) +* **deps:** bump pg from 8.13.0 to 8.13.1 ([#12031](https://github.com/mdn/yari/issues/12031)) ([ed311eb](https://github.com/mdn/yari/commit/ed311eb0384febc0ef6894ebb8b2033d3657b784)) +* **deps:** bump the dependencies group in /deployer with 2 updates ([#12039](https://github.com/mdn/yari/issues/12039)) ([9eef219](https://github.com/mdn/yari/commit/9eef219fa76301d1ad9a1b06793bc15dd289286d)) +* **deps:** bump web-features from 2.0.0 to 2.1.0 ([#12019](https://github.com/mdn/yari/issues/12019)) ([d04186c](https://github.com/mdn/yari/commit/d04186c5ef0c15e6bc53017b26fddb616fb8fa6d)) +* **deps:** bump web-features from 2.1.0 to 2.2.0 ([#12028](https://github.com/mdn/yari/issues/12028)) ([d77571f](https://github.com/mdn/yari/commit/d77571fa2a0a78d5abe6aa3062cc23bd9e9a5bd4)) +* **deps:** bump web-features from 2.2.0 to 2.3.0 ([#12047](https://github.com/mdn/yari/issues/12047)) ([e85edda](https://github.com/mdn/yari/commit/e85edda8da58f11ecf226468eee56b3ca33b1482)) +* **deps:** migrate to googleapis/release-please-action ([#12032](https://github.com/mdn/yari/issues/12032)) ([82980d1](https://github.com/mdn/yari/commit/82980d12f0613aa64edbbfc5d9ce6ece37b5c203)) +* **macros/LearnSidebar:** add Japanese translations for JavaScript ([#11988](https://github.com/mdn/yari/issues/11988)) ([2aa510c](https://github.com/mdn/yari/commit/2aa510cdb810c9f0a66a6b3387325cdadcc80739)) +* **server:** clean-up ([#11968](https://github.com/mdn/yari/issues/11968)) ([82d4df2](https://github.com/mdn/yari/commit/82d4df2cac0ea2ae543a712d2c7494660133e735)) + +## [2.65.0](https://github.com/mdn/yari/compare/v2.64.2...v2.65.0) (2024-10-18) + + +### Features + +* **community:** new community page design ([#11653](https://github.com/mdn/yari/issues/11653)) ([75a3f2f](https://github.com/mdn/yari/commit/75a3f2fa57a350054d56491702c10715abfcbad7)) + + +### Bug Fixes + +* **ssr:** fix --no-docs (rename to --skip-docs) ([#11973](https://github.com/mdn/yari/issues/11973)) ([69ca945](https://github.com/mdn/yari/commit/69ca945ad6412875a208b8591ede222cd4a72ac1)) + + +### Miscellaneous + +* **deps-dev:** bump @playwright/test from 1.48.0 to 1.48.1 ([#11970](https://github.com/mdn/yari/issues/11970)) ([4f3e1fa](https://github.com/mdn/yari/commit/4f3e1fa730012b5f301e1d02312f861587c113c6)) +* **deps-dev:** bump @swc/core from 1.7.35 to 1.7.36 ([#11969](https://github.com/mdn/yari/issues/11969)) ([b8b926a](https://github.com/mdn/yari/commit/b8b926a0ccb97d2dafb1febfdb9d460b95fc3918)) +* **deps-dev:** bump @types/node from 18.19.55 to 18.19.56 in the types group ([#11974](https://github.com/mdn/yari/issues/11974)) ([bfb8e83](https://github.com/mdn/yari/commit/bfb8e83512083115bdde0300b3558eceec45c13c)) +* **deps-dev:** bump @types/react-dom from 18.3.0 to 18.3.1 in the types group ([#11958](https://github.com/mdn/yari/issues/11958)) ([16d48b4](https://github.com/mdn/yari/commit/16d48b4ef34733826c68d97750221e7f55d93976)) +* **deps-dev:** bump black from 24.8.0 to 24.10.0 in /testing/integration in the dependencies group ([#11956](https://github.com/mdn/yari/issues/11956)) ([46fb511](https://github.com/mdn/yari/commit/46fb51107ae2183dd6f3c195d73fd2b6bcf6413e)) +* **deps-dev:** bump html-validate from 8.24.1 to 8.24.2 ([#11976](https://github.com/mdn/yari/issues/11976)) ([bf3f060](https://github.com/mdn/yari/commit/bf3f060683df20e365fe1cd5347fbb555d72c2d2)) +* **deps-dev:** bump html-webpack-plugin from 5.6.0 to 5.6.2 ([#11982](https://github.com/mdn/yari/issues/11982)) ([ca04218](https://github.com/mdn/yari/commit/ca042186029b7e6433b03af8f2fd60a359de2e01)) +* **deps-dev:** bump react-router-dom from 6.26.2 to 6.27.0 ([#11964](https://github.com/mdn/yari/issues/11964)) ([a6eb940](https://github.com/mdn/yari/commit/a6eb940b22e7cb38225f589be3175c6251ae64a3)) +* **deps-dev:** bump typescript-eslint from 8.8.1 to 8.9.0 ([#11967](https://github.com/mdn/yari/issues/11967)) ([7a49885](https://github.com/mdn/yari/commit/7a498856acf98dc1d67239d7cfbb313288d19551)) +* **deps-dev:** bump typescript-eslint from 8.9.0 to 8.10.0 ([#11984](https://github.com/mdn/yari/issues/11984)) ([957b042](https://github.com/mdn/yari/commit/957b04240e922bcae9ff3979eaa7cc8b6bda2887)) +* **deps:** bump @mdn/browser-compat-data from 5.6.5 to 5.6.6 ([#11965](https://github.com/mdn/yari/issues/11965)) ([3dd8dab](https://github.com/mdn/yari/commit/3dd8dab7654f5c20b5946db7ff30bc8d0bbebf3e)) +* **deps:** bump @mdn/browser-compat-data from 5.6.6 to 5.6.7 ([#11971](https://github.com/mdn/yari/issues/11971)) ([0720ee7](https://github.com/mdn/yari/commit/0720ee7a53773e23cff5cce95ed0addc413c3be8)) +* **deps:** bump @webref/css from 6.16.0 to 6.16.1 ([#11959](https://github.com/mdn/yari/issues/11959)) ([deb507d](https://github.com/mdn/yari/commit/deb507dcd66392ecbce791aca9abfe34fe79af7e)) +* **deps:** bump @webref/css from 6.16.1 to 6.17.0 ([#11986](https://github.com/mdn/yari/issues/11986)) ([fb01f6b](https://github.com/mdn/yari/commit/fb01f6b5fcd66ea79af195d3cd757134cd206586)) +* **deps:** bump fdir from 6.4.0 to 6.4.2 ([#11975](https://github.com/mdn/yari/issues/11975)) ([ab172c3](https://github.com/mdn/yari/commit/ab172c3aa2d5caf6e4624b6d93ce5b208150db4d)) +* **deps:** bump file-type from 19.5.0 to 19.6.0 ([#11963](https://github.com/mdn/yari/issues/11963)) ([a1ed7cb](https://github.com/mdn/yari/commit/a1ed7cb211d697dac7874e7b7633936df84e9515)) +* **deps:** bump openai from 4.67.3 to 4.68.0 ([#11985](https://github.com/mdn/yari/issues/11985)) ([6701713](https://github.com/mdn/yari/commit/6701713af4be923c4e29893641b2da613de659bf)) +* **deps:** bump the dependencies group in /deployer with 3 updates ([#11966](https://github.com/mdn/yari/issues/11966)) ([b37a6e1](https://github.com/mdn/yari/commit/b37a6e1119e625bc09368086060ea0c0918e2521)) +* **macros/LearnSidebar:** add Japanese translations for HTML and CSS ([#11840](https://github.com/mdn/yari/issues/11840)) ([85b9436](https://github.com/mdn/yari/commit/85b9436859c1d2e6ba9a8da45bae65eaf0a3bab8)) +* **macros/WebExtAllExamples:** update zh-* translation ([#11831](https://github.com/mdn/yari/issues/11831)) ([e0c5575](https://github.com/mdn/yari/commit/e0c55755666b1969cdf8a8676cd5f1604d527efb)) +* **observatory:** update the FAQ for the new API V2 ([#11954](https://github.com/mdn/yari/issues/11954)) ([460d530](https://github.com/mdn/yari/commit/460d5303e0738a9fb73afc8250b8cab70efba67e)) +* **telemetry:** measure homepage link clicks ([#11978](https://github.com/mdn/yari/issues/11978)) ([92467e2](https://github.com/mdn/yari/commit/92467e2cc191f5ca155387ba22b6c508f8fd9693)) + +## [2.64.2](https://github.com/mdn/yari/compare/v2.64.1...v2.64.2) (2024-10-11) + + +### Bug Fixes + +* **m2h:** don't delete p's in li's ([#11930](https://github.com/mdn/yari/issues/11930)) ([41e892e](https://github.com/mdn/yari/commit/41e892e0fb275b12967c8845a2ca572590b4d0e0)) + + +### Enhancements + +* **server:** introduce SERVER_HOST variable ([#11394](https://github.com/mdn/yari/issues/11394)) ([70001af](https://github.com/mdn/yari/commit/70001af2ba2bd89f8e10d0ce1707fc67620950c1)) + + +### Miscellaneous + +* **deps-dev:** bump @babel/core from 7.25.2 to 7.25.7 ([#11901](https://github.com/mdn/yari/issues/11901)) ([c7967e6](https://github.com/mdn/yari/commit/c7967e6bcd662afca8ffa0b8cc20f4bcc93dea25)) +* **deps-dev:** bump @babel/core from 7.25.7 to 7.25.8 ([#11950](https://github.com/mdn/yari/issues/11950)) ([0cff31c](https://github.com/mdn/yari/commit/0cff31c138a809a789e21f39f45fbc39dbe8b543)) +* **deps-dev:** bump @babel/eslint-parser from 7.25.1 to 7.25.7 ([#11903](https://github.com/mdn/yari/issues/11903)) ([502e931](https://github.com/mdn/yari/commit/502e93163ab039e62fa4976f867a16c3c7f57795)) +* **deps-dev:** bump @babel/eslint-parser from 7.25.7 to 7.25.8 ([#11952](https://github.com/mdn/yari/issues/11952)) ([4423c74](https://github.com/mdn/yari/commit/4423c740f1f46d06ef9816499a5806bd667ac4f3)) +* **deps-dev:** bump @babel/preset-env from 7.25.4 to 7.25.7 ([#11906](https://github.com/mdn/yari/issues/11906)) ([7df6904](https://github.com/mdn/yari/commit/7df69046db037ce316b9f3af3fc0861f12ffe0eb)) +* **deps-dev:** bump @babel/preset-env from 7.25.7 to 7.25.8 ([#11951](https://github.com/mdn/yari/issues/11951)) ([fb4e8cd](https://github.com/mdn/yari/commit/fb4e8cd8fc80c410f6730124e555b962ecc8cbc7)) +* **deps-dev:** bump @playwright/test from 1.47.2 to 1.48.0 ([#11940](https://github.com/mdn/yari/issues/11940)) ([1a3cf98](https://github.com/mdn/yari/commit/1a3cf98b85819bc5029ebd704f1e9c9c543bbfd4)) +* **deps-dev:** bump @swc/core from 1.7.28 to 1.7.35 ([#11944](https://github.com/mdn/yari/issues/11944)) ([c435ebb](https://github.com/mdn/yari/commit/c435ebbfae11f06cb0ea1970da5e48cf8a4d0175)) +* **deps-dev:** bump @types/node from 18.19.54 to 18.19.55 in the types group ([#11924](https://github.com/mdn/yari/issues/11924)) ([b3146ee](https://github.com/mdn/yari/commit/b3146eecd015e186ba389d164c7c5cc7065f60e4)) +* **deps-dev:** bump @types/react from 18.3.10 to 18.3.11 in the types group ([#11900](https://github.com/mdn/yari/issues/11900)) ([14586a9](https://github.com/mdn/yari/commit/14586a9511cf9c3c2a5f8ea69db9698d6e0e4e66)) +* **deps-dev:** bump eslint-plugin-import from 2.30.0 to 2.31.0 ([#11904](https://github.com/mdn/yari/issues/11904)) ([06dc9be](https://github.com/mdn/yari/commit/06dc9be705da361b287274769c34a911c2a553c5)) +* **deps-dev:** bump eslint-plugin-n from 17.10.3 to 17.11.0 ([#11937](https://github.com/mdn/yari/issues/11937)) ([4aded5e](https://github.com/mdn/yari/commit/4aded5e3a656a27e28ebaa346042635fee45a2f2)) +* **deps-dev:** bump eslint-plugin-n from 17.11.0 to 17.11.1 ([#11945](https://github.com/mdn/yari/issues/11945)) ([0b3caee](https://github.com/mdn/yari/commit/0b3caee7726298fabfc84e0e767e1e02c5242b88)) +* **deps-dev:** bump eslint-plugin-unicorn from 55.0.0 to 56.0.0 ([#11910](https://github.com/mdn/yari/issues/11910)) ([1995f7e](https://github.com/mdn/yari/commit/1995f7e3fd2806f7df44e5b87326b3a28ea4a7a7)) +* **deps-dev:** bump html-validate from 8.24.0 to 8.24.1 ([#11913](https://github.com/mdn/yari/issues/11913)) ([edc8680](https://github.com/mdn/yari/commit/edc86806251ea1590ff9d54f36b810a3bfc287f4)) +* **deps-dev:** bump peggy from 4.0.3 to 4.1.1 ([#11911](https://github.com/mdn/yari/issues/11911)) ([94ed7c3](https://github.com/mdn/yari/commit/94ed7c3c505b7629315c3b83a358c45290960fe7)) +* **deps-dev:** bump postcss-normalize from 13.0.0 to 13.0.1 ([#11873](https://github.com/mdn/yari/issues/11873)) ([fe63dfb](https://github.com/mdn/yari/commit/fe63dfba6c87fc7934c56bc36bf945c8a69a4eaf)) +* **deps-dev:** bump postcss-preset-env from 10.0.5 to 10.0.6 ([#11918](https://github.com/mdn/yari/issues/11918)) ([1709581](https://github.com/mdn/yari/commit/17095811072ea9fb0ff526c98b1931ac991bf21c)) +* **deps-dev:** bump postcss-preset-env from 10.0.6 to 10.0.7 ([#11949](https://github.com/mdn/yari/issues/11949)) ([25a94ae](https://github.com/mdn/yari/commit/25a94aeec3152e69f08badbfe38421fdf09d6e3d)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.5.2 to 2.5.3 ([#11933](https://github.com/mdn/yari/issues/11933)) ([05e0b50](https://github.com/mdn/yari/commit/05e0b50f9c4bae6e4372a0eee924fef61c44935d)) +* **deps-dev:** bump sass from 1.79.4 to 1.79.5 ([#11953](https://github.com/mdn/yari/issues/11953)) ([0da273e](https://github.com/mdn/yari/commit/0da273e5e0798195028a78fcc4d30a7e649e07f6)) +* **deps-dev:** bump typescript from 5.6.2 to 5.6.3 ([#11939](https://github.com/mdn/yari/issues/11939)) ([075ffc3](https://github.com/mdn/yari/commit/075ffc37fb5decbe3fc358fcfb2d263538bb0091)) +* **deps-dev:** bump typescript from 5.6.2 to 5.6.3 in /client/pwa ([#11932](https://github.com/mdn/yari/issues/11932)) ([5954786](https://github.com/mdn/yari/commit/59547866ca7f833ee11edeb0fa4b7777ee37eefc)) +* **deps-dev:** bump typescript-eslint from 8.8.0 to 8.8.1 ([#11928](https://github.com/mdn/yari/issues/11928)) ([5087f89](https://github.com/mdn/yari/commit/5087f8935de8a9997858dbf3fc0dad0f77600e53)) +* **deps:** bump @lit/react from 1.0.5 to 1.0.6 ([#11927](https://github.com/mdn/yari/issues/11927)) ([b78d46f](https://github.com/mdn/yari/commit/b78d46f896b92d4d8831ebeb98232b46ef3e4cc5)) +* **deps:** bump @mdn/browser-compat-data from 5.6.4 to 5.6.5 ([#11942](https://github.com/mdn/yari/issues/11942)) ([a69cff6](https://github.com/mdn/yari/commit/a69cff6318493ee95a5dc66d1d779fef2a91fb1f)) +* **deps:** bump @sentry/node from 8.32.0 to 8.33.0 in the sentry group ([#11899](https://github.com/mdn/yari/issues/11899)) ([379a7ae](https://github.com/mdn/yari/commit/379a7ae31da8bf7b636e122a906ff2472b35d1f5)) +* **deps:** bump @sentry/node from 8.33.0 to 8.33.1 in the sentry group ([#11908](https://github.com/mdn/yari/issues/11908)) ([7d3db0f](https://github.com/mdn/yari/commit/7d3db0f3e97112b6bc557afb0e042355ca449774)) +* **deps:** bump @sentry/node from 8.33.1 to 8.34.0 in the sentry group ([#11948](https://github.com/mdn/yari/issues/11948)) ([6097cc4](https://github.com/mdn/yari/commit/6097cc492823a2f590041dc90829f354f38f440a)) +* **deps:** bump @stripe/stripe-js from 4.6.0 to 4.7.0 ([#11917](https://github.com/mdn/yari/issues/11917)) ([b7cd6f5](https://github.com/mdn/yari/commit/b7cd6f5036f2d89bcaad057f87c7b66cb0caf688)) +* **deps:** bump @stripe/stripe-js from 4.7.0 to 4.8.0 ([#11943](https://github.com/mdn/yari/issues/11943)) ([cf11391](https://github.com/mdn/yari/commit/cf113917bc54e3b607bca7fea681d7bf7631d975)) +* **deps:** bump boto3 from 1.35.29 to 1.35.34 in /deployer in the dependencies group ([#11912](https://github.com/mdn/yari/issues/11912)) ([a65ec00](https://github.com/mdn/yari/commit/a65ec001de946f60412a5a48cc63304d83407c78)) +* **deps:** bump cookie from 0.5.0 to 0.7.0 in /libs/locale-utils ([#11919](https://github.com/mdn/yari/issues/11919)) ([2d2ad46](https://github.com/mdn/yari/commit/2d2ad4642793cf55dacee59f3d1c5720e20a5b6e)) +* **deps:** bump cookie from 0.5.0 to 0.7.2 in /cloud-function ([#11920](https://github.com/mdn/yari/issues/11920)) ([1701ec0](https://github.com/mdn/yari/commit/1701ec0b0d0eaea57a501415e2297496b601307a)) +* **deps:** bump cookie from 0.6.0 to 0.7.0 ([#11902](https://github.com/mdn/yari/issues/11902)) ([b4dacfa](https://github.com/mdn/yari/commit/b4dacfac7173578919a0072fbac57ea69bed42be)) +* **deps:** bump cookie from 0.7.0 to 0.7.1 ([#11909](https://github.com/mdn/yari/issues/11909)) ([bed92fe](https://github.com/mdn/yari/commit/bed92fe636bcb30bb438d4e87a2ea0d3f5a46325)) +* **deps:** bump cookie from 0.7.1 to 0.7.2 ([#11914](https://github.com/mdn/yari/issues/11914)) ([025a545](https://github.com/mdn/yari/commit/025a545364c019e3155b558dbdae8be3676440b0)) +* **deps:** bump cookie-parser from 1.4.6 to 1.4.7 ([#11936](https://github.com/mdn/yari/issues/11936)) ([b926ffc](https://github.com/mdn/yari/commit/b926ffc12a850e5fa73a45d33c81df06e5550f6f)) +* **deps:** bump express from 4.21.0 to 4.21.1 ([#11941](https://github.com/mdn/yari/issues/11941)) ([72c4f53](https://github.com/mdn/yari/commit/72c4f53613e14943890c81d21307726e6814a611)) +* **deps:** bump http-proxy-middleware from 2.0.6 to 2.0.7 ([#11916](https://github.com/mdn/yari/issues/11916)) ([350b239](https://github.com/mdn/yari/commit/350b2394d83bfce07bf4cd718ef1503330f61c47)) +* **deps:** bump lit from 3.2.0 to 3.2.1 ([#11925](https://github.com/mdn/yari/issues/11925)) ([4be2377](https://github.com/mdn/yari/commit/4be2377f5c4c76caad8b21f21408f2fd39348cf1)) +* **deps:** bump openai from 4.67.0 to 4.67.1 ([#11905](https://github.com/mdn/yari/issues/11905)) ([2cf2ee5](https://github.com/mdn/yari/commit/2cf2ee56fc764356f510bf903c922541fd622d7b)) +* **deps:** bump openai from 4.67.1 to 4.67.2 ([#11929](https://github.com/mdn/yari/issues/11929)) ([8fecd83](https://github.com/mdn/yari/commit/8fecd8342f696cc6cff3e5b9801d81f16d113a1d)) +* **deps:** bump openai from 4.67.2 to 4.67.3 ([#11938](https://github.com/mdn/yari/issues/11938)) ([e0000c5](https://github.com/mdn/yari/commit/e0000c58a59635e837cc42a5cb441edc763e9c2f)) +* **deps:** bump web-features from 1.4.0 to 2.0.0 ([#11935](https://github.com/mdn/yari/issues/11935)) ([499b11e](https://github.com/mdn/yari/commit/499b11e6a8c9e04caa0f6919bef1a1bd0dd46373)) +* **deps:** bump web-specs from 3.21.0 to 3.22.0 ([#11915](https://github.com/mdn/yari/issues/11915)) ([b1ea10e](https://github.com/mdn/yari/commit/b1ea10ec71b723f7787118251926436219f0e474)) +* **deps:** bump web-specs from 3.22.0 to 3.23.0 ([#11926](https://github.com/mdn/yari/issues/11926)) ([2f1aab4](https://github.com/mdn/yari/commit/2f1aab41ecd0fbc6b3418f7be181e2d3bb758a87)) +* **deps:** migrate from inquirer to @inquirer/prompts 7.0.0 ([#11508](https://github.com/mdn/yari/issues/11508)) ([98e8f3e](https://github.com/mdn/yari/commit/98e8f3e768d07d527ef30dbc6fdbe91b8d2cffc6)) +* **macros/AvailableInWorkers:** add zh-CN translations ([#11894](https://github.com/mdn/yari/issues/11894)) ([b10b2ae](https://github.com/mdn/yari/commit/b10b2ae0c1460ba98ef1bd1d3c1b4c1551fd424b)) +* **menu:** add new pill to curriculum ([#11923](https://github.com/mdn/yari/issues/11923)) ([798536b](https://github.com/mdn/yari/commit/798536b8284753d097e5d096d2ee698c4570a5cc)) +* **observatory:** remove links to old observatory ([#11947](https://github.com/mdn/yari/issues/11947)) ([1db7020](https://github.com/mdn/yari/commit/1db70206820806891b8f7f58dbdf93f1f89b1e84)) + +## [2.64.1](https://github.com/mdn/yari/compare/v2.64.0...v2.64.1) (2024-10-02) + + +### Bug Fixes + +* **build:** don't run bundlesize action on PRs from forks ([#11887](https://github.com/mdn/yari/issues/11887)) ([9ddf73e](https://github.com/mdn/yari/commit/9ddf73e50f3469b9bc728a143d870c77c3c8cd4e)) +* **macros/jsxref:** fix dot handling ([#11869](https://github.com/mdn/yari/issues/11869)) ([de1a76a](https://github.com/mdn/yari/commit/de1a76a2d53c450dddc7b26e297fc360de65d36d)) + + +### Enhancements + +* **build:** improve expected document path error message ([#11606](https://github.com/mdn/yari/issues/11606)) ([afa30bc](https://github.com/mdn/yari/commit/afa30bcaf032d986a46247efb5edc15594e49a88)) +* **curriculum:** add inline scrim design to custom element ([#11866](https://github.com/mdn/yari/issues/11866)) ([540505b](https://github.com/mdn/yari/commit/540505ba3168e2e502341cd661997b4be5673f42)) +* **language-menu:** explain "Remember language" + link announcement ([#11865](https://github.com/mdn/yari/issues/11865)) ([ca0300d](https://github.com/mdn/yari/commit/ca0300d28810fa6294bd3a189531800227dbdc50)) +* **seo:** link technologies in homepage hero ([#11877](https://github.com/mdn/yari/issues/11877)) ([2bce115](https://github.com/mdn/yari/commit/2bce115c9af3344895dc5e57c4d23570d86bd069)) + + +### Miscellaneous + +* **curriculum:** add styling for pdf download banner ([#11834](https://github.com/mdn/yari/issues/11834)) ([8e5c55e](https://github.com/mdn/yari/commit/8e5c55ebd484ccae1a92141f90ab17808a95f93a)) +* **curriculum:** change scrimba copy/links ([#11874](https://github.com/mdn/yari/issues/11874)) ([c90c6fc](https://github.com/mdn/yari/commit/c90c6fca8260fa48158c8fbabadb1bd5c606dce1)) +* **deps-dev:** bump @swc/core from 1.7.26 to 1.7.28 ([#11862](https://github.com/mdn/yari/issues/11862)) ([233402a](https://github.com/mdn/yari/commit/233402a7f5eea1895ea243a2645338e2e2e81c83)) +* **deps-dev:** bump @types/node from 18.19.51 to 18.19.53 in the types group ([#11870](https://github.com/mdn/yari/issues/11870)) ([56541b3](https://github.com/mdn/yari/commit/56541b3e426d9b43c6fd1326a287a9267168bf94)) +* **deps-dev:** bump browserslist from 4.23.3 to 4.24.0 ([#11863](https://github.com/mdn/yari/issues/11863)) ([72122f0](https://github.com/mdn/yari/commit/72122f0478fc42f0ba4f8975245332c8c6cf798c)) +* **deps-dev:** bump eslint-plugin-react from 7.36.1 to 7.37.0 ([#11876](https://github.com/mdn/yari/issues/11876)) ([0f5a50b](https://github.com/mdn/yari/commit/0f5a50b84ff958bec546ce274f41e8d46283bdac)) +* **deps-dev:** bump eslint-plugin-react from 7.37.0 to 7.37.1 ([#11896](https://github.com/mdn/yari/issues/11896)) ([e072309](https://github.com/mdn/yari/commit/e07230970d00e4452fed90445a2a64fcb7cbc316)) +* **deps-dev:** bump html-validate from 8.23.0 to 8.24.0 ([#11860](https://github.com/mdn/yari/issues/11860)) ([ca1821c](https://github.com/mdn/yari/commit/ca1821c024184e76bff4c342bbd8b18142f165ff)) +* **deps-dev:** bump sass from 1.79.3 to 1.79.4 ([#11882](https://github.com/mdn/yari/issues/11882)) ([c4516ad](https://github.com/mdn/yari/commit/c4516ad5cb1769ee6e5343b3a648f36f271d6947)) +* **deps-dev:** bump the types group with 2 updates ([#11879](https://github.com/mdn/yari/issues/11879)) ([4c25d57](https://github.com/mdn/yari/commit/4c25d57cbd4ef09d9994c8bfa1bcb3853e55acf4)) +* **deps-dev:** bump typescript-eslint from 8.7.0 to 8.8.0 ([#11890](https://github.com/mdn/yari/issues/11890)) ([9a856d8](https://github.com/mdn/yari/commit/9a856d871b1cea2d1028ec8cff27bcdb86fd2b16)) +* **deps-dev:** bump webpack from 5.94.0 to 5.95.0 ([#11871](https://github.com/mdn/yari/issues/11871)) ([123a233](https://github.com/mdn/yari/commit/123a2334dccbafa48330adf93276eb21cded5f2a)) +* **deps-dev:** bump webpack from 5.94.0 to 5.95.0 in /client/pwa ([#11868](https://github.com/mdn/yari/issues/11868)) ([c5ccaf1](https://github.com/mdn/yari/commit/c5ccaf1b85ad9fac7362e333d8f029c0a1c056df)) +* **deps:** bump @mdn/browser-compat-data from 5.6.2 to 5.6.3 ([#11861](https://github.com/mdn/yari/issues/11861)) ([7fbcd36](https://github.com/mdn/yari/commit/7fbcd364ae8b0623f89ae3d3fa8eb42354d2aceb)) +* **deps:** bump @mdn/browser-compat-data from 5.6.3 to 5.6.4 ([#11881](https://github.com/mdn/yari/issues/11881)) ([1a98631](https://github.com/mdn/yari/commit/1a986314369e595b2173b0e005455648aee0ae57)) +* **deps:** bump @stripe/stripe-js from 4.5.0 to 4.6.0 ([#11889](https://github.com/mdn/yari/issues/11889)) ([510d943](https://github.com/mdn/yari/commit/510d94317de76c1e72cdfb17627af200a2f7c589)) +* **deps:** bump @webref/css from 6.15.2 to 6.16.0 ([#11892](https://github.com/mdn/yari/issues/11892)) ([690b997](https://github.com/mdn/yari/commit/690b99742d707e1a9ba1e3af07bd1a1184d3c6fc)) +* **deps:** bump boto3 from 1.35.24 to 1.35.29 in /deployer in the dependencies group ([#11878](https://github.com/mdn/yari/issues/11878)) ([9790fdf](https://github.com/mdn/yari/commit/9790fdf491c47e207b8da3a8d5626cbf3cec3376)) +* **deps:** bump fdir from 6.3.0 to 6.4.0 ([#11880](https://github.com/mdn/yari/issues/11880)) ([991e4e0](https://github.com/mdn/yari/commit/991e4e0b377d537486bd0b30f3d7ccd409089165)) +* **deps:** bump openai from 4.63.0 to 4.64.0 ([#11872](https://github.com/mdn/yari/issues/11872)) ([3f7ad43](https://github.com/mdn/yari/commit/3f7ad4336c3621dfa479e3eeec5f8a4e6e721e0b)) +* **deps:** bump openai from 4.64.0 to 4.65.0 ([#11875](https://github.com/mdn/yari/issues/11875)) ([cd27679](https://github.com/mdn/yari/commit/cd276790c604f62f2a62d321cbed32125dd58fc6)) +* **deps:** bump openai from 4.65.0 to 4.66.1 ([#11891](https://github.com/mdn/yari/issues/11891)) ([131e39b](https://github.com/mdn/yari/commit/131e39bc71dcc73be99d9e8deaf884c3621edb1d)) +* **deps:** bump openai from 4.66.1 to 4.67.0 ([#11897](https://github.com/mdn/yari/issues/11897)) ([694798a](https://github.com/mdn/yari/commit/694798a6bdb3765524a63572d47490b71f12f04c)) +* **deps:** bump rehype-parse from 9.0.0 to 9.0.1 ([#11884](https://github.com/mdn/yari/issues/11884)) ([71cf8a9](https://github.com/mdn/yari/commit/71cf8a93e352a7211bd63a3d2d8b17ec6610b971)) +* **deps:** bump rehype-stringify from 10.0.0 to 10.0.1 ([#11883](https://github.com/mdn/yari/issues/11883)) ([b21152a](https://github.com/mdn/yari/commit/b21152a904178cec7c5e5a9bd063929c48dc8545)) +* **macros/HTTPSidebar:** Reorg HTTP sidebar after doc reshuffle, delete 'Basics of HTTP' ([#11753](https://github.com/mdn/yari/issues/11753)) ([1536571](https://github.com/mdn/yari/commit/1536571e3c9f28110065ac4da9ecfd7c698753de)) +* **macros:** add "except shared" condition to AvailableinWorkers ([#11888](https://github.com/mdn/yari/issues/11888)) ([41ad479](https://github.com/mdn/yari/commit/41ad4797a608cfa194f5265e16025794d5cd9f25)) + +## [2.64.0](https://github.com/mdn/yari/compare/v2.63.1...v2.64.0) (2024-09-25) + + +### Features + +* **curriculum:** add scrim-inline custom element ([#11823](https://github.com/mdn/yari/issues/11823)) ([8e3a00f](https://github.com/mdn/yari/commit/8e3a00fc807284626aac0b1d13bfb400925ba070)) +* **language-menu:** add "Remember language" experiment ([#11518](https://github.com/mdn/yari/issues/11518)) ([3ac917f](https://github.com/mdn/yari/commit/3ac917f006c58d8a12da90ba1420bb1509cc0e0f)) +* **ssr:** render JSX instead of index.html ([#11672](https://github.com/mdn/yari/issues/11672)) ([6b75edd](https://github.com/mdn/yari/commit/6b75edd96e09b1152b332683c3fa8faf6734df69)) +* **syntax-highlight:** do client side, support more languages ([#11654](https://github.com/mdn/yari/issues/11654)) ([253ef1f](https://github.com/mdn/yari/commit/253ef1f8621123dc9b70d1c2d0a18888cff4556c)) + + +### Bug Fixes + +* **layout:** add scrolling container around block math elements ([#11856](https://github.com/mdn/yari/issues/11856)) ([69b2cc9](https://github.com/mdn/yari/commit/69b2cc9717bb0a76fb5d0519ae0a26e6b5a03e64)) +* **style:** use em unit for Switch/Thumbs atoms ([#11855](https://github.com/mdn/yari/issues/11855)) ([e2a4910](https://github.com/mdn/yari/commit/e2a4910013232547132e07d7a8692458ad14a769)) +* **test-build:** enable BSA ([#11815](https://github.com/mdn/yari/issues/11815)) ([78a47ca](https://github.com/mdn/yari/commit/78a47ca6ae4e9dc7d40173797e2fda4573a26d8c)) + + +### Enhancements + +* **build:** show bundle size diff on PRs ([#11757](https://github.com/mdn/yari/issues/11757)) ([51a6be3](https://github.com/mdn/yari/commit/51a6be3ccf96d02e86d9341e1db9a6ac30574ebd)) + + +### Miscellaneous + +* **deps-dev:** bump @playwright/test from 1.47.1 to 1.47.2 ([#11849](https://github.com/mdn/yari/issues/11849)) ([6e88cf3](https://github.com/mdn/yari/commit/6e88cf3ef72f145a8700fd6d4cd03e807e21e15f)) +* **deps-dev:** bump @types/react from 18.3.6 to 18.3.7 in the types group ([#11816](https://github.com/mdn/yari/issues/11816)) ([055c285](https://github.com/mdn/yari/commit/055c285a31ece7bcce81a026203f03d8aae1388e)) +* **deps-dev:** bump @types/react from 18.3.7 to 18.3.8 in the types group ([#11835](https://github.com/mdn/yari/issues/11835)) ([c5d881b](https://github.com/mdn/yari/commit/c5d881bc5938a5121f44f5f768281667013c0caa)) +* **deps-dev:** bump babel-loader from 9.2.0 to 9.2.1 ([#11822](https://github.com/mdn/yari/issues/11822)) ([e334844](https://github.com/mdn/yari/commit/e334844c354277eedde8f7523d84cdb8ab7d6d56)) +* **deps-dev:** bump eslint from 8.57.0 to 8.57.1 ([#11819](https://github.com/mdn/yari/issues/11819)) ([dfb4d19](https://github.com/mdn/yari/commit/dfb4d19ace28aba1a3254b69404519590f099170)) +* **deps-dev:** bump eslint-plugin-n from 17.10.2 to 17.10.3 ([#11829](https://github.com/mdn/yari/issues/11829)) ([db38cbc](https://github.com/mdn/yari/commit/db38cbc3713d8738f78a1ef1159541f848a998f4)) +* **deps-dev:** bump html-validate from 8.22.0 to 8.23.0 ([#11848](https://github.com/mdn/yari/issues/11848)) ([fd64361](https://github.com/mdn/yari/commit/fd6436188b7a7f5f9a40f0f7f153d7a4d8c53b14)) +* **deps-dev:** bump jsdom from 25.0.0 to 25.0.1 ([#11846](https://github.com/mdn/yari/issues/11846)) ([e1ecf35](https://github.com/mdn/yari/commit/e1ecf354982f7f23e6ce34f37e178fc45df8e2a4)) +* **deps-dev:** bump postcss-preset-env from 10.0.3 to 10.0.5 ([#11850](https://github.com/mdn/yari/issues/11850)) ([032a78a](https://github.com/mdn/yari/commit/032a78a2a90aef4f0ff00bcd8f0f6c3db7adee27)) +* **deps-dev:** bump sass from 1.78.0 to 1.79.1 ([#11825](https://github.com/mdn/yari/issues/11825)) ([c713df6](https://github.com/mdn/yari/commit/c713df67e123ecb666111aa05979f6bf9235a2bc)) +* **deps-dev:** bump sass from 1.79.1 to 1.79.2 ([#11837](https://github.com/mdn/yari/issues/11837)) ([a5b7a99](https://github.com/mdn/yari/commit/a5b7a9936417fbfb5c063df099db5820e03552a9)) +* **deps-dev:** bump sass from 1.79.2 to 1.79.3 ([#11844](https://github.com/mdn/yari/issues/11844)) ([6fd45da](https://github.com/mdn/yari/commit/6fd45da18cdc745bcbee82b2a3fe11b4b2aed123)) +* **deps-dev:** bump sass-loader from 16.0.1 to 16.0.2 ([#11847](https://github.com/mdn/yari/issues/11847)) ([c6d9cbc](https://github.com/mdn/yari/commit/c6d9cbc801bba7c915a99dfa473c623f037a95d9)) +* **deps-dev:** bump the types group with 2 updates ([#11859](https://github.com/mdn/yari/issues/11859)) ([15ec9ae](https://github.com/mdn/yari/commit/15ec9ae027240d12cc7f830dfda45cd514c74600)) +* **deps-dev:** bump typescript-eslint from 8.5.0 to 8.6.0 ([#11820](https://github.com/mdn/yari/issues/11820)) ([03d8519](https://github.com/mdn/yari/commit/03d85196df3085cef92222dab81adb0b710de6a1)) +* **deps-dev:** bump typescript-eslint from 8.6.0 to 8.7.0 ([#11853](https://github.com/mdn/yari/issues/11853)) ([49c44ab](https://github.com/mdn/yari/commit/49c44abb9008e4e41bcf3d73ee5b3b882b1d188c)) +* **deps:** bump @mdn/browser-compat-data from 5.5.51 to 5.6.0 ([#11821](https://github.com/mdn/yari/issues/11821)) ([55e8797](https://github.com/mdn/yari/commit/55e8797e947d2bcb018d4514c49d81fa363a28e3)) +* **deps:** bump @mdn/browser-compat-data from 5.6.0 to 5.6.1 ([#11828](https://github.com/mdn/yari/issues/11828)) ([2591275](https://github.com/mdn/yari/commit/25912751864dfa208415c8253a9f9222ba371456)) +* **deps:** bump @mdn/browser-compat-data from 5.6.1 to 5.6.2 ([#11836](https://github.com/mdn/yari/issues/11836)) ([92123f2](https://github.com/mdn/yari/commit/92123f249fcf074a5908f8923181e81111b7b513)) +* **deps:** bump @sentry/node from 8.30.0 to 8.31.0 in the sentry group ([#11843](https://github.com/mdn/yari/issues/11843)) ([9d0d0c1](https://github.com/mdn/yari/commit/9d0d0c19da3077d11fe9f1c0dc751636b3f59705)) +* **deps:** bump @sentry/node from 8.31.0 to 8.32.0 in the sentry group ([#11858](https://github.com/mdn/yari/issues/11858)) ([148f9c4](https://github.com/mdn/yari/commit/148f9c4542e86996222d8ad50982c888e55b89b4)) +* **deps:** bump @stripe/stripe-js from 4.4.0 to 4.5.0 ([#11818](https://github.com/mdn/yari/issues/11818)) ([6267a4e](https://github.com/mdn/yari/commit/6267a4e6c7245cc8c4fe84078980fd44ce943988)) +* **deps:** bump @webref/css from 6.15.1 to 6.15.2 ([#11803](https://github.com/mdn/yari/issues/11803)) ([d746b75](https://github.com/mdn/yari/commit/d746b75e0fffffa2b7f0dae82c21d53d2485e063)) +* **deps:** bump boto3 from 1.35.19 to 1.35.24 in /deployer in the dependencies group ([#11851](https://github.com/mdn/yari/issues/11851)) ([961b6cc](https://github.com/mdn/yari/commit/961b6ccef4fb8acc3d97459667e4168155f1dc37)) +* **deps:** bump openai from 4.61.0 to 4.61.1 ([#11817](https://github.com/mdn/yari/issues/11817)) ([3b63888](https://github.com/mdn/yari/commit/3b6388877ed5436a984a474ebbb83b50317abbbe)) +* **deps:** bump openai from 4.61.1 to 4.62.0 ([#11827](https://github.com/mdn/yari/issues/11827)) ([1b3a718](https://github.com/mdn/yari/commit/1b3a7184f4a7d79970602568933e2433a2d978b2)) +* **deps:** bump openai from 4.62.0 to 4.62.1 ([#11832](https://github.com/mdn/yari/issues/11832)) ([e4350a6](https://github.com/mdn/yari/commit/e4350a6dd91ff49e6c7aac96b6127a20c713769f)) +* **deps:** bump openai from 4.62.1 to 4.63.0 ([#11845](https://github.com/mdn/yari/issues/11845)) ([24b346f](https://github.com/mdn/yari/commit/24b346f0a03bea5474373e148719d72575cccabd)) +* **deps:** bump pg from 8.12.0 to 8.13.0 ([#11826](https://github.com/mdn/yari/issues/11826)) ([1fde16d](https://github.com/mdn/yari/commit/1fde16da9b1b4dbb17c3cec8afeac5c64a9aac24)) +* **deps:** bump pytest from 8.3.2 to 8.3.3 in /testing/integration in the dependencies group ([#11814](https://github.com/mdn/yari/issues/11814)) ([678bdb2](https://github.com/mdn/yari/commit/678bdb2a7cd9b1ff396ab6f1886d7fd2080680fa)) +* **deps:** bump rehype-format from 5.0.0 to 5.0.1 ([#11833](https://github.com/mdn/yari/issues/11833)) ([d295fdf](https://github.com/mdn/yari/commit/d295fdf89e3a0ac863665da9fc207b0f38239abd)) +* **deps:** bump remark-rehype from 11.1.0 to 11.1.1 ([#11838](https://github.com/mdn/yari/issues/11838)) ([4c50d51](https://github.com/mdn/yari/commit/4c50d5180f6f834ca95b34bf7f11fad889c39f83)) +* **deps:** bump web-features from 1.3.0 to 1.4.0 ([#11854](https://github.com/mdn/yari/issues/11854)) ([d4c742f](https://github.com/mdn/yari/commit/d4c742ff562dbbe8f9129e175c0062a82d2a5b53)) +* **origin-trial:** update tokens ([#11824](https://github.com/mdn/yari/issues/11824)) ([f21b111](https://github.com/mdn/yari/commit/f21b11164d7287444d86802d9b041552ce261716)) + +## [2.63.1](https://github.com/mdn/yari/compare/v2.63.0...v2.63.1) (2024-09-16) + + +### Bug Fixes + +* **build:** use pipefail to fail function deployments ([#11806](https://github.com/mdn/yari/issues/11806)) ([5141019](https://github.com/mdn/yari/commit/5141019b54e24d8df6db8619dd1585c8fb1a7587)) +* **placement:** use variable for horizontal banner ([#11795](https://github.com/mdn/yari/issues/11795)) ([d880aaf](https://github.com/mdn/yari/commit/d880aaf8116f1fe692452f68107e173d042e5cb9)) +* **sidebar:** reuse icon margin for non-nested entries ([#11786](https://github.com/mdn/yari/issues/11786)) ([2294df0](https://github.com/mdn/yari/commit/2294df00ba8be26bf0767b78c02a0abad5c7894e)) + + +### Enhancements + +* **ad-free:** hide all banners completely ([#11787](https://github.com/mdn/yari/issues/11787)) ([f93b850](https://github.com/mdn/yari/commit/f93b85005b8f921e9f27266d02750af0363e1d06)) + + +### Miscellaneous + +* **deps-dev:** bump @playwright/test from 1.47.0 to 1.47.1 ([#11812](https://github.com/mdn/yari/issues/11812)) ([8e698db](https://github.com/mdn/yari/commit/8e698db7231a8ce0f87630bc50f19667b0deb136)) +* **deps-dev:** bump @swc/core from 1.7.24 to 1.7.25 ([#11791](https://github.com/mdn/yari/issues/11791)) ([0e30971](https://github.com/mdn/yari/commit/0e309719d5193d4dcc193cfd997dbd591475e590)) +* **deps-dev:** bump @swc/core from 1.7.25 to 1.7.26 ([#11793](https://github.com/mdn/yari/issues/11793)) ([51c07ba](https://github.com/mdn/yari/commit/51c07ba14af4d142b9ea16315a92fe65e35999c8)) +* **deps-dev:** bump @types/jest from 29.5.12 to 29.5.13 in the types group ([#11801](https://github.com/mdn/yari/issues/11801)) ([fc79d49](https://github.com/mdn/yari/commit/fc79d49564ba9bbb0fb7edff63c77947532e97d1)) +* **deps-dev:** bump @types/react from 18.3.5 to 18.3.6 in the types group ([#11808](https://github.com/mdn/yari/issues/11808)) ([9baf777](https://github.com/mdn/yari/commit/9baf777611cf9f3f7c0f65e5ece25d577290e856)) +* **deps-dev:** bump babel-loader from 9.1.3 to 9.2.0 ([#11811](https://github.com/mdn/yari/issues/11811)) ([fc35868](https://github.com/mdn/yari/commit/fc3586803901ea4d3a3fc66d0b6c18e57d025545)) +* **deps-dev:** bump eslint-plugin-react from 7.35.2 to 7.36.1 ([#11805](https://github.com/mdn/yari/issues/11805)) ([35fc136](https://github.com/mdn/yari/commit/35fc1362f82b1d6bea60d4a0225cf4e34d5fa6a1)) +* **deps-dev:** bump husky from 9.1.5 to 9.1.6 ([#11798](https://github.com/mdn/yari/issues/11798)) ([b3288e0](https://github.com/mdn/yari/commit/b3288e016c54fa41faac200e6a78be00f74509a0)) +* **deps-dev:** bump postcss from 8.4.45 to 8.4.47 ([#11810](https://github.com/mdn/yari/issues/11810)) ([2497484](https://github.com/mdn/yari/commit/2497484c5e94efaf9186940e28b84e3453459d05)) +* **deps-dev:** bump the types group across 1 directory with 2 updates ([#11743](https://github.com/mdn/yari/issues/11743)) ([a38975e](https://github.com/mdn/yari/commit/a38975ece5e7b4cf588964ea15b1abdb19b8c69b)) +* **deps:** bump express from 4.20.0 to 4.21.0 ([#11796](https://github.com/mdn/yari/issues/11796)) ([90e5231](https://github.com/mdn/yari/commit/90e5231100588a6a65073ff1946d05fff02ab33e)) +* **deps:** bump mdn-data from 2.11.0 to 2.11.1 ([#11802](https://github.com/mdn/yari/issues/11802)) ([16d9403](https://github.com/mdn/yari/commit/16d9403db82e6bb4cfa7e94e7fb36f42ce98e4c5)) +* **deps:** bump openai from 4.58.2 to 4.59.0 ([#11799](https://github.com/mdn/yari/issues/11799)) ([4877d5b](https://github.com/mdn/yari/commit/4877d5bf0dcd1c6baf6cbdeaa46f64d4e2c820ca)) +* **deps:** bump openai from 4.59.0 to 4.60.0 ([#11804](https://github.com/mdn/yari/issues/11804)) ([dd1c110](https://github.com/mdn/yari/commit/dd1c11065374834c0ed4dd48f20fc0a3db9d7657)) +* **deps:** bump openai from 4.60.0 to 4.61.0 ([#11809](https://github.com/mdn/yari/issues/11809)) ([bcc7727](https://github.com/mdn/yari/commit/bcc7727d0be0c3eb0abcbba2a256dd718d40b47f)) +* **deps:** bump the dependencies group in /deployer with 2 updates ([#11807](https://github.com/mdn/yari/issues/11807)) ([0caaee1](https://github.com/mdn/yari/commit/0caaee198887ff226a9d9d10bb48d1e5d5b6564b)) +* **deps:** bump web-features from 1.2.0 to 1.3.0 ([#11800](https://github.com/mdn/yari/issues/11800)) ([39e1574](https://github.com/mdn/yari/commit/39e1574b4a21e15bc287fcd5310755a7b2f7f015)) +* **deps:** run npm audit fix in /cloud-function ([#11792](https://github.com/mdn/yari/issues/11792)) ([43b307f](https://github.com/mdn/yari/commit/43b307fe9c59ee3e16eecb16be943a8dfaad6d7d)) +* **deps:** run yarn upgrade ([#11789](https://github.com/mdn/yari/issues/11789)) ([2777d58](https://github.com/mdn/yari/commit/2777d58faffad32ce25e479968306331cef3b001)) +* **macros:** delete DOMAttributeMethods + unimplemented_inline macros ([#11790](https://github.com/mdn/yari/issues/11790)) ([e0b7616](https://github.com/mdn/yari/commit/e0b76166d13511d773ee67c397a058eb883bb278)) +* **placement:** add scrimba discount ([#11785](https://github.com/mdn/yari/issues/11785)) ([ac157ff](https://github.com/mdn/yari/commit/ac157ff0a659e10b7fed6646d105e1ed90a7ea44)) +* **tools-menu:** remove "New" indicator ([#11794](https://github.com/mdn/yari/issues/11794)) ([f2bca97](https://github.com/mdn/yari/commit/f2bca97057fe51e69fb2ada1e1360767d798b531)) + +## [2.63.0](https://github.com/mdn/yari/compare/v2.62.0...v2.63.0) (2024-09-10) + + +### Features + +* translate MathML section ([606e5cb](https://github.com/mdn/yari/commit/606e5cb54b2eae8749d32cf5b8ce0af8b861bc9e)) + + +### Bug Fixes + +* **ai-help:** handle invalid chat ids correctly ([#11678](https://github.com/mdn/yari/issues/11678)) ([225fe24](https://github.com/mdn/yari/commit/225fe24478291a16f026969724aee03dfcabceb2)) +* **ai-help:** set chatId on user message ([#11751](https://github.com/mdn/yari/issues/11751)) ([97f4b23](https://github.com/mdn/yari/commit/97f4b233c4af2572d1f81d4175af918e5119490d)) +* **ci:** check dependabot PR user instead of actor ([#11741](https://github.com/mdn/yari/issues/11741)) ([0d8dd6b](https://github.com/mdn/yari/commit/0d8dd6b92637a8756b4e3862b00e42e928de21fc)) +* **contributor-spotlight:** some old pages not building ([#11679](https://github.com/mdn/yari/issues/11679)) ([5adb9eb](https://github.com/mdn/yari/commit/5adb9eb2be4a06d9e3dd208f28a79003082bddba)) +* **curriculum:** fix module overview sidescroll ([#11681](https://github.com/mdn/yari/issues/11681)) ([0be1a35](https://github.com/mdn/yari/commit/0be1a35c965f34795d7c827e6b0b458ba09bd42c)) +* **layout:** avoid sidebar overflow beyond footer ([#11621](https://github.com/mdn/yari/issues/11621)) ([8b0792f](https://github.com/mdn/yari/commit/8b0792f2554e7d64521a29f83861ff4e7d18f059)) +* **macros/WebExtAllExamples:** update branch name ([#11747](https://github.com/mdn/yari/issues/11747)) ([61ef395](https://github.com/mdn/yari/commit/61ef395d613e15e1c6fd493eeb7bb9ef3dfeb080)) +* **macro:** update redirected URLs ([61ef395](https://github.com/mdn/yari/commit/61ef395d613e15e1c6fd493eeb7bb9ef3dfeb080)) + + +### Miscellaneous + +* **deps-dev:** add @types/js-yaml 4.0.9 ([#11620](https://github.com/mdn/yari/issues/11620)) ([0c4e3f7](https://github.com/mdn/yari/commit/0c4e3f7c8819ac5cda4547e965beb524d3db0d7f)) +* **deps-dev:** bump @playwright/test from 1.46.1 to 1.47.0 ([#11749](https://github.com/mdn/yari/issues/11749)) ([0de6066](https://github.com/mdn/yari/commit/0de606681abdedfd73d6f2bde34759f28177b877)) +* **deps-dev:** bump @swc/core from 1.7.18 to 1.7.19 ([#11706](https://github.com/mdn/yari/issues/11706)) ([1042246](https://github.com/mdn/yari/commit/104224655d35aa9680a2e5e0b727e5e83b8bfb57)) +* **deps-dev:** bump @swc/core from 1.7.19 to 1.7.21 ([#11708](https://github.com/mdn/yari/issues/11708)) ([05b9e81](https://github.com/mdn/yari/commit/05b9e81f49d3abc42ad5f891cfe7bea666e5f181)) +* **deps-dev:** bump @swc/core from 1.7.21 to 1.7.22 ([#11716](https://github.com/mdn/yari/issues/11716)) ([1e4867f](https://github.com/mdn/yari/commit/1e4867fc1154707acdfdaad63bc15cf8f4b4586a)) +* **deps-dev:** bump @swc/core from 1.7.22 to 1.7.23 ([#11728](https://github.com/mdn/yari/issues/11728)) ([9a73951](https://github.com/mdn/yari/commit/9a73951ab4f49194baea447a7ec59e55afd91944)) +* **deps-dev:** bump @swc/core from 1.7.23 to 1.7.24 ([#11766](https://github.com/mdn/yari/issues/11766)) ([5047a7a](https://github.com/mdn/yari/commit/5047a7af9a2acebc719ab15b1eeb4a0962b559dc)) +* **deps-dev:** bump @types/node from 18.19.46 to 18.19.47 in the types group ([#11705](https://github.com/mdn/yari/issues/11705)) ([151cdf1](https://github.com/mdn/yari/commit/151cdf18507917be6a29845a5f295bacba81b3a3)) +* **deps-dev:** bump diff from 5.2.0 to 6.0.0 ([#11729](https://github.com/mdn/yari/issues/11729)) ([418da90](https://github.com/mdn/yari/commit/418da90ed6b4945f2a052f2f6d109c683b0f8973)) +* **deps-dev:** bump diff from 6.0.0 to 7.0.0 ([#11764](https://github.com/mdn/yari/issues/11764)) ([6dc8934](https://github.com/mdn/yari/commit/6dc8934176aae8bdfe405dbcf58eb9ce0b6ead44)) +* **deps-dev:** bump eslint-plugin-import from 2.29.1 to 2.30.0 ([#11727](https://github.com/mdn/yari/issues/11727)) ([65c7920](https://github.com/mdn/yari/commit/65c792087b4ea5828b5ba17d711bdf82ae6785d0)) +* **deps-dev:** bump eslint-plugin-jest from 28.8.0 to 28.8.1 ([#11712](https://github.com/mdn/yari/issues/11712)) ([a4f2535](https://github.com/mdn/yari/commit/a4f2535b7ef037cdbb6995d52cfb06d93181c661)) +* **deps-dev:** bump eslint-plugin-jest from 28.8.1 to 28.8.2 ([#11721](https://github.com/mdn/yari/issues/11721)) ([50276a3](https://github.com/mdn/yari/commit/50276a3a8b92cd6f43ec72e5912ee4f4f765ee7d)) +* **deps-dev:** bump eslint-plugin-jest from 28.8.2 to 28.8.3 ([#11745](https://github.com/mdn/yari/issues/11745)) ([b5d1ac2](https://github.com/mdn/yari/commit/b5d1ac235dc887d23dc9452fa71788f0d59aeddd)) +* **deps-dev:** bump eslint-plugin-jsx-a11y from 6.9.0 to 6.10.0 ([#11735](https://github.com/mdn/yari/issues/11735)) ([b0fe30c](https://github.com/mdn/yari/commit/b0fe30c5b1c5884256bc21d632cf3609eb9ff0c6)) +* **deps-dev:** bump eslint-plugin-react from 7.35.0 to 7.35.1 ([#11726](https://github.com/mdn/yari/issues/11726)) ([d026632](https://github.com/mdn/yari/commit/d026632c1d3730d07774bfd01f175bf559c9de32)) +* **deps-dev:** bump eslint-plugin-react from 7.35.1 to 7.35.2 ([#11740](https://github.com/mdn/yari/issues/11740)) ([4b3903d](https://github.com/mdn/yari/commit/4b3903d7a3d5ff01fe619cea81a65fa46823afa7)) +* **deps-dev:** bump html-validate from 8.21.0 to 8.22.0 ([#11765](https://github.com/mdn/yari/issues/11765)) ([4febe01](https://github.com/mdn/yari/commit/4febe01541e571de800942b3df1d95f772ae7cf7)) +* **deps-dev:** bump jsdom from 24.1.1 to 25.0.0 ([#11691](https://github.com/mdn/yari/issues/11691)) ([3ed5009](https://github.com/mdn/yari/commit/3ed5009eab3f4d19b6afa4aeb1db8111befdc945)) +* **deps-dev:** bump postcss from 8.4.41 to 8.4.44 ([#11720](https://github.com/mdn/yari/issues/11720)) ([8c0bc24](https://github.com/mdn/yari/commit/8c0bc2437c6a5773f1766cbf6ecd77a95b6770a8)) +* **deps-dev:** bump postcss from 8.4.44 to 8.4.45 ([#11732](https://github.com/mdn/yari/issues/11732)) ([54891cd](https://github.com/mdn/yari/commit/54891cdf07e72150724b31657bcd1e67a739120f)) +* **deps-dev:** bump postcss-normalize from 10.0.1 to 13.0.0 ([#11769](https://github.com/mdn/yari/issues/11769)) ([90824b9](https://github.com/mdn/yari/commit/90824b9478ebcd67ae70625f36c58f68a6a3a823)) +* **deps-dev:** bump postcss-preset-env from 10.0.2 to 10.0.3 ([#11763](https://github.com/mdn/yari/issues/11763)) ([d515d49](https://github.com/mdn/yari/commit/d515d493fcdae177d382980f218f9cee69729a4a)) +* **deps-dev:** bump postcss-preset-env from 9.6.0 to 10.0.2 ([#11650](https://github.com/mdn/yari/issues/11650)) ([8450196](https://github.com/mdn/yari/commit/8450196bbd935809efa985394249e544f9c6529a)) +* **deps-dev:** bump react-router-dom from 6.26.1 to 6.26.2 ([#11779](https://github.com/mdn/yari/issues/11779)) ([d3953b8](https://github.com/mdn/yari/commit/d3953b81c0c092f7a1cb4ac69615a842e8cdda1d)) +* **deps-dev:** bump sass from 1.77.6 to 1.78.0 ([#11736](https://github.com/mdn/yari/issues/11736)) ([6b2cde6](https://github.com/mdn/yari/commit/6b2cde6955926e7b0033146e470f870fc6d31deb)) +* **deps-dev:** bump sass-loader from 15.0.0 to 16.0.1 ([#11661](https://github.com/mdn/yari/issues/11661)) ([b4c6ec5](https://github.com/mdn/yari/commit/b4c6ec53bff459ae54e85a4695eff55ac2f355ec)) +* **deps-dev:** bump typescript from 5.5.4 to 5.6.2 ([#11780](https://github.com/mdn/yari/issues/11780)) ([cda5388](https://github.com/mdn/yari/commit/cda5388bd751a5428ab41d9b2fd1b17cf8f957a3)) +* **deps-dev:** bump typescript from 5.5.4 to 5.6.2 in /client/pwa ([#11784](https://github.com/mdn/yari/issues/11784)) ([35a38cf](https://github.com/mdn/yari/commit/35a38cfda471b409758449e8b6ff7f98d3a19f98)) +* **deps-dev:** bump typescript-eslint from 8.3.0 to 8.4.0 ([#11730](https://github.com/mdn/yari/issues/11730)) ([46e9a9f](https://github.com/mdn/yari/commit/46e9a9f54b65da1921406ed39d97102efdd7bd27)) +* **deps-dev:** bump typescript-eslint from 8.4.0 to 8.5.0 ([#11777](https://github.com/mdn/yari/issues/11777)) ([a19a636](https://github.com/mdn/yari/commit/a19a636b45c11c44fdcb6679624c4ee214d00f32)) +* **deps-dev:** bump webpack-dev-server from 5.0.4 to 5.1.0 ([#11738](https://github.com/mdn/yari/issues/11738)) ([63f24c6](https://github.com/mdn/yari/commit/63f24c679fdfe9dcfea926fd24c3b38d97a0b0b0)) +* **deps:** add @types/js-yaml devDependency ([0c4e3f7](https://github.com/mdn/yari/commit/0c4e3f7c8819ac5cda4547e965beb524d3db0d7f)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.51 to 2.7.52 in /client/pwa ([#11703](https://github.com/mdn/yari/issues/11703)) ([9199073](https://github.com/mdn/yari/commit/91990735c66405080f88e9121db76edf25aecd56)) +* **deps:** bump @codemirror/lang-css from 6.2.1 to 6.3.0 ([#11761](https://github.com/mdn/yari/issues/11761)) ([e98de74](https://github.com/mdn/yari/commit/e98de7418cd0aa27c439b2ba6c45912fb70e6f8e)) +* **deps:** bump @mdn/browser-compat-data from 5.5.49 to 5.5.50 ([#11737](https://github.com/mdn/yari/issues/11737)) ([16b85db](https://github.com/mdn/yari/commit/16b85dbabac846f8db73718227cf36a644a5a04e)) +* **deps:** bump @mdn/browser-compat-data from 5.5.50 to 5.5.51 ([#11767](https://github.com/mdn/yari/issues/11767)) ([e18d9f4](https://github.com/mdn/yari/commit/e18d9f4d5030dd9554fa89c0867ec74453760ca9)) +* **deps:** bump @sentry/node from 8.26.0 to 8.27.0 in the sentry group ([#11704](https://github.com/mdn/yari/issues/11704)) ([8e108bc](https://github.com/mdn/yari/commit/8e108bc0eb51ad4124a4b6e3e95125135a238796)) +* **deps:** bump @sentry/node from 8.27.0 to 8.28.0 in the sentry group ([#11725](https://github.com/mdn/yari/issues/11725)) ([165b2e8](https://github.com/mdn/yari/commit/165b2e8554a42b7e06f60f5f9068e8ae8334cae1)) +* **deps:** bump @sentry/node from 8.28.0 to 8.29.0 in the sentry group ([#11760](https://github.com/mdn/yari/issues/11760)) ([9b5103f](https://github.com/mdn/yari/commit/9b5103f9dae5b2a81a31978dbbddd85211409150)) +* **deps:** bump @stripe/stripe-js from 4.3.0 to 4.4.0 ([#11709](https://github.com/mdn/yari/issues/11709)) ([4b3e75b](https://github.com/mdn/yari/commit/4b3e75bdef8b83433020fcb616437b3632d2fe90)) +* **deps:** bump @webref/css from 6.14.2 to 6.15.0 ([#11714](https://github.com/mdn/yari/issues/11714)) ([d27da87](https://github.com/mdn/yari/commit/d27da8708fcb0e499f2c360cf43f86b3bef7b05a)) +* **deps:** bump @webref/css from 6.15.0 to 6.15.1 ([#11748](https://github.com/mdn/yari/issues/11748)) ([4d66823](https://github.com/mdn/yari/commit/4d668234dc2d0b9b867216acc5fc692cbe466fed)) +* **deps:** bump boto3 from 1.35.10 to 1.35.14 in /deployer in the dependencies group ([#11759](https://github.com/mdn/yari/issues/11759)) ([4c1e99e](https://github.com/mdn/yari/commit/4c1e99e22d266b3570fd2fe982a1eb074c36703b)) +* **deps:** bump boto3 from 1.35.5 to 1.35.10 in /deployer in the dependencies group ([#11723](https://github.com/mdn/yari/issues/11723)) ([b34fa69](https://github.com/mdn/yari/commit/b34fa6901855d96aad1c4017c1b117006c2eaf7f)) +* **deps:** bump cryptography from 42.0.4 to 43.0.1 in /deployer ([#11731](https://github.com/mdn/yari/issues/11731)) ([64a7e82](https://github.com/mdn/yari/commit/64a7e821dd45516947a9727de73c4f032ce3d43a)) +* **deps:** bump express from 4.19.2 to 4.20.0 ([#11781](https://github.com/mdn/yari/issues/11781)) ([77bdb78](https://github.com/mdn/yari/commit/77bdb78718aa90bd624b130cc106058318cd9946)) +* **deps:** bump file-type from 19.4.1 to 19.5.0 ([#11770](https://github.com/mdn/yari/issues/11770)) ([34ab42d](https://github.com/mdn/yari/commit/34ab42db5177eee917bb973ede22effdcf1f10cd)) +* **deps:** bump loglevel from 1.9.1 to 1.9.2 ([#11762](https://github.com/mdn/yari/issues/11762)) ([7fdfffa](https://github.com/mdn/yari/commit/7fdfffa67ddefaaad42995995a511419b68e0be9)) +* **deps:** bump mdn-data from 2.10.0 to 2.11.0 ([#11782](https://github.com/mdn/yari/issues/11782)) ([24e8009](https://github.com/mdn/yari/commit/24e8009837ae6f1ff3dbfd956d7db952587f0aad)) +* **deps:** bump mdn-data from 2.9.0 to 2.10.0 ([#11722](https://github.com/mdn/yari/issues/11722)) ([965e9b7](https://github.com/mdn/yari/commit/965e9b75dca03e92a8507a9162a7a7a634fbf749)) +* **deps:** bump micromatch from 4.0.5 to 4.0.8 ([28bd03e](https://github.com/mdn/yari/commit/28bd03e8068edd45a6ec9cee0ab7fa65ea21c4e7)) +* **deps:** bump micromatch from 4.0.5 to 4.0.8 in /cloud-function ([#11756](https://github.com/mdn/yari/issues/11756)) ([28bd03e](https://github.com/mdn/yari/commit/28bd03e8068edd45a6ec9cee0ab7fa65ea21c4e7)) +* **deps:** bump nodemon from 2.0.22 to 3.1.4 ([1a3e72b](https://github.com/mdn/yari/commit/1a3e72bd0618250e585473c2db3208cd07cbcaba)) +* **deps:** bump nodemon from 2.0.22 to 3.1.4 in /cloud-function ([#11754](https://github.com/mdn/yari/issues/11754)) ([1a3e72b](https://github.com/mdn/yari/commit/1a3e72bd0618250e585473c2db3208cd07cbcaba)) +* **deps:** bump openai from 4.56.0 to 4.56.1 ([#11707](https://github.com/mdn/yari/issues/11707)) ([c1eb963](https://github.com/mdn/yari/commit/c1eb963f238f15a9cb20753e5abb83fb1f9b4052)) +* **deps:** bump openai from 4.56.1 to 4.57.0 ([#11713](https://github.com/mdn/yari/issues/11713)) ([dcbc926](https://github.com/mdn/yari/commit/dcbc9265d8f2066684c708a4fa69fbaaea17a6cf)) +* **deps:** bump openai from 4.57.0 to 4.57.1 ([#11739](https://github.com/mdn/yari/issues/11739)) ([98f96bc](https://github.com/mdn/yari/commit/98f96bcec90ae1169f1ceb308b085b663cd2c354)) +* **deps:** bump openai from 4.57.1 to 4.57.3 ([#11746](https://github.com/mdn/yari/issues/11746)) ([fc7b9d6](https://github.com/mdn/yari/commit/fc7b9d65cbc30c2e3ac5862d0115089d210170e9)) +* **deps:** bump openai from 4.57.3 to 4.58.0 ([#11750](https://github.com/mdn/yari/issues/11750)) ([9465fec](https://github.com/mdn/yari/commit/9465fecee903cdd947f2bd25afa2a8a2f373243e)) +* **deps:** bump openai from 4.58.0 to 4.58.1 ([#11768](https://github.com/mdn/yari/issues/11768)) ([86bf27c](https://github.com/mdn/yari/commit/86bf27c4a131bd68665b95a589eb87bfb0423a1a)) +* **deps:** bump openai from 4.58.1 to 4.58.2 ([#11783](https://github.com/mdn/yari/issues/11783)) ([0960844](https://github.com/mdn/yari/commit/09608440f17b3292413d61490538f85609be2eda)) +* **deps:** bump pyquery from 2.0.0 to 2.0.1 in /testing/integration in the dependencies group ([#11718](https://github.com/mdn/yari/issues/11718)) ([e0c6a42](https://github.com/mdn/yari/commit/e0c6a420b0577239e6dff98e17d7caa05cf53495)) +* **deps:** bump send from 0.18.0 to 0.19.0 ([#11776](https://github.com/mdn/yari/issues/11776)) ([9f35bf8](https://github.com/mdn/yari/commit/9f35bf84f18741d88b4bab37455e573262501f47)) +* **deps:** bump web-specs from 3.17.0 to 3.18.0 ([#11710](https://github.com/mdn/yari/issues/11710)) ([81dacb3](https://github.com/mdn/yari/commit/81dacb3fc0a58e864d9d2bd0837be51a1b5d4464)) +* **deps:** bump web-specs from 3.18.0 to 3.18.1 ([#11715](https://github.com/mdn/yari/issues/11715)) ([faed92a](https://github.com/mdn/yari/commit/faed92a42cc563c9281f1116c51f7bd17ec9439b)) +* **deps:** bump web-specs from 3.18.1 to 3.19.0 ([#11733](https://github.com/mdn/yari/issues/11733)) ([e185b30](https://github.com/mdn/yari/commit/e185b3046f2e8fa69a6ccc6577d0e9596c58c87d)) +* **deps:** bump web-specs from 3.19.0 to 3.20.0 ([#11744](https://github.com/mdn/yari/issues/11744)) ([deb979b](https://github.com/mdn/yari/commit/deb979b8b4032db8655630c46ed2f8545cd8aeb5)) +* **deps:** bump web-specs from 3.20.0 to 3.21.0 ([#11778](https://github.com/mdn/yari/issues/11778)) ([55643a5](https://github.com/mdn/yari/commit/55643a513c1bda40933a84e2ca972b15e93975e8)) +* **deps:** pin cheerio to 1.0.0-rc.12 ([#11752](https://github.com/mdn/yari/issues/11752)) ([722b130](https://github.com/mdn/yari/commit/722b13033ca9b0b2234d927ac4e0c298a3b00740)) +* **macros/LearnSidebar:** add Japanese translation for MathML section ([#11680](https://github.com/mdn/yari/issues/11680)) ([606e5cb](https://github.com/mdn/yari/commit/606e5cb54b2eae8749d32cf5b8ce0af8b861bc9e)) +* **news:** add scrimba partnership to news ([#11701](https://github.com/mdn/yari/issues/11701)) ([60d8dee](https://github.com/mdn/yari/commit/60d8dee49883a0c43b996938b5257bdadc667df7)) +* **spas:** re-use section from docs for spas ([#11742](https://github.com/mdn/yari/issues/11742)) ([460c019](https://github.com/mdn/yari/commit/460c019791c05d2c5a866101e90c3afd33147f63)) +* **telemetry:** renew metrics (and remove some) ([#11724](https://github.com/mdn/yari/issues/11724)) ([852d867](https://github.com/mdn/yari/commit/852d8678eec9354dfc6e95faaa825958ec1f8565)) + +## [2.62.0](https://github.com/mdn/yari/compare/v2.61.0...v2.62.0) (2024-08-28) + + +### Bug Fixes + +* **sidebars:** change slugs for URI documents in HTTP sidebar ([#11700](https://github.com/mdn/yari/issues/11700)) ([e24dd17](https://github.com/mdn/yari/commit/e24dd1790d0725d811556bb64b021dfa0a36f40b)) + + +### Miscellaneous + +* **deps-dev:** bump typescript-eslint from 8.2.0 to 8.3.0 ([#11694](https://github.com/mdn/yari/issues/11694)) ([6e8985f](https://github.com/mdn/yari/commit/6e8985f733caf8983879c04420f8fe23df1e2e85)) +* **deps:** bump @mdn/browser-compat-data from 5.5.48 to 5.5.49 ([#11695](https://github.com/mdn/yari/issues/11695)) ([a07476c](https://github.com/mdn/yari/commit/a07476cde86c116cd41e87f61cd26c5c4f8e83e7)) + +## [2.61.0](https://github.com/mdn/yari/compare/v2.60.1...v2.61.0) (2024-08-26) + + +### Features + +* **cli:** Fix recursive document deletion ([#9486](https://github.com/mdn/yari/issues/9486)) ([7b10636](https://github.com/mdn/yari/commit/7b1063657160a58cb60a06e71ddf817cb34d9c54)) +* **cloud-function:** migrate to @sentry/google-cloud-serverless ([#11230](https://github.com/mdn/yari/issues/11230)) ([872111a](https://github.com/mdn/yari/commit/872111ac4d80a2dc9586a1d31ffd19a3abfb3810)) +* **doc:** add pageType field ([#11662](https://github.com/mdn/yari/issues/11662)) ([79f75ca](https://github.com/mdn/yari/commit/79f75ca185a099073358a7d11ab7e494fc46c13c)) +* enable Go language syntax highlighting, set pre,code tab-size to 4 ([61db1a6](https://github.com/mdn/yari/commit/61db1a6a1dd24a3a071671ea3e90975888a4fa02)) +* **pong:** support custom colors for new sidebar format ([#11498](https://github.com/mdn/yari/issues/11498)) ([a0f2afd](https://github.com/mdn/yari/commit/a0f2afd1574a6778b92b4e3b940c0b0e91560d8a)) + + +### Bug Fixes + +* **baseline:** catch computeBaseline() error ([#11636](https://github.com/mdn/yari/issues/11636)) ([1735372](https://github.com/mdn/yari/commit/173537238daea05b53238e494c61d09631a13c60)) +* **baseline:** hide when feature status differs from BCD key status ([#11547](https://github.com/mdn/yari/issues/11547)) ([b493ff2](https://github.com/mdn/yari/commit/b493ff28fa2e931c004e4229ee89574b5eede017)) +* **baseline:** support ranged dates, use upstream types ([#11536](https://github.com/mdn/yari/issues/11536)) ([2782f97](https://github.com/mdn/yari/commit/2782f97b587df5ce58a406ca491af2d094543076)) +* **build:** use pipefail to fail builds ([#11637](https://github.com/mdn/yari/issues/11637)) ([570efab](https://github.com/mdn/yari/commit/570efabd558a202583beabf990a36957e2cb5939)) +* **notecard:** misaligned icon, excessive internal padding ([#11467](https://github.com/mdn/yari/issues/11467)) ([5bc2965](https://github.com/mdn/yari/commit/5bc29659e167bad2c09c8ad249ed7fadcb15a754)) +* **observatory:** better glean error keys ([#11597](https://github.com/mdn/yari/issues/11597)) ([985a416](https://github.com/mdn/yari/commit/985a4161a7c755b41e2be15c120e4ccafe31340d)) +* **placement:** reuse TextColor/BackgroundColor for "AD" link ([#11540](https://github.com/mdn/yari/issues/11540)) ([16a6717](https://github.com/mdn/yari/commit/16a6717933b1c72d5014e1310133ff5e28578fd5)) + + +### Enhancements + +* **seo:** use meta description templates for web-api-* pages ([#11635](https://github.com/mdn/yari/issues/11635)) ([e890906](https://github.com/mdn/yari/commit/e890906d15fda1afd7b0f0a519328a7094bac055)) +* **syntax-highlight:** enable Go language, set tab-size to 4 ([#11608](https://github.com/mdn/yari/issues/11608)) ([61db1a6](https://github.com/mdn/yari/commit/61db1a6a1dd24a3a071671ea3e90975888a4fa02)) + + +### Miscellaneous + +* **ai-help:** replace GPT-3.5 Turbo with GPT-4o mini ([#11586](https://github.com/mdn/yari/issues/11586)) ([324fb98](https://github.com/mdn/yari/commit/324fb983d1f92cb026ec062fe2603392bf796bc9)) +* **ai-help:** stop generating ada embeddings ([#11630](https://github.com/mdn/yari/issues/11630)) ([5144908](https://github.com/mdn/yari/commit/5144908d1a468fb3307f3cd74496d5a39d674a37)) +* **baseline:** update learn more link to glossary entry ([#11532](https://github.com/mdn/yari/issues/11532)) ([a291a6a](https://github.com/mdn/yari/commit/a291a6a1e62ebac5dc8ef41b89381500dc7377a0)) +* **deps-dev:** bump @babel/core from 7.24.9 to 7.25.2 ([#11563](https://github.com/mdn/yari/issues/11563)) ([b280432](https://github.com/mdn/yari/commit/b280432d9718786503a8e09f033e3f5f8d394684)) +* **deps-dev:** bump @babel/eslint-parser from 7.24.8 to 7.25.1 ([#11553](https://github.com/mdn/yari/issues/11553)) ([9145b40](https://github.com/mdn/yari/commit/9145b408926e20ff73e018a544738842cfa387c7)) +* **deps-dev:** bump @babel/preset-env from 7.24.8 to 7.25.0 ([#11556](https://github.com/mdn/yari/issues/11556)) ([3d94971](https://github.com/mdn/yari/commit/3d9497115f84a283a37f85ea1ea87f327bac97be)) +* **deps-dev:** bump @babel/preset-env from 7.25.0 to 7.25.2 ([#11561](https://github.com/mdn/yari/issues/11561)) ([170194e](https://github.com/mdn/yari/commit/170194e5aa9d3311133757659709a5ab073cea90)) +* **deps-dev:** bump @babel/preset-env from 7.25.2 to 7.25.3 ([#11574](https://github.com/mdn/yari/issues/11574)) ([e670f69](https://github.com/mdn/yari/commit/e670f6971de161198bdb36999603f9214604baca)) +* **deps-dev:** bump @babel/preset-env from 7.25.3 to 7.25.4 ([#11673](https://github.com/mdn/yari/issues/11673)) ([d9e1b25](https://github.com/mdn/yari/commit/d9e1b254b2bafa82593445f2ec5a1edc9c2622e8)) +* **deps-dev:** bump @playwright/test from 1.45.3 to 1.46.0 ([#11600](https://github.com/mdn/yari/issues/11600)) ([479bbbe](https://github.com/mdn/yari/commit/479bbbe993549fbbe41257b551d441752f33b066)) +* **deps-dev:** bump @playwright/test from 1.46.0 to 1.46.1 ([#11649](https://github.com/mdn/yari/issues/11649)) ([76d4707](https://github.com/mdn/yari/commit/76d4707b3249b84344e414b89b7759b69cb84a9c)) +* **deps-dev:** bump @swc/core from 1.7.0 to 1.7.1 ([#11533](https://github.com/mdn/yari/issues/11533)) ([30e87c6](https://github.com/mdn/yari/commit/30e87c633be2d47a7d4fabe153c7fa70bee30148)) +* **deps-dev:** bump @swc/core from 1.7.1 to 1.7.2 ([#11543](https://github.com/mdn/yari/issues/11543)) ([04c1579](https://github.com/mdn/yari/commit/04c1579d954dccaa8107264f6c372df4ca0affa4)) +* **deps-dev:** bump @swc/core from 1.7.10 to 1.7.11 ([#11634](https://github.com/mdn/yari/issues/11634)) ([78bab43](https://github.com/mdn/yari/commit/78bab431095fe8b0b677796fc37f1ae4e80cdf89)) +* **deps-dev:** bump @swc/core from 1.7.11 to 1.7.12 ([#11652](https://github.com/mdn/yari/issues/11652)) ([3c24c65](https://github.com/mdn/yari/commit/3c24c656075b690bde2bb382bf6f4fc5aff3fddf)) +* **deps-dev:** bump @swc/core from 1.7.12 to 1.7.14 ([#11660](https://github.com/mdn/yari/issues/11660)) ([487a8f5](https://github.com/mdn/yari/commit/487a8f5df5255ff541b74691b5a385462b6635e0)) +* **deps-dev:** bump @swc/core from 1.7.14 to 1.7.18 ([#11686](https://github.com/mdn/yari/issues/11686)) ([f91f248](https://github.com/mdn/yari/commit/f91f248b0c250616b330452d2fa2299de5e92f40)) +* **deps-dev:** bump @swc/core from 1.7.2 to 1.7.3 ([#11559](https://github.com/mdn/yari/issues/11559)) ([1461f58](https://github.com/mdn/yari/commit/1461f58ea4e693f25912781bd54611c65c64be3f)) +* **deps-dev:** bump @swc/core from 1.7.3 to 1.7.4 ([#11573](https://github.com/mdn/yari/issues/11573)) ([c8a826b](https://github.com/mdn/yari/commit/c8a826b374913aabdfbe3a910671bb4f668daf6d)) +* **deps-dev:** bump @swc/core from 1.7.4 to 1.7.5 ([#11581](https://github.com/mdn/yari/issues/11581)) ([25570b8](https://github.com/mdn/yari/commit/25570b8a6a802edf7f2e1b64ea1a0c46bc9f95f2)) +* **deps-dev:** bump @swc/core from 1.7.5 to 1.7.6 ([#11588](https://github.com/mdn/yari/issues/11588)) ([bd7c123](https://github.com/mdn/yari/commit/bd7c1236c20e9d83accf5e4b8065d9dfdbccbeec)) +* **deps-dev:** bump @swc/core from 1.7.6 to 1.7.10 ([#11625](https://github.com/mdn/yari/issues/11625)) ([b1a18ca](https://github.com/mdn/yari/commit/b1a18cac5980b5dd35065645d3400edf7616e230)) +* **deps-dev:** bump @types/node from 18.18.7 to 18.19.44 in the types group ([#11623](https://github.com/mdn/yari/issues/11623)) ([4c8e8d6](https://github.com/mdn/yari/commit/4c8e8d6496245dd5fec5b34eb188c6155b0e1359)) +* **deps-dev:** bump @types/node from 18.19.44 to 18.19.45 in the types group ([#11648](https://github.com/mdn/yari/issues/11648)) ([750ace2](https://github.com/mdn/yari/commit/750ace2078d94021e6660cc7c6f076fcdbb20317)) +* **deps-dev:** bump @types/node from 18.19.45 to 18.19.46 in the types group ([#11685](https://github.com/mdn/yari/issues/11685)) ([096bae2](https://github.com/mdn/yari/commit/096bae2ab04cf7a16ff0d9704e1133b118b550e5)) +* **deps-dev:** bump @types/react from 18.3.3 to 18.3.4 in the types group ([#11665](https://github.com/mdn/yari/issues/11665)) ([b446829](https://github.com/mdn/yari/commit/b4468291c65b7a2a8a3f701b46e4cb603d7733bd)) +* **deps-dev:** bump browserslist from 4.23.2 to 4.23.3 ([#11583](https://github.com/mdn/yari/issues/11583)) ([84f2569](https://github.com/mdn/yari/commit/84f256958fa60a2d4f92c4edbd57bdb85ccf8e74)) +* **deps-dev:** bump eslint-plugin-jest from 28.6.0 to 28.7.0 ([#11593](https://github.com/mdn/yari/issues/11593)) ([e136501](https://github.com/mdn/yari/commit/e136501d17bdb8d88b8056b5a5360760a5091357)) +* **deps-dev:** bump eslint-plugin-jest from 28.7.0 to 28.8.0 ([#11612](https://github.com/mdn/yari/issues/11612)) ([9ad8658](https://github.com/mdn/yari/commit/9ad8658ef22e78fb1fddf35f6ff51a633880e143)) +* **deps-dev:** bump eslint-plugin-n from 17.10.1 to 17.10.2 ([#11594](https://github.com/mdn/yari/issues/11594)) ([e51f9e0](https://github.com/mdn/yari/commit/e51f9e0020a161a6e7881ae1cff6f483b21a7d0e)) +* **deps-dev:** bump eslint-plugin-n from 17.9.0 to 17.10.1 ([#11545](https://github.com/mdn/yari/issues/11545)) ([6ca9a43](https://github.com/mdn/yari/commit/6ca9a43d67158c28db557c0bb863685f600ee7ad)) +* **deps-dev:** bump eslint-plugin-unicorn from 54.0.0 to 55.0.0 ([#11539](https://github.com/mdn/yari/issues/11539)) ([0cc49fc](https://github.com/mdn/yari/commit/0cc49fc1121a99a6d262b36d8a789817e6be074e)) +* **deps-dev:** bump husky from 9.1.1 to 9.1.2 ([#11544](https://github.com/mdn/yari/issues/11544)) ([03984c6](https://github.com/mdn/yari/commit/03984c6225134bf8cc5594f94ab53a8fd686ac1b)) +* **deps-dev:** bump husky from 9.1.2 to 9.1.3 ([#11558](https://github.com/mdn/yari/issues/11558)) ([71ce3cf](https://github.com/mdn/yari/commit/71ce3cf273b1d5ccd5dd5df970d2f2b72dd14add)) +* **deps-dev:** bump husky from 9.1.3 to 9.1.4 ([#11562](https://github.com/mdn/yari/issues/11562)) ([1e16d84](https://github.com/mdn/yari/commit/1e16d843096c764d71071701ed0dcc1ddeeb588d)) +* **deps-dev:** bump husky from 9.1.4 to 9.1.5 ([#11666](https://github.com/mdn/yari/issues/11666)) ([9f4943a](https://github.com/mdn/yari/commit/9f4943a669410a049e14bb73f688b5170f96b4cd)) +* **deps-dev:** bump mini-css-extract-plugin from 2.9.0 to 2.9.1 ([#11659](https://github.com/mdn/yari/issues/11659)) ([c13babb](https://github.com/mdn/yari/commit/c13babbb1d9ccffa9f8fa5d6981b30fc35d15301)) +* **deps-dev:** bump postcss from 8.4.39 to 8.4.40 ([#11538](https://github.com/mdn/yari/issues/11538)) ([72781eb](https://github.com/mdn/yari/commit/72781eb0109dbbaccf93b5f910dc19ef15c7becb)) +* **deps-dev:** bump postcss from 8.4.40 to 8.4.41 ([#11601](https://github.com/mdn/yari/issues/11601)) ([804d452](https://github.com/mdn/yari/commit/804d452e146842028410129cc02c169c75e36c47)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.5.1 to 2.5.2 ([#11688](https://github.com/mdn/yari/issues/11688)) ([43ac22c](https://github.com/mdn/yari/commit/43ac22c019b692d8ded55afb7852f5fefd097b23)) +* **deps-dev:** bump react-router-dom from 6.25.1 to 6.26.0 ([#11585](https://github.com/mdn/yari/issues/11585)) ([c8e3ac3](https://github.com/mdn/yari/commit/c8e3ac328558dd4f8b31722dac2ae3aa7adde70d)) +* **deps-dev:** bump react-router-dom from 6.26.0 to 6.26.1 ([#11641](https://github.com/mdn/yari/issues/11641)) ([6a82a08](https://github.com/mdn/yari/commit/6a82a0858dd09481d6f0c6bb8572d6dd71aeebba)) +* **deps-dev:** bump sass-loader from 14.2.1 to 15.0.0 ([#11535](https://github.com/mdn/yari/issues/11535)) ([8914a11](https://github.com/mdn/yari/commit/8914a11bbc7d4840f362923fde91632717bcacb4)) +* **deps-dev:** bump the dependencies group in /testing/integration with 2 updates ([#11595](https://github.com/mdn/yari/issues/11595)) ([7bae7f8](https://github.com/mdn/yari/commit/7bae7f83ae34f897d50d6460dc9d086060eec006)) +* **deps-dev:** bump ts-jest from 29.2.0 to 29.2.4 ([#11575](https://github.com/mdn/yari/issues/11575)) ([793fdc0](https://github.com/mdn/yari/commit/793fdc068b31bd41a47e5fe50375cde843b0075d)) +* **deps-dev:** bump ts-jest from 29.2.4 to 29.2.5 ([#11690](https://github.com/mdn/yari/issues/11690)) ([61b18e3](https://github.com/mdn/yari/commit/61b18e3450326742de8f1003f537c9bbd2079749)) +* **deps-dev:** bump typescript-eslint from 7.17.0 to 7.18.0 ([#11565](https://github.com/mdn/yari/issues/11565)) ([2ae593f](https://github.com/mdn/yari/commit/2ae593ff2847ed87a33f37d5a76bf5a9254276d3)) +* **deps-dev:** bump typescript-eslint from 7.18.0 to 8.0.1 ([#11599](https://github.com/mdn/yari/issues/11599)) ([a00c3c2](https://github.com/mdn/yari/commit/a00c3c297d110c78f9a1f6b5c1f617df3ade564b)) +* **deps-dev:** bump typescript-eslint from 8.0.1 to 8.1.0 ([#11628](https://github.com/mdn/yari/issues/11628)) ([cacc1b9](https://github.com/mdn/yari/commit/cacc1b93cad87c2a8fc07db8060bf32cbdb4f168)) +* **deps-dev:** bump typescript-eslint from 8.1.0 to 8.2.0 ([#11656](https://github.com/mdn/yari/issues/11656)) ([c27b5ae](https://github.com/mdn/yari/commit/c27b5ae9f11e5010cea4aaae34292e91f6edaab4)) +* **deps-dev:** bump webpack from 5.93.0 to 5.94.0 ([#11676](https://github.com/mdn/yari/issues/11676)) ([a4d8749](https://github.com/mdn/yari/commit/a4d8749c509b5b4e6069960ca10f8de373f9b261)) +* **deps-dev:** bump webpack from 5.93.0 to 5.94.0 in /client/pwa ([#11674](https://github.com/mdn/yari/issues/11674)) ([e93d8f6](https://github.com/mdn/yari/commit/e93d8f6acb3a378f62b81d4ee189eea1bd22911c)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.47 to 2.7.48 in /client/pwa ([#11568](https://github.com/mdn/yari/issues/11568)) ([c45984b](https://github.com/mdn/yari/commit/c45984bc8f6e449cad865e897ecd064d06a832ca)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.48 to 2.7.51 in /client/pwa ([#11671](https://github.com/mdn/yari/issues/11671)) ([61786a2](https://github.com/mdn/yari/commit/61786a247d3c108300a579ee96432693cf94e1bf)) +* **deps:** bump @mdn/browser-compat-data from 5.5.40 to 5.5.41 ([#11534](https://github.com/mdn/yari/issues/11534)) ([86a9276](https://github.com/mdn/yari/commit/86a92766bf69af52e8bb7de05fcdd381190c48f4)) +* **deps:** bump @mdn/browser-compat-data from 5.5.41 to 5.5.42 ([#11555](https://github.com/mdn/yari/issues/11555)) ([06de257](https://github.com/mdn/yari/commit/06de257bf9ad92d302403ccfbaaf0ff4789e97cf)) +* **deps:** bump @mdn/browser-compat-data from 5.5.42 to 5.5.43 ([#11566](https://github.com/mdn/yari/issues/11566)) ([64d1c10](https://github.com/mdn/yari/commit/64d1c1017a4b6c1796df0de1d8d3fd0d090ac2d6)) +* **deps:** bump @mdn/browser-compat-data from 5.5.43 to 5.5.44 ([#11589](https://github.com/mdn/yari/issues/11589)) ([902dc82](https://github.com/mdn/yari/commit/902dc821157fe778e9b4e4ea4f9d2d7a0b74fb48)) +* **deps:** bump @mdn/browser-compat-data from 5.5.44 to 5.5.45 ([#11605](https://github.com/mdn/yari/issues/11605)) ([01312ac](https://github.com/mdn/yari/commit/01312acbe348c86e5794aae9ea209da91be2536c)) +* **deps:** bump @mdn/browser-compat-data from 5.5.45 to 5.5.46 ([#11627](https://github.com/mdn/yari/issues/11627)) ([30c82f0](https://github.com/mdn/yari/commit/30c82f0dae4e979113aa75fa1ac5e6ff6bbcc2a6)) +* **deps:** bump @mdn/browser-compat-data from 5.5.46 to 5.5.47 ([#11670](https://github.com/mdn/yari/issues/11670)) ([68ba985](https://github.com/mdn/yari/commit/68ba9859a571d37a3028e3aeb36316a03136432a)) +* **deps:** bump @mdn/browser-compat-data from 5.5.47 to 5.5.48 ([#11689](https://github.com/mdn/yari/issues/11689)) ([6ced515](https://github.com/mdn/yari/commit/6ced515533cb1209272400b7a192255bd51599f5)) +* **deps:** bump @mozilla/glean from 5.0.2 to 5.0.3 ([#11590](https://github.com/mdn/yari/issues/11590)) ([be17613](https://github.com/mdn/yari/commit/be176133429e0191bddae06b22ab8a038ba7c615)) +* **deps:** bump @sentry/node from 8.19.0 to 8.20.0 in the sentry group ([#11537](https://github.com/mdn/yari/issues/11537)) ([c99b94d](https://github.com/mdn/yari/commit/c99b94dd78793d612c836e2325ef95287d818075)) +* **deps:** bump @sentry/node from 8.20.0 to 8.21.0 in the sentry group ([#11567](https://github.com/mdn/yari/issues/11567)) ([8c092a1](https://github.com/mdn/yari/commit/8c092a16822adb8885010d5126c8dad130a1d839)) +* **deps:** bump @sentry/node from 8.21.0 to 8.22.0 in the sentry group ([#11571](https://github.com/mdn/yari/issues/11571)) ([976302c](https://github.com/mdn/yari/commit/976302c5bf2fff746d4a24a74ec1c5edb23b4f77)) +* **deps:** bump @sentry/node from 8.22.0 to 8.23.0 in the sentry group ([#11598](https://github.com/mdn/yari/issues/11598)) ([f1aa8d6](https://github.com/mdn/yari/commit/f1aa8d65416c3c7f8297b088743e439f7a4c99bd)) +* **deps:** bump @sentry/node from 8.23.0 to 8.24.0 in the sentry group ([#11602](https://github.com/mdn/yari/issues/11602)) ([6e79ac8](https://github.com/mdn/yari/commit/6e79ac80603fdc7db4e8e2f6dc694a300a406c13)) +* **deps:** bump @sentry/node from 8.24.0 to 8.25.0 in the sentry group ([#11616](https://github.com/mdn/yari/issues/11616)) ([390c035](https://github.com/mdn/yari/commit/390c035ae019cc89812e7965df4f4a6c9cb05a0e)) +* **deps:** bump @sentry/node from 8.25.0 to 8.26.0 in the sentry group ([#11632](https://github.com/mdn/yari/issues/11632)) ([791c631](https://github.com/mdn/yari/commit/791c6317be46f6ffb2406d0caa5679e9b8db6e42)) +* **deps:** bump @stripe/stripe-js from 4.1.0 to 4.2.0 ([#11610](https://github.com/mdn/yari/issues/11610)) ([eae9c62](https://github.com/mdn/yari/commit/eae9c6224754996f46a0ad225f9fac0c4432da9b)) +* **deps:** bump @stripe/stripe-js from 4.2.0 to 4.3.0 ([#11638](https://github.com/mdn/yari/issues/11638)) ([ef0df46](https://github.com/mdn/yari/commit/ef0df463c17bc666dfb0c0d2525c4a4c02ed18c5)) +* **deps:** bump @webref/css from 6.13.1 to 6.14.0 ([#11542](https://github.com/mdn/yari/issues/11542)) ([deedd01](https://github.com/mdn/yari/commit/deedd0169bcfaff9547e2e4b028fd1bf3cfbdeeb)) +* **deps:** bump @webref/css from 6.14.0 to 6.14.1 ([#11576](https://github.com/mdn/yari/issues/11576)) ([d62b071](https://github.com/mdn/yari/commit/d62b071f0ef89324ac583208908e0eada829dded)) +* **deps:** bump @webref/css from 6.14.1 to 6.14.2 ([#11658](https://github.com/mdn/yari/issues/11658)) ([7facced](https://github.com/mdn/yari/commit/7facced6ad4a145b5be0500b44df8dcf314e55db)) +* **deps:** bump async from 3.2.5 to 3.2.6 ([#11657](https://github.com/mdn/yari/issues/11657)) ([bede296](https://github.com/mdn/yari/commit/bede296a3258ac348a2e42f11b667d102df53f9a)) +* **deps:** bump boto3 from 1.34.153 to 1.34.158 in /deployer in the dependencies group ([#11622](https://github.com/mdn/yari/issues/11622)) ([0558e26](https://github.com/mdn/yari/commit/0558e269ae31686d55d3a54a95948753735f67b1)) +* **deps:** bump boto3 from 1.34.158 to 1.35.0 in /deployer in the dependencies group ([#11647](https://github.com/mdn/yari/issues/11647)) ([292e678](https://github.com/mdn/yari/commit/292e678ee95269cec1c615b960ad52fcc6ed7b08)) +* **deps:** bump boto3 from 1.35.0 to 1.35.5 in /deployer in the dependencies group ([#11682](https://github.com/mdn/yari/issues/11682)) ([ef087d2](https://github.com/mdn/yari/commit/ef087d2c6f0bd0601bd3e3404ae6712b2c07099f)) +* **deps:** bump cheerio from 1.0.0-rc.12 to 1.0.0 ([#11626](https://github.com/mdn/yari/issues/11626)) ([856405f](https://github.com/mdn/yari/commit/856405fc3ddd9f9fbbb0c3c009d6099e5acab0d8)) +* **deps:** bump dayjs from 1.11.12 to 1.11.13 ([#11668](https://github.com/mdn/yari/issues/11668)) ([be9d8b9](https://github.com/mdn/yari/commit/be9d8b9cce957d54dc421a4388b672ed04dd0a7e)) +* **deps:** bump fast-xml-parser from 4.3.4 to 4.4.1 ([#11560](https://github.com/mdn/yari/issues/11560)) ([3ca992d](https://github.com/mdn/yari/commit/3ca992d29bfbc7475a84f3d6fdae8f33b8d6ad50)) +* **deps:** bump fdir from 6.2.0 to 6.3.0 ([#11687](https://github.com/mdn/yari/issues/11687)) ([e0bd00a](https://github.com/mdn/yari/commit/e0bd00a16fbb9b531f56bce0e423f8907f0c93eb)) +* **deps:** bump file-type from 19.3.0 to 19.4.0 ([#11587](https://github.com/mdn/yari/issues/11587)) ([350d84b](https://github.com/mdn/yari/commit/350d84b8bd1725e74204c82a41a21e5b9d4daede)) +* **deps:** bump file-type from 19.4.0 to 19.4.1 ([#11639](https://github.com/mdn/yari/issues/11639)) ([5ac69b2](https://github.com/mdn/yari/commit/5ac69b2264ac1e7d08559ce89934f2cbe7782022)) +* **deps:** bump is-svg from 5.0.1 to 5.1.0 ([#11592](https://github.com/mdn/yari/issues/11592)) ([a33a589](https://github.com/mdn/yari/commit/a33a5891261217252d31a22768cdffd3c68dd397)) +* **deps:** bump mdn-data from 2.8.0 to 2.9.0 ([#11579](https://github.com/mdn/yari/issues/11579)) ([d930863](https://github.com/mdn/yari/commit/d930863abcb20d52170ab95b670a2676e26f7451)) +* **deps:** bump micromatch from 4.0.4 to 4.0.8 in /client/pwa ([#11683](https://github.com/mdn/yari/issues/11683)) ([e320b68](https://github.com/mdn/yari/commit/e320b681c210d61e8320fde081b1816ddd99796c)) +* **deps:** bump micromatch from 4.0.5 to 4.0.8 ([#11684](https://github.com/mdn/yari/issues/11684)) ([358c3e7](https://github.com/mdn/yari/commit/358c3e7a5385a17f04c7827d689e2f50577cc8f6)) +* **deps:** bump openai from 4.53.0 to 4.53.1 ([#11541](https://github.com/mdn/yari/issues/11541)) ([f0ec2be](https://github.com/mdn/yari/commit/f0ec2be6f3a88e34831f5a090dd153dfb390efb9)) +* **deps:** bump openai from 4.53.1 to 4.53.2 ([#11551](https://github.com/mdn/yari/issues/11551)) ([65e3304](https://github.com/mdn/yari/commit/65e33046fc483b3172857e667e72e9213a2d4311)) +* **deps:** bump openai from 4.53.2 to 4.54.0 ([#11580](https://github.com/mdn/yari/issues/11580)) ([3abbc12](https://github.com/mdn/yari/commit/3abbc125f5654fcb488ffb425b4838f421e393eb)) +* **deps:** bump openai from 4.54.0 to 4.55.0 ([#11604](https://github.com/mdn/yari/issues/11604)) ([9bfd688](https://github.com/mdn/yari/commit/9bfd68821e499fdaf19ad266cf38c153baca1401)) +* **deps:** bump openai from 4.55.0 to 4.55.1 ([#11611](https://github.com/mdn/yari/issues/11611)) ([e6accc7](https://github.com/mdn/yari/commit/e6accc7c969ea9cb5e38e364439686f719044242)) +* **deps:** bump openai from 4.55.1 to 4.55.3 ([#11617](https://github.com/mdn/yari/issues/11617)) ([a0a2641](https://github.com/mdn/yari/commit/a0a26418dd977f1746394f01d72fca888f358ba0)) +* **deps:** bump openai from 4.55.3 to 4.55.4 ([#11624](https://github.com/mdn/yari/issues/11624)) ([308747a](https://github.com/mdn/yari/commit/308747a0da221ec45bb68da7f876c912ae2d51d5)) +* **deps:** bump openai from 4.55.4 to 4.55.5 ([#11629](https://github.com/mdn/yari/issues/11629)) ([7c49bc8](https://github.com/mdn/yari/commit/7c49bc8a38bfafdb7e5c69c6053d966ed9b0df45)) +* **deps:** bump openai from 4.55.5 to 4.55.7 ([#11633](https://github.com/mdn/yari/issues/11633)) ([5d5256d](https://github.com/mdn/yari/commit/5d5256d8d819b8b19c358070a8677fe260dc4ffc)) +* **deps:** bump openai from 4.55.7 to 4.56.0 ([#11651](https://github.com/mdn/yari/issues/11651)) ([c0e633b](https://github.com/mdn/yari/commit/c0e633ba9904e3bd3b2f84843a30b5a7dbacc784)) +* **deps:** bump pytest from 8.3.1 to 8.3.2 in /testing/integration in the dependencies group ([#11550](https://github.com/mdn/yari/issues/11550)) ([c621908](https://github.com/mdn/yari/commit/c62190864e1df2109e6a9baa1b67c787aaa126d1)) +* **deps:** bump the dependencies group in /deployer with 2 updates ([#11549](https://github.com/mdn/yari/issues/11549)) ([d2f8f33](https://github.com/mdn/yari/commit/d2f8f33a56cfd3577ba2824ed3bee3c1c5c08149)) +* **deps:** bump the dependencies group in /deployer with 3 updates ([#11596](https://github.com/mdn/yari/issues/11596)) ([ae82324](https://github.com/mdn/yari/commit/ae823240ccefe07b2e6d4f78513bcd3bff6f2f22)) +* **deps:** bump web-features from 1.0.0 to 1.1.0 ([#11603](https://github.com/mdn/yari/issues/11603)) ([c0958e1](https://github.com/mdn/yari/commit/c0958e125c09322b9bd254eb55dd8ba2ae98920a)) +* **deps:** bump web-features from 1.1.0 to 1.2.0 ([#11675](https://github.com/mdn/yari/issues/11675)) ([ad7d2cc](https://github.com/mdn/yari/commit/ad7d2ccbe02a77f2362b407890265f43ccd42049)) +* **deps:** bump web-specs from 3.13.1 to 3.14.0 ([#11557](https://github.com/mdn/yari/issues/11557)) ([133a730](https://github.com/mdn/yari/commit/133a730db5a1b2eb88cd07d7d01c8ab2c1d7c870)) +* **deps:** bump web-specs from 3.14.0 to 3.15.0 ([#11564](https://github.com/mdn/yari/issues/11564)) ([7beb00c](https://github.com/mdn/yari/commit/7beb00c1867a6810003dbec4102f32f799d93073)) +* **deps:** bump web-specs from 3.15.0 to 3.16.0 ([#11577](https://github.com/mdn/yari/issues/11577)) ([4da5e67](https://github.com/mdn/yari/commit/4da5e679f94a5afb327c40b3b0d486b4c884afce)) +* **deps:** bump web-specs from 3.16.0 to 3.17.0 ([#11669](https://github.com/mdn/yari/issues/11669)) ([454c9a1](https://github.com/mdn/yari/commit/454c9a1a929d7aef1a4b99bc5d8bb49966aab29b)) +* **macros/LearnSidebar:** add Japanese translation for 5 locations ([#11507](https://github.com/mdn/yari/issues/11507)) ([b342cae](https://github.com/mdn/yari/commit/b342cae8161fbd1ecb03b29692c52d239a3b8fec)) +* **survey:** august 2024 web app survey ([#11570](https://github.com/mdn/yari/issues/11570)) ([b5ecb29](https://github.com/mdn/yari/commit/b5ecb29c4b485d6c635c94d9bf3c3a22b1a696de)) +* **survey:** extend august 2024 web app survey by a few days ([#11615](https://github.com/mdn/yari/issues/11615)) ([1bf885e](https://github.com/mdn/yari/commit/1bf885eff2723afec4a458fa47fe3f4e18e28f28)) + +## [2.60.1](https://github.com/mdn/yari/compare/v2.60.0...v2.60.1) (2024-07-23) + + +### Bug Fixes + +* **baseline:** hide on /MDN/ pages ([#11358](https://github.com/mdn/yari/issues/11358)) ([af33c55](https://github.com/mdn/yari/commit/af33c55ffe68ec00de1c8bdeb53ed3d079137351)) +* **build:** ignore GITHUB_REF in mdn/yari ([#11398](https://github.com/mdn/yari/issues/11398)) ([21d7dc1](https://github.com/mdn/yari/commit/21d7dc19a3e92bb7521053554369a6fd3a4bcfd7)) +* **cloud-function:** avoid double slash where canonical url has trailing slash ([#11441](https://github.com/mdn/yari/issues/11441)) ([593f7b0](https://github.com/mdn/yari/commit/593f7b0723d757dc312a1f778ae1925c19d75448)) +* **login:** don't double encodeURI ([#11448](https://github.com/mdn/yari/issues/11448)) ([821f69a](https://github.com/mdn/yari/commit/821f69a714f82426331e8892c9332f8476f41ae5)) +* **markdown:** Fix GFM rendering if blank line right after magic keyword ([#11108](https://github.com/mdn/yari/issues/11108)) ([16d7b88](https://github.com/mdn/yari/commit/16d7b88f13173a2eedd531a3da58c8b3fcf9c599)) +* **search:** hide "No query, no results" on server ([#11359](https://github.com/mdn/yari/issues/11359)) ([630fc42](https://github.com/mdn/yari/commit/630fc421cff08ab75f16443d045142eb9ddaed32)) +* **server:** Inter wouldn't load on Linux 🐧 ([#11491](https://github.com/mdn/yari/issues/11491)) ([5ceaaa1](https://github.com/mdn/yari/commit/5ceaaa1eff34d031cf2878203122d7808e9bbbc5)) + + +### Miscellaneous + +* **curriculum:** slim down context. ([#11449](https://github.com/mdn/yari/issues/11449)) ([380dd82](https://github.com/mdn/yari/commit/380dd823b9d4cbdf065c8952dc7c0979f52caeb0)) +* **deps-dev:** bump @babel/core from 7.24.7 to 7.24.8 ([#11472](https://github.com/mdn/yari/issues/11472)) ([d02a335](https://github.com/mdn/yari/commit/d02a335bb8c20da64e50edeaadd06931215f6824)) +* **deps-dev:** bump @babel/core from 7.24.8 to 7.24.9 ([#11479](https://github.com/mdn/yari/issues/11479)) ([18183d3](https://github.com/mdn/yari/commit/18183d3bcde4637b09906ed94e854460357d386f)) +* **deps-dev:** bump @babel/eslint-parser from 7.24.7 to 7.24.8 ([#11471](https://github.com/mdn/yari/issues/11471)) ([bb70ad0](https://github.com/mdn/yari/commit/bb70ad02ccfd52130ecc1051e34cb6e617b38227)) +* **deps-dev:** bump @babel/preset-env from 7.24.7 to 7.24.8 ([#11473](https://github.com/mdn/yari/issues/11473)) ([99d2290](https://github.com/mdn/yari/commit/99d22903923a707f1a386bfa914f12ee71f1eb3e)) +* **deps-dev:** bump @playwright/test from 1.45.1 to 1.45.2 ([#11485](https://github.com/mdn/yari/issues/11485)) ([e21cdbb](https://github.com/mdn/yari/commit/e21cdbb5b92930e23e11979191386718429cd62a)) +* **deps-dev:** bump @playwright/test from 1.45.2 to 1.45.3 ([#11524](https://github.com/mdn/yari/issues/11524)) ([b3a0aaf](https://github.com/mdn/yari/commit/b3a0aafda3530165c0653c6b7e89b62be1764e70)) +* **deps-dev:** bump @swc/core from 1.6.13 to 1.7.0 ([#11494](https://github.com/mdn/yari/issues/11494)) ([7c3a1e0](https://github.com/mdn/yari/commit/7c3a1e0a69be04a5cb24565d6a4ebd51275dd6db)) +* **deps-dev:** bump browserslist from 4.23.1 to 4.23.2 ([#11454](https://github.com/mdn/yari/issues/11454)) ([435a3b0](https://github.com/mdn/yari/commit/435a3b050d9f9a9a22b662f40b221114cc2f36bd)) +* **deps-dev:** bump eslint-plugin-react from 7.34.3 to 7.34.4 ([#11477](https://github.com/mdn/yari/issues/11477)) ([2a06792](https://github.com/mdn/yari/commit/2a0679277840863d73567266e8e1eea266d140b1)) +* **deps-dev:** bump eslint-plugin-react from 7.34.4 to 7.35.0 ([#11515](https://github.com/mdn/yari/issues/11515)) ([aa9e6b0](https://github.com/mdn/yari/commit/aa9e6b0ab9588d5e743affe7b0a58e2da22e0268)) +* **deps-dev:** bump html-validate from 8.20.1 to 8.21.0 ([#11516](https://github.com/mdn/yari/issues/11516)) ([2bcc6e7](https://github.com/mdn/yari/commit/2bcc6e7dd8a5c3736c485530493c78e7ae77984c)) +* **deps-dev:** bump husky from 9.0.11 to 9.1.1 ([#11505](https://github.com/mdn/yari/issues/11505)) ([ff273d1](https://github.com/mdn/yari/commit/ff273d1aa06dbde1d9aa79bab0e718ca976fdff9)) +* **deps-dev:** bump jsdom from 24.1.0 to 24.1.1 ([#11511](https://github.com/mdn/yari/issues/11511)) ([708f875](https://github.com/mdn/yari/commit/708f87577e161ee87ecdef1883fbd3838c810ca8)) +* **deps-dev:** bump prettier from 3.3.2 to 3.3.3 ([#11481](https://github.com/mdn/yari/issues/11481)) ([fd6c658](https://github.com/mdn/yari/commit/fd6c65843305ef7b0c83714a0c77df6ffee61e42)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.5.0 to 2.5.1 ([#11486](https://github.com/mdn/yari/issues/11486)) ([24020fc](https://github.com/mdn/yari/commit/24020fc2e625ca1aace6d5da538645324abbe324)) +* **deps-dev:** bump react-router-dom from 6.24.1 to 6.25.0 ([#11489](https://github.com/mdn/yari/issues/11489)) ([038314a](https://github.com/mdn/yari/commit/038314a86ed92b0b7dbe38a14b7a95adab33cb9b)) +* **deps-dev:** bump react-router-dom from 6.25.0 to 6.25.1 ([#11493](https://github.com/mdn/yari/issues/11493)) ([18bcf16](https://github.com/mdn/yari/commit/18bcf16bf25c0a5cdbb3a9752231ea238f9ccbf9)) +* **deps-dev:** bump typescript from 5.5.3 to 5.5.4 ([#11522](https://github.com/mdn/yari/issues/11522)) ([7d052f7](https://github.com/mdn/yari/commit/7d052f7373714452247646364c623c44e060539d)) +* **deps-dev:** bump typescript from 5.5.3 to 5.5.4 in /client/pwa ([#11519](https://github.com/mdn/yari/issues/11519)) ([6eccc62](https://github.com/mdn/yari/commit/6eccc62c3754bc1e97ff9da460fda7af43866eea)) +* **deps-dev:** bump typescript-eslint from 7.16.0 to 7.16.1 ([#11484](https://github.com/mdn/yari/issues/11484)) ([f59704d](https://github.com/mdn/yari/commit/f59704dd02803cddb8b1ea5cae90b89ed0567ea2)) +* **deps-dev:** bump typescript-eslint from 7.16.1 to 7.17.0 ([#11521](https://github.com/mdn/yari/issues/11521)) ([22ed98a](https://github.com/mdn/yari/commit/22ed98ad1bf4d9af350bc2a6cd62e9a349b24bbf)) +* **deps-dev:** bump webpack from 5.92.1 to 5.93.0 ([#11474](https://github.com/mdn/yari/issues/11474)) ([5b2cd75](https://github.com/mdn/yari/commit/5b2cd75b73c9c931dd2cc3c4b681af08ad25b07c)) +* **deps-dev:** bump webpack from 5.92.1 to 5.93.0 in /client/pwa ([#11469](https://github.com/mdn/yari/issues/11469)) ([38b8c56](https://github.com/mdn/yari/commit/38b8c56492c618abfd2429858ac0d812172db9db)) +* **deps-dev:** remove style-dictionary ([#11447](https://github.com/mdn/yari/issues/11447)) ([f52482c](https://github.com/mdn/yari/commit/f52482ca3a363df2c6efe46b3ae18da8c4bb0b06)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.45 to 2.7.47 in /client/pwa ([#11495](https://github.com/mdn/yari/issues/11495)) ([4fee745](https://github.com/mdn/yari/commit/4fee7451a517bb80f5168d0e79341cd672886607)) +* **deps:** bump @mdn/browser-compat-data from 5.5.37 to 5.5.38 ([#11452](https://github.com/mdn/yari/issues/11452)) ([7261817](https://github.com/mdn/yari/commit/7261817f9fd7d1a31adb40c121e3c48661a3642a)) +* **deps:** bump @mdn/browser-compat-data from 5.5.38 to 5.5.39 ([#11478](https://github.com/mdn/yari/issues/11478)) ([d89dfec](https://github.com/mdn/yari/commit/d89dfecdcf632bf08104b33fcd18d229bcb180b3)) +* **deps:** bump @mdn/browser-compat-data from 5.5.39 to 5.5.40 ([#11513](https://github.com/mdn/yari/issues/11513)) ([437c54b](https://github.com/mdn/yari/commit/437c54bf441898b59ded2aa679e85b8a95cccd2a)) +* **deps:** bump @sentry/node from 8.15.0 to 8.17.0 in the sentry group ([#11451](https://github.com/mdn/yari/issues/11451)) ([1c0714b](https://github.com/mdn/yari/commit/1c0714b6c354351b655f807212b60884975b731f)) +* **deps:** bump @sentry/node from 8.17.0 to 8.18.0 in the sentry group ([#11487](https://github.com/mdn/yari/issues/11487)) ([e674816](https://github.com/mdn/yari/commit/e6748160ee1c903e410964e7bb6638f0998ad26f)) +* **deps:** bump @sentry/node from 8.18.0 to 8.19.0 in the sentry group ([#11503](https://github.com/mdn/yari/issues/11503)) ([fc60e2b](https://github.com/mdn/yari/commit/fc60e2bc92def5a6e1ecf1a6997eafcf2fd7743f)) +* **deps:** bump @webref/css from 6.13.0 to 6.13.1 ([#11457](https://github.com/mdn/yari/issues/11457)) ([eff24ce](https://github.com/mdn/yari/commit/eff24ce9eb88c6b27643aea1133db53c4dd7c16e)) +* **deps:** bump dayjs from 1.11.11 to 1.11.12 ([#11504](https://github.com/mdn/yari/issues/11504)) ([65bee27](https://github.com/mdn/yari/commit/65bee278928278ce8e6ef3536896a021272b7319)) +* **deps:** bump dexie from 3.2.7 to 4.0.8 ([#11466](https://github.com/mdn/yari/issues/11466)) ([ba064b7](https://github.com/mdn/yari/commit/ba064b742867606674ebed5e4ae468da540d0e54)) +* **deps:** bump dexie from 3.2.7 to 4.0.8 in /client/pwa ([#11461](https://github.com/mdn/yari/issues/11461)) ([7a08569](https://github.com/mdn/yari/commit/7a085690379de13429465dd8aeb126c7cbc96cc6)) +* **deps:** bump fdir from 6.1.1 to 6.2.0 ([#11517](https://github.com/mdn/yari/issues/11517)) ([8bd645e](https://github.com/mdn/yari/commit/8bd645e8d0848b4a639d09e26053da3691a16496)) +* **deps:** bump file-type from 19.1.0 to 19.1.1 ([#11465](https://github.com/mdn/yari/issues/11465)) ([0e6f0e0](https://github.com/mdn/yari/commit/0e6f0e0f9e8780ba0091dbd86875536fd54b735f)) +* **deps:** bump file-type from 19.1.1 to 19.2.0 ([#11492](https://github.com/mdn/yari/issues/11492)) ([f29628b](https://github.com/mdn/yari/commit/f29628b58457f5625bc8fca9547286871e465318)) +* **deps:** bump file-type from 19.2.0 to 19.3.0 ([#11523](https://github.com/mdn/yari/issues/11523)) ([195cf8f](https://github.com/mdn/yari/commit/195cf8f2b87e7f9db9d366cde83ad8a223da0e0c)) +* **deps:** bump lru-cache from 10.4.0 to 10.4.3 ([#11453](https://github.com/mdn/yari/issues/11453)) ([0a20f93](https://github.com/mdn/yari/commit/0a20f934c2689d2df37c51e82d1c141515386b39)) +* **deps:** bump open-editor from 4.1.1 to 5.0.0 ([#11480](https://github.com/mdn/yari/issues/11480)) ([8d06483](https://github.com/mdn/yari/commit/8d06483c4f26a44aa2f1e082bcd636bd7cf39f8e)) +* **deps:** bump openai from 4.52.4 to 4.52.5 ([#11456](https://github.com/mdn/yari/issues/11456)) ([2958f43](https://github.com/mdn/yari/commit/2958f4355cf2a37b2453cd22d043c2d02a88c339)) +* **deps:** bump openai from 4.52.5 to 4.52.7 ([#11470](https://github.com/mdn/yari/issues/11470)) ([c2f75df](https://github.com/mdn/yari/commit/c2f75dffbe00e4c84abf25250b1d1d5b3832e1ce)) +* **deps:** bump openai from 4.52.7 to 4.53.0 ([#11520](https://github.com/mdn/yari/issues/11520)) ([ce6237c](https://github.com/mdn/yari/commit/ce6237cc6a157db0ae873c81cd8cd5728aff9b54)) +* **deps:** bump pytest from 8.2.2 to 8.3.1 in /testing/integration in the dependencies group ([#11510](https://github.com/mdn/yari/issues/11510)) ([b78d9d0](https://github.com/mdn/yari/commit/b78d9d07eb32790ab8f48cb64e3c5bad95b3f14a)) +* **deps:** bump the dependencies group across 1 directory with 2 updates ([#11509](https://github.com/mdn/yari/issues/11509)) ([ad533ba](https://github.com/mdn/yari/commit/ad533ba302dbc86e7dcc141164509703786c71a2)) +* **deps:** bump web-specs from 3.13.0 to 3.13.1 ([#11463](https://github.com/mdn/yari/issues/11463)) ([44b32ea](https://github.com/mdn/yari/commit/44b32eabe623210529c5f33063e12a19834bbc9b)) +* **plus:** remove fxa rebranding ([#11500](https://github.com/mdn/yari/issues/11500)) ([786a032](https://github.com/mdn/yari/commit/786a032656cafdb32e44da773a3f379b7e22c854)) + +## [2.60.0](https://github.com/mdn/yari/compare/v2.59.0...v2.60.0) (2024-07-10) + + +### Features + +* **curriculum:** launch Scrimba partnership ([4cb0e63](https://github.com/mdn/yari/commit/4cb0e63ae666d2ff348256a2209a744001c0d583)) + + +### Bug Fixes + +* **curriculum:** add via to scrim ([#11445](https://github.com/mdn/yari/issues/11445)) ([9763358](https://github.com/mdn/yari/commit/9763358c6c7dbae2b47eb07ca4f9d20a8dbc684f)) +* **curriculum:** avoid underline on focus ([#11443](https://github.com/mdn/yari/issues/11443)) ([cc44904](https://github.com/mdn/yari/commit/cc44904da39135dd5084a9773daf23a28aee2199)) +* **curriculum:** remove autofocus on scrim ([#11444](https://github.com/mdn/yari/issues/11444)) ([ce52c70](https://github.com/mdn/yari/commit/ce52c70e4dcac74928850a1178ac51e03dcc1b59)) +* **observatory:** set sidebar/TOC background-color ([#11420](https://github.com/mdn/yari/issues/11420)) ([895982d](https://github.com/mdn/yari/commit/895982deb35079da6aed4a8ae532310e4667e40b)) + + +### Enhancements + +* **curriculum:** improve design ([#11064](https://github.com/mdn/yari/issues/11064)) ([702afab](https://github.com/mdn/yari/commit/702afaba0186fbbc8bda3c3dd40a413fab3c1ae4)) +* **sidebar,toc:** improve style of current item ([#11063](https://github.com/mdn/yari/issues/11063)) ([2e15a84](https://github.com/mdn/yari/commit/2e15a841e81660d97479f2ca74bea6c65ac8fc6a)) +* **toc:** localize "In this article" header ([#11303](https://github.com/mdn/yari/issues/11303)) ([439736b](https://github.com/mdn/yari/commit/439736b9a74787b6639874f22aa33fec2c0104a5)) + + +### Miscellaneous + +* **deps-dev:** bump @swc/core from 1.6.7 to 1.6.13 ([#11428](https://github.com/mdn/yari/issues/11428)) ([fa9df3c](https://github.com/mdn/yari/commit/fa9df3c3dcb2b377ec718129f303f0dd11d3ef5d)) +* **deps-dev:** bump @types/cli-progress from 3.11.5 to 3.11.6 in the types group ([#11427](https://github.com/mdn/yari/issues/11427)) ([11759ac](https://github.com/mdn/yari/commit/11759ac43b10089a1800dc193368f00a40563c5e)) +* **deps-dev:** bump postcss-preset-env from 9.5.15 to 9.6.0 ([#11430](https://github.com/mdn/yari/issues/11430)) ([dcc2e6c](https://github.com/mdn/yari/commit/dcc2e6cfdf7810562293357156305435e56a19ba)) +* **deps-dev:** bump ts-jest from 29.1.5 to 29.2.0 ([#11440](https://github.com/mdn/yari/issues/11440)) ([58353d3](https://github.com/mdn/yari/commit/58353d37287a3e9d596a4d002eb4c08e5ae8cae3)) +* **deps-dev:** bump typescript-eslint from 7.15.0 to 7.16.0 ([#11437](https://github.com/mdn/yari/issues/11437)) ([1ba1fd0](https://github.com/mdn/yari/commit/1ba1fd0d32aa437c2fb0ac22e73c33c7758b0e67)) +* **deps:** bump @mdn/browser-compat-data from 5.5.36 to 5.5.37 ([#11429](https://github.com/mdn/yari/issues/11429)) ([21152da](https://github.com/mdn/yari/commit/21152da95c07242916febe6e27a353259cf3f7ea)) +* **deps:** bump @sentry/node from 8.14.0 to 8.15.0 in the sentry group ([#11421](https://github.com/mdn/yari/issues/11421)) ([8a80079](https://github.com/mdn/yari/commit/8a800790587bd026d718dd9eaff634728f3016fc)) +* **deps:** bump boto3 from 1.34.136 to 1.34.140 in /deployer in the dependencies group ([#11433](https://github.com/mdn/yari/issues/11433)) ([e6e2b5e](https://github.com/mdn/yari/commit/e6e2b5e04386ac1194add9ea2d521d601b2bc32e)) +* **deps:** bump certifi from 2023.7.22 to 2024.7.4 in /deployer ([#11424](https://github.com/mdn/yari/issues/11424)) ([4837b63](https://github.com/mdn/yari/commit/4837b6312bd4ac9b8a0e5f75088792e29929525b)) +* **deps:** bump certifi from 2023.7.22 to 2024.7.4 in /testing/integration ([#11425](https://github.com/mdn/yari/issues/11425)) ([ec98d99](https://github.com/mdn/yari/commit/ec98d9979f7e146455dcdb2297d339bd9eb4d08c)) +* **deps:** bump file-type from 19.0.0 to 19.1.0 ([#11438](https://github.com/mdn/yari/issues/11438)) ([770accb](https://github.com/mdn/yari/commit/770accbc44986b259fc3444c268ea287a0ef5410)) +* **deps:** bump inquirer from 10.0.0 to 10.0.1 ([#11436](https://github.com/mdn/yari/issues/11436)) ([c87068a](https://github.com/mdn/yari/commit/c87068aeef7c6a1d54e34177aeb00b887e695b38)) +* **deps:** bump inquirer from 9.3.3 to 9.3.4 ([#11422](https://github.com/mdn/yari/issues/11422)) ([09629b2](https://github.com/mdn/yari/commit/09629b20086bb06b14406f29f226b4008f2621c4)) +* **deps:** bump inquirer from 9.3.4 to 10.0.0 ([#11432](https://github.com/mdn/yari/issues/11432)) ([52d63db](https://github.com/mdn/yari/commit/52d63dbae6f5093b30857c868e9c82cf6d656720)) +* **deps:** bump lru-cache from 10.3.0 to 10.4.0 ([#11431](https://github.com/mdn/yari/issues/11431)) ([fa448af](https://github.com/mdn/yari/commit/fa448af17fd048d7787f3d3c75f598c3d7ac06dc)) +* **deps:** bump openai from 4.52.3 to 4.52.4 ([#11439](https://github.com/mdn/yari/issues/11439)) ([0e6ff64](https://github.com/mdn/yari/commit/0e6ff64ccbc4392124e58f4115fcb5a71ca034cd)) + +## [2.59.0](https://github.com/mdn/yari/compare/v2.58.0...v2.59.0) (2024-07-04) + + +### Features + +* **observatory:** launch HTTP Observatory ([#10371](https://github.com/mdn/yari/issues/10371)) ([43fbe21](https://github.com/mdn/yari/commit/43fbe2147492a365c8e3b687f02f1f19db39a2b4)) +* **pong:** new design experiment ([#11367](https://github.com/mdn/yari/issues/11367)) ([95f9c26](https://github.com/mdn/yari/commit/95f9c26f7f558ae53e19b069032e130dc246a9b7)) + + +### Bug Fixes + +* **cloud-function:** sanitize pong/get input ([#11229](https://github.com/mdn/yari/issues/11229)) ([a35254b](https://github.com/mdn/yari/commit/a35254beea65751cd22cadc04deac07f72b086e2)) +* **deps:** bump required node version to >=18.18 ([#11373](https://github.com/mdn/yari/issues/11373)) ([4f6d197](https://github.com/mdn/yari/commit/4f6d197851e94383e4fce3393ca6e8fd0e87ee3c)) +* **macros/LearnSidebar:** add missing entry ([#11383](https://github.com/mdn/yari/issues/11383)) ([a141725](https://github.com/mdn/yari/commit/a141725ed2631c2afc7436f61ee901ef45c4b04b)) +* **observatory:** update FAQ question about move ([#11413](https://github.com/mdn/yari/issues/11413)) ([5b8b80c](https://github.com/mdn/yari/commit/5b8b80ccad9bd920fb63e8c2f4d2d5e768f5ca12)) +* **observatory:** update landing page copy ([#11405](https://github.com/mdn/yari/issues/11405)) ([fa64b0f](https://github.com/mdn/yari/commit/fa64b0f25466e87cefb499070f69c27187280867)) +* **observatory:** update typo about highest possible score ([#11407](https://github.com/mdn/yari/issues/11407)) ([f6a9da8](https://github.com/mdn/yari/commit/f6a9da89615c3fb5dd20065eae1bc462390a008d)) +* **playground:** preserve HTML comments ([#11304](https://github.com/mdn/yari/issues/11304)) ([e30b1a9](https://github.com/mdn/yari/commit/e30b1a99c7b6a22b5fe393c89b074723b1aed166)) +* **pong:** fix invalid default value ([#11384](https://github.com/mdn/yari/issues/11384)) ([1ad0e5a](https://github.com/mdn/yari/commit/1ad0e5a1ac2c3217361d3f0dfaedc4254f633e50)) +* **pong:** no padding in mobile sidebar ([#11382](https://github.com/mdn/yari/issues/11382)) ([ea6da0f](https://github.com/mdn/yari/commit/ea6da0fb3499fab6088530ff42ee4eb5c25dd253)) +* **pong:** remove div/p ([#11393](https://github.com/mdn/yari/issues/11393)) ([e27d2b8](https://github.com/mdn/yari/commit/e27d2b8b512e3942cb35c20da86a8e7be12e18c8)) + + +### Enhancements + +* **ad-free:** hide top-banner completely ([#11412](https://github.com/mdn/yari/issues/11412)) ([83d5075](https://github.com/mdn/yari/commit/83d50752b91cb4af2b74d87075e3052bb8fbec56)) + + +### Miscellaneous + +* **deps-dev:** bump @playwright/test from 1.44.1 to 1.45.0 ([#11362](https://github.com/mdn/yari/issues/11362)) ([49f9d73](https://github.com/mdn/yari/commit/49f9d73b4c7466f7bdfbfbea603cdf3a71820f16)) +* **deps-dev:** bump @playwright/test from 1.45.0 to 1.45.1 ([#11410](https://github.com/mdn/yari/issues/11410)) ([0727724](https://github.com/mdn/yari/commit/07277248a0e7187e9228ca06d5f6a0e0907097f9)) +* **deps-dev:** bump @swc/core from 1.6.5 to 1.6.6 ([#11387](https://github.com/mdn/yari/issues/11387)) ([c3d2233](https://github.com/mdn/yari/commit/c3d22337583bafa1ba5234cfe561e4e1304a7ef6)) +* **deps-dev:** bump @swc/core from 1.6.6 to 1.6.7 ([#11415](https://github.com/mdn/yari/issues/11415)) ([96ab2e1](https://github.com/mdn/yari/commit/96ab2e1570488e30adebdc8120c83fb09222205c)) +* **deps-dev:** bump postcss from 8.4.38 to 8.4.39 ([#11389](https://github.com/mdn/yari/issues/11389)) ([a7e38f2](https://github.com/mdn/yari/commit/a7e38f28ba2854a85c9c6f2ba944ce2043c7f9c4)) +* **deps-dev:** bump postcss-preset-env from 9.5.14 to 9.5.15 ([#11388](https://github.com/mdn/yari/issues/11388)) ([a809827](https://github.com/mdn/yari/commit/a809827f5784b26a5074c61bffd6d85574daeb95)) +* **deps-dev:** bump react-router-dom from 6.24.0 to 6.24.1 ([#11416](https://github.com/mdn/yari/issues/11416)) ([a1c10fc](https://github.com/mdn/yari/commit/a1c10fc54dbaf576e55cc954802e5b85939df196)) +* **deps-dev:** bump typescript from 5.5.2 to 5.5.3 ([#11402](https://github.com/mdn/yari/issues/11402)) ([0926f1e](https://github.com/mdn/yari/commit/0926f1e5217ebd9231338f2519dbfa711e2be76c)) +* **deps-dev:** bump typescript from 5.5.2 to 5.5.3 in /client/pwa ([#11404](https://github.com/mdn/yari/issues/11404)) ([8e23bf7](https://github.com/mdn/yari/commit/8e23bf71ab29838df489425b5184f8435bed0bc5)) +* **deps-dev:** bump typescript-eslint from 7.14.1 to 7.15.0 ([#11401](https://github.com/mdn/yari/issues/11401)) ([6aae3be](https://github.com/mdn/yari/commit/6aae3be325bbac25cb335cc42dcb3c31a6a40b30)) +* **deps:** bump @mdn/browser-compat-data from 5.5.35 to 5.5.36 ([#11403](https://github.com/mdn/yari/issues/11403)) ([04fc1d1](https://github.com/mdn/yari/commit/04fc1d1f5859aeb2b9acac1860ead382d8f14880)) +* **deps:** bump @sentry/node from 8.12.0 to 8.13.0 in the sentry group ([#11378](https://github.com/mdn/yari/issues/11378)) ([84cc06f](https://github.com/mdn/yari/commit/84cc06f7516c3bde51aa6c35c16a66e1ead1e17a)) +* **deps:** bump @sentry/node from 8.13.0 to 8.14.0 in the sentry group ([#11414](https://github.com/mdn/yari/issues/11414)) ([a6dfd86](https://github.com/mdn/yari/commit/a6dfd8647159533c938d7780da1849b0bc903826)) +* **deps:** bump @stripe/stripe-js from 3.5.0 to 4.0.0 ([#11329](https://github.com/mdn/yari/issues/11329)) ([7368909](https://github.com/mdn/yari/commit/736890955f7f1a2d64324b1f0ccc4d784c67c738)) +* **deps:** bump @stripe/stripe-js from 4.0.0 to 4.1.0 ([#11411](https://github.com/mdn/yari/issues/11411)) ([4bd6950](https://github.com/mdn/yari/commit/4bd6950e638e210f2b7f20ccfc30854b5789b935)) +* **deps:** bump @webref/css from 6.12.15 to 6.13.0 ([#11399](https://github.com/mdn/yari/issues/11399)) ([7431046](https://github.com/mdn/yari/commit/7431046c49f9801aa8cf6054ad84710d96790669)) +* **deps:** bump boto3 from 1.34.131 to 1.34.136 in /deployer in the dependencies group ([#11392](https://github.com/mdn/yari/issues/11392)) ([10a71b9](https://github.com/mdn/yari/commit/10a71b99b8f4b4f2753a2805535023c3de5a442a)) +* **deps:** bump inquirer from 9.2.23 to 9.3.0 ([#11376](https://github.com/mdn/yari/issues/11376)) ([b68eb39](https://github.com/mdn/yari/commit/b68eb39140aeb94aef9063eef868d0fcff5af060)) +* **deps:** bump inquirer from 9.3.0 to 9.3.1 ([#11381](https://github.com/mdn/yari/issues/11381)) ([30fd0ea](https://github.com/mdn/yari/commit/30fd0ea2708d48d195d7bcfb99c5460b37271b30)) +* **deps:** bump inquirer from 9.3.1 to 9.3.2 ([#11391](https://github.com/mdn/yari/issues/11391)) ([7e7ca6d](https://github.com/mdn/yari/commit/7e7ca6d104a24d7986e870075cabb5a5c6ee72e4)) +* **deps:** bump inquirer from 9.3.2 to 9.3.3 ([#11418](https://github.com/mdn/yari/issues/11418)) ([db188c5](https://github.com/mdn/yari/commit/db188c5907799df1a580a43c89c35243bbc4cf2c)) +* **deps:** bump lru-cache from 10.2.2 to 10.3.0 ([#11379](https://github.com/mdn/yari/issues/11379)) ([0886b32](https://github.com/mdn/yari/commit/0886b3233868e02e8e6dd71ea32b5e2f9f9adcfd)) +* **deps:** bump openai from 4.52.1 to 4.52.2 ([#11386](https://github.com/mdn/yari/issues/11386)) ([7befaaa](https://github.com/mdn/yari/commit/7befaaa50333eda38d781dc01defc33394a255d1)) +* **deps:** bump openai from 4.52.2 to 4.52.3 ([#11408](https://github.com/mdn/yari/issues/11408)) ([2d60f25](https://github.com/mdn/yari/commit/2d60f25b9cbb5a6d68bcd04135677ee978124dd6)) +* **deps:** bump pgvector from 0.1.8 to 0.2.0 ([#11380](https://github.com/mdn/yari/issues/11380)) ([7bd4fff](https://github.com/mdn/yari/commit/7bd4fff877064ba8b1d192f2ec67922059354af0)) +* **deps:** bump read-chunk from 4.0.3 to 5.0.0 ([#11390](https://github.com/mdn/yari/issues/11390)) ([8ebaaf0](https://github.com/mdn/yari/commit/8ebaaf03131c67f4babc8a4e6f10f00e5edd15e3)) +* **deps:** bump web-features from 0.8.6 to 0.9.0 ([#11400](https://github.com/mdn/yari/issues/11400)) ([5bc6b5f](https://github.com/mdn/yari/commit/5bc6b5f62428c23b164beeeae1ebd8646056a083)) +* **deps:** bump web-specs from 3.12.0 to 3.12.1 ([#11375](https://github.com/mdn/yari/issues/11375)) ([1d0e65e](https://github.com/mdn/yari/commit/1d0e65ecdb8bf750ba7d7bca83fc3582f3783685)) +* **deps:** bump web-specs from 3.12.1 to 3.13.0 ([#11409](https://github.com/mdn/yari/issues/11409)) ([8722fd0](https://github.com/mdn/yari/commit/8722fd0c297c159d12dd61dc8e5d2475b0d5540c)) +* **flaws:** exclude /en-US/observatory/* from broken-link flaw ([#11406](https://github.com/mdn/yari/issues/11406)) ([25c3064](https://github.com/mdn/yari/commit/25c30642e330cd383a1f7621a9dbb14d9766c008)) +* **macros/LearnSidebar:** add Event bubbling guide ([#11395](https://github.com/mdn/yari/issues/11395)) ([4872a86](https://github.com/mdn/yari/commit/4872a86c591de7349c7021568dc2c4b8d5c6a22c)) +* **macros/WebExtExamples:** add zh translations ([#11377](https://github.com/mdn/yari/issues/11377)) ([5492bba](https://github.com/mdn/yari/commit/5492bba75b840879abaff7746c680cd4110c0798)) +* **test-build:** enable placements ([#11374](https://github.com/mdn/yari/issues/11374)) ([dee547c](https://github.com/mdn/yari/commit/dee547c6036a5f26e8b2cfffd33685077e656401)) +* **workflows:** remove xyz-build ([#11419](https://github.com/mdn/yari/issues/11419)) ([c832fa5](https://github.com/mdn/yari/commit/c832fa55dcabdaafc7e16b1c14bc6ad5ad2c1620)) + +## [2.58.0](https://github.com/mdn/yari/compare/v2.57.0...v2.58.0) (2024-06-26) + + +### Features + +* **workflows:** add test-build workflow ([#11312](https://github.com/mdn/yari/issues/11312)) ([307e469](https://github.com/mdn/yari/commit/307e469b3d55fc5bb3b6529ec54f7155d2d59248)) + + +### Bug Fixes + +* **build:** return early on error ([#11352](https://github.com/mdn/yari/issues/11352)) ([0ee33f7](https://github.com/mdn/yari/commit/0ee33f79d3e0ef3d9dd7c93dbcad7436c1b50903)) +* **package:** run render:html on prepack ([#11368](https://github.com/mdn/yari/issues/11368)) ([59ab9f9](https://github.com/mdn/yari/commit/59ab9f973daacbe7ec9630571495057c9b88195a)) + + +### Miscellaneous + +* **deps-dev:** bump @swc/core from 1.6.3 to 1.6.5 ([#11355](https://github.com/mdn/yari/issues/11355)) ([60717c9](https://github.com/mdn/yari/commit/60717c93e20c1ffcd2659b7f7e1a410213feafd5)) +* **deps-dev:** bump react-router-dom from 6.23.1 to 6.24.0 ([#11363](https://github.com/mdn/yari/issues/11363)) ([9b9897e](https://github.com/mdn/yari/commit/9b9897ed286d87fc4e84cdb9a0d3cbdfc27da5aa)) +* **deps-dev:** bump typescript-eslint from 7.13.1 to 7.14.1 ([#11364](https://github.com/mdn/yari/issues/11364)) ([1d824aa](https://github.com/mdn/yari/commit/1d824aabd735939c75b4f783580565f1770851fd)) +* **deps:** bump @google-cloud/functions-framework from 3.1.3 to 3.4.0 in /cloud-function ([#11315](https://github.com/mdn/yari/issues/11315)) ([bfd20d4](https://github.com/mdn/yari/commit/bfd20d4457f4f5df0ce246a8e35d59ab25c28fe1)) +* **deps:** bump @mdn/browser-compat-data from 5.5.34 to 5.5.35 ([#11370](https://github.com/mdn/yari/issues/11370)) ([616a26d](https://github.com/mdn/yari/commit/616a26d4bc2139c9ee8322d59a0da1bfb100c0fe)) +* **deps:** bump @sentry/node from 8.10.0 to 8.11.0 in the sentry group ([#11353](https://github.com/mdn/yari/issues/11353)) ([9893212](https://github.com/mdn/yari/commit/9893212eab252fc91d593691f483500b7d5ba32c)) +* **deps:** bump @sentry/node from 8.11.0 to 8.12.0 in the sentry group ([#11360](https://github.com/mdn/yari/issues/11360)) ([9e64fa7](https://github.com/mdn/yari/commit/9e64fa79d00e0f1dd325098a1c872d2ddf7bc4cb)) +* **deps:** bump boto3 from 1.34.127 to 1.34.131 in /deployer in the dependencies group ([#11357](https://github.com/mdn/yari/issues/11357)) ([10b9756](https://github.com/mdn/yari/commit/10b975682916435d15b838802f8d66217b6438be)) +* **deps:** bump openai from 4.52.0 to 4.52.1 ([#11371](https://github.com/mdn/yari/issues/11371)) ([90633bc](https://github.com/mdn/yari/commit/90633bc2a4f617bd5f3e5b1a367cc8847224d6b9)) +* **deps:** bump web-specs from 3.10.0 to 3.11.0 ([#11354](https://github.com/mdn/yari/issues/11354)) ([8e37876](https://github.com/mdn/yari/commit/8e378766ef67c8dbca2e989234fbb9a698630bae)) +* **deps:** bump web-specs from 3.11.0 to 3.12.0 ([#11369](https://github.com/mdn/yari/issues/11369)) ([5f6da45](https://github.com/mdn/yari/commit/5f6da45c89c40c9d30592545230700d5f3b2c6c5)) +* **macros/LearnSidebar:** add Japanese translations ([#11351](https://github.com/mdn/yari/issues/11351)) ([acecc93](https://github.com/mdn/yari/commit/acecc93efd8f495b18a199520a99acf787cca3c9)) +* **redirects:** remove retiredLocale parameter ([#11148](https://github.com/mdn/yari/issues/11148)) ([08f38df](https://github.com/mdn/yari/commit/08f38df549c97def866649156181953d39c10b76)) +* **types:** narrow string to Locale where possible ([#11323](https://github.com/mdn/yari/issues/11323)) ([3a20751](https://github.com/mdn/yari/commit/3a20751a3f25b4bf7fa21fea2a5e53476c89b69a)) + +## [2.57.0](https://github.com/mdn/yari/compare/v2.56.0...v2.57.0) (2024-06-21) + + +### Features + +* **build:** split rendering `index.html` from building `index.json` ([#10953](https://github.com/mdn/yari/issues/10953)) ([acc0ede](https://github.com/mdn/yari/commit/acc0edea4c82bcae944e8280aef15426449527ba)) +* **cloud-function:** redirect non-canonical URLs ([#11151](https://github.com/mdn/yari/issues/11151)) ([8568a5e](https://github.com/mdn/yari/commit/8568a5e31e6fe3bc6f509fdb3dca4ffdee32c10e)) +* **ppa:** add origin trial token ([#11309](https://github.com/mdn/yari/issues/11309)) ([8128007](https://github.com/mdn/yari/commit/8128007654239b844f463c7bb3016fc94fbe6b58)) + + +### Bug Fixes + +* **seo:** remove contributors.txt from robots.txt ([#11311](https://github.com/mdn/yari/issues/11311)) ([1e561bb](https://github.com/mdn/yari/commit/1e561bbbe02b4068e0ad36c023b73b77b7ea8aad)) + + +### Miscellaneous + +* **deps-dev:** bump @swc/core from 1.5.28 to 1.5.29 ([#11306](https://github.com/mdn/yari/issues/11306)) ([74742d9](https://github.com/mdn/yari/commit/74742d9b2924dcca4982d70a67f5eb23c0c959f7)) +* **deps-dev:** bump @swc/core from 1.5.29 to 1.6.1 ([#11320](https://github.com/mdn/yari/issues/11320)) ([50f1c6c](https://github.com/mdn/yari/commit/50f1c6c3fac0c4b00716b0a86656cc422b32dcf0)) +* **deps-dev:** bump @swc/core from 1.6.1 to 1.6.3 ([#11336](https://github.com/mdn/yari/issues/11336)) ([b68d1ac](https://github.com/mdn/yari/commit/b68d1ac70c6d27336737b51040f98d7e6efe3813)) +* **deps-dev:** bump @types/imagemin from 8.0.5 to 9.0.0 ([#11249](https://github.com/mdn/yari/issues/11249)) ([cf0d726](https://github.com/mdn/yari/commit/cf0d72617a8c2c5c632a700a357acee4396c086e)) +* **deps-dev:** bump eslint-plugin-jsx-a11y from 6.8.0 to 6.9.0 ([#11338](https://github.com/mdn/yari/issues/11338)) ([5d7b2e0](https://github.com/mdn/yari/commit/5d7b2e0f5aa16a274ea22e93e21d1a4d4f328b91)) +* **deps-dev:** bump eslint-plugin-n from 17.8.1 to 17.9.0 ([#11310](https://github.com/mdn/yari/issues/11310)) ([e550c28](https://github.com/mdn/yari/commit/e550c2870bc6a4a37cc8ed204274aa87b2638621)) +* **deps-dev:** bump eslint-plugin-react from 7.34.2 to 7.34.3 ([#11334](https://github.com/mdn/yari/issues/11334)) ([f62039f](https://github.com/mdn/yari/commit/f62039ffda000d04478e5d8c8bbb68d61349e474)) +* **deps-dev:** bump eslint-plugin-unicorn from 53.0.0 to 54.0.0 ([#11321](https://github.com/mdn/yari/issues/11321)) ([f198365](https://github.com/mdn/yari/commit/f1983656bc1e78b6328beb3afbd44c0af4c6111d)) +* **deps-dev:** bump flake8 from 7.0.0 to 7.1.0 in /testing/integration in the dependencies group ([#11319](https://github.com/mdn/yari/issues/11319)) ([c62293c](https://github.com/mdn/yari/commit/c62293c2bbcb852b4dc587f20d746d89acf6b52a)) +* **deps-dev:** bump peggy from 4.0.2 to 4.0.3 ([#11340](https://github.com/mdn/yari/issues/11340)) ([2f497b2](https://github.com/mdn/yari/commit/2f497b2a61f7c08e535b95a99202a83af2f37a22)) +* **deps-dev:** bump sass from 1.77.5 to 1.77.6 ([#11332](https://github.com/mdn/yari/issues/11332)) ([37bb822](https://github.com/mdn/yari/commit/37bb8223c14d57d350cf08de3a41cfc4cd49b0ff)) +* **deps-dev:** bump ts-jest from 29.1.4 to 29.1.5 ([#11318](https://github.com/mdn/yari/issues/11318)) ([435f1a9](https://github.com/mdn/yari/commit/435f1a96ded19977b6e27ea0ee82026393bf8003)) +* **deps-dev:** bump typescript from 5.4.5 to 5.5.2 ([#11347](https://github.com/mdn/yari/issues/11347)) ([a8860a5](https://github.com/mdn/yari/commit/a8860a5a21d46b59112573bdc76ba74a221e5f15)) +* **deps-dev:** bump typescript from 5.4.5 to 5.5.2 in /client/pwa ([#11346](https://github.com/mdn/yari/issues/11346)) ([7898380](https://github.com/mdn/yari/commit/7898380d0e093fd6074216e3eea8dea6942befbc)) +* **deps-dev:** bump typescript-eslint from 7.13.0 to 7.13.1 ([#11331](https://github.com/mdn/yari/issues/11331)) ([6644b31](https://github.com/mdn/yari/commit/6644b3167d368156d70688e5f8b31c463e8b5272)) +* **deps-dev:** bump webpack from 5.92.0 to 5.92.1 ([#11342](https://github.com/mdn/yari/issues/11342)) ([c084a0a](https://github.com/mdn/yari/commit/c084a0ad201e1ebef7cd69f95fb3c0aeb1d3c75b)) +* **deps-dev:** bump webpack from 5.92.0 to 5.92.1 in /client/pwa ([#11343](https://github.com/mdn/yari/issues/11343)) ([118f71b](https://github.com/mdn/yari/commit/118f71bd9a0d3e7eb56524f4479d1dd83d2283d2)) +* **deps:** bump @mdn/browser-compat-data from 5.5.33 to 5.5.34 ([#11330](https://github.com/mdn/yari/issues/11330)) ([9f86551](https://github.com/mdn/yari/commit/9f8655154fb8d0414586d6a50dc87921d5393b75)) +* **deps:** bump @sentry/node from 8.9.2 to 8.10.0 in the sentry group ([#11337](https://github.com/mdn/yari/issues/11337)) ([074b053](https://github.com/mdn/yari/commit/074b053f2345475f76eb17a2c934971ec9468307)) +* **deps:** bump @webref/css from 6.12.13 to 6.12.14 ([#11307](https://github.com/mdn/yari/issues/11307)) ([9822241](https://github.com/mdn/yari/commit/982224132624e0fc27a2e8bdc11f343f211d1eee)) +* **deps:** bump @webref/css from 6.12.14 to 6.12.15 ([#11335](https://github.com/mdn/yari/issues/11335)) ([fd1d008](https://github.com/mdn/yari/commit/fd1d008d27ebdb7be3bbc4e111ec601618b26ee4)) +* **deps:** bump braces from 3.0.2 to 3.0.3 in /cloud-function ([#11314](https://github.com/mdn/yari/issues/11314)) ([04e63b7](https://github.com/mdn/yari/commit/04e63b7a3641c3901d7d742fd9b85b469cd4771b)) +* **deps:** bump express from 4.18.2 to 4.19.2 + follow-redirects from 1.15.5 to 1.15.6 in /cloud-function ([#11250](https://github.com/mdn/yari/issues/11250)) ([daa2ff0](https://github.com/mdn/yari/commit/daa2ff0181aecd7862b09f8c45e8edefab623b56)) +* **deps:** bump imagemin-svgo from 10.0.1 to 11.0.1 ([#11316](https://github.com/mdn/yari/issues/11316)) ([f96c189](https://github.com/mdn/yari/commit/f96c189efbd187ddf3105b56c2f8a237fb789144)) +* **deps:** bump openai from 4.50.0 to 4.51.0 ([#11305](https://github.com/mdn/yari/issues/11305)) ([980003d](https://github.com/mdn/yari/commit/980003d2dfac4914cdf72baa158bd2a5aac178bd)) +* **deps:** bump openai from 4.51.0 to 4.52.0 ([#11339](https://github.com/mdn/yari/issues/11339)) ([2931833](https://github.com/mdn/yari/commit/2931833a8527532b8a214c4cf040d46fec5a0297)) +* **deps:** bump the dependencies group in /deployer with 2 updates ([#11317](https://github.com/mdn/yari/issues/11317)) ([17a37ed](https://github.com/mdn/yari/commit/17a37ed844ef755f9efcd8aed63d3584924655e4)) +* **deps:** bump unified from 11.0.4 to 11.0.5 ([#11341](https://github.com/mdn/yari/issues/11341)) ([5a6285e](https://github.com/mdn/yari/commit/5a6285eaf5cccae469a579c6fff67707915bb473)) +* **deps:** bump urllib3 from 1.26.18 to 1.26.19 in /deployer ([#11324](https://github.com/mdn/yari/issues/11324)) ([d7c44d3](https://github.com/mdn/yari/commit/d7c44d38b4a24a4291a83ea4f020dcaa7a84e4ab)) +* **deps:** bump urllib3 from 1.26.18 to 1.26.19 in /testing/integration ([#11325](https://github.com/mdn/yari/issues/11325)) ([0c1c051](https://github.com/mdn/yari/commit/0c1c051599a645da48618608b0cd697904587059)) +* **deps:** bump web-specs from 3.9.1 to 3.10.0 ([#11348](https://github.com/mdn/yari/issues/11348)) ([c12e309](https://github.com/mdn/yari/commit/c12e30923b1fc794f7e1c2b2d16ae4a6c744b0c3)) +* **deps:** bump ws from 8.17.0 to 8.17.1 ([#11326](https://github.com/mdn/yari/issues/11326)) ([ac90640](https://github.com/mdn/yari/commit/ac90640de9d7a30ee98842e0fadc8e95bb66fb51)) +* **macros/AddonSidebar*:** update zh-CN translation ([#11231](https://github.com/mdn/yari/issues/11231)) ([1609a74](https://github.com/mdn/yari/commit/1609a74c20f53108b0b888599668ce989b565d3f)) + +## [2.56.0](https://github.com/mdn/yari/compare/v2.55.0...v2.56.0) (2024-06-12) + + +### Features + +* **workflows:** add test-de-build stub ([#11302](https://github.com/mdn/yari/issues/11302)) ([de73d82](https://github.com/mdn/yari/commit/de73d82297ac9a8365976b742d0c15cf1f82f8d4)) + + +### Bug Fixes + +* **macros/EmbedLiveSample:** move sandbox attr behind ending tag ([#11292](https://github.com/mdn/yari/issues/11292)) ([e19cf3d](https://github.com/mdn/yari/commit/e19cf3d220c3ed4feccef5fa753027f9a29d2cb2)) + + +### Miscellaneous + +* **deps-dev:** bump @swc/core from 1.5.25 to 1.5.27 ([#11281](https://github.com/mdn/yari/issues/11281)) ([305fbba](https://github.com/mdn/yari/commit/305fbbad6003dcc6537fbdd5456bc07cafc5abc7)) +* **deps-dev:** bump @swc/core from 1.5.27 to 1.5.28 ([#11285](https://github.com/mdn/yari/issues/11285)) ([7da4d06](https://github.com/mdn/yari/commit/7da4d0692d1b86cff2efc73c98f8b5d2e34d7aa9)) +* **deps-dev:** bump browserslist from 4.23.0 to 4.23.1 ([#11279](https://github.com/mdn/yari/issues/11279)) ([e2273ca](https://github.com/mdn/yari/commit/e2273caae97d529b5b200f2130beba84fca6891f)) +* **deps-dev:** bump html-validate from 8.20.0 to 8.20.1 ([#11298](https://github.com/mdn/yari/issues/11298)) ([2451695](https://github.com/mdn/yari/commit/2451695b7dde13a9ed665ea7e7e9d000d7588ecc)) +* **deps-dev:** bump mdast-util-to-hast from 13.1.0 to 13.2.0 ([#11280](https://github.com/mdn/yari/issues/11280)) ([e8ecf2d](https://github.com/mdn/yari/commit/e8ecf2d7820d61bfd1771a7f54f35cfe346eecb4)) +* **deps-dev:** bump prettier from 3.3.1 to 3.3.2 ([#11287](https://github.com/mdn/yari/issues/11287)) ([7af1fcb](https://github.com/mdn/yari/commit/7af1fcb98221f1d4e20bb1d93340f63f2d799819)) +* **deps-dev:** bump sass from 1.77.4 to 1.77.5 ([#11300](https://github.com/mdn/yari/issues/11300)) ([0a0660f](https://github.com/mdn/yari/commit/0a0660f5acc9570e3065d40161204f3a3fcf1683)) +* **deps-dev:** bump typescript-eslint from 7.12.0 to 7.13.0 ([#11288](https://github.com/mdn/yari/issues/11288)) ([c90b596](https://github.com/mdn/yari/commit/c90b596efece2d1fad09ab55f31cb5c2286713a6)) +* **deps-dev:** bump webpack from 5.91.0 to 5.92.0 ([#11297](https://github.com/mdn/yari/issues/11297)) ([7e1c857](https://github.com/mdn/yari/commit/7e1c8571f597974377143c96b1a4309798f99680)) +* **deps-dev:** bump webpack from 5.91.0 to 5.92.0 in /client/pwa ([#11293](https://github.com/mdn/yari/issues/11293)) ([ec2853c](https://github.com/mdn/yari/commit/ec2853c5fe178c3fc8c4b6cae7ced72fcf7ce861)) +* **deps:** bump @mdn/browser-compat-data from 5.5.31 to 5.5.32 ([#11278](https://github.com/mdn/yari/issues/11278)) ([f1c107a](https://github.com/mdn/yari/commit/f1c107a101c7dfeb97637f34fae14df4fe253065)) +* **deps:** bump @mdn/browser-compat-data from 5.5.32 to 5.5.33 ([#11301](https://github.com/mdn/yari/issues/11301)) ([7e5e5f1](https://github.com/mdn/yari/commit/7e5e5f121f9dec6746789c308813e9fc12fe7ee5)) +* **deps:** bump @sentry/node from 8.8.0 to 8.9.2 in the sentry group ([#11296](https://github.com/mdn/yari/issues/11296)) ([58294bf](https://github.com/mdn/yari/commit/58294bf84356370b91fce70f914ecb86ef28de65)) +* **deps:** bump braces from 3.0.2 to 3.0.3 in /client/pwa ([#11289](https://github.com/mdn/yari/issues/11289)) ([9732a96](https://github.com/mdn/yari/commit/9732a9681eaa0f93debefc2e9b2b3df762de5bb1)) +* **deps:** bump openai from 4.49.0 to 4.49.1 ([#11277](https://github.com/mdn/yari/issues/11277)) ([4c2d762](https://github.com/mdn/yari/commit/4c2d762fb6ac0d99963f4544de438df5a3557cee)) +* **deps:** bump openai from 4.49.1 to 4.50.0 ([#11286](https://github.com/mdn/yari/issues/11286)) ([ae44662](https://github.com/mdn/yari/commit/ae44662c78c904101a9f85eb4d75bbe51540a279)) +* **deps:** bump pytest from 8.2.1 to 8.2.2 in /testing/integration in the dependencies group ([#11283](https://github.com/mdn/yari/issues/11283)) ([43aee4f](https://github.com/mdn/yari/commit/43aee4f68dcebc57d8711ea378dc43d2ea8d4092)) +* **deps:** bump the dependencies group in /deployer with 2 updates ([#11284](https://github.com/mdn/yari/issues/11284)) ([ab47670](https://github.com/mdn/yari/commit/ab47670a228c6e0f37c96cf79c0ee697c53cbb45)) +* **deps:** bump web-features from 0.8.5 to 0.8.6 ([#11299](https://github.com/mdn/yari/issues/11299)) ([0f3b72a](https://github.com/mdn/yari/commit/0f3b72a2e3e1f7c2b1104387e5ea319f485f5c7a)) +* **macros/XsltRef:** update zh-CN translation ([2277868](https://github.com/mdn/yari/commit/22778688e9bbe1aa4833f1c47a743d6d4c902bc2)) +* **surveys:** close German locale survey ([#11294](https://github.com/mdn/yari/issues/11294)) ([587542e](https://github.com/mdn/yari/commit/587542ef27e0cfa22c1fe0fdba4c1781b4ee628f)) + +## [2.55.0](https://github.com/mdn/yari/compare/v2.54.0...v2.55.0) (2024-06-10) + + +### Features + +* **surveys:** add German locale survey ([#11272](https://github.com/mdn/yari/issues/11272)) ([8c015b5](https://github.com/mdn/yari/commit/8c015b5fba5520adafc5735a8279106dafbdbb1b)) +* **telemetry:** measure survey actions ([#11273](https://github.com/mdn/yari/issues/11273)) ([526fc67](https://github.com/mdn/yari/commit/526fc67f9c1bcaa67b4318f3182ff7b025e4d080)) + + +### Bug Fixes + +* **cloud-function:** use URL.pathname to resolve index.html only ([#11271](https://github.com/mdn/yari/issues/11271)) ([102682a](https://github.com/mdn/yari/commit/102682a4482b2b8b455d6ff041cbbed076474a36)) +* **css-syntax:** link types with brackets + prefer main spec for at-rules ([#11070](https://github.com/mdn/yari/issues/11070)) ([8aa2699](https://github.com/mdn/yari/commit/8aa269908255208c87f05d779d80ee875728eda6)) +* **css:** remove screen condition from media queries ([#11142](https://github.com/mdn/yari/issues/11142)) ([a814540](https://github.com/mdn/yari/commit/a814540e4686e6c59751184ef69947bc763a884d)) +* **macros/AccessibilitySidebar:** list subpages via en-US ([#11259](https://github.com/mdn/yari/issues/11259)) ([96bad13](https://github.com/mdn/yari/commit/96bad13293ab258b9dff433fda37322f098ec077)) +* **macros/MDNSidebar:** fix typo in Korean translation ([#11244](https://github.com/mdn/yari/issues/11244)) ([ee3f07f](https://github.com/mdn/yari/commit/ee3f07f2d61c144fd7fd5515ffecbb99eb37841e)) +* **seo:** add missing sitemaps ([#11234](https://github.com/mdn/yari/issues/11234)) ([4c78143](https://github.com/mdn/yari/commit/4c781432cfc9f2adb3f9cb9a13b2954afe1ddd50)) + + +### Enhancements + +* **homepage:** optimize + lazy-load contributor logo ([#11258](https://github.com/mdn/yari/issues/11258)) ([43bde1c](https://github.com/mdn/yari/commit/43bde1c474793a8d238630b161697b5670670b19)) +* **surveys:** update design + logo + add footnote ([#11274](https://github.com/mdn/yari/issues/11274)) ([9100952](https://github.com/mdn/yari/commit/9100952af5e0f9e06ea8760ef785ed171688f087)) + + +### Miscellaneous + +* **build:** remove obsolete `/@api/deki/` handling ([#11228](https://github.com/mdn/yari/issues/11228)) ([8ec146e](https://github.com/mdn/yari/commit/8ec146e6d4994534b36b7ee3056d602b53ab05ea)) +* **cloud-function:** migrate `url.parse()` to `new URL()` ([#9655](https://github.com/mdn/yari/issues/9655)) ([051a599](https://github.com/mdn/yari/commit/051a5993f7bdb3d5b7a987e7f10b3b4d15926ed4)) +* **deps-dev:** bump @babel/core from 7.24.6 to 7.24.7 ([#11263](https://github.com/mdn/yari/issues/11263)) ([8d4e69f](https://github.com/mdn/yari/commit/8d4e69f64c675f9704ac39d9b7fd540b309e1ea2)) +* **deps-dev:** bump @babel/eslint-parser from 7.24.6 to 7.24.7 ([#11261](https://github.com/mdn/yari/issues/11261)) ([0253b52](https://github.com/mdn/yari/commit/0253b521c63fd8cafd56b2d2b81795022e764919)) +* **deps-dev:** bump @babel/preset-env from 7.24.6 to 7.24.7 ([#11264](https://github.com/mdn/yari/issues/11264)) ([7d3d1a5](https://github.com/mdn/yari/commit/7d3d1a5460a07013298c2e4d098618de3c877718)) +* **deps-dev:** bump @swc/core from 1.5.24 to 1.5.25 ([#11256](https://github.com/mdn/yari/issues/11256)) ([a1a5eda](https://github.com/mdn/yari/commit/a1a5eda0e818bf64a07c6cec477abcc4c5e5acf3)) +* **deps-dev:** bump eslint-plugin-jest from 28.5.0 to 28.6.0 ([#11267](https://github.com/mdn/yari/issues/11267)) ([4923e00](https://github.com/mdn/yari/commit/4923e007dd18d7b040e6e555ebba0357546dbbd9)) +* **deps-dev:** bump eslint-plugin-n from 17.7.0 to 17.8.0 ([#11252](https://github.com/mdn/yari/issues/11252)) ([15a0fb3](https://github.com/mdn/yari/commit/15a0fb3f3a4e0e5bb3137b165835ea6de41a4156)) +* **deps-dev:** bump eslint-plugin-n from 17.8.0 to 17.8.1 ([#11265](https://github.com/mdn/yari/issues/11265)) ([2f4e25d](https://github.com/mdn/yari/commit/2f4e25d218ab4977911a3db9d015429b80b820b1)) +* **deps-dev:** bump prettier from 3.3.0 to 3.3.1 ([#11254](https://github.com/mdn/yari/issues/11254)) ([146d6bd](https://github.com/mdn/yari/commit/146d6bd747da7ff5c68a27e5fb84d9411cb01507)) +* **deps:** bump @sentry/node from 8.7.0 to 8.8.0 in the sentry group ([#11266](https://github.com/mdn/yari/issues/11266)) ([56fe5b7](https://github.com/mdn/yari/commit/56fe5b7b79ae38b5ae8b33561673fdeffe6cda7b)) +* **deps:** bump @webref/css from 6.12.12 to 6.12.13 ([#11262](https://github.com/mdn/yari/issues/11262)) ([d7534a9](https://github.com/mdn/yari/commit/d7534a9018eb0c2e2aabd2c61cab843bc1e0d756)) +* **deps:** bump openai from 4.47.3 to 4.48.1 ([#11253](https://github.com/mdn/yari/issues/11253)) ([c99ba50](https://github.com/mdn/yari/commit/c99ba507fa9208f3b5dde3fcfd035ccdbb84faf0)) +* **deps:** bump openai from 4.48.1 to 4.48.2 ([#11260](https://github.com/mdn/yari/issues/11260)) ([807dcc9](https://github.com/mdn/yari/commit/807dcc92479a9e91f77b199321e9aca36ed06d4b)) +* **deps:** bump openai from 4.48.2 to 4.49.0 ([#11268](https://github.com/mdn/yari/issues/11268)) ([5e0b871](https://github.com/mdn/yari/commit/5e0b871ffb0562d49c1d71f82ab3c5dc1ad3fe38)) +* **deps:** bump pg from 8.11.5 to 8.12.0 ([#11255](https://github.com/mdn/yari/issues/11255)) ([654c2ad](https://github.com/mdn/yari/commit/654c2ad3330dc2f3c817ce5ad2a8233e3fc542a8)) +* **deps:** bump sse.js from 2.4.1 to 2.5.0 ([#11269](https://github.com/mdn/yari/issues/11269)) ([d6c8558](https://github.com/mdn/yari/commit/d6c855834d99353dc258ddf9a51c0b96f805237b)) +* **macros/AvailableInWorkers:** update Japanese translation ([#11155](https://github.com/mdn/yari/issues/11155)) ([89b79b1](https://github.com/mdn/yari/commit/89b79b122efcf7f02e9cf77bb688d2d08d77a5a0)) +* **readme:** remove ngrok section ([#11164](https://github.com/mdn/yari/issues/11164)) ([0cae8bd](https://github.com/mdn/yari/commit/0cae8bdecf96d082160f98cf6e6796f48721c047)) + +## [2.54.0](https://github.com/mdn/yari/compare/v2.53.1...v2.54.0) (2024-06-04) + + +### Features + +* **pride:** pride 2024 ([#11213](https://github.com/mdn/yari/issues/11213)) ([b791c07](https://github.com/mdn/yari/commit/b791c07186cc07c1488dffb424b341cda8a5cba7)) + + +### Bug Fixes + +* **breadcrumbs:** use short-title for parents ([#11180](https://github.com/mdn/yari/issues/11180)) ([978dabf](https://github.com/mdn/yari/commit/978dabf075ee1ec76619dff1e99b7656f181a22c)) + + +### Miscellaneous + +* **deps-dev:** bump @pmmmwh/react-refresh-webpack-plugin from 0.5.13 to 0.5.15 ([#11241](https://github.com/mdn/yari/issues/11241)) ([d25df94](https://github.com/mdn/yari/commit/d25df940e368392b20aee8333dceaf51ec8f8280)) +* **deps-dev:** bump @swc/core from 1.5.22 to 1.5.24 ([#11226](https://github.com/mdn/yari/issues/11226)) ([47a02e6](https://github.com/mdn/yari/commit/47a02e6269797140765beaf24dd15d71b0e86c7e)) +* **deps-dev:** bump html-validate from 8.19.1 to 8.20.0 ([#11242](https://github.com/mdn/yari/issues/11242)) ([b9f2bee](https://github.com/mdn/yari/commit/b9f2beed1814b1efed9c84d68902d65348676281)) +* **deps-dev:** bump prettier from 3.2.5 to 3.3.0 ([#11240](https://github.com/mdn/yari/issues/11240)) ([bad5f91](https://github.com/mdn/yari/commit/bad5f9134e5993a0a1c1b366e6459d591ba98025)) +* **deps-dev:** bump sass from 1.77.3 to 1.77.4 ([#11225](https://github.com/mdn/yari/issues/11225)) ([d2a7572](https://github.com/mdn/yari/commit/d2a757221c3087dc925f57ff7bf5f2084364555f)) +* **deps-dev:** bump typescript-eslint from 7.11.0 to 7.12.0 ([#11246](https://github.com/mdn/yari/issues/11246)) ([fa53cf2](https://github.com/mdn/yari/commit/fa53cf2c772bc15fa275f507e11edc719e5ea22b)) +* **deps:** bump @mdn/browser-compat-data from 5.5.30 to 5.5.31 ([#11237](https://github.com/mdn/yari/issues/11237)) ([f1a7e0f](https://github.com/mdn/yari/commit/f1a7e0f35230821c46f873424e31cc3daa565765)) +* **deps:** bump @stripe/stripe-js from 3.4.1 to 3.5.0 ([#11247](https://github.com/mdn/yari/issues/11247)) ([634bf48](https://github.com/mdn/yari/commit/634bf48d9c47c692b7dcc963e18accfdbb03de35)) +* **deps:** bump inquirer from 9.2.22 to 9.2.23 ([#11239](https://github.com/mdn/yari/issues/11239)) ([e7ed8bd](https://github.com/mdn/yari/commit/e7ed8bd443625b1f30139ce5d138d814c16e4fde)) +* **deps:** bump openai from 4.47.2 to 4.47.3 ([#11238](https://github.com/mdn/yari/issues/11238)) ([345b092](https://github.com/mdn/yari/commit/345b092fa5ee534c851860eaa92ad58930e434db)) +* **deps:** bump requests from 2.32.2 to 2.32.3 in /testing/integration in the dependencies group ([#11235](https://github.com/mdn/yari/issues/11235)) ([08141ed](https://github.com/mdn/yari/commit/08141ed83284130e3f6d1233f35ec513ff046a44)) +* **deps:** bump the dependencies group in /deployer with 2 updates ([#11243](https://github.com/mdn/yari/issues/11243)) ([0cf1b9a](https://github.com/mdn/yari/commit/0cf1b9a3e0614b3292b0b4d1555413816824aa42)) +* **deps:** bump web-features from 0.8.4 to 0.8.5 ([#11245](https://github.com/mdn/yari/issues/11245)) ([674b0c6](https://github.com/mdn/yari/commit/674b0c68242644816407f137313fca8554daaacc)) +* **deps:** bump web-specs from 3.9.0 to 3.9.1 ([#11248](https://github.com/mdn/yari/issues/11248)) ([e6e14ec](https://github.com/mdn/yari/commit/e6e14ec9645665be664eeabfbec9f27028555e99)) +* **fundamental-redirects:** add more /docs/ prefix redirects ([#11223](https://github.com/mdn/yari/issues/11223)) ([537bbf7](https://github.com/mdn/yari/commit/537bbf73e7a29b666107b94b8499296caefd7e49)) + +## [2.53.1](https://github.com/mdn/yari/compare/v2.53.0...v2.53.1) (2024-05-31) + + +### Bug Fixes + +* **cloud-function:** skip next() on fundamental redirect ([#11222](https://github.com/mdn/yari/issues/11222)) ([00daf0f](https://github.com/mdn/yari/commit/00daf0f11a77b0fb76ca873f1f4bbc9108d50237)) +* **seo:** add rel="nofollow" on "Sign up for free" link ([#11219](https://github.com/mdn/yari/issues/11219)) ([ef26b7f](https://github.com/mdn/yari/commit/ef26b7f91bf19919e328bf04ab97955a20e4f4a6)) +* **sync-translated-content:** preserve l10n frontmatter ([#11224](https://github.com/mdn/yari/issues/11224)) ([66653b7](https://github.com/mdn/yari/commit/66653b7426b5570cbcffb495c9f5997215079d7e)) + +## [2.53.0](https://github.com/mdn/yari/compare/v2.52.1...v2.53.0) (2024-05-30) + + +### Features + +* **experiment:** stop rewriting Web/API page titles ([#11218](https://github.com/mdn/yari/issues/11218)) ([e04081a](https://github.com/mdn/yari/commit/e04081a24415185ff35e4b4ec847a70fc734916a)) +* **telemetry:** measure user preferred languages ([#11065](https://github.com/mdn/yari/issues/11065)) ([cad650c](https://github.com/mdn/yari/commit/cad650cc01dbc75ad1399600ad0289ed751f19c6)) + + +### Bug Fixes + +* **article-footer:** reduce margin on small screens ([#11141](https://github.com/mdn/yari/issues/11141)) ([b4bc689](https://github.com/mdn/yari/commit/b4bc689c50c67452c9184da7a9b5b20c47ca9f72)) +* **css:** fit feedback form on smaller screens ([b4bc689](https://github.com/mdn/yari/commit/b4bc689c50c67452c9184da7a9b5b20c47ca9f72)) +* **curriculum:** increase module list tab contrast ([#11062](https://github.com/mdn/yari/issues/11062)) ([4084fff](https://github.com/mdn/yari/commit/4084fff8edafc109f2cdbce4fc64387b6d47b9b1)) +* **filechecker:** revert imagemin-svgo ([#11201](https://github.com/mdn/yari/issues/11201)) ([bd4aad4](https://github.com/mdn/yari/commit/bd4aad4ebaa6fc2890cabec8b64cb5c50797874e)) +* **i10n:** localize deprecated header text in ko ([#11189](https://github.com/mdn/yari/issues/11189)) ([d4c41a8](https://github.com/mdn/yari/commit/d4c41a89b3df8a51fed6bd71ed043538cdb3767e)) +* **l10n:** localize translation banner in pt-BR ([#11018](https://github.com/mdn/yari/issues/11018)) ([f4ce821](https://github.com/mdn/yari/commit/f4ce82102f02074ce7d10dc801819d255db5f076)) +* **playground:** avoid stringifying invalid console messages ([#11150](https://github.com/mdn/yari/issues/11150)) ([90072c8](https://github.com/mdn/yari/commit/90072c8ef4fdbd98d5ad09367f0e6b432cdaedf5)) +* **pong:** avoid duplicate "https:" ([#11212](https://github.com/mdn/yari/issues/11212)) ([c4ef726](https://github.com/mdn/yari/commit/c4ef7260ce2d3339caec5adce86e743cc31ba60e)) +* **search:** use "noindex, follow" robots tag + remove robots.txt exclude ([#11140](https://github.com/mdn/yari/issues/11140)) ([734c0b6](https://github.com/mdn/yari/commit/734c0b6716c356ca2ee5dd3da6d796925a4190de)) +* **seo:** identify sponsored links ([#11217](https://github.com/mdn/yari/issues/11217)) ([5d47456](https://github.com/mdn/yari/commit/5d474566f03af5f48ad81db94c0874c09c2670d6)) +* **seo:** prevent contributors.txt from indexing and crawling ([#11149](https://github.com/mdn/yari/issues/11149)) ([7164c71](https://github.com/mdn/yari/commit/7164c71db4468a2646b665dcd6e8e9a9c0b2b61f)) + + +### Miscellaneous + +* **deps-dev:** bump @babel/core from 7.24.5 to 7.24.6 ([#11191](https://github.com/mdn/yari/issues/11191)) ([75a243b](https://github.com/mdn/yari/commit/75a243be3d73f1a2e9e28778bac8194c91cd832a)) +* **deps-dev:** bump @babel/eslint-parser from 7.24.5 to 7.24.6 ([#11196](https://github.com/mdn/yari/issues/11196)) ([5e34519](https://github.com/mdn/yari/commit/5e34519958a6e31de9b1df3a306e962293be1fea)) +* **deps-dev:** bump @babel/preset-env from 7.24.5 to 7.24.6 ([#11194](https://github.com/mdn/yari/issues/11194)) ([2c719ef](https://github.com/mdn/yari/commit/2c719efeeaab427f3114d5eaf7de9a021c5aa798)) +* **deps-dev:** bump @playwright/test from 1.44.0 to 1.44.1 ([#11177](https://github.com/mdn/yari/issues/11177)) ([f3df793](https://github.com/mdn/yari/commit/f3df793e6ee4f534bdc809f7579ab40eeaeef90c)) +* **deps-dev:** bump @swc/core from 1.5.7 to 1.5.22 ([#11216](https://github.com/mdn/yari/issues/11216)) ([7da5467](https://github.com/mdn/yari/commit/7da5467c4271f3be86f23c6bd22a4514a4655285)) +* **deps-dev:** bump @types/react from 18.3.2 to 18.3.3 in the types group ([#11183](https://github.com/mdn/yari/issues/11183)) ([a80c17a](https://github.com/mdn/yari/commit/a80c17a00b6d435d55f5523defed317b1ff0b090)) +* **deps-dev:** bump braces from 3.0.2 to 3.0.3 ([#11170](https://github.com/mdn/yari/issues/11170)) ([bf88dec](https://github.com/mdn/yari/commit/bf88decd1261de081d0053d0709a5defdb76aea6)) +* **deps-dev:** bump css-loader from 7.1.1 to 7.1.2 ([#11176](https://github.com/mdn/yari/issues/11176)) ([39ebfe3](https://github.com/mdn/yari/commit/39ebfe39b6c762fea66fbefd35731017f4422662)) +* **deps-dev:** bump eslint-plugin-n from 17.4.0 to 17.7.0 ([#11126](https://github.com/mdn/yari/issues/11126)) ([fa9c6d1](https://github.com/mdn/yari/commit/fa9c6d1134a68f02255e5908c84bce5efbb8dd5f)) +* **deps-dev:** bump eslint-plugin-react from 7.34.1 to 7.34.2 ([#11206](https://github.com/mdn/yari/issues/11206)) ([595dd9b](https://github.com/mdn/yari/commit/595dd9bf1f1bc9c326df280e5ef8811f4c61ef58)) +* **deps-dev:** bump eslint-webpack-plugin from 4.1.0 to 4.2.0 ([#11192](https://github.com/mdn/yari/issues/11192)) ([64b90ec](https://github.com/mdn/yari/commit/64b90ec61f636aaa837b14819c1f0de0138abe15)) +* **deps-dev:** bump html-validate from 8.18.2 to 8.19.0 ([#11159](https://github.com/mdn/yari/issues/11159)) ([2786895](https://github.com/mdn/yari/commit/2786895bfa2d4703dd4a69fbafd8d9534592c1e3)) +* **deps-dev:** bump html-validate from 8.19.0 to 8.19.1 ([#11184](https://github.com/mdn/yari/issues/11184)) ([a8d88fa](https://github.com/mdn/yari/commit/a8d88fa1b94e02f49b926e2d235cfa7985dd7c22)) +* **deps-dev:** bump jsdom from 24.0.0 to 24.1.0 ([#11197](https://github.com/mdn/yari/issues/11197)) ([5e232a4](https://github.com/mdn/yari/commit/5e232a411c6b15b5ba0bbbd6cc36a54039e1087e)) +* **deps-dev:** bump postcss-preset-env from 9.5.13 to 9.5.14 ([#11185](https://github.com/mdn/yari/issues/11185)) ([658845c](https://github.com/mdn/yari/commit/658845c2a84498436e60a38ccc9f0cbd14ec78a0)) +* **deps-dev:** bump sass from 1.77.2 to 1.77.3 ([#11215](https://github.com/mdn/yari/issues/11215)) ([5e715a1](https://github.com/mdn/yari/commit/5e715a1182b22f01223cb2e3d8733994bdcba233)) +* **deps-dev:** bump ts-jest from 29.1.2 to 29.1.3 ([#11171](https://github.com/mdn/yari/issues/11171)) ([0d7850e](https://github.com/mdn/yari/commit/0d7850ed7acb2fcb518d6f1457e6faa9aeddebc8)) +* **deps-dev:** bump ts-jest from 29.1.3 to 29.1.4 ([#11204](https://github.com/mdn/yari/issues/11204)) ([e4ab9aa](https://github.com/mdn/yari/commit/e4ab9aaf99467df5709a79a9124895f9160ffcf4)) +* **deps-dev:** bump typescript-eslint from 7.10.0 to 7.11.0 ([#11203](https://github.com/mdn/yari/issues/11203)) ([8ab2bdd](https://github.com/mdn/yari/commit/8ab2bddcc26dea80f9deb9d1538606259cccf903)) +* **deps-dev:** bump typescript-eslint from 7.9.0 to 7.10.0 ([#11169](https://github.com/mdn/yari/issues/11169)) ([1de9a26](https://github.com/mdn/yari/commit/1de9a268bf1db0f5a74b78d3789ae63ed3e31e67)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.44 to 2.7.45 in /client/pwa ([#11210](https://github.com/mdn/yari/issues/11210)) ([00bf253](https://github.com/mdn/yari/commit/00bf253ec55fe7d4efb61a6dad6eec4caa64dee0)) +* **deps:** bump @mdn/browser-compat-data from 5.5.28 to 5.5.29 ([#11162](https://github.com/mdn/yari/issues/11162)) ([9eabb01](https://github.com/mdn/yari/commit/9eabb010e47bc4cb96a9399ccb1c952287081881)) +* **deps:** bump @mdn/browser-compat-data from 5.5.29 to 5.5.30 ([#11209](https://github.com/mdn/yari/issues/11209)) ([3ba4218](https://github.com/mdn/yari/commit/3ba4218de6b793fcb4d2a4a9205233e4d2da7afc)) +* **deps:** bump @mozilla/glean from 5.0.1 to 5.0.2 ([#11186](https://github.com/mdn/yari/issues/11186)) ([d8d26c7](https://github.com/mdn/yari/commit/d8d26c778ae2b938b8f2792a757cf90019f25377)) +* **deps:** bump @sentry/node from 7.114.0 to 8.2.1 in the sentry group across 1 directory ([#11145](https://github.com/mdn/yari/issues/11145)) ([3127032](https://github.com/mdn/yari/commit/3127032e2efea5b401a12dfbb374d3d869425fed)) +* **deps:** bump @sentry/node from 8.2.1 to 8.3.0 in the sentry group ([#11174](https://github.com/mdn/yari/issues/11174)) ([1b74acf](https://github.com/mdn/yari/commit/1b74acfbb63346761a664afeb72907537d54c12d)) +* **deps:** bump @sentry/node from 8.3.0 to 8.4.0 in the sentry group ([#11182](https://github.com/mdn/yari/issues/11182)) ([e208941](https://github.com/mdn/yari/commit/e208941d67da07d4662e054a1417864851917ced)) +* **deps:** bump @sentry/node from 8.4.0 to 8.5.0 in the sentry group ([#11202](https://github.com/mdn/yari/issues/11202)) ([d2cb9bb](https://github.com/mdn/yari/commit/d2cb9bbd81c6c1e9b61d4bcc4f090bb811395858)) +* **deps:** bump @sentry/node from 8.5.0 to 8.7.0 in the sentry group ([#11214](https://github.com/mdn/yari/issues/11214)) ([6a44d2d](https://github.com/mdn/yari/commit/6a44d2dd744515134df17c3d9109868eab3ec853)) +* **deps:** bump @stripe/stripe-js from 3.4.0 to 3.4.1 ([#11172](https://github.com/mdn/yari/issues/11172)) ([e344db8](https://github.com/mdn/yari/commit/e344db8fabf121b1b3e07c6f794ecdfc97d560c2)) +* **deps:** bump @webref/css from 6.12.11 to 6.12.12 ([#11175](https://github.com/mdn/yari/issues/11175)) ([6160188](https://github.com/mdn/yari/commit/616018897b68cb053e6463f2f9dcf9aaf2c8ae3e)) +* **deps:** bump inquirer from 9.2.21 to 9.2.22 ([#11160](https://github.com/mdn/yari/issues/11160)) ([2a67c3c](https://github.com/mdn/yari/commit/2a67c3cb5bade44e06737175e69995e76539c705)) +* **deps:** bump mdast-util-from-markdown from 2.0.0 to 2.0.1 ([#11193](https://github.com/mdn/yari/issues/11193)) ([3f3e342](https://github.com/mdn/yari/commit/3f3e342e3072e6c918bb6f3fd9584ae572421937)) +* **deps:** bump mdn-data from 2.7.0 to 2.8.0 ([#11173](https://github.com/mdn/yari/issues/11173)) ([e35a29a](https://github.com/mdn/yari/commit/e35a29aac598a1343a9de614d69311e9bf319e84)) +* **deps:** bump openai from 4.47.1 to 4.47.2 ([#11208](https://github.com/mdn/yari/issues/11208)) ([5029ecb](https://github.com/mdn/yari/commit/5029ecbb5959c2b0d2a0eb6253edb561fc5a934e)) +* **deps:** bump pytest from 8.2.0 to 8.2.1 in /testing/integration in the dependencies group ([#11156](https://github.com/mdn/yari/issues/11156)) ([fb2066e](https://github.com/mdn/yari/commit/fb2066e94798bcd5150d5b271fd8a44feb479d76)) +* **deps:** bump requests from 2.31.0 to 2.32.0 in /deployer ([#11167](https://github.com/mdn/yari/issues/11167)) ([95ea0da](https://github.com/mdn/yari/commit/95ea0da0aed99e9804d91c20eddcc17ce74023d3)) +* **deps:** bump requests from 2.31.0 to 2.32.0 in /testing/integration ([#11168](https://github.com/mdn/yari/issues/11168)) ([09b7046](https://github.com/mdn/yari/commit/09b7046e5b3afea8975643c3bfb957e9ac7f8ca0)) +* **deps:** bump requests from 2.32.0 to 2.32.2 in /testing/integration in the dependencies group ([#11198](https://github.com/mdn/yari/issues/11198)) ([860a9d7](https://github.com/mdn/yari/commit/860a9d7527350e6b0620b0a52a8e997be5d0fd88)) +* **deps:** bump the dependencies group in /deployer with 2 updates ([#11158](https://github.com/mdn/yari/issues/11158)) ([8b483e8](https://github.com/mdn/yari/commit/8b483e8136bc92c2a25b0a462160394b853a8a14)) +* **deps:** bump the dependencies group in /deployer with 2 updates ([#11200](https://github.com/mdn/yari/issues/11200)) ([778446d](https://github.com/mdn/yari/commit/778446d70618405943feb1f6e0a3bca33e42f8c3)) +* **deps:** bump web-features from 0.8.2 to 0.8.3 ([#11161](https://github.com/mdn/yari/issues/11161)) ([65bfe90](https://github.com/mdn/yari/commit/65bfe9001a9ade594001692d3945788032c77dd8)) +* **deps:** bump web-features from 0.8.3 to 0.8.4 ([#11207](https://github.com/mdn/yari/issues/11207)) ([776ef23](https://github.com/mdn/yari/commit/776ef2316117e30447db251da6aa7e894778ef8a)) +* **macros/LearnSidebar:** add Japanese translation for Games section ([#11152](https://github.com/mdn/yari/issues/11152)) ([10d50be](https://github.com/mdn/yari/commit/10d50bef14a761b4798fdb12d0043086acc75d3e)) + +## [2.52.1](https://github.com/mdn/yari/compare/v2.52.0...v2.52.1) (2024-05-17) + + +### Bug Fixes + +* **build:** sort build.json content ([#11124](https://github.com/mdn/yari/issues/11124)) ([77ec929](https://github.com/mdn/yari/commit/77ec929f7d80f845f31d5822eb5e4cc8c9b1cef9)) +* **css-syntax:** explicitly order specs ([#11101](https://github.com/mdn/yari/issues/11101)) ([8e8cd78](https://github.com/mdn/yari/commit/8e8cd7892e4737dc82122cc55ea46e4366da6a0d)) +* **l10n:** improve style of en-US links ([#11052](https://github.com/mdn/yari/issues/11052)) ([378dd13](https://github.com/mdn/yari/commit/378dd13aeccf81e2e7d3404528e453ca5064f1d0)) +* **layout:** avoid column breaks in index ([#11053](https://github.com/mdn/yari/issues/11053)) ([710685e](https://github.com/mdn/yari/commit/710685ea6e1acb3f56aaeebdaa7199a99492efd2)) +* **layout:** avoid column-breaks in index ([710685e](https://github.com/mdn/yari/commit/710685ea6e1acb3f56aaeebdaa7199a99492efd2)) +* **spas:** index AI Help + Updates ([#11138](https://github.com/mdn/yari/issues/11138)) ([f4c2388](https://github.com/mdn/yari/commit/f4c2388032a76fa4e09b84d46475f43f55e25004)) +* **ssr:** remove unnecessary robots tags ([#11139](https://github.com/mdn/yari/issues/11139)) ([1207158](https://github.com/mdn/yari/commit/12071588ec64d125cc39c15c1f3cf068d96f204c)) + + +### Miscellaneous + +* **deps-dev:** bump @swc/core from 1.5.5 to 1.5.7 ([#11132](https://github.com/mdn/yari/issues/11132)) ([b5f43c9](https://github.com/mdn/yari/commit/b5f43c977f286e747f4003e45cd2982dd74fe3c7)) +* **deps-dev:** bump @types/mdast from 4.0.3 to 4.0.4 in the types group ([#11128](https://github.com/mdn/yari/issues/11128)) ([aef184e](https://github.com/mdn/yari/commit/aef184e4054b6a8ba7bfc0a73dc12f12ff333a48)) +* **deps-dev:** bump eslint-plugin-unicorn from 52.0.0 to 53.0.0 ([#11103](https://github.com/mdn/yari/issues/11103)) ([0b263d0](https://github.com/mdn/yari/commit/0b263d0e6822ef7f9812760a14b6e3b4a1b879fe)) +* **deps-dev:** bump postcss-preset-env from 9.5.12 to 9.5.13 ([#11131](https://github.com/mdn/yari/issues/11131)) ([1423ca4](https://github.com/mdn/yari/commit/1423ca4c7c1904c49ac2d002aad8b8d5ce498691)) +* **deps-dev:** bump sass from 1.77.1 to 1.77.2 ([#11146](https://github.com/mdn/yari/issues/11146)) ([fb95669](https://github.com/mdn/yari/commit/fb9566992ba4454e7a7e336e649ab36018b83cf4)) +* **deps-dev:** bump typescript-eslint from 7.8.0 to 7.9.0 ([#11129](https://github.com/mdn/yari/issues/11129)) ([a5d0ac3](https://github.com/mdn/yari/commit/a5d0ac3cc59bee18b908c47c4f2da73e1c6379b0)) +* **deps:** bump @mdn/browser-compat-data from 5.5.27 to 5.5.28 ([#11135](https://github.com/mdn/yari/issues/11135)) ([1329cd4](https://github.com/mdn/yari/commit/1329cd4855448e8a642f3d3583fb4f50d5df60af)) +* **deps:** bump @webref/css from 6.12.10 to 6.12.11 ([#11147](https://github.com/mdn/yari/issues/11147)) ([163aa9e](https://github.com/mdn/yari/commit/163aa9ef00a45fb03d154a3000d5fa8eece931a6)) +* **deps:** bump inquirer from 9.2.20 to 9.2.21 ([#11134](https://github.com/mdn/yari/issues/11134)) ([6025c0e](https://github.com/mdn/yari/commit/6025c0efde55d5682c371227a3199b19b97da2c1)) +* **deps:** bump is-svg from 5.0.0 to 5.0.1 ([#11130](https://github.com/mdn/yari/issues/11130)) ([cfb93df](https://github.com/mdn/yari/commit/cfb93df0d952593f3cd86c0cf7ded58e1dde7d84)) +* **deps:** bump openai from 4.45.0 to 4.47.1 ([#11133](https://github.com/mdn/yari/issues/11133)) ([85aec2d](https://github.com/mdn/yari/commit/85aec2d4c7f623b796a30dba0ea251fce97cd0ce)) +* **deps:** bump web-features from 0.8.1 to 0.8.2 ([#11144](https://github.com/mdn/yari/issues/11144)) ([f8c0a29](https://github.com/mdn/yari/commit/f8c0a29b5acb6e03ff0237a15f69342ea32625bf)) + +## [2.52.0](https://github.com/mdn/yari/compare/v2.51.0...v2.52.0) (2024-05-14) + + +### Features + +* **csp:** allow shared assets ([#10858](https://github.com/mdn/yari/issues/10858)) ([4249546](https://github.com/mdn/yari/commit/4249546243cc16def100bfd2800dbecc6a9056b0)) + + +### Bug Fixes + +* **baseline:** hide screen orientation lock banner ([#11107](https://github.com/mdn/yari/issues/11107)) ([a851ba5](https://github.com/mdn/yari/commit/a851ba557d144242d116b606e8f38b1b5389ec5d)) +* **blog:** hydration errors due to newsletter component ([#11106](https://github.com/mdn/yari/issues/11106)) ([36c3d0c](https://github.com/mdn/yari/commit/36c3d0c584d7e236d0759079d46b9974ee01a233)) +* **curriculum:** highlight "Getting started" in module overview ([#11051](https://github.com/mdn/yari/issues/11051)) ([a3dd9b4](https://github.com/mdn/yari/commit/a3dd9b4778f86a3f1e9f9514846ab9fc90e4522a)) +* **l10n:** improve position of en-US link indicators in sidebar ([#11066](https://github.com/mdn/yari/issues/11066)) ([1b9c773](https://github.com/mdn/yari/commit/1b9c773421ca758841bd2cc0f324961a9356bfff)) +* **macro:** Fix two flaws in CSSRef.ejs ([#11081](https://github.com/mdn/yari/issues/11081)) ([344ec8c](https://github.com/mdn/yari/commit/344ec8c1e4a0bd120b8ea1ef6d9cd187446fc33c)) +* **macros:** fix URL issues in sidebar macros ([#11082](https://github.com/mdn/yari/issues/11082)) ([2cfbb67](https://github.com/mdn/yari/commit/2cfbb6748522030af23a2ba08208f4b9d2dbab70)) +* **playground/runner:** fix external script loading in playground ([#11017](https://github.com/mdn/yari/issues/11017)) ([8ba95b2](https://github.com/mdn/yari/commit/8ba95b23a3fee93f2235eda2809002437f02a521)) +* **telemetry:** remove Glean migration flag ([#11069](https://github.com/mdn/yari/issues/11069)) ([54a9bc8](https://github.com/mdn/yari/commit/54a9bc8f40c7e90e3675bfdd94f75ef49cd94e9d)) + + +### Enhancements + +* **macros/AvailableInWorkers:** add "only available in Web Workers" case ([#10968](https://github.com/mdn/yari/issues/10968)) ([d56a76f](https://github.com/mdn/yari/commit/d56a76fabb6f6452a2ddfd472c889103c30faf2c)) +* **macros/EmbedYouTube:** add optional title attribute ([#10504](https://github.com/mdn/yari/issues/10504)) ([4d215d3](https://github.com/mdn/yari/commit/4d215d32f5a8960942059e95e3f6c6fe45f30920)) + + +### Miscellaneous + +* **deps-dev:** bump @playwright/test from 1.43.1 to 1.44.0 ([#11090](https://github.com/mdn/yari/issues/11090)) ([e258f67](https://github.com/mdn/yari/commit/e258f678dc960b2920dcdce38a034b4e443043bf)) +* **deps-dev:** bump @swc/core from 1.5.0 to 1.5.3 ([#11083](https://github.com/mdn/yari/issues/11083)) ([10dcfa4](https://github.com/mdn/yari/commit/10dcfa497a4ce0330df3b92abcb4d44de2ebcc21)) +* **deps-dev:** bump @swc/core from 1.5.3 to 1.5.5 ([#11097](https://github.com/mdn/yari/issues/11097)) ([ec29038](https://github.com/mdn/yari/commit/ec29038bf12a836f55c6b408874112746da4e947)) +* **deps-dev:** bump @testing-library/react from 15.0.6 to 15.0.7 ([#11088](https://github.com/mdn/yari/issues/11088)) ([9207a00](https://github.com/mdn/yari/commit/9207a00d56b5da5bd006469dabff161d470cc68e)) +* **deps-dev:** bump @types/react from 18.3.1 to 18.3.2 in the types group ([#11111](https://github.com/mdn/yari/issues/11111)) ([1357a95](https://github.com/mdn/yari/commit/1357a95e09a9dbced817613c0a4a4f75a8de4f30)) +* **deps-dev:** bump css-minimizer-webpack-plugin from 6.0.0 to 7.0.0 ([#11095](https://github.com/mdn/yari/issues/11095)) ([8722a0e](https://github.com/mdn/yari/commit/8722a0e0f874964abb8197fbce0feeb65c7c96f8)) +* **deps-dev:** bump eslint-plugin-jest from 28.3.0 to 28.4.0 ([#11057](https://github.com/mdn/yari/issues/11057)) ([fd2212f](https://github.com/mdn/yari/commit/fd2212fb74ce192fde540ffdee92daddd1192d82)) +* **deps-dev:** bump eslint-plugin-jest from 28.4.0 to 28.5.0 ([#11076](https://github.com/mdn/yari/issues/11076)) ([1b48294](https://github.com/mdn/yari/commit/1b482945073638e1c27c0d6e0c64ad7386f28a49)) +* **deps-dev:** bump postcss-preset-env from 9.5.11 to 9.5.12 ([#11115](https://github.com/mdn/yari/issues/11115)) ([2573f2d](https://github.com/mdn/yari/commit/2573f2d973a8a5ecd7439bd0c484561f5cf20736)) +* **deps-dev:** bump postcss-preset-env from 9.5.9 to 9.5.11 ([#11074](https://github.com/mdn/yari/issues/11074)) ([341770b](https://github.com/mdn/yari/commit/341770b9604a46b7ce0acc1daf476923279fecd0)) +* **deps-dev:** bump react-router-dom from 6.23.0 to 6.23.1 ([#11118](https://github.com/mdn/yari/issues/11118)) ([b9d17b2](https://github.com/mdn/yari/commit/b9d17b2c1cee59d08a79cbe812d37097c9ce2901)) +* **deps-dev:** bump sass from 1.76.0 to 1.77.0 ([#11084](https://github.com/mdn/yari/issues/11084)) ([964acde](https://github.com/mdn/yari/commit/964acdeba29561960082e1336da67084059c803d)) +* **deps-dev:** bump sass from 1.77.0 to 1.77.1 ([#11112](https://github.com/mdn/yari/issues/11112)) ([c951332](https://github.com/mdn/yari/commit/c9513328a7312dc5d8fe881eb43d57dbc5da81f7)) +* **deps-dev:** bump semver from 7.6.0 to 7.6.2 ([#11104](https://github.com/mdn/yari/issues/11104)) ([9f9b11b](https://github.com/mdn/yari/commit/9f9b11bfa944a23c16289f858f0b77e1b5b06c17)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.43 to 2.7.44 in /client/pwa ([#11072](https://github.com/mdn/yari/issues/11072)) ([e80a07c](https://github.com/mdn/yari/commit/e80a07cb83e42bc8523baf36ccd8e99723be7aad)) +* **deps:** bump @mdn/browser-compat-data from 5.5.24 to 5.5.25 ([#11078](https://github.com/mdn/yari/issues/11078)) ([e561699](https://github.com/mdn/yari/commit/e5616992d5af0af24c8a694d0a497a8528492cc1)) +* **deps:** bump @mdn/browser-compat-data from 5.5.25 to 5.5.26 ([#11098](https://github.com/mdn/yari/issues/11098)) ([3ab9aeb](https://github.com/mdn/yari/commit/3ab9aeb3d88d342cb5fedd73aa779bb18cd81943)) +* **deps:** bump @mdn/browser-compat-data from 5.5.26 to 5.5.27 ([#11117](https://github.com/mdn/yari/issues/11117)) ([90b672a](https://github.com/mdn/yari/commit/90b672a557ccf46d121dd982b0b6db9b4c594dc9)) +* **deps:** bump @stripe/stripe-js from 3.3.0 to 3.4.0 ([#11089](https://github.com/mdn/yari/issues/11089)) ([d72e13d](https://github.com/mdn/yari/commit/d72e13d9d8b26429a19b17fe555132afbeb5bae5)) +* **deps:** bump @webref/css from 6.12.9 to 6.12.10 ([#11055](https://github.com/mdn/yari/issues/11055)) ([43ce724](https://github.com/mdn/yari/commit/43ce72426249ef2306933760caaa2bc15130211c)) +* **deps:** bump boto3 from 1.34.93 to 1.34.98 in /deployer in the dependencies group ([#11071](https://github.com/mdn/yari/issues/11071)) ([8ca807b](https://github.com/mdn/yari/commit/8ca807b8a15accea51b3560db6cadfc4f3bed015)) +* **deps:** bump boto3 from 1.34.98 to 1.34.103 in /deployer in the dependencies group ([#11119](https://github.com/mdn/yari/issues/11119)) ([fd8cb95](https://github.com/mdn/yari/commit/fd8cb95bf52f21c7981e69a2a9a260633a9a93b1)) +* **deps:** bump imagemin from 8.0.1 to 9.0.0 ([#11077](https://github.com/mdn/yari/issues/11077)) ([45254aa](https://github.com/mdn/yari/commit/45254aa86da9a0d9724e566a47e600d7b8671d8b)) +* **deps:** bump imagemin-pngquant from 9.0.2 to 10.0.0 ([#11094](https://github.com/mdn/yari/issues/11094)) ([3457280](https://github.com/mdn/yari/commit/345728022e9f3e8ac5498192766e1c774f91caaf)) +* **deps:** bump imagemin-svgo from 10.0.1 to 11.0.0 ([#11075](https://github.com/mdn/yari/issues/11075)) ([e05460d](https://github.com/mdn/yari/commit/e05460d531af54c91da93709f82b7b8b67e909ed)) +* **deps:** bump mdn-data from 2.6.1 to 2.7.0 ([#11114](https://github.com/mdn/yari/issues/11114)) ([d39d1ab](https://github.com/mdn/yari/commit/d39d1ab870471e1752eb9ffc09aec721742b9396)) +* **deps:** bump openai from 4.40.0 to 4.40.1 ([#11056](https://github.com/mdn/yari/issues/11056)) ([f7d9d9e](https://github.com/mdn/yari/commit/f7d9d9e5f1755722e4a3b10f98043ed419840cad)) +* **deps:** bump openai from 4.40.1 to 4.41.0 ([#11073](https://github.com/mdn/yari/issues/11073)) ([fb838fa](https://github.com/mdn/yari/commit/fb838fa0754dae00ee8bc945561d318515120d02)) +* **deps:** bump openai from 4.41.0 to 4.42.0 ([#11086](https://github.com/mdn/yari/issues/11086)) ([a71f650](https://github.com/mdn/yari/commit/a71f6504582f57e8b52a9b1a3015060fa67e741f)) +* **deps:** bump openai from 4.42.0 to 4.43.0 ([#11100](https://github.com/mdn/yari/issues/11100)) ([f5b4261](https://github.com/mdn/yari/commit/f5b426133b65c887392b34af6ec170fd1e045f87)) +* **deps:** bump openai from 4.43.0 to 4.44.0 ([#11102](https://github.com/mdn/yari/issues/11102)) ([68620de](https://github.com/mdn/yari/commit/68620de3db3e20ff2f4a79d6d7f33d33498080e3)) +* **deps:** bump openai from 4.44.0 to 4.45.0 ([#11116](https://github.com/mdn/yari/issues/11116)) ([41381ce](https://github.com/mdn/yari/commit/41381cef9dd3b08870f78bf0ebd17e2d79062d7b)) +* **deps:** bump the sentry group with 2 updates ([#11054](https://github.com/mdn/yari/issues/11054)) ([854f8b3](https://github.com/mdn/yari/commit/854f8b391b2f9eac4a67119ebafe851526d22186)) +* **deps:** bump the sentry group with 2 updates ([#11093](https://github.com/mdn/yari/issues/11093)) ([8ee8605](https://github.com/mdn/yari/commit/8ee8605b7afc79046c7bfac6177e5ee86d58e437)) +* **deps:** bump web-features from 0.7.0 to 0.8.0 ([#11059](https://github.com/mdn/yari/issues/11059)) ([c8f3031](https://github.com/mdn/yari/commit/c8f3031b42fec8cab3cb6102d60ef12aa169d296)) +* **deps:** bump web-features from 0.8.0 to 0.8.1 ([#11087](https://github.com/mdn/yari/issues/11087)) ([5f6884d](https://github.com/mdn/yari/commit/5f6884dc8e2da14eb735ac98357620e37664ba4b)) +* **deps:** bump web-specs from 3.8.0 to 3.9.0 ([#11058](https://github.com/mdn/yari/issues/11058)) ([2fb635d](https://github.com/mdn/yari/commit/2fb635d5fda6cb0344ea6dd4128d471c64942474)) +* **webpack:** deterministic output when changing config ([4a5cf81](https://github.com/mdn/yari/commit/4a5cf81b8958bb3b5f80b8d20ae0bc1ae1d426bb)) +* **webpack:** directly import fork-ts-checker-webpack-plugin ([98e6b1a](https://github.com/mdn/yari/commit/98e6b1a8eb74ecfc486b08d1e7b0547693577cce)) +* **webpack:** import chalk directly ([f434a26](https://github.com/mdn/yari/commit/f434a26a0a82bb068f3cea15025babe0fa69a5de)) +* **webpack:** merge avif config into config for other images ([d83555c](https://github.com/mdn/yari/commit/d83555c29ea05419ae4a6850c24f7d0fb8545038)) +* **webpack:** remove additionalModulePaths since baseUrl isn't set in our tsconfig ([b143bee](https://github.com/mdn/yari/commit/b143beefdc43a33f3f1631581f7a4a62a9929033)) +* **webpack:** remove appIndexJs path and hard code ([8a8e7f6](https://github.com/mdn/yari/commit/8a8e7f6f39c895dfb581abcbaf827ebe52d1c778)) +* **webpack:** remove appTsBuildInfoFile and hard code ([ae074e9](https://github.com/mdn/yari/commit/ae074e9f9fd4367b6ef05883af5a4ffc17818b4d)) +* **webpack:** remove appWebpackCache, use defaults ([becd279](https://github.com/mdn/yari/commit/becd279baffc25346f0ba606585f5e3295f36d1a)) +* **webpack:** remove create-react-app eslint config, use defaults ([76dd20b](https://github.com/mdn/yari/commit/76dd20b75aa771f16f46e0e35bcda2f814a0a094)) +* **webpack:** remove DISABLE_NEW_JSX_TRANSFORM option ([c838dab](https://github.com/mdn/yari/commit/c838dab899c24bd518f9abdb8b62d6811607c3d8)) +* **webpack:** remove FAST_REFRESH option ([37099d9](https://github.com/mdn/yari/commit/37099d9e7314c42c8cab5e893ff91d1ae2160bfb)) +* **webpack:** remove InlineChunkHtmlPlugin ([fb2fa7f](https://github.com/mdn/yari/commit/fb2fa7fd99dbd2e13cd66e9a11e11501a665e338)) +* **webpack:** remove InterpolateHtmlPlugin ([6416525](https://github.com/mdn/yari/commit/64165259e9c2634c87752a2506f022e4463f74eb)) +* **webpack:** remove jestAliases, since it's not used anywhere ([eddba0b](https://github.com/mdn/yari/commit/eddba0b959fd166496ed217871a09cde95cbea50)) +* **webpack:** remove ModuleNotFoundPlugin ([7da3f25](https://github.com/mdn/yari/commit/7da3f25caae8bc00879c37f42ebf0f27c3fd9a09)) +* **webpack:** remove ModuleScopePlugin ([8184c1a](https://github.com/mdn/yari/commit/8184c1ad6a65ca6fa548d2211ab76e631510937a)) +* **webpack:** remove moment locale ignore, we don't use moment ([cf77437](https://github.com/mdn/yari/commit/cf7743797b30dd30a8442d3b912c81eb248ff8d5)) +* **webpack:** remove proxySetup path, import setupProxy directly ([2a92a56](https://github.com/mdn/yari/commit/2a92a56d405358576513ebab5a65679f17ec46b8)) +* **webpack:** remove react-dev-utils ([716c865](https://github.com/mdn/yari/commit/716c865ae26d7d743b937a42a0d5aa0f11a1f25b)) +* **webpack:** remove react-dev-utils imports from build script ([5e6edb0](https://github.com/mdn/yari/commit/5e6edb0728bdc80ea7eacee2dc7df7e17671b05a)) +* **webpack:** remove react-dev-utils imports from dev server config ([443ecef](https://github.com/mdn/yari/commit/443ecef738126b86c7a740bbd3ac9ab324e11139)) +* **webpack:** remove react-dev-utils imports from start script ([8d576e9](https://github.com/mdn/yari/commit/8d576e98309010cc54f21718b946de9b88b15dde)) +* **webpack:** remove react-native-web specific config options ([1418f82](https://github.com/mdn/yari/commit/1418f82db09bc9cd42b0264265db0331174017ee)) +* **webpack:** remove remnants of PUBLIC_URL and hard code ([e28e12b](https://github.com/mdn/yari/commit/e28e12bd67191234a8fc5ded5e857623c8266eb0)) +* **webpack:** remove setupTests, it's not used by anything ([00d0c8a](https://github.com/mdn/yari/commit/00d0c8a3ae5c485327c418b3b7f926cf1b04eda1)) +* **webpack:** remove support for css modules, we don't use them ([727bfd8](https://github.com/mdn/yari/commit/727bfd814f76f38abe16f8cbc389638c4cd31332)) +* **webpack:** remove use of appNodeModules ([e84fc2c](https://github.com/mdn/yari/commit/e84fc2cc664c31f6fcfb2b8c1a9e8b17fddea7af)) +* **webpack:** remove webpackAliases since baseUrl isn't set in our tsconfig ([2edfa21](https://github.com/mdn/yari/commit/2edfa2133addc9eeb76ed8040892dd41af41d42a)) +* **webpack:** remove workbox-webpack-plugin, we roll our own service worker ([2245351](https://github.com/mdn/yari/commit/22453512de7129cfa3ff44deece235efeff1e48c)) +* **webpack:** use asset/resource because we never want to inline ([d41019a](https://github.com/mdn/yari/commit/d41019a5b352eca019e67cbefa68dacd99818b23)) +* **webpack:** we use a tsconfig.json, remove conditional ts logic ([0b9ebf3](https://github.com/mdn/yari/commit/0b9ebf3e7d8bf1e873794b7596c87342df355ebc)) + +## [2.51.0](https://github.com/mdn/yari/compare/v2.50.0...v2.51.0) (2024-05-02) + + +### Features + +* **css-syntax:** render more constituents ([#11003](https://github.com/mdn/yari/issues/11003)) ([9c61077](https://github.com/mdn/yari/commit/9c61077c889a49b5e58077904aacb190bf95e893)) +* **markdown:** add support for GFM noteblocks proposal ([#10168](https://github.com/mdn/yari/issues/10168)) ([afeb857](https://github.com/mdn/yari/commit/afeb85708e5fdaa4230071a27241f480de681ac8)) +* **playground:** add Reset button ([#10934](https://github.com/mdn/yari/issues/10934)) ([d316348](https://github.com/mdn/yari/commit/d3163481da53792b0cd4c893051484a62caa127d)) +* **telemetry:** measure 25%/50%/75% scroll depth ([#11041](https://github.com/mdn/yari/issues/11041)) ([4585241](https://github.com/mdn/yari/commit/4585241a24fcd62076c39cd11ccf92394da5351a)) + + +### Bug Fixes + +* **fonts:** ensure italic looks like italic in Safari ([#10828](https://github.com/mdn/yari/issues/10828)) ([a06e429](https://github.com/mdn/yari/commit/a06e429e8f4a02a5b898ebdb885d23667eee31c2)) +* **macros:** make smartLink() error message more informative ([#11042](https://github.com/mdn/yari/issues/11042)) ([930c9cf](https://github.com/mdn/yari/commit/930c9cf51ec393ea72c0bff0c40fd19ac10df494)) +* **placement:** adjust hover style for links ([#9981](https://github.com/mdn/yari/issues/9981)) ([67a8e4c](https://github.com/mdn/yari/commit/67a8e4c60d9654c0575967445195ed4ee5b069b3)) +* **ssr:** imported svg paths set wrong ([#11012](https://github.com/mdn/yari/issues/11012)) ([ec1ded9](https://github.com/mdn/yari/commit/ec1ded9f4cb4db6f16c705f58c42f30b47d7eef7)) + + +### Enhancements + +* **l10n:** localize "(en-US)" indicator ([#10996](https://github.com/mdn/yari/issues/10996)) ([be8852c](https://github.com/mdn/yari/commit/be8852c8b0f3bc4296eb77e44a108bf5e1f86f40)) +* **l10n:** localize en-US link title ([#11011](https://github.com/mdn/yari/issues/11011)) ([56a18b0](https://github.com/mdn/yari/commit/56a18b0ce36e13135491200eed2adbfd42d3a6c0)) +* **macros/APIRef:** show badges on all links ([#9757](https://github.com/mdn/yari/issues/9757)) ([b7bbcaa](https://github.com/mdn/yari/commit/b7bbcaa7fb33b02e0ee16bad00972b216948f7ff)) + + +### Miscellaneous + +* **deps-dev:** bump @testing-library/react from 15.0.5 to 15.0.6 ([#11049](https://github.com/mdn/yari/issues/11049)) ([56a8ee5](https://github.com/mdn/yari/commit/56a8ee5a2c9b154f0af68d95edeb5d5cff4c814b)) +* **deps-dev:** bump sass from 1.75.0 to 1.76.0 ([#11046](https://github.com/mdn/yari/issues/11046)) ([165736b](https://github.com/mdn/yari/commit/165736b9a6acf419abf65fb47ad57984b9b11372)) +* **deps:** bump @mdn/browser-compat-data from 5.5.23 to 5.5.24 ([#11044](https://github.com/mdn/yari/issues/11044)) ([4e5f0e2](https://github.com/mdn/yari/commit/4e5f0e25cf74abb87587acea4e425b413beb1c1b)) +* **deps:** bump @mozilla/glean from 5.0.0 to 5.0.1 ([#11043](https://github.com/mdn/yari/issues/11043)) ([9d02ed7](https://github.com/mdn/yari/commit/9d02ed7730cfdc8f4facf7580a500fc0dd430091)) +* **deps:** bump openai from 4.39.0 to 4.40.0 ([#11045](https://github.com/mdn/yari/issues/11045)) ([babe608](https://github.com/mdn/yari/commit/babe608767cb8bafd98800ddec75761bd959c742)) + +## [2.50.0](https://github.com/mdn/yari/compare/v2.49.0...v2.50.0) (2024-04-30) + + +### Features + +* **ssr:** remove external files dependencies ([#10885](https://github.com/mdn/yari/issues/10885)) ([8fea595](https://github.com/mdn/yari/commit/8fea595d181602c1aae9ec3b7b3f41364bd8132a)) + + +### Bug Fixes + +* **baseline:** checkmarks weren't reflecting mobile status ([#11002](https://github.com/mdn/yari/issues/11002)) ([242c2f8](https://github.com/mdn/yari/commit/242c2f80916721017f26f672931c6ab476a611f5)) +* **callouts:** reduce inner bottom spacing ([#10944](https://github.com/mdn/yari/issues/10944)) ([5720ae0](https://github.com/mdn/yari/commit/5720ae05276d58b23f982ac7c465f6c4e0a9886b)) +* **l10n:** localize translation banner in Spanish ([#11004](https://github.com/mdn/yari/issues/11004)) ([87e6325](https://github.com/mdn/yari/commit/87e63255d79eb692c2ef6ccfaa2904720ec65a84)) +* **l10n:** localize translation banner in zh-TW ([#11016](https://github.com/mdn/yari/issues/11016)) ([b1d9444](https://github.com/mdn/yari/commit/b1d9444f2c9a40d04d6720eb8cf87f0e6d37519c)) +* **language-menu:** always render inter-locale links ([#11013](https://github.com/mdn/yari/issues/11013)) ([e74ffd5](https://github.com/mdn/yari/commit/e74ffd52424090eeaf5752d90ea2475238178a49)) +* **macro:** fix a flaw in AccessiblitySidebar.ejs ([fca5342](https://github.com/mdn/yari/commit/fca5342e2c6d9552ecce748229d930c5c6329b99)) +* **macro:** fix duplicate entries in APIRef ([92baf4e](https://github.com/mdn/yari/commit/92baf4e52a9edc8a510de87c065fcfcd63ef1b9c)) +* **macros/AccessibilitySidebar:** remove deleted Annotations page ([#11040](https://github.com/mdn/yari/issues/11040)) ([fca5342](https://github.com/mdn/yari/commit/fca5342e2c6d9552ecce748229d930c5c6329b99)) +* **macros/APIRef:** skip duplicate entries in Related pages ([#10973](https://github.com/mdn/yari/issues/10973)) ([92baf4e](https://github.com/mdn/yari/commit/92baf4e52a9edc8a510de87c065fcfcd63ef1b9c)), closes [#10864](https://github.com/mdn/yari/issues/10864) +* **playground:** disable Share/Clear buttons if empty ([#10935](https://github.com/mdn/yari/issues/10935)) ([35dc1d7](https://github.com/mdn/yari/commit/35dc1d75cd3b71c2795c7f19d81f43a614ae570d)) +* **playground:** validate console messages ([#10962](https://github.com/mdn/yari/issues/10962)) ([37379ec](https://github.com/mdn/yari/commit/37379ecca00b5100040485987bb6541626614066)) +* **spas:** set canonical url ([#11033](https://github.com/mdn/yari/issues/11033)) ([01db757](https://github.com/mdn/yari/commit/01db7576a5004a1c1c2012ff2bac38c4ee3fc414)) +* **ssr:** imported image paths set wrong ([#10982](https://github.com/mdn/yari/issues/10982)) ([90c0e4f](https://github.com/mdn/yari/commit/90c0e4f8b09ff8acc82b113b258a2424a041eb99)) +* **translations/dashboard:** fix table sorting ([#9910](https://github.com/mdn/yari/issues/9910)) ([2cd44e4](https://github.com/mdn/yari/commit/2cd44e44da2f6201c3d1494a5751555ad4e19e60)) + + +### Enhancements + +* **macros/CSSInfo:** add "Animation type" link ([#10947](https://github.com/mdn/yari/issues/10947)) ([40ce610](https://github.com/mdn/yari/commit/40ce6101698a0481d0167748af8b6b4b9fe78d67)) +* **macros/JSRef:** refactor + update inheritance data + separate instance/static methods/properties ([#8502](https://github.com/mdn/yari/issues/8502)) ([a2202ba](https://github.com/mdn/yari/commit/a2202bac1e1109d6925bdc6016860254c0c1d481)) +* **notecards,callouts:** reduce borders ([#10943](https://github.com/mdn/yari/issues/10943)) ([e313193](https://github.com/mdn/yari/commit/e3131931936529a2adfc4657f5e3bf7d354cb034)) +* **stage-build:** always build from next + trigger from main ([#10986](https://github.com/mdn/yari/issues/10986)) ([c9fc3de](https://github.com/mdn/yari/commit/c9fc3deab7ebf7a3ab74f4dd7facd267807923d7)) +* **telemetry:** enable Glean automatic page load events ([#10985](https://github.com/mdn/yari/issues/10985)) ([3b8e023](https://github.com/mdn/yari/commit/3b8e023db1f864afcd154fe2d65f4c35b915a0a6)) + + +### Miscellaneous + +* **deps-dev:** bump @babel/core from 7.24.4 to 7.24.5 ([#11036](https://github.com/mdn/yari/issues/11036)) ([b900918](https://github.com/mdn/yari/commit/b90091869d25a99fd47c17f8051f4a3fb9c0403c)) +* **deps-dev:** bump @babel/eslint-parser from 7.24.1 to 7.24.5 ([#11035](https://github.com/mdn/yari/issues/11035)) ([9f477f5](https://github.com/mdn/yari/commit/9f477f532ab394ecde7925cf3266154119259b0c)) +* **deps-dev:** bump @babel/preset-env from 7.24.4 to 7.24.5 ([#11039](https://github.com/mdn/yari/issues/11039)) ([5d07739](https://github.com/mdn/yari/commit/5d077391a786a9e0062ff106383f66a8bbe68994)) +* **deps-dev:** bump @pmmmwh/react-refresh-webpack-plugin from 0.5.11 to 0.5.13 ([#11025](https://github.com/mdn/yari/issues/11025)) ([537eac1](https://github.com/mdn/yari/commit/537eac1993960ac56a5e5a8380a5cdc8f81ef3b8)) +* **deps-dev:** bump @swc/core from 1.4.16 to 1.4.17 ([#10978](https://github.com/mdn/yari/issues/10978)) ([8763695](https://github.com/mdn/yari/commit/8763695d9c8d737e9b51eefab4c3b23df2d4ff15)) +* **deps-dev:** bump @swc/core from 1.4.17 to 1.5.0 ([#10989](https://github.com/mdn/yari/issues/10989)) ([e557131](https://github.com/mdn/yari/commit/e55713157d6571a40f14ef2998446d571479d63b)) +* **deps-dev:** bump @testing-library/react from 15.0.2 to 15.0.3 ([#10976](https://github.com/mdn/yari/issues/10976)) ([1a33033](https://github.com/mdn/yari/commit/1a3303307da1a3e0ce967218383e7474fb2546f9)) +* **deps-dev:** bump @testing-library/react from 15.0.3 to 15.0.4 ([#10992](https://github.com/mdn/yari/issues/10992)) ([7387066](https://github.com/mdn/yari/commit/7387066b6936554c20c5e3e1368147631a174aa6)) +* **deps-dev:** bump @testing-library/react from 15.0.4 to 15.0.5 ([#11028](https://github.com/mdn/yari/issues/11028)) ([86ad974](https://github.com/mdn/yari/commit/86ad97468adddb91e30cf06fac7268e5ab1b9cbc)) +* **deps-dev:** bump eslint-plugin-jest from 28.2.0 to 28.3.0 ([#11027](https://github.com/mdn/yari/issues/11027)) ([2bb856a](https://github.com/mdn/yari/commit/2bb856a7ba67f9e4a35ebcdeb0347719261c1d78)) +* **deps-dev:** bump eslint-plugin-n from 17.2.1 to 17.3.1 ([#10999](https://github.com/mdn/yari/issues/10999)) ([6bacb9b](https://github.com/mdn/yari/commit/6bacb9b0a022f4a5137d5cb4d10acdf9661c1dc4)) +* **deps-dev:** bump eslint-plugin-n from 17.3.1 to 17.4.0 ([#11037](https://github.com/mdn/yari/issues/11037)) ([bcb713e](https://github.com/mdn/yari/commit/bcb713e3d2357de4442795973dd7ef920d07ab83)) +* **deps-dev:** bump eslint-plugin-react-hooks from 4.6.0 to 4.6.1 ([#11006](https://github.com/mdn/yari/issues/11006)) ([135379c](https://github.com/mdn/yari/commit/135379cf6f7fa1213050dd876f72def9fb90a0ae)) +* **deps-dev:** bump eslint-plugin-react-hooks from 4.6.1 to 4.6.2 ([#11024](https://github.com/mdn/yari/issues/11024)) ([17c783e](https://github.com/mdn/yari/commit/17c783e4d77eb67630754bb09d8c132248524682)) +* **deps-dev:** bump html-validate from 8.18.1 to 8.18.2 ([#10970](https://github.com/mdn/yari/issues/10970)) ([dba5270](https://github.com/mdn/yari/commit/dba52704f2d346009e3bd5580a1d42b3f71e7faa)) +* **deps-dev:** bump postcss-preset-env from 9.5.5 to 9.5.6 ([#10960](https://github.com/mdn/yari/issues/10960)) ([3390897](https://github.com/mdn/yari/commit/33908972a73ed07dd253b4fe2a3da18899933d7f)) +* **deps-dev:** bump postcss-preset-env from 9.5.6 to 9.5.8 ([#10969](https://github.com/mdn/yari/issues/10969)) ([df93928](https://github.com/mdn/yari/commit/df9392854d314ff7f9029b38cce16017fce743d2)) +* **deps-dev:** bump postcss-preset-env from 9.5.8 to 9.5.9 ([#10980](https://github.com/mdn/yari/issues/10980)) ([4a1795e](https://github.com/mdn/yari/commit/4a1795e1120135fa007e022bf88f182de836e37e)) +* **deps-dev:** bump react and @types/react ([#11007](https://github.com/mdn/yari/issues/11007)) ([1093f7a](https://github.com/mdn/yari/commit/1093f7a1e1361bd97e0213024543551f542ba026)) +* **deps-dev:** bump react and @types/react ([#11029](https://github.com/mdn/yari/issues/11029)) ([d84be62](https://github.com/mdn/yari/commit/d84be62440e89be0dcb639371c9979f8378f6f66)) +* **deps-dev:** bump react-dom and @types/react-dom ([#11032](https://github.com/mdn/yari/issues/11032)) ([7a24a17](https://github.com/mdn/yari/commit/7a24a17ed15876e580c53e420a2977bc7aaa36d1)) +* **deps-dev:** bump react-is from 18.2.0 to 18.3.0 ([#11010](https://github.com/mdn/yari/issues/11010)) ([a77442f](https://github.com/mdn/yari/commit/a77442f25dadc29513bbd99a61efa95ee2134783)) +* **deps-dev:** bump react-is from 18.3.0 to 18.3.1 ([#11023](https://github.com/mdn/yari/issues/11023)) ([b8256e0](https://github.com/mdn/yari/commit/b8256e068ad787584a5c22e6d5ab24cab36569e2)) +* **deps-dev:** bump react-refresh from 0.14.0 to 0.14.1 ([#11009](https://github.com/mdn/yari/issues/11009)) ([e26ab1c](https://github.com/mdn/yari/commit/e26ab1c4c6ae8405e9778161823916fcb9dfefee)) +* **deps-dev:** bump react-refresh from 0.14.1 to 0.14.2 ([#11022](https://github.com/mdn/yari/issues/11022)) ([920a6ad](https://github.com/mdn/yari/commit/920a6ad86bad86d0d31ff73034962bf66f98a66e)) +* **deps-dev:** bump react-router-dom from 6.22.1 to 6.23.0 ([#10994](https://github.com/mdn/yari/issues/10994)) ([0d4f83d](https://github.com/mdn/yari/commit/0d4f83dffbaef0845cacb5b69bdec770791639fd)) +* **deps-dev:** bump typescript-eslint from 7.7.0 to 7.7.1 ([#10979](https://github.com/mdn/yari/issues/10979)) ([fc6baee](https://github.com/mdn/yari/commit/fc6baee959de1fad3a4f4bda06d7b6e538a0c4de)) +* **deps-dev:** bump typescript-eslint from 7.7.1 to 7.8.0 ([#11034](https://github.com/mdn/yari/issues/11034)) ([228f89e](https://github.com/mdn/yari/commit/228f89e855a39fa4b947d152c728fc6f2c3e44fb)) +* **deps-dev:** bump workbox-webpack-plugin from 7.0.0 to 7.1.0 ([#10990](https://github.com/mdn/yari/issues/10990)) ([c901e5f](https://github.com/mdn/yari/commit/c901e5fca58e31c5b22e95034ee5cfc86085cdfe)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.41 to 2.7.43 in /client/pwa ([#10987](https://github.com/mdn/yari/issues/10987)) ([2bf3220](https://github.com/mdn/yari/commit/2bf3220eeec75f1e62c97ec2b57e95730e6192d1)) +* **deps:** bump @mdn/browser-compat-data from 5.5.22 to 5.5.23 ([#10977](https://github.com/mdn/yari/issues/10977)) ([f59483d](https://github.com/mdn/yari/commit/f59483de53ed7df58fb2f30ba835f7b901c6fb21)) +* **deps:** bump @mozilla/glean from 4.0.0 to 5.0.0 ([#10795](https://github.com/mdn/yari/issues/10795)) ([223fd3c](https://github.com/mdn/yari/commit/223fd3c34540e9693585ede21fcbd9c9fcac474b)) +* **deps:** bump @webref/css from 6.12.8 to 6.12.9 ([#10971](https://github.com/mdn/yari/issues/10971)) ([745ca8f](https://github.com/mdn/yari/commit/745ca8f23f71ba4d537ab131e292fd827941c092)) +* **deps:** bump boto3 from 1.34.84 to 1.34.88 in /deployer in the dependencies group ([#10967](https://github.com/mdn/yari/issues/10967)) ([34a3dd4](https://github.com/mdn/yari/commit/34a3dd4ec33908ba1f26571a0f65437e99796d04)) +* **deps:** bump dayjs from 1.11.10 to 1.11.11 ([#11021](https://github.com/mdn/yari/issues/11021)) ([7fd1589](https://github.com/mdn/yari/commit/7fd15892fd9bd64339feba7b35faedade663db6a)) +* **deps:** bump http-proxy-middleware from 2.0.6 to 3.0.0 in /cloud-function ([#10834](https://github.com/mdn/yari/issues/10834)) ([365f5b6](https://github.com/mdn/yari/commit/365f5b62219cd38571945c0f5ed2061529e7edce)) +* **deps:** bump inquirer from 9.2.19 to 9.2.20 ([#11026](https://github.com/mdn/yari/issues/11026)) ([c2a0185](https://github.com/mdn/yari/commit/c2a0185f02f10687cab9a96a89a251905c6d2ce8)) +* **deps:** bump lru-cache from 10.2.0 to 10.2.1 ([#11008](https://github.com/mdn/yari/issues/11008)) ([358cac4](https://github.com/mdn/yari/commit/358cac4381a73422352b5007203b7b8e5ad05aa9)) +* **deps:** bump lru-cache from 10.2.1 to 10.2.2 ([#11020](https://github.com/mdn/yari/issues/11020)) ([4416efb](https://github.com/mdn/yari/commit/4416efb90c0f0af1a2f4cf7e800bfad8a8e993af)) +* **deps:** bump mdn-data from 2.5.0 to 2.6.0 ([#10961](https://github.com/mdn/yari/issues/10961)) ([df72b4a](https://github.com/mdn/yari/commit/df72b4a40beb279ac0ccde6372e92d9b6118935c)) +* **deps:** bump mdn-data from 2.6.0 to 2.6.1 ([#10995](https://github.com/mdn/yari/issues/10995)) ([7dabb47](https://github.com/mdn/yari/commit/7dabb4768f3b5d8a0ffb5774f25f15323861a464)) +* **deps:** bump openai from 4.37.1 to 4.38.1 ([#10959](https://github.com/mdn/yari/issues/10959)) ([36d5cc8](https://github.com/mdn/yari/commit/36d5cc877797038c04d4917aba8e75ae9323a7e1)) +* **deps:** bump openai from 4.38.1 to 4.38.2 ([#10972](https://github.com/mdn/yari/issues/10972)) ([b1cf84e](https://github.com/mdn/yari/commit/b1cf84e971e82070b12845eea0f2997941050c01)) +* **deps:** bump openai from 4.38.2 to 4.38.3 ([#10981](https://github.com/mdn/yari/issues/10981)) ([82fc1b8](https://github.com/mdn/yari/commit/82fc1b8fe0f904ae85f09f021445cf371acc71fc)) +* **deps:** bump openai from 4.38.3 to 4.38.5 ([#11001](https://github.com/mdn/yari/issues/11001)) ([81ec2a7](https://github.com/mdn/yari/commit/81ec2a779197d9e1215bc826c497a17a26e6f3e3)) +* **deps:** bump openai from 4.38.5 to 4.39.0 ([#11038](https://github.com/mdn/yari/issues/11038)) ([afcd3b8](https://github.com/mdn/yari/commit/afcd3b8b9b632fa04b4cfaa0c849afe5b84cbd3b)) +* **deps:** bump the dependencies group in /deployer with 3 updates ([#11030](https://github.com/mdn/yari/issues/11030)) ([abbc1a6](https://github.com/mdn/yari/commit/abbc1a68db913432c96995bf1450da3dbaefa3af)) +* **deps:** bump the dependencies group in /testing/integration with 2 updates ([#11019](https://github.com/mdn/yari/issues/11019)) ([bcb953b](https://github.com/mdn/yari/commit/bcb953bea81e54b1ea9a76cb29fb33cefb3d129a)) +* **deps:** bump the sentry group with 2 updates ([#10958](https://github.com/mdn/yari/issues/10958)) ([2b77133](https://github.com/mdn/yari/commit/2b7713397c838479d4fc1fb0bc1f5605d4260bf6)) +* **deps:** bump the sentry group with 2 updates ([#10974](https://github.com/mdn/yari/issues/10974)) ([54e2354](https://github.com/mdn/yari/commit/54e2354fa143b6f5727fd8f1d34d46548f0a09dd)) +* **deps:** bump the sentry group with 2 updates ([#10988](https://github.com/mdn/yari/issues/10988)) ([e4f41eb](https://github.com/mdn/yari/commit/e4f41eb39be426c08edb663ea3521f1e1aeacf33)) +* **deps:** bump the sentry group with 2 updates ([#10998](https://github.com/mdn/yari/issues/10998)) ([ba4e6be](https://github.com/mdn/yari/commit/ba4e6becc91b1980a1ddd4ab995544d25d74ae7d)) +* **deps:** bump web-features from 0.6.3 to 0.6.4 ([#10975](https://github.com/mdn/yari/issues/10975)) ([18c2e7a](https://github.com/mdn/yari/commit/18c2e7aa23c18354eb271a91513ad821038de93c)) +* **deps:** bump web-features from 0.6.4 to 0.7.0 ([#11000](https://github.com/mdn/yari/issues/11000)) ([076165b](https://github.com/mdn/yari/commit/076165b539ec352eecaea124a75969a893f1c43e)) +* **l10n:** add zh-TW translation for NoteBanner ([b1d9444](https://github.com/mdn/yari/commit/b1d9444f2c9a40d04d6720eb8cf87f0e6d37519c)) +* **macros/AccessibilitySidebar:** add zh-cn translation ([#10948](https://github.com/mdn/yari/issues/10948)) ([6c7e902](https://github.com/mdn/yari/commit/6c7e902cd6dded7638ecee4cf2b1977aa325f8e0)) +* **macros/CSSRef:** add color guides ([#10945](https://github.com/mdn/yari/issues/10945)) ([c1d159d](https://github.com/mdn/yari/commit/c1d159de3bbeac0d3dbf3247cccd0a418ede6452)) +* **macros/GamesSidebar:** add Russian translation ([#10984](https://github.com/mdn/yari/issues/10984)) ([9439029](https://github.com/mdn/yari/commit/943902919727ac0411c57864b625a355e468ba64)) +* **macros/LearnSidebar:** add more Japanese translations ([#10964](https://github.com/mdn/yari/issues/10964)) ([aa0224f](https://github.com/mdn/yari/commit/aa0224f380023b0c5a9efebea367cdffb21cde9b)) +* **scss:** remove unused notecards styles ([#10957](https://github.com/mdn/yari/issues/10957)) ([e03ea63](https://github.com/mdn/yari/commit/e03ea63990cb1494ad708a45302e46cf3689c5f6)) + +## [2.49.0](https://github.com/mdn/yari/compare/v2.48.0...v2.49.0) (2024-04-18) + + +### Features + +* **experiment:** rewrite Web/API page titles ([#10926](https://github.com/mdn/yari/issues/10926)) ([d8173cc](https://github.com/mdn/yari/commit/d8173cc190686634cd43f0a83b4f6178a133e9f5)) + + +### Bug Fixes + +* **experiment:** replace test group for Web/API page titles ([#10955](https://github.com/mdn/yari/issues/10955)) ([1dfb5b2](https://github.com/mdn/yari/commit/1dfb5b23db7e643e8ad4c7450b9d0ceacb227cbd)) +* **playground:** dispatch DOMContentLoaded event on document + bubble ([7229dd3](https://github.com/mdn/yari/commit/7229dd334ed51281816629db88b9365858c56740)) +* **playground:** dispatch readystatechange + bubble DOMContentLoaded on document ([#10946](https://github.com/mdn/yari/issues/10946)) ([7229dd3](https://github.com/mdn/yari/commit/7229dd334ed51281816629db88b9365858c56740)) +* **playground:** dispatch readystatechange event ([7229dd3](https://github.com/mdn/yari/commit/7229dd334ed51281816629db88b9365858c56740)) +* **stage-build:** provide GH_TOKEN + specify repo in trigger job ([#10932](https://github.com/mdn/yari/issues/10932)) ([d371c0a](https://github.com/mdn/yari/commit/d371c0a8b76a6c47eb8a11d59275860559232678)) + + +### Enhancements + +* **macros/PreviousMenuNext:** use the actual title of the document by default ([#10812](https://github.com/mdn/yari/issues/10812)) ([10da897](https://github.com/mdn/yari/commit/10da8978812024f0bf3d1e21db4a36e68da33d8a)) + + +### Miscellaneous + +* **deps-dev:** bump @swc/core from 1.4.14 to 1.4.15 ([#10941](https://github.com/mdn/yari/issues/10941)) ([28f775d](https://github.com/mdn/yari/commit/28f775d91a3163b446ee8855df66d8d4b56df277)) +* **deps-dev:** bump @swc/core from 1.4.15 to 1.4.16 ([#10951](https://github.com/mdn/yari/issues/10951)) ([d099746](https://github.com/mdn/yari/commit/d09974644971491627705abd5da743fc24f65faf)) +* **deps-dev:** bump mini-css-extract-plugin from 2.8.1 to 2.9.0 ([#10938](https://github.com/mdn/yari/issues/10938)) ([672e79a](https://github.com/mdn/yari/commit/672e79a6d70bc7cd2a17cbe314a6b7e3acb221e9)) +* **deps-dev:** bump sass-loader from 14.2.0 to 14.2.1 ([#10937](https://github.com/mdn/yari/issues/10937)) ([85372d5](https://github.com/mdn/yari/commit/85372d56b9bef30c379a5e3846233feef59a1962)) +* **deps:** bump @mdn/browser-compat-data from 5.5.21 to 5.5.22 ([#10939](https://github.com/mdn/yari/issues/10939)) ([c290528](https://github.com/mdn/yari/commit/c29052859667c74d5be831d56df0c42d13e0aa62)) +* **deps:** bump @webref/css from 6.12.7 to 6.12.8 ([#10949](https://github.com/mdn/yari/issues/10949)) ([3051a61](https://github.com/mdn/yari/commit/3051a613edb2a169d63cf20415e302f56028ad7a)) +* **deps:** bump inquirer from 9.2.18 to 9.2.19 ([#10940](https://github.com/mdn/yari/issues/10940)) ([b4520ff](https://github.com/mdn/yari/commit/b4520ff50ae976be365b6ca0531f4834e3451e7a)) +* **deps:** bump openai from 4.35.0 to 4.36.0 ([#10936](https://github.com/mdn/yari/issues/10936)) ([dcda615](https://github.com/mdn/yari/commit/dcda6157cb8a0722ec43079b66bcf001fe6beb92)) +* **deps:** bump openai from 4.36.0 to 4.37.1 ([#10950](https://github.com/mdn/yari/issues/10950)) ([c6212c4](https://github.com/mdn/yari/commit/c6212c4f155db69dd464e7708cdca33570b53e15)) +* **deps:** bump web-specs from 3.7.1 to 3.8.0 ([#10952](https://github.com/mdn/yari/issues/10952)) ([126088d](https://github.com/mdn/yari/commit/126088dce86f68adeabed833943cd86883899f34)) + +## [2.48.0](https://github.com/mdn/yari/compare/v2.47.0...v2.48.0) (2024-04-16) + + +### Features + +* **macros:** add Accessibility sidebar ([#10659](https://github.com/mdn/yari/issues/10659)) ([0b6e2ae](https://github.com/mdn/yari/commit/0b6e2aeabfd09b1312e84c9422216e6b90693f4d)) +* **sidebar-filter:** measure when user types in the filter ([#10912](https://github.com/mdn/yari/issues/10912)) ([26ed0e5](https://github.com/mdn/yari/commit/26ed0e5609c1b574bad91de770f0fbc765068aa0)) +* **stage-build:** deploy next with main merged ([#10930](https://github.com/mdn/yari/issues/10930)) ([8216930](https://github.com/mdn/yari/commit/821693052a0dc539ef0cc32ad4c644e098ae524e)) +* **translations/differences:** visualize how many commits behind translations are ([#8338](https://github.com/mdn/yari/issues/8338)) ([42ab3e5](https://github.com/mdn/yari/commit/42ab3e592b79852e7e389b1b3d4f4babcfdc6f47)) + + +### Bug Fixes + +* **cloud-function:** use ts-node via NODE_OPTIONS ([#10873](https://github.com/mdn/yari/issues/10873)) ([512ebb0](https://github.com/mdn/yari/commit/512ebb02494213e1614afbe9d827f567679d8f27)) +* **curriculum:** fix typo on landing page ([#10860](https://github.com/mdn/yari/issues/10860)) ([1229663](https://github.com/mdn/yari/commit/1229663870271bb5f807233c6979fb18768cff4b)) +* **curriculum:** rename Module Contents heading ([#10852](https://github.com/mdn/yari/issues/10852)) ([b5d354a](https://github.com/mdn/yari/commit/b5d354a57f11fe2a93501eb5aed0a6205d6d206c)) +* **interactive-examples:** grant clipboard-write permission to iframe ([#10910](https://github.com/mdn/yari/issues/10910)) ([fcf94ad](https://github.com/mdn/yari/commit/fcf94ad256b0d18474e1f569f7a6dff3cf5b8b51)) +* **macros/CSSRef:** include level two functions ([#10679](https://github.com/mdn/yari/issues/10679)) ([cd7458c](https://github.com/mdn/yari/commit/cd7458c8e69d7a5f70577ed5a65611211341d859)) +* **playground:** rename reset to clear ([#10806](https://github.com/mdn/yari/issues/10806)) ([54ad381](https://github.com/mdn/yari/commit/54ad381de3a3931005fea1a4baa01c8d9ec88672)) +* **scripts:** specify loader via NODE_OPTIONS ([#10865](https://github.com/mdn/yari/issues/10865)) ([842c316](https://github.com/mdn/yari/commit/842c316ed5b8b3b62e9fc84cf2fc474d96c6cae9)) +* **scripts:** use cross-env for tool ([#10874](https://github.com/mdn/yari/issues/10874)) ([eeb3784](https://github.com/mdn/yari/commit/eeb37840de2a6f2f4d1e5b4a618a8e9ec7f5678d)) +* **sidebar:** unify sections by declaring them with CSS classes ([#9930](https://github.com/mdn/yari/issues/9930)) ([b5bb96e](https://github.com/mdn/yari/commit/b5bb96ef80cf295cc235a8246205d6f6e3cfa66b)) +* **stage-build:** trigger `next` version of workflow on schedule ([#10931](https://github.com/mdn/yari/issues/10931)) ([9876306](https://github.com/mdn/yari/commit/98763063ca97cda112761e3ad0ccd6c9fdb8d13a)) +* **toolbar:** make suggestion diffs theme-friendly ([#9322](https://github.com/mdn/yari/issues/9322)) ([d47c135](https://github.com/mdn/yari/commit/d47c1352e084ce2d6c0490fff573931bc3e69a29)) +* **xyz:** update xyz build ([#10866](https://github.com/mdn/yari/issues/10866)) ([51b39a9](https://github.com/mdn/yari/commit/51b39a90a6269f121e707901ba2c872fb55111f7)) + + +### Enhancements + +* **ai-help:** add model to issue reports ([#10925](https://github.com/mdn/yari/issues/10925)) ([3765a90](https://github.com/mdn/yari/commit/3765a90484aa7c2daddb677e8fbf489a02515d2a)) +* **dev-dashboard:** reuse Paginator molecule in flaws and translation dashboards ([#9319](https://github.com/mdn/yari/issues/9319)) ([b507c5c](https://github.com/mdn/yari/commit/b507c5c8ec8bc35b5e7c5a9692f2fbab8eb46b03)) + + +### Miscellaneous + +* **curriculum:** unify some spacing ([#10872](https://github.com/mdn/yari/issues/10872)) ([8e38b5e](https://github.com/mdn/yari/commit/8e38b5e83ebf5da0f40d8c889433ee73cffc6eb6)) +* **deps-dev:** bump @babel/core from 7.24.3 to 7.24.4 ([#10850](https://github.com/mdn/yari/issues/10850)) ([424bbce](https://github.com/mdn/yari/commit/424bbce074cfae7e64a9028e05157f8af24e4f19)) +* **deps-dev:** bump @babel/preset-env from 7.24.3 to 7.24.4 ([#10851](https://github.com/mdn/yari/issues/10851)) ([ed6b6b6](https://github.com/mdn/yari/commit/ed6b6b6e736ea796cf3b62b37bea458f927488e0)) +* **deps-dev:** bump @playwright/test from 1.42.1 to 1.43.0 ([#10856](https://github.com/mdn/yari/issues/10856)) ([13387b4](https://github.com/mdn/yari/commit/13387b4563e8376acfc4354d4bcd1d27aba7476f)) +* **deps-dev:** bump @playwright/test from 1.43.0 to 1.43.1 ([#10918](https://github.com/mdn/yari/issues/10918)) ([9ec5d70](https://github.com/mdn/yari/commit/9ec5d705d227349f7326fef7afff2e5722d5094a)) +* **deps-dev:** bump @swc/core from 1.4.11 to 1.4.12 ([#10848](https://github.com/mdn/yari/issues/10848)) ([732b836](https://github.com/mdn/yari/commit/732b8365196774050336ec38abd47a5604a2edfc)) +* **deps-dev:** bump @swc/core from 1.4.12 to 1.4.13 ([#10884](https://github.com/mdn/yari/issues/10884)) ([2a69acd](https://github.com/mdn/yari/commit/2a69acdb39f3d02cf02a6fbe1bbb6a4664aa38b3)) +* **deps-dev:** bump @swc/core from 1.4.13 to 1.4.14 ([#10919](https://github.com/mdn/yari/issues/10919)) ([7374117](https://github.com/mdn/yari/commit/737411763c405ab0bea495912cb096f4924c05dd)) +* **deps-dev:** bump @testing-library/react from 14.2.2 to 14.3.0 ([#10876](https://github.com/mdn/yari/issues/10876)) ([efb5630](https://github.com/mdn/yari/commit/efb5630dcb51d650ed37ed48709ef2a5b6e15321)) +* **deps-dev:** bump @testing-library/react from 14.3.0 to 15.0.2 ([#10920](https://github.com/mdn/yari/issues/10920)) ([e531d03](https://github.com/mdn/yari/commit/e531d03f4607e3cf526e341dd3e6ab85ab570ab0)) +* **deps-dev:** bump @types/react from 18.2.74 to 18.2.75 in the types group ([#10875](https://github.com/mdn/yari/issues/10875)) ([2e234e0](https://github.com/mdn/yari/commit/2e234e091cb512fa4766d804530d2ff0b5e3fadd)) +* **deps-dev:** bump @types/react from 18.2.77 to 18.2.78 in the types group ([#10914](https://github.com/mdn/yari/issues/10914)) ([8db6ee0](https://github.com/mdn/yari/commit/8db6ee03c5d4aa13f3c01b1f9b0a019045598a9f)) +* **deps-dev:** bump @types/react from 18.2.78 to 18.2.79 in the types group ([#10927](https://github.com/mdn/yari/issues/10927)) ([127286c](https://github.com/mdn/yari/commit/127286cc5c6219d7be8c48948146ff3850a4b4be)) +* **deps-dev:** bump black from 24.3.0 to 24.4.0 in /testing/integration in the dependencies group ([#10916](https://github.com/mdn/yari/issues/10916)) ([990525e](https://github.com/mdn/yari/commit/990525e098e82e65d17fcee3a27310541006eea6)) +* **deps-dev:** bump css-loader from 6.10.0 to 6.11.0 ([#10849](https://github.com/mdn/yari/issues/10849)) ([4eb5965](https://github.com/mdn/yari/commit/4eb5965bb73848fbad6a67fe745b2be614c7ce06)) +* **deps-dev:** bump css-loader from 6.11.0 to 7.0.0 ([#10854](https://github.com/mdn/yari/issues/10854)) ([ee7f9d5](https://github.com/mdn/yari/commit/ee7f9d50914124d7563c6c61bcee9f1b22928616)) +* **deps-dev:** bump css-loader from 7.0.0 to 7.1.0 ([#10877](https://github.com/mdn/yari/issues/10877)) ([4f03e6a](https://github.com/mdn/yari/commit/4f03e6a7b0d946757d628148a9c47403524007d2)) +* **deps-dev:** bump css-loader from 7.1.0 to 7.1.1 ([#10894](https://github.com/mdn/yari/issues/10894)) ([54da696](https://github.com/mdn/yari/commit/54da696c7e4519f1ff05e53784a828b77046228b)) +* **deps-dev:** bump eslint-plugin-jest from 27.9.0 to 28.2.0 ([#10869](https://github.com/mdn/yari/issues/10869)) ([e8d67c4](https://github.com/mdn/yari/commit/e8d67c4b14080da23a785a415dc48d689c879c7e)) +* **deps-dev:** bump eslint-plugin-n from 16.6.2 to 17.0.0 ([#10870](https://github.com/mdn/yari/issues/10870)) ([d71f322](https://github.com/mdn/yari/commit/d71f3221b8c1470194bfa28c0d27f92d3dfb1f16)) +* **deps-dev:** bump eslint-plugin-n from 17.0.0 to 17.1.0 ([#10881](https://github.com/mdn/yari/issues/10881)) ([4af72c6](https://github.com/mdn/yari/commit/4af72c63dd7fb324698d93666d0199443d8595af)) +* **deps-dev:** bump eslint-plugin-n from 17.1.0 to 17.2.0 ([#10888](https://github.com/mdn/yari/issues/10888)) ([c8dc3e9](https://github.com/mdn/yari/commit/c8dc3e9ae1b57a025ae530bfbdef7d73a1493ad9)) +* **deps-dev:** bump eslint-plugin-n from 17.2.0 to 17.2.1 ([#10921](https://github.com/mdn/yari/issues/10921)) ([ed933b0](https://github.com/mdn/yari/commit/ed933b076be0edb9a2f68d13bb918675b2da790e)) +* **deps-dev:** bump eslint-plugin-unicorn from 51.0.1 to 52.0.0 ([#10845](https://github.com/mdn/yari/issues/10845)) ([458bbea](https://github.com/mdn/yari/commit/458bbea21f7de3b8602dbff4b88d64af59de77e0)) +* **deps-dev:** bump postcss-preset-env from 9.5.4 to 9.5.5 ([#10907](https://github.com/mdn/yari/issues/10907)) ([a7a64b7](https://github.com/mdn/yari/commit/a7a64b7030c41d9598c9535054eca78dccc806af)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.4.14 to 2.5.0 ([#10903](https://github.com/mdn/yari/issues/10903)) ([0584534](https://github.com/mdn/yari/commit/05845344e7e82968046ae1ada73a61591d927ca3)) +* **deps-dev:** bump sass from 1.72.0 to 1.74.1 ([#10847](https://github.com/mdn/yari/issues/10847)) ([962d17d](https://github.com/mdn/yari/commit/962d17d6cf9f6fc2432702b539943fcd07112d34)) +* **deps-dev:** bump sass from 1.74.1 to 1.75.0 ([#10908](https://github.com/mdn/yari/issues/10908)) ([bd27a23](https://github.com/mdn/yari/commit/bd27a233fa287ab89496ef0fd79362b12e2b0895)) +* **deps-dev:** bump sass-loader from 14.1.1 to 14.2.0 ([#10902](https://github.com/mdn/yari/issues/10902)) ([52bda8f](https://github.com/mdn/yari/commit/52bda8fdb3f0e1215c9d9f44ac822a0ee2d58940)) +* **deps-dev:** bump the types group with 1 update ([#10837](https://github.com/mdn/yari/issues/10837)) ([d56ea44](https://github.com/mdn/yari/commit/d56ea44801bea4479ffc56689d34e8b32e73d5d1)) +* **deps-dev:** bump the types group with 1 update ([#10844](https://github.com/mdn/yari/issues/10844)) ([76a4c9b](https://github.com/mdn/yari/commit/76a4c9b364271c8d6cd46e962b4083deb85e6dd6)) +* **deps-dev:** bump the types group with 2 updates ([#10901](https://github.com/mdn/yari/issues/10901)) ([ee43a24](https://github.com/mdn/yari/commit/ee43a24ff14da7cca64b238111fba27bbed2a10e)) +* **deps-dev:** bump typescript from 5.4.3 to 5.4.4 ([#10857](https://github.com/mdn/yari/issues/10857)) ([21c0b89](https://github.com/mdn/yari/commit/21c0b89d7ac138462f0518ce7a34b5930652e099)) +* **deps-dev:** bump typescript from 5.4.3 to 5.4.4 in /client/pwa ([#10853](https://github.com/mdn/yari/issues/10853)) ([c07f3fa](https://github.com/mdn/yari/commit/c07f3fa5918b77b4c5531129210aa5e8e6e57703)) +* **deps-dev:** bump typescript from 5.4.4 to 5.4.5 ([#10893](https://github.com/mdn/yari/issues/10893)) ([94e8bf6](https://github.com/mdn/yari/commit/94e8bf60a5e11caefa4143ad5c9673d90ef8af4f)) +* **deps-dev:** bump typescript from 5.4.4 to 5.4.5 in /client/pwa ([#10892](https://github.com/mdn/yari/issues/10892)) ([7442b15](https://github.com/mdn/yari/commit/7442b15eb85d4167c9890c989ce0d689063470b0)) +* **deps-dev:** bump typescript-eslint from 7.5.0 to 7.6.0 ([#10880](https://github.com/mdn/yari/issues/10880)) ([1ceb696](https://github.com/mdn/yari/commit/1ceb6960edf4ac8afb501a98d66e313eeba6063f)) +* **deps-dev:** bump typescript-eslint from 7.6.0 to 7.7.0 ([#10928](https://github.com/mdn/yari/issues/10928)) ([493e21c](https://github.com/mdn/yari/commit/493e21cc572da49a2d362c20792eb83ec33c11a9)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.40 to 2.7.41 in /client/pwa ([#10836](https://github.com/mdn/yari/issues/10836)) ([ed6190b](https://github.com/mdn/yari/commit/ed6190bb62637b1adb8fd24e80591d0afe966795)) +* **deps:** bump @codemirror/lang-html from 6.4.8 to 6.4.9 ([#10906](https://github.com/mdn/yari/issues/10906)) ([7f86fb5](https://github.com/mdn/yari/commit/7f86fb53c5a613c0287d4e3fa0d18e3f58cff4c9)) +* **deps:** bump @mdn/browser-compat-data from 5.5.18 to 5.5.19 ([#10839](https://github.com/mdn/yari/issues/10839)) ([1b2b428](https://github.com/mdn/yari/commit/1b2b428493ac52842fa5b90b781ec9a21e209627)) +* **deps:** bump @mdn/browser-compat-data from 5.5.19 to 5.5.20 ([#10882](https://github.com/mdn/yari/issues/10882)) ([3c8481a](https://github.com/mdn/yari/commit/3c8481a66ce2b4d6436beef71ec397f152a843e4)) +* **deps:** bump @mdn/browser-compat-data from 5.5.20 to 5.5.21 ([#10922](https://github.com/mdn/yari/issues/10922)) ([b7e8db2](https://github.com/mdn/yari/commit/b7e8db2bdc7966ec6782bdaab0781bc2715e3905)) +* **deps:** bump @stripe/stripe-js from 3.2.0 to 3.3.0 ([#10878](https://github.com/mdn/yari/issues/10878)) ([0eef466](https://github.com/mdn/yari/commit/0eef466729c63335ac60900ad9c61d16d0ccf31b)) +* **deps:** bump @webref/css from 6.12.5 to 6.12.6 ([#10838](https://github.com/mdn/yari/issues/10838)) ([3581fc0](https://github.com/mdn/yari/commit/3581fc0aa29afc7ba7cd7c881584e7e4642314eb)) +* **deps:** bump @webref/css from 6.12.6 to 6.12.7 ([#10904](https://github.com/mdn/yari/issues/10904)) ([3ed6a9a](https://github.com/mdn/yari/commit/3ed6a9ab60eab4962155e6ee5a633db2255f8c82)) +* **deps:** bump boto3 from 1.34.74 to 1.34.79 in /deployer in the dependencies group ([#10868](https://github.com/mdn/yari/issues/10868)) ([374b2da](https://github.com/mdn/yari/commit/374b2dada24c0d6caf7bb65f61869eadbcf84a4d)) +* **deps:** bump ejs from 3.1.9 to 3.1.10 ([#10923](https://github.com/mdn/yari/issues/10923)) ([df0f248](https://github.com/mdn/yari/commit/df0f2485060fa8c0c70be33bd419d270eaf92abb)) +* **deps:** bump idna from 3.4 to 3.7 in /deployer ([#10899](https://github.com/mdn/yari/issues/10899)) ([24a14ae](https://github.com/mdn/yari/commit/24a14ae419b8574fc37d513cc9a4f60aed2e092a)) +* **deps:** bump idna from 3.4 to 3.7 in /testing/integration ([#10898](https://github.com/mdn/yari/issues/10898)) ([2f3199f](https://github.com/mdn/yari/commit/2f3199fc4188bc6df00d9a4da5c3b65db7f79005)) +* **deps:** bump inquirer from 9.2.17 to 9.2.18 ([#10917](https://github.com/mdn/yari/issues/10917)) ([712a881](https://github.com/mdn/yari/commit/712a881b4f5814d284d778dd836dff0882b92163)) +* **deps:** bump mdn-data from 2.4.2 to 2.5.0 ([#10883](https://github.com/mdn/yari/issues/10883)) ([ae48b26](https://github.com/mdn/yari/commit/ae48b26edb76dfb61f1e026a5f6252d9994ac69d)) +* **deps:** bump node from 18.18 to latest 18 ([#10871](https://github.com/mdn/yari/issues/10871)) ([6f2e9d0](https://github.com/mdn/yari/commit/6f2e9d05dcac81928afe4787257bc5a0f9571a8b)) +* **deps:** bump openai from 4.32.0 to 4.32.1 ([#10842](https://github.com/mdn/yari/issues/10842)) ([65b769c](https://github.com/mdn/yari/commit/65b769cf6646f655965e850283c3f6296fda66fb)) +* **deps:** bump openai from 4.32.1 to 4.32.2 ([#10855](https://github.com/mdn/yari/issues/10855)) ([42af73a](https://github.com/mdn/yari/commit/42af73ace0f222dbf73d54056144308643aab67f)) +* **deps:** bump openai from 4.32.2 to 4.33.0 ([#10867](https://github.com/mdn/yari/issues/10867)) ([1578b72](https://github.com/mdn/yari/commit/1578b7251a33a6c6aeff1afa40abe472e0c59c93)) +* **deps:** bump openai from 4.33.0 to 4.33.1 ([#10915](https://github.com/mdn/yari/issues/10915)) ([5a09048](https://github.com/mdn/yari/commit/5a09048d29c705f98834d0d1485c3eda5e178363)) +* **deps:** bump openai from 4.33.1 to 4.35.0 ([#10929](https://github.com/mdn/yari/issues/10929)) ([beb13fa](https://github.com/mdn/yari/commit/beb13fac078716106c43191b1e022bfafd6a51e1)) +* **deps:** bump pg from 8.11.4 to 8.11.5 ([#10840](https://github.com/mdn/yari/issues/10840)) ([0423309](https://github.com/mdn/yari/commit/04233097cc6046fe5c8fca5c2cc251b9d6ba6269)) +* **deps:** bump the dependencies group in /deployer with 2 updates ([#10924](https://github.com/mdn/yari/issues/10924)) ([861f9f8](https://github.com/mdn/yari/commit/861f9f8edefdf90d10ab0a9e90d3178a70ec1008)) +* **deps:** bump the sentry group with 2 updates ([#10900](https://github.com/mdn/yari/issues/10900)) ([b781deb](https://github.com/mdn/yari/commit/b781deb5a83905e63051e96f06707be70565479b)) +* **deps:** bump the sentry group with 2 updates ([#10913](https://github.com/mdn/yari/issues/10913)) ([50a0d4f](https://github.com/mdn/yari/commit/50a0d4f22abfee71536dc6ef9076a753fe1c2112)) +* **deps:** bump web-features from 0.6.1 to 0.6.2 ([#10846](https://github.com/mdn/yari/issues/10846)) ([a98d188](https://github.com/mdn/yari/commit/a98d188e7db531c16bc02135c3a33057155b9d86)) +* **deps:** bump web-features from 0.6.2 to 0.6.3 ([#10889](https://github.com/mdn/yari/issues/10889)) ([3de72a5](https://github.com/mdn/yari/commit/3de72a569ea3af74c22eb5dda73a0ed8a9628633)) +* **deps:** bump web-specs from 3.6.0 to 3.7.0 ([#10841](https://github.com/mdn/yari/issues/10841)) ([f0754e3](https://github.com/mdn/yari/commit/f0754e3ecbc19f890fbd374f5629660314d804b3)) +* **deps:** bump web-specs from 3.7.0 to 3.7.1 ([#10896](https://github.com/mdn/yari/issues/10896)) ([58314b1](https://github.com/mdn/yari/commit/58314b1a48fe8053c57be918935aa9e64c99d08f)) +* **macros/AvailableInWorkers:** add zh-CN translation ([#10843](https://github.com/mdn/yari/issues/10843)) ([4c89c2a](https://github.com/mdn/yari/commit/4c89c2a8eb533f7f2c962f83e2053b4523ca0475)) + +## [2.47.0](https://github.com/mdn/yari/compare/v2.46.0...v2.47.0) (2024-04-02) + + +### Features + +* **ai-help:** index text-embedding-3-model embeddings ([#10818](https://github.com/mdn/yari/issues/10818)) ([f7cfaae](https://github.com/mdn/yari/commit/f7cfaae77f9ecbb5d7e1c1dd24eaa41c90c8466c)) + + +### Bug Fixes + +* **playground:** allow forms in iframe ([1ffb026](https://github.com/mdn/yari/commit/1ffb0261196752308a48b9f87d32101427d82430)) + + +### Enhancements + +* **ai-help:** hash markdown to identify formatting updates ([#10643](https://github.com/mdn/yari/issues/10643)) ([de1aae9](https://github.com/mdn/yari/commit/de1aae979e3107036cdad2e467f765639e747b03)) +* **curriculum:** add numbers to modules and fixes ([0f20809](https://github.com/mdn/yari/commit/0f2080913971ea72450b84a2ef237a49bb9e7580)) + + +### Miscellaneous + +* **deps-dev:** bump html-validate from 8.18.0 to 8.18.1 ([#10823](https://github.com/mdn/yari/issues/10823)) ([4776146](https://github.com/mdn/yari/commit/47761469ebfa4f219f852654f9d4577526029018)) +* **deps-dev:** bump postcss-preset-env from 9.5.2 to 9.5.3 ([#10827](https://github.com/mdn/yari/issues/10827)) ([e49c106](https://github.com/mdn/yari/commit/e49c10699215111b7dd93a499311ccbbb1fd7226)) +* **deps-dev:** bump postcss-preset-env from 9.5.3 to 9.5.4 ([#10832](https://github.com/mdn/yari/issues/10832)) ([0e3a9cc](https://github.com/mdn/yari/commit/0e3a9cce7267a0a23dd0c17397bf146846f78d43)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.4.13 to 2.4.14 ([#10826](https://github.com/mdn/yari/issues/10826)) ([a0de4de](https://github.com/mdn/yari/commit/a0de4de6981f30d81fa4e4d2a46b2de65c2f7d87)) +* **deps-dev:** bump the types group with 1 update ([#10814](https://github.com/mdn/yari/issues/10814)) ([f4ebe66](https://github.com/mdn/yari/commit/f4ebe6685e15caf4b80b03b2acb3c4983788ba51)) +* **deps-dev:** bump typescript-eslint from 7.4.0 to 7.5.0 ([#10830](https://github.com/mdn/yari/issues/10830)) ([23f3ea0](https://github.com/mdn/yari/commit/23f3ea044a90fd1b021373983f8c5abe140d2342)) +* **deps:** bump @mdn/browser-compat-data from 5.5.17 to 5.5.18 ([#10822](https://github.com/mdn/yari/issues/10822)) ([344fe99](https://github.com/mdn/yari/commit/344fe992412d4f057689f0cd7a119fdecc7af7c1)) +* **deps:** bump @stripe/stripe-js from 3.1.0 to 3.2.0 ([#10833](https://github.com/mdn/yari/issues/10833)) ([fc896ea](https://github.com/mdn/yari/commit/fc896ea0d3044c6aeee627f83c612b2537715265)) +* **deps:** bump inquirer from 9.2.16 to 9.2.17 ([#10821](https://github.com/mdn/yari/issues/10821)) ([cffdbc2](https://github.com/mdn/yari/commit/cffdbc268a79e91026010dd29af81375918ab791)) +* **deps:** bump openai from 4.29.2 to 4.30.0 ([#10815](https://github.com/mdn/yari/issues/10815)) ([685cde7](https://github.com/mdn/yari/commit/685cde73e29fb55a764e873f5179dc16e6641fc8)) +* **deps:** bump openai from 4.30.0 to 4.31.0 ([#10825](https://github.com/mdn/yari/issues/10825)) ([ac409f3](https://github.com/mdn/yari/commit/ac409f3930b11a22ca190c22e5cc4dc448f47147)) +* **deps:** bump openai from 4.31.0 to 4.32.0 ([#10831](https://github.com/mdn/yari/issues/10831)) ([de70b44](https://github.com/mdn/yari/commit/de70b4453f3cfd93556da8215d2cd9d572959dcb)) +* **deps:** bump pg from 8.11.3 to 8.11.4 ([#10824](https://github.com/mdn/yari/issues/10824)) ([456d1c6](https://github.com/mdn/yari/commit/456d1c670dab7b32896e5a513e926e46d194010f)) +* **deps:** bump the dependencies group in /deployer with 1 update ([#10820](https://github.com/mdn/yari/issues/10820)) ([9703884](https://github.com/mdn/yari/commit/9703884c9c00ec739d7ad66d9eb347efaf24e675)) +* **deps:** bump the sentry group with 2 updates ([#10813](https://github.com/mdn/yari/issues/10813)) ([51252ff](https://github.com/mdn/yari/commit/51252ff54b5d292abb0fa2c6de32342b88a456f7)) + +## [2.46.0](https://github.com/mdn/yari/compare/v2.45.1...v2.46.0) (2024-03-28) + + +### Features + +* **macros/AvailableInWorkers:** support more distinct cases ([#10029](https://github.com/mdn/yari/issues/10029)) ([f38adb3](https://github.com/mdn/yari/commit/f38adb3ac9a6c715059b00a099d81fb67dc974af)) + + +### Bug Fixes + +* **ai-help:** limit input to 25k characters ([#10796](https://github.com/mdn/yari/issues/10796)) ([cf2aee6](https://github.com/mdn/yari/commit/cf2aee62b3495e0f605ab6e258aab4a91e8495ca)) +* **contributor-spotlight:** show PageNotFound on error ([#9759](https://github.com/mdn/yari/issues/9759)) ([0312f1a](https://github.com/mdn/yari/commit/0312f1aae9c548bcd0ae5a9d58d12e6d6453b87b)) +* **curriculum:** remove forbidden hr from ol ([#10786](https://github.com/mdn/yari/issues/10786)) ([32a7a4b](https://github.com/mdn/yari/commit/32a7a4b3c286ebf11c5d15372c52c1b6489c3ec1)) +* **kumascript:** add translations() to page info ([#8241](https://github.com/mdn/yari/issues/8241)) ([0807413](https://github.com/mdn/yari/commit/08074138f1c2afd571627e3b94ee14c20ee3442e)) +* **macros/cssxref:** correct URL generation for data types and functions ([#8766](https://github.com/mdn/yari/issues/8766)) ([a0813d0](https://github.com/mdn/yari/commit/a0813d00025744136eb8d6c6f2db01d924b0cba7)) +* **playground:** remove redundant vertical scroll bar ([#10752](https://github.com/mdn/yari/issues/10752)) ([3f74a19](https://github.com/mdn/yari/commit/3f74a193a82d4a756edc57b9eff2e894c9f5e1a3)) + + +### Enhancements + +* **ai-help:** improve off-topic response handling ([#10797](https://github.com/mdn/yari/issues/10797)) ([6fd7a3a](https://github.com/mdn/yari/commit/6fd7a3a374eba388eb3528f258888ddb021fc40d)) +* **breadcrumbs:** show current and parent (not root) on mobile + add padding ([#10315](https://github.com/mdn/yari/issues/10315)) ([2276ecb](https://github.com/mdn/yari/commit/2276ecbeab7281d3be749bdc4bd5af6707d4cd61)) +* **build:** warn only once about missing BLOG_ROOT ([#10269](https://github.com/mdn/yari/issues/10269)) ([ad94d8a](https://github.com/mdn/yari/commit/ad94d8a7ee92b8ad25ef09f33f9539d15a44a28b)) +* **flaws-page:** specify 'yarn build' usage in error message for clarity ([#10785](https://github.com/mdn/yari/issues/10785)) ([a21d702](https://github.com/mdn/yari/commit/a21d7024f3e28922a43336af52bd289903c7a6d6)) +* **libs/env:** improve error message for bad .env configs ([#9673](https://github.com/mdn/yari/issues/9673)) ([f26f60c](https://github.com/mdn/yari/commit/f26f60c39a1b0d4615b1ab6c9fd1fd85493dc6ca)) +* **tool/fix-flaws:** add progress bar ([#9433](https://github.com/mdn/yari/issues/9433)) ([0e9d1f1](https://github.com/mdn/yari/commit/0e9d1f1e1f158a7bc49dcdc1e9e9f521c71cb04f)) + + +### Miscellaneous + +* **deps-dev:** bump @swc/core from 1.4.8 to 1.4.11 ([#10792](https://github.com/mdn/yari/issues/10792)) ([b436474](https://github.com/mdn/yari/commit/b4364746f97b32c259caca73d5e7244aef30167d)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.4.12 to 2.4.13 ([#10808](https://github.com/mdn/yari/issues/10808)) ([8d60ef9](https://github.com/mdn/yari/commit/8d60ef9edced78fa2bdc32542f1668e07ab36fa8)) +* **deps-dev:** bump tailwindcss from 3.4.1 to 3.4.3 ([#10809](https://github.com/mdn/yari/issues/10809)) ([5913e7c](https://github.com/mdn/yari/commit/5913e7c2451c29eec971f72bede798442b05dbad)) +* **deps-dev:** bump the types group with 1 update ([#10789](https://github.com/mdn/yari/issues/10789)) ([5722b4e](https://github.com/mdn/yari/commit/5722b4ea401b14d4bb770ca858263eb5fb331230)) +* **deps-dev:** bump the types group with 1 update ([#10799](https://github.com/mdn/yari/issues/10799)) ([37655b5](https://github.com/mdn/yari/commit/37655b5f6574b8365944ebe35ced28cc72dfd286)) +* **deps-dev:** bump the types group with 1 update ([#10807](https://github.com/mdn/yari/issues/10807)) ([6e4114a](https://github.com/mdn/yari/commit/6e4114a5ca9b0fb5fb595aa4e88ca988cd8744a3)) +* **deps-dev:** bump typescript-eslint from 7.3.1 to 7.4.0 ([#10791](https://github.com/mdn/yari/issues/10791)) ([e1e4fbc](https://github.com/mdn/yari/commit/e1e4fbc418501debf9fb4fddc64ac3cd09856f3f)) +* **deps-dev:** remove unused tailwindcss dependency ([#10810](https://github.com/mdn/yari/issues/10810)) ([2c95a9a](https://github.com/mdn/yari/commit/2c95a9abeb8a15e67a47242369ce9b3deb6b7b49)) +* **deps:** bump @mdn/bcd-utils-api from 0.0.6 to 0.0.7 ([#10793](https://github.com/mdn/yari/issues/10793)) ([7ea45e6](https://github.com/mdn/yari/commit/7ea45e64bf90044eb3e4c9e642eba54181cb805e)) +* **deps:** bump @mdn/browser-compat-data from 5.5.16 to 5.5.17 ([#10800](https://github.com/mdn/yari/issues/10800)) ([bdad452](https://github.com/mdn/yari/commit/bdad452a5f43408925ced3734a2cd9da8fd9dcee)) +* **deps:** bump @stripe/stripe-js from 3.0.10 to 3.1.0 ([#10794](https://github.com/mdn/yari/issues/10794)) ([fc245ad](https://github.com/mdn/yari/commit/fc245addc92eecee5aa9f73cb4ecc9c9b935b03c)) +* **deps:** bump @webref/css from 6.12.4 to 6.12.5 ([#10801](https://github.com/mdn/yari/issues/10801)) ([1352725](https://github.com/mdn/yari/commit/135272583e89dac06f689c1ec0de6786deafcc21)) +* **deps:** bump express from 4.19.1 to 4.19.2 ([#10790](https://github.com/mdn/yari/issues/10790)) ([1732e67](https://github.com/mdn/yari/commit/1732e67226a7d2f4721766d5abb0ea3972f54bfc)) +* **deps:** bump web-specs from 3.5.0 to 3.6.0 ([#10802](https://github.com/mdn/yari/issues/10802)) ([8e159b6](https://github.com/mdn/yari/commit/8e159b642bd8116d3a6eadcd3943d6c19a5dde9f)) +* **macros/JsSidebar:** update Russian locale ([#10735](https://github.com/mdn/yari/issues/10735)) ([cea32ef](https://github.com/mdn/yari/commit/cea32efd34e641bbed30740398ab02c37c654831)) +* **macros:** remove deprecated bug/htmlattrdef/xref_cssvisual macros ([#10003](https://github.com/mdn/yari/issues/10003)) ([9a90d17](https://github.com/mdn/yari/commit/9a90d17fdb00fd497972c9f987e15374610737ba)) + +## [2.45.1](https://github.com/mdn/yari/compare/v2.45.0...v2.45.1) (2024-03-25) + + +### Bug Fixes + +* **macros/LearnSidebar:** update titles for consistency ([#10773](https://github.com/mdn/yari/issues/10773)) ([b488d0f](https://github.com/mdn/yari/commit/b488d0fb5e915abd61fa754050655386822c16ca)) +* **playground:** dispatch DOMContentLoaded event manually ([#10770](https://github.com/mdn/yari/issues/10770)) ([2515b3d](https://github.com/mdn/yari/commit/2515b3de75d67bbf32d3de1564efa5734177e6ad)) +* **routes:** redirect / => /en-US/ except for writers ([#10778](https://github.com/mdn/yari/issues/10778)) ([7d694d0](https://github.com/mdn/yari/commit/7d694d018f78f01595446653ec023c7955d43ecb)) + + +### Miscellaneous + +* **deps-dev:** bump html-validate from 8.17.1 to 8.18.0 ([#10780](https://github.com/mdn/yari/issues/10780)) ([e59a9fd](https://github.com/mdn/yari/commit/e59a9fddfef666184ba21c1b9b5217b710c8ff32)) +* **deps-dev:** bump the types group with 1 update ([#10779](https://github.com/mdn/yari/issues/10779)) ([1e4a564](https://github.com/mdn/yari/commit/1e4a56426b569c5c045609703b0fd71a7361e910)) +* **deps:** bump @webref/css from 6.12.3 to 6.12.4 ([#10782](https://github.com/mdn/yari/issues/10782)) ([e12fedd](https://github.com/mdn/yari/commit/e12fedd530cac8f545039317a60af7616db739a6)) +* **deps:** bump dependabot/fetch-metadata from 1 to 2 ([#10767](https://github.com/mdn/yari/issues/10767)) ([07ca353](https://github.com/mdn/yari/commit/07ca35352cce92659d5b995bda9d9620a0a53993)) +* **deps:** bump the dependencies group in /deployer with 1 update ([#10783](https://github.com/mdn/yari/issues/10783)) ([df2570b](https://github.com/mdn/yari/commit/df2570b2923a89add0483c1677f3cfad97305ffb)) +* **deps:** bump the sentry group with 2 updates ([#10768](https://github.com/mdn/yari/issues/10768)) ([e13746d](https://github.com/mdn/yari/commit/e13746d19de57511e18cdd160f27faaf748f64ed)) +* **deps:** bump web-features from 0.6.0 to 0.6.1 ([#10781](https://github.com/mdn/yari/issues/10781)) ([d90a926](https://github.com/mdn/yari/commit/d90a9269711b8dcc09bd02dc2f7889033a9ac36b)) +* **macros/LearnSidebar:** add Japanese translation retake ([40be4dd](https://github.com/mdn/yari/commit/40be4dd0044bada0dcbe5910297290f7e0d8acec)) + +## [2.45.0](https://github.com/mdn/yari/compare/v2.44.0...v2.45.0) (2024-03-21) + + +### Features + +* **google-analytics:** migrate to gtag.js with dual tagging ([#10687](https://github.com/mdn/yari/issues/10687)) ([56dbe78](https://github.com/mdn/yari/commit/56dbe78ae713bf7d9082f7b44c8600621afb31c8)) +* **telemetry:** measure served placement types ([#10708](https://github.com/mdn/yari/issues/10708)) ([e90e4e3](https://github.com/mdn/yari/commit/e90e4e3356aeb898fcd17cb14458bd93eff2097b)) + + +### Bug Fixes + +* **article-footer:** link to translated-content for other locales ([#10743](https://github.com/mdn/yari/issues/10743)) ([fd3f69c](https://github.com/mdn/yari/commit/fd3f69cdbca0b8a46770359b030d263b383f8a33)) +* **cli:** add popularities to "yarn start" script ([#10718](https://github.com/mdn/yari/issues/10718)) ([f07a42a](https://github.com/mdn/yari/commit/f07a42af255346160790cc2e881390c1448239da)) +* **csp:** add *.analytics.google.com ([#10729](https://github.com/mdn/yari/issues/10729)) ([12dde4f](https://github.com/mdn/yari/commit/12dde4f34e7bec8c4d0f3386035468c9729ae1a6)) +* **csp:** allow GA via Tag Manager ([#10715](https://github.com/mdn/yari/issues/10715)) ([e8ec3d3](https://github.com/mdn/yari/commit/e8ec3d3b888950cc4a3d052241f93216a5b5d9f5)) +* **curriculum:** don't flag curriclum links ([#10763](https://github.com/mdn/yari/issues/10763)) ([6d989e4](https://github.com/mdn/yari/commit/6d989e4fc551fa0422b3069dce5b56989d46d009)) +* **document:** do not break the line of the metadata ([#10129](https://github.com/mdn/yari/issues/10129)) ([789aa15](https://github.com/mdn/yari/commit/789aa1527fb699243105ae1db79b3f5e25be4aa2)) +* **google-analytics:** allow analytics.js in CSP ([#10765](https://github.com/mdn/yari/issues/10765)) ([3758c73](https://github.com/mdn/yari/commit/3758c735cbbaeaba1baccc8bce9491a6a3f7e786)) +* **icon:** fix the clipboard icon on safari ios ([#10762](https://github.com/mdn/yari/issues/10762)) ([f4b6be2](https://github.com/mdn/yari/commit/f4b6be2ecd2cf7dbd0dfadedfef0a803c2d88892)) +* **search:** preserve meaningful dots ([#9951](https://github.com/mdn/yari/issues/9951)) ([d84662e](https://github.com/mdn/yari/commit/d84662ebbfb3ef93233d388e0b25f1ef6060857d)) +* **search:** remove "not" from stopwords ([#10644](https://github.com/mdn/yari/issues/10644)) ([8fd03c3](https://github.com/mdn/yari/commit/8fd03c3980780d975ed1a447a96e9aa6e62d6e70)) + + +### Miscellaneous + +* **deps-dev:** bump @babel/core from 7.24.0 to 7.24.1 ([#10737](https://github.com/mdn/yari/issues/10737)) ([fa46ea5](https://github.com/mdn/yari/commit/fa46ea5c0ff7a7ab5b8fbc3a6f64ccfc89aed127)) +* **deps-dev:** bump @babel/core from 7.24.1 to 7.24.3 ([#10755](https://github.com/mdn/yari/issues/10755)) ([cac817d](https://github.com/mdn/yari/commit/cac817d24449ce143ea978226e760f8fb782168a)) +* **deps-dev:** bump @babel/eslint-parser from 7.23.10 to 7.24.1 ([#10741](https://github.com/mdn/yari/issues/10741)) ([a2c331e](https://github.com/mdn/yari/commit/a2c331e73a78e9a03f09b53de87314ff9520f68a)) +* **deps-dev:** bump @babel/preset-env from 7.24.0 to 7.24.1 ([#10738](https://github.com/mdn/yari/issues/10738)) ([8086a3b](https://github.com/mdn/yari/commit/8086a3b488f00b342ce850f2c3aa34f578aa70f9)) +* **deps-dev:** bump @babel/preset-env from 7.24.1 to 7.24.3 ([#10756](https://github.com/mdn/yari/issues/10756)) ([a7fefec](https://github.com/mdn/yari/commit/a7fefec1f9dfc3c6be87c5636ce0247fd4d07f4b)) +* **deps-dev:** bump @testing-library/react from 14.2.1 to 14.2.2 ([#10745](https://github.com/mdn/yari/issues/10745)) ([a97b9aa](https://github.com/mdn/yari/commit/a97b9aa5fc874bfec8fa12b99425aa96f2012b5b)) +* **deps-dev:** bump eslint-plugin-react from 7.34.0 to 7.34.1 ([#10727](https://github.com/mdn/yari/issues/10727)) ([c8cdf92](https://github.com/mdn/yari/commit/c8cdf925657ff696cc13066bcd09b61f37b4643e)) +* **deps-dev:** bump html-validate from 8.15.0 to 8.16.0 ([#10726](https://github.com/mdn/yari/issues/10726)) ([c8ec945](https://github.com/mdn/yari/commit/c8ec94512c31f0657279ecd8eceeaa5f5afa35b5)) +* **deps-dev:** bump html-validate from 8.16.0 to 8.17.0 ([#10742](https://github.com/mdn/yari/issues/10742)) ([9276802](https://github.com/mdn/yari/commit/92768027117bbae3c111a2265cba18bf84c488ba)) +* **deps-dev:** bump html-validate from 8.17.0 to 8.17.1 ([#10759](https://github.com/mdn/yari/issues/10759)) ([266bf47](https://github.com/mdn/yari/commit/266bf47fe29fa0bf4f11080c2b7e905d75136e99)) +* **deps-dev:** bump postcss from 8.4.35 to 8.4.36 ([#10724](https://github.com/mdn/yari/issues/10724)) ([d22a72d](https://github.com/mdn/yari/commit/d22a72d53a2ed20795cbea14a1dad0975c101961)) +* **deps-dev:** bump postcss from 8.4.36 to 8.4.37 ([#10746](https://github.com/mdn/yari/issues/10746)) ([da4baa3](https://github.com/mdn/yari/commit/da4baa33727624bfd9241dd5e25cb152d11a4155)) +* **deps-dev:** bump postcss from 8.4.37 to 8.4.38 ([#10754](https://github.com/mdn/yari/issues/10754)) ([32ccbdf](https://github.com/mdn/yari/commit/32ccbdfdcc9fa5eaf3a4dafa338678b7cb716262)) +* **deps-dev:** bump postcss-preset-env from 9.5.1 to 9.5.2 ([#10723](https://github.com/mdn/yari/issues/10723)) ([f476c1f](https://github.com/mdn/yari/commit/f476c1f0d7749804ef39b9f92f66118b1bf327df)) +* **deps-dev:** bump the dependencies group in /testing/integration with 1 update ([#10720](https://github.com/mdn/yari/issues/10720)) ([a951216](https://github.com/mdn/yari/commit/a95121638920d893a3bf75289e6d7bfd8b333026)) +* **deps-dev:** bump the types group with 1 update ([#10736](https://github.com/mdn/yari/issues/10736)) ([d3b6df9](https://github.com/mdn/yari/commit/d3b6df9b9429dbfd10719de5c446c35ae479a64f)) +* **deps-dev:** bump typescript from 5.4.2 to 5.4.3 ([#10758](https://github.com/mdn/yari/issues/10758)) ([26056db](https://github.com/mdn/yari/commit/26056db20ec73b5a1960ace6d8e006dfa0b0a122)) +* **deps-dev:** bump typescript from 5.4.2 to 5.4.3 in /client/pwa ([#10761](https://github.com/mdn/yari/issues/10761)) ([08848b8](https://github.com/mdn/yari/commit/08848b8d450e6088567e4fb1456f597744360d44)) +* **deps-dev:** bump typescript-eslint from 7.2.0 to 7.3.1 ([#10740](https://github.com/mdn/yari/issues/10740)) ([a157c60](https://github.com/mdn/yari/commit/a157c60c40c64d11f22ebfcd23df56271ddc59e1)) +* **deps-dev:** bump webpack from 5.90.3 to 5.91.0 ([#10753](https://github.com/mdn/yari/issues/10753)) ([44701a8](https://github.com/mdn/yari/commit/44701a8af4a409802d1a6141e37a6cf91398147f)) +* **deps-dev:** bump webpack from 5.90.3 to 5.91.0 in /client/pwa ([#10760](https://github.com/mdn/yari/issues/10760)) ([f47ec4b](https://github.com/mdn/yari/commit/f47ec4b2ecad23b6ec985ba8d7799d3000fdf700)) +* **deps-dev:** bump webpack-dev-server from 5.0.3 to 5.0.4 ([#10747](https://github.com/mdn/yari/issues/10747)) ([6b2a258](https://github.com/mdn/yari/commit/6b2a258a479240d62a60ec5521f74eb796ec9ce8)) +* **deps:** bump @mdn/bcd-utils-api from 0.0.5 to 0.0.6 ([#10739](https://github.com/mdn/yari/issues/10739)) ([2bca6b2](https://github.com/mdn/yari/commit/2bca6b241cdc1395b766e4f4482d26233cc60bb3)) +* **deps:** bump @mdn/browser-compat-data from 5.5.15 to 5.5.16 ([#10725](https://github.com/mdn/yari/issues/10725)) ([74adc46](https://github.com/mdn/yari/commit/74adc46d7bca936162a75d8902a8da1769daaedb)) +* **deps:** bump dexie from 3.2.6 to 3.2.7 ([#10749](https://github.com/mdn/yari/issues/10749)) ([0e37d09](https://github.com/mdn/yari/commit/0e37d0993009aa8859067e6dcc996efc4be631da)) +* **deps:** bump dexie from 3.2.6 to 3.2.7 in /client/pwa ([#10750](https://github.com/mdn/yari/issues/10750)) ([54336bc](https://github.com/mdn/yari/commit/54336bc475c7a1f1fc15d52362fce284dd0e562f)) +* **deps:** bump express from 4.18.3 to 4.19.1 ([#10757](https://github.com/mdn/yari/issues/10757)) ([dacd958](https://github.com/mdn/yari/commit/dacd958a7400309e0e64c1e93f36167c4d839780)) +* **deps:** bump node from 18.17 to 18.18 ([#10154](https://github.com/mdn/yari/issues/10154)) ([45ef76f](https://github.com/mdn/yari/commit/45ef76fc67fecfc33a067ebee296ba9cb6f92462)) +* **deps:** bump openai from 4.29.0 to 4.29.1 ([#10722](https://github.com/mdn/yari/issues/10722)) ([94f1d93](https://github.com/mdn/yari/commit/94f1d9374b8dab7b500b3f281cf7d3bc1c18edae)) +* **deps:** bump openai from 4.29.1 to 4.29.2 ([#10748](https://github.com/mdn/yari/issues/10748)) ([0a075d8](https://github.com/mdn/yari/commit/0a075d876c76ce62043f2d1c657f98e1d4cd78ad)) +* **deps:** bump pytest-rerunfailures from 13.0 to 14.0 in /testing/integration ([#10721](https://github.com/mdn/yari/issues/10721)) ([41c24bc](https://github.com/mdn/yari/commit/41c24bc6f3be3b4edb02b2a3d01592821194cdb5)) +* **deps:** bump the dependencies group in /deployer with 2 updates ([#10728](https://github.com/mdn/yari/issues/10728)) ([a34cd8f](https://github.com/mdn/yari/commit/a34cd8f0ae48d24d2993c671725ddb800f8b004d)) +* **macros/HTTPSidebar:** improve Spanish locale ([#10710](https://github.com/mdn/yari/issues/10710)) ([8ac8c6f](https://github.com/mdn/yari/commit/8ac8c6f2d26e58ddc5bb5c419b97a84e619dff52)) + +## [2.44.0](https://github.com/mdn/yari/compare/v2.43.0...v2.44.0) (2024-03-15) + + +### Features + +* **blog:** remove playground queue ([#10666](https://github.com/mdn/yari/issues/10666)) ([b432d38](https://github.com/mdn/yari/commit/b432d380d4a13bd85001e7cb574b6b1376937247)) + + +### Bug Fixes + +* **ai-help:** show stopped message once + restore search animation ([#10632](https://github.com/mdn/yari/issues/10632)) ([e24a7cc](https://github.com/mdn/yari/commit/e24a7cc367be3321138ab5e3b591b685085f2570)) +* **article-footer:** add missing space ([#10671](https://github.com/mdn/yari/issues/10671)) ([5acdfb1](https://github.com/mdn/yari/commit/5acdfb17a69584b2e8b9d4a932b7a0bc83bd9df5)) +* **article-footer:** reduce illustration size ([#10678](https://github.com/mdn/yari/issues/10678)) ([7b815ba](https://github.com/mdn/yari/commit/7b815babcf438ea28f0e379323354f8bb8bed49b)) +* **article-footer:** show red heart emoji in Chrome/Edge ([#10677](https://github.com/mdn/yari/issues/10677)) ([e12a0c4](https://github.com/mdn/yari/commit/e12a0c45c393c1a1bab5b99ab5510e63bf784665)) +* **bcd:** fix tooltip for removed features ([#10684](https://github.com/mdn/yari/issues/10684)) ([49c84bb](https://github.com/mdn/yari/commit/49c84bb2861262582effdba246c076d94e0b64c8)) +* **flaws:** don't report link to missing translation as broken if en-US fallback exists ([#9408](https://github.com/mdn/yari/issues/9408)) ([f9756d1](https://github.com/mdn/yari/commit/f9756d11a5cffe1b90054f94ffe52872ff771eb6)) +* **telemetry:** measure link/button clicks properly ([#10707](https://github.com/mdn/yari/issues/10707)) ([2c27a78](https://github.com/mdn/yari/commit/2c27a78bcfbc0ba1d818c9928328770eae32fabd)) + + +### Miscellaneous + +* **deps-dev:** bump @swc/core from 1.4.2 to 1.4.5 ([#10657](https://github.com/mdn/yari/issues/10657)) ([5531c0e](https://github.com/mdn/yari/commit/5531c0e033e06909e0d3009c64cd3730dba7a99d)) +* **deps-dev:** bump @swc/core from 1.4.5 to 1.4.6 ([#10669](https://github.com/mdn/yari/issues/10669)) ([5b53388](https://github.com/mdn/yari/commit/5b533887a4822070b21092f01a58132ffd608e93)) +* **deps-dev:** bump @swc/core from 1.4.6 to 1.4.7 ([#10696](https://github.com/mdn/yari/issues/10696)) ([9d1a3a7](https://github.com/mdn/yari/commit/9d1a3a74182a0f844d674fe8783f1c2512b30077)) +* **deps-dev:** bump @swc/core from 1.4.7 to 1.4.8 ([#10703](https://github.com/mdn/yari/issues/10703)) ([74322c9](https://github.com/mdn/yari/commit/74322c930bd5e86558944717cc714d8264c37662)) +* **deps-dev:** bump eslint-webpack-plugin from 4.0.1 to 4.1.0 ([#10705](https://github.com/mdn/yari/issues/10705)) ([dde0182](https://github.com/mdn/yari/commit/dde0182e93e536b8891b53f16f5d418dc0b6e882)) +* **deps-dev:** bump html-validate from 8.12.0 to 8.13.0 ([#10656](https://github.com/mdn/yari/issues/10656)) ([ef2273a](https://github.com/mdn/yari/commit/ef2273a50604d58ad5b688f1312e4ad05d001d69)) +* **deps-dev:** bump html-validate from 8.13.0 to 8.15.0 ([#10674](https://github.com/mdn/yari/issues/10674)) ([3e69431](https://github.com/mdn/yari/commit/3e6943102f9eed07dc05284f2515b8ac870b5f40)) +* **deps-dev:** bump postcss-preset-env from 9.4.0 to 9.5.0 ([#10661](https://github.com/mdn/yari/issues/10661)) ([ed0d873](https://github.com/mdn/yari/commit/ed0d873696204693725ccb6295882b8b1eb8d9ba)) +* **deps-dev:** bump postcss-preset-env from 9.5.0 to 9.5.1 ([#10706](https://github.com/mdn/yari/issues/10706)) ([73dd5ed](https://github.com/mdn/yari/commit/73dd5edeaae31e776a8813429f4b0d8ef8d361d5)) +* **deps-dev:** bump sass from 1.71.1 to 1.72.0 ([#10700](https://github.com/mdn/yari/issues/10700)) ([30069d5](https://github.com/mdn/yari/commit/30069d50b396530e306dcd6fde1ea09d94ed4104)) +* **deps-dev:** bump the types group with 1 update ([#10655](https://github.com/mdn/yari/issues/10655)) ([556ff0a](https://github.com/mdn/yari/commit/556ff0a6f8739b4b095648d80a7a5b553658683b)) +* **deps-dev:** bump the types group with 1 update ([#10681](https://github.com/mdn/yari/issues/10681)) ([02256fa](https://github.com/mdn/yari/commit/02256fa8284b3e8913a0afc64b54c6c8ac4c0c3d)) +* **deps-dev:** bump the types group with 1 update ([#10688](https://github.com/mdn/yari/issues/10688)) ([48d9d7b](https://github.com/mdn/yari/commit/48d9d7be19315f76a43f888d7f595dfacffd5f98)) +* **deps-dev:** bump the types group with 1 update ([#10711](https://github.com/mdn/yari/issues/10711)) ([10a8162](https://github.com/mdn/yari/commit/10a81625674c47660a2a59c614509edb90106b4c)) +* **deps-dev:** bump the types group with 2 updates ([#10660](https://github.com/mdn/yari/issues/10660)) ([69b2c05](https://github.com/mdn/yari/commit/69b2c05006a2d8a192ed07c7d876614692eaba48)) +* **deps-dev:** bump typescript from 5.3.3 to 5.4.2 ([#10662](https://github.com/mdn/yari/issues/10662)) ([f960988](https://github.com/mdn/yari/commit/f96098826747f1b01ce101c7dc6efee29d092295)) +* **deps-dev:** bump typescript from 5.3.3 to 5.4.2 in /client/pwa ([#10665](https://github.com/mdn/yari/issues/10665)) ([f14bc4a](https://github.com/mdn/yari/commit/f14bc4afca37b7273a307b8cc318d41e8c00d878)) +* **deps-dev:** bump typescript-eslint from 7.1.1 to 7.2.0 ([#10682](https://github.com/mdn/yari/issues/10682)) ([6a175fc](https://github.com/mdn/yari/commit/6a175fcad7398849b8c29e8bb0346b4c03baee5c)) +* **deps-dev:** bump webpack-dev-server from 5.0.2 to 5.0.3 ([#10692](https://github.com/mdn/yari/issues/10692)) ([f60c855](https://github.com/mdn/yari/commit/f60c855779967a3128243582618e78c31fc3d2fe)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.37 to 2.7.40 in /client/pwa ([#10667](https://github.com/mdn/yari/issues/10667)) ([4fafd98](https://github.com/mdn/yari/commit/4fafd981d094b959f2bf19f188b2e085ef8d8f04)) +* **deps:** bump @mdn/browser-compat-data from 5.5.13 to 5.5.14 ([#10664](https://github.com/mdn/yari/issues/10664)) ([6e2f93b](https://github.com/mdn/yari/commit/6e2f93b1df61dac10f70d48560b6e1e332ae6336)) +* **deps:** bump @mdn/browser-compat-data from 5.5.14 to 5.5.15 ([#10693](https://github.com/mdn/yari/issues/10693)) ([2ec1187](https://github.com/mdn/yari/commit/2ec1187c4176b9b6d2a73cc7de25b76008587a4b)) +* **deps:** bump @stripe/stripe-js from 3.0.7 to 3.0.8 ([#10683](https://github.com/mdn/yari/issues/10683)) ([1f6ba5d](https://github.com/mdn/yari/commit/1f6ba5d040189efcdf1bdca0fdeac96773f8b79f)) +* **deps:** bump @stripe/stripe-js from 3.0.8 to 3.0.10 ([#10712](https://github.com/mdn/yari/issues/10712)) ([fa65fed](https://github.com/mdn/yari/commit/fa65fedb73374b87bfac78e988b9544b7a511d24)) +* **deps:** bump @webref/css from 6.12.1 to 6.12.2 ([#10663](https://github.com/mdn/yari/issues/10663)) ([b2117d5](https://github.com/mdn/yari/commit/b2117d53ab8020e266d66a942c22c8beacadba03)) +* **deps:** bump @webref/css from 6.12.2 to 6.12.3 ([#10689](https://github.com/mdn/yari/issues/10689)) ([6ccccb7](https://github.com/mdn/yari/commit/6ccccb7f1d77052151ce9ab42faeb12b0c3c8fe0)) +* **deps:** bump follow-redirects from 1.15.4 to 1.15.6 ([#10713](https://github.com/mdn/yari/issues/10713)) ([24a2bf9](https://github.com/mdn/yari/commit/24a2bf93e784039123ae542249703e35583e48ea)) +* **deps:** bump inquirer from 9.2.15 to 9.2.16 ([#10695](https://github.com/mdn/yari/issues/10695)) ([482e706](https://github.com/mdn/yari/commit/482e7065151e41c0f2ca13fd4e016269f2c90e8e)) +* **deps:** bump open from 10.0.4 to 10.1.0 ([#10675](https://github.com/mdn/yari/issues/10675)) ([541d1e5](https://github.com/mdn/yari/commit/541d1e5044bb8987504b493f173fc53d4605ce82)) +* **deps:** bump openai from 4.28.4 to 4.29.0 ([#10701](https://github.com/mdn/yari/issues/10701)) ([4a987a7](https://github.com/mdn/yari/commit/4a987a7ec7f83b7209069dddab17672cab2cc79a)) +* **deps:** bump sse.js from 2.3.0 to 2.4.1 ([#10704](https://github.com/mdn/yari/issues/10704)) ([d6cedf8](https://github.com/mdn/yari/commit/d6cedf8673fd0de550a2a586055f6a44d51f2928)) +* **deps:** bump the dependencies group in /deployer with 3 updates ([#10672](https://github.com/mdn/yari/issues/10672)) ([96023a7](https://github.com/mdn/yari/commit/96023a70f3f996d23ee4813de9e5cd67a96cac06)) +* **deps:** bump the dependencies group in /testing/integration with 1 update ([#10676](https://github.com/mdn/yari/issues/10676)) ([75041dc](https://github.com/mdn/yari/commit/75041dccf5ecb8eacb83302abcab3ccab998fa35)) +* **deps:** bump the sentry group with 2 updates ([#10673](https://github.com/mdn/yari/issues/10673)) ([e9f50b5](https://github.com/mdn/yari/commit/e9f50b5b43fc7b3a6687adcf9fe45db51e8c9c7e)) +* **deps:** bump the sentry group with 2 updates ([#10680](https://github.com/mdn/yari/issues/10680)) ([3214666](https://github.com/mdn/yari/commit/32146664261eec754b4a140693e530704fc8b4b7)) +* **deps:** bump the sentry group with 2 updates ([#10699](https://github.com/mdn/yari/issues/10699)) ([1d587dd](https://github.com/mdn/yari/commit/1d587dd1b1b826395c5a1b36e6f46ab5e6dbef33)) +* **deps:** bump web-features from 0.5.1 to 0.6.0 ([#10702](https://github.com/mdn/yari/issues/10702)) ([0346cb2](https://github.com/mdn/yari/commit/0346cb2dac4576de13d4ef5f568159312f71c6cf)) +* **deps:** bump web-specs from 3.4.0 to 3.5.0 ([#10694](https://github.com/mdn/yari/issues/10694)) ([af1f8cb](https://github.com/mdn/yari/commit/af1f8cb87fcf1f9446febcabb26ec22a80b55aa9)) +* **macros/EmbedLiveSample:** deprecate screenshot URL parameter ([#10697](https://github.com/mdn/yari/issues/10697)) ([2a24620](https://github.com/mdn/yari/commit/2a246201b0b198b349ebf5635b702fa309557836)) +* **macros:** Deprecate no_tag_omission macro ([#10686](https://github.com/mdn/yari/issues/10686)) ([bea5317](https://github.com/mdn/yari/commit/bea53179ba249b5f28e325db8ba2aec194f45fce)) +* **telemetry:** measure theme switcher clicks ([#10698](https://github.com/mdn/yari/issues/10698)) ([c584cb6](https://github.com/mdn/yari/commit/c584cb61bf05e8855a72be52767277a42c9bba56)) +* **telemetry:** remove and migrate GA measurements to Glean ([#10527](https://github.com/mdn/yari/issues/10527)) ([fc4da56](https://github.com/mdn/yari/commit/fc4da56ffd9e616174cfda3313d8c38f82431d62)) + +## [2.43.0](https://github.com/mdn/yari/compare/v2.42.1...v2.43.0) (2024-03-05) + + +### Features + +* **article-footer:** redesign footer + add feedback buttons ([#10625](https://github.com/mdn/yari/issues/10625)) ([40659a8](https://github.com/mdn/yari/commit/40659a8359af372c0e1af4e2c40da4d0979afc06)) +* **latest-news:** fetch metadata from Blog articles + update list ([#10614](https://github.com/mdn/yari/issues/10614)) ([734c37c](https://github.com/mdn/yari/commit/734c37c0834713f0cfd62d98d282a7c37522b68f)) + + +### Bug Fixes + +* **cloud-function:** redirect blog/curriculum/play without locale ([#10654](https://github.com/mdn/yari/issues/10654)) ([2fe9d54](https://github.com/mdn/yari/commit/2fe9d540a0c4cd7b78047770d6195fb30fff0a91)) +* **featured-articles:** improve how Blog articles are shown ([#10624](https://github.com/mdn/yari/issues/10624)) ([4900d37](https://github.com/mdn/yari/commit/4900d37495b30cb0d2adb99dded61a88f30c2c3b)) +* **logo:** set width to width of largest logo ([#10652](https://github.com/mdn/yari/issues/10652)) ([e606646](https://github.com/mdn/yari/commit/e60664601ea55cd61a94ee4ad5db304b2df0f49d)) +* **recent-contributions:** break long words instead of overflowing ([#10503](https://github.com/mdn/yari/issues/10503)) ([9ec8963](https://github.com/mdn/yari/commit/9ec8963de4277cb98ff8633c29687c411cbf5db2)) +* **types:** pass types through memoize properly ([#10567](https://github.com/mdn/yari/issues/10567)) ([ed9cbf3](https://github.com/mdn/yari/commit/ed9cbf3e0b2b3dd017b266ac04dd9c540388f42c)) + + +### Miscellaneous + +* **deps-dev:** bump the types group with 1 update ([#10648](https://github.com/mdn/yari/issues/10648)) ([a6293c3](https://github.com/mdn/yari/commit/a6293c3ee4ac66334f9dda5b124b02130517839d)) +* **deps-dev:** bump typescript-eslint from 7.1.0 to 7.1.1 ([#10649](https://github.com/mdn/yari/issues/10649)) ([cc74431](https://github.com/mdn/yari/commit/cc74431283efead765156e2453a306c0329341d6)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.36 to 2.7.37 in /client/pwa ([#10646](https://github.com/mdn/yari/issues/10646)) ([b218c21](https://github.com/mdn/yari/commit/b218c2192ab6d06dc1db4cca7e3b65444bb4da4e)) +* **deps:** bump @stripe/stripe-js from 3.0.6 to 3.0.7 ([#10651](https://github.com/mdn/yari/issues/10651)) ([0071314](https://github.com/mdn/yari/commit/00713146c396aad3c9187044def1abbb17760fe2)) +* **deps:** bump dexie from 3.2.5 to 3.2.6 ([#10650](https://github.com/mdn/yari/issues/10650)) ([8a6f76d](https://github.com/mdn/yari/commit/8a6f76d294167f8cc72893bad5d62bbd67bc4f1d)) +* **deps:** bump dexie from 3.2.5 to 3.2.6 in /client/pwa ([#10645](https://github.com/mdn/yari/issues/10645)) ([17e353f](https://github.com/mdn/yari/commit/17e353ffcfe180153e1de1644f5b7d49527ce6e1)) + +## [2.42.1](https://github.com/mdn/yari/compare/v2.42.0...v2.42.1) (2024-03-04) + + +### Bug Fixes + +* **build/matches:** remove unnecessary type imports ([#10634](https://github.com/mdn/yari/issues/10634)) ([7a31bf6](https://github.com/mdn/yari/commit/7a31bf6297f0f7ea309f831ef34318abb80b287c)) + + +### Miscellaneous + +* **deps-dev:** bump @playwright/test from 1.42.0 to 1.42.1 ([#10641](https://github.com/mdn/yari/issues/10641)) ([83a4b83](https://github.com/mdn/yari/commit/83a4b83c89e7a50bbe51695c5f4f63003e50974a)) +* **deps-dev:** bump eslint-plugin-react from 7.33.2 to 7.34.0 ([#10639](https://github.com/mdn/yari/issues/10639)) ([ae23d61](https://github.com/mdn/yari/commit/ae23d61db80f0b41069755e6c47d42bdb4063981)) +* **deps-dev:** bump html-validate from 8.11.1 to 8.12.0 ([#10640](https://github.com/mdn/yari/issues/10640)) ([fc9bcec](https://github.com/mdn/yari/commit/fc9bcece20e5878cb2190a03304de1d69e4e6c3e)) +* **deps:** bump @mdn/browser-compat-data from 5.5.12 to 5.5.13 ([#10642](https://github.com/mdn/yari/issues/10642)) ([bce0c1f](https://github.com/mdn/yari/commit/bce0c1fde52e6b17ac8ccb922d3bdabeedc861d9)) +* **deps:** bump the dependencies group in /deployer with 2 updates ([#10637](https://github.com/mdn/yari/issues/10637)) ([2493ab5](https://github.com/mdn/yari/commit/2493ab5129a07d91c9d73c842be6d77dc2aa0223)) +* **deps:** bump the dependencies group in /testing/integration with 1 update ([#10635](https://github.com/mdn/yari/issues/10635)) ([be0f9eb](https://github.com/mdn/yari/commit/be0f9eb2cfb06623bbdb51a79247089a23527fef)) +* **deps:** bump the sentry group with 2 updates ([#10636](https://github.com/mdn/yari/issues/10636)) ([8b8d421](https://github.com/mdn/yari/commit/8b8d421d5778d4d87344ebdb0d38560772180d98)) +* **macro:** Add ko DOMAttributeMethods ([9658fca](https://github.com/mdn/yari/commit/9658fcaba5bd7a7ecae28eb5129d9171c70e9d16)) +* **macros/DOMAttributeMethods:** add ko locale ([#10502](https://github.com/mdn/yari/issues/10502)) ([9658fca](https://github.com/mdn/yari/commit/9658fcaba5bd7a7ecae28eb5129d9171c70e9d16)) + +## [2.42.0](https://github.com/mdn/yari/compare/v2.41.0...v2.42.0) (2024-03-01) + + +### Features + +* **ai-help:** index short_title ([#10579](https://github.com/mdn/yari/issues/10579)) ([6939552](https://github.com/mdn/yari/commit/69395528f0943a99cc0fd033407b72830fb58f4f)) +* **ai-help:** show canned answer without sources for off-topic questions ([#10575](https://github.com/mdn/yari/issues/10575)) ([fcd236a](https://github.com/mdn/yari/commit/fcd236a8565e506ae255483984315b81950d738d)) + + +### Bug Fixes + +* **ai-help:** hide "Stop answering" before we respond ([#10530](https://github.com/mdn/yari/issues/10530)) ([ad5f5a4](https://github.com/mdn/yari/commit/ad5f5a44dc0ce4285bb6c0471f89fa5b566235a2)) +* **ai-help:** refetch quota after an ai error ([#10615](https://github.com/mdn/yari/issues/10615)) ([aa6b141](https://github.com/mdn/yari/commit/aa6b141a34e0542ee458ed0aeffcc3c434801188)) +* **ai-help:** remove decorative images from a11y tree ([#10520](https://github.com/mdn/yari/issues/10520)) ([575420c](https://github.com/mdn/yari/commit/575420cf6100a94e3263d9834652a255660d9d1a)) +* **build:** check for bad_src flaws in markdown files ([#8133](https://github.com/mdn/yari/issues/8133)) ([a76cc0e](https://github.com/mdn/yari/commit/a76cc0e2c43463b5bed3d48d0d0af94a9bbabc47)) +* **modal:** make close button visible ([#10604](https://github.com/mdn/yari/issues/10604)) ([2e06a1a](https://github.com/mdn/yari/commit/2e06a1ad8adc5d97dc1d8b264ad06bd3f3cdcd36)) + + +### Enhancements + +* **ai-help:** disable top banner if quota banner is visible ([#10532](https://github.com/mdn/yari/issues/10532)) ([0b03586](https://github.com/mdn/yari/commit/0b03586af5d87eb86f2301c6309ed01c7c970250)) +* **ai-help:** improve stopped state ([#10580](https://github.com/mdn/yari/issues/10580)) ([8c988be](https://github.com/mdn/yari/commit/8c988be94b8e89d26c0a847a3f98d443b7ab0421)) +* **build/spas:** allow yarn dev without internet if DEV_MODE is enabled ([#10533](https://github.com/mdn/yari/issues/10533)) ([78a9500](https://github.com/mdn/yari/commit/78a95005b171b67dca006a51c2e54c245d281a95)) + + +### Miscellaneous + +* **deps-dev:** bump @babel/core from 7.23.9 to 7.24.0 ([#10621](https://github.com/mdn/yari/issues/10621)) ([514592d](https://github.com/mdn/yari/commit/514592d2cf4381811bee58abc095a8026ff55c10)) +* **deps-dev:** bump @babel/preset-env from 7.23.9 to 7.24.0 ([#10619](https://github.com/mdn/yari/issues/10619)) ([0fc068f](https://github.com/mdn/yari/commit/0fc068f84de542231ff50a1f1b28feff6f9e1a0a)) +* **deps-dev:** bump postcss-loader from 8.1.0 to 8.1.1 ([#10620](https://github.com/mdn/yari/issues/10620)) ([266d4d8](https://github.com/mdn/yari/commit/266d4d82ddd1a8f5214d081c6fa763f46d3b75d7)) +* **deps-dev:** bump the types group with 1 update ([#10627](https://github.com/mdn/yari/issues/10627)) ([27ea44f](https://github.com/mdn/yari/commit/27ea44fbad8e30194d8e36c04bbf01bb265fb68e)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.35 to 2.7.36 in /client/pwa ([#10623](https://github.com/mdn/yari/issues/10623)) ([aa34dab](https://github.com/mdn/yari/commit/aa34dabf46529798152e5c7869097d6fea0372a7)) +* **deps:** bump @webref/css from 6.12.0 to 6.12.1 ([#10622](https://github.com/mdn/yari/issues/10622)) ([4f68cf5](https://github.com/mdn/yari/commit/4f68cf545249e3800a3d8e05644fb4be441eb895)) +* **deps:** bump express from 4.18.2 to 4.18.3 ([#10628](https://github.com/mdn/yari/issues/10628)) ([368c2c4](https://github.com/mdn/yari/commit/368c2c40d229e5c6cd2261633e6cfadb7495f101)) +* **deps:** bump openai from 4.28.0 to 4.28.4 ([#10618](https://github.com/mdn/yari/issues/10618)) ([2873cd9](https://github.com/mdn/yari/commit/2873cd9e83052b587a4dc430781a2374517e21bd)) +* **deps:** bump sse.js from 2.2.0 to 2.3.0 ([#10631](https://github.com/mdn/yari/issues/10631)) ([4b89823](https://github.com/mdn/yari/commit/4b898230f7a66296c51da3b697de04264614ff49)) +* **deps:** bump the sentry group with 2 updates ([#10626](https://github.com/mdn/yari/issues/10626)) ([5bd14de](https://github.com/mdn/yari/commit/5bd14de55ea0e3b95ae7505e81e83570ed9dbd06)) +* **deps:** bump web-specs from 3.3.1 to 3.4.0 ([#10629](https://github.com/mdn/yari/issues/10629)) ([e9a2722](https://github.com/mdn/yari/commit/e9a272284bc04227be3566e8af0ad0b44af70f1e)) +* **featured-articles:** update links for 2024 Q1 ([#10613](https://github.com/mdn/yari/issues/10613)) ([4725d59](https://github.com/mdn/yari/commit/4725d59fe89060595b83f4554d37da3ef24e3977)) +* **footer:** replace Twitter with X logo ([#10438](https://github.com/mdn/yari/issues/10438)) ([a940648](https://github.com/mdn/yari/commit/a94064884b5027b43035450ab6bacd8232d29fbc)) +* **macros/CSSRef:** add Containment guides ([#10611](https://github.com/mdn/yari/issues/10611)) ([c207fcc](https://github.com/mdn/yari/commit/c207fcce4016beaa40f612871ab1458de0499db3)) + +## [2.41.0](https://github.com/mdn/yari/compare/v2.40.0...v2.41.0) (2024-02-28) + + +### Features + +* **macros/MDNSidebar:** add Feature status page ([#10409](https://github.com/mdn/yari/issues/10409)) ([a3f8d7e](https://github.com/mdn/yari/commit/a3f8d7e373b203f646f67776d81c34febec05cd7)) + + +### Bug Fixes + +* **curriculum:** fix feedback changes ([#10610](https://github.com/mdn/yari/issues/10610)) ([5cd436c](https://github.com/mdn/yari/commit/5cd436c9a1b7465d2e9dc60994c500fb070be352)) + + +### Miscellaneous + +* **deps-dev:** bump @playwright/test from 1.41.2 to 1.42.0 ([#10607](https://github.com/mdn/yari/issues/10607)) ([2392be0](https://github.com/mdn/yari/commit/2392be0e1328db6f6dfad9746f23cef857d241a1)) +* **deps-dev:** bump mini-css-extract-plugin from 2.8.0 to 2.8.1 ([#10606](https://github.com/mdn/yari/issues/10606)) ([967fdc5](https://github.com/mdn/yari/commit/967fdc5772b8acdb006fdff00f5bbd29e4c6a319)) +* **deps:** bump mdn-data from 2.4.1 to 2.4.2 ([#10605](https://github.com/mdn/yari/issues/10605)) ([39ea592](https://github.com/mdn/yari/commit/39ea5924a4f1abe4f420f02aab38a3676d2c1f62)) +* **macros/PreviousMenuNext:** add zh translation ([#10603](https://github.com/mdn/yari/issues/10603)) ([1751cc1](https://github.com/mdn/yari/commit/1751cc1aa75b859fd668c32b5dca35d85d323878)) + +## [2.40.0](https://github.com/mdn/yari/compare/v2.39.5...v2.40.0) (2024-02-27) + + +### Features + +* **curriculum:** integrate MDN Curriculum ([#10433](https://github.com/mdn/yari/issues/10433)) ([5fd4800](https://github.com/mdn/yari/commit/5fd48005e3d9cac2ff0cb821eb69242fffcc5ce4)) + + +### Bug Fixes + +* **ai-help:** improve generation error message ([#10424](https://github.com/mdn/yari/issues/10424)) ([f1c13d8](https://github.com/mdn/yari/commit/f1c13d8afd87f3741ce53df101be27d79700799e)) +* **build:** add CURRICULUM_ROOT to prod ([b189a17](https://github.com/mdn/yari/commit/b189a17a1b049a2bd87233a530fad24d51674c34)) +* **curriculum:** add CURRICULUM_ROOT ([#10602](https://github.com/mdn/yari/issues/10602)) ([b189a17](https://github.com/mdn/yari/commit/b189a17a1b049a2bd87233a530fad24d51674c34)) + + +### Miscellaneous + +* **deps-dev:** bump html-validate from 8.11.0 to 8.11.1 ([#10599](https://github.com/mdn/yari/issues/10599)) ([3032272](https://github.com/mdn/yari/commit/30322723f1ef0a72462ee395aa5cecdfc8d04dc2)) +* **deps-dev:** bump the types group with 1 update ([#10596](https://github.com/mdn/yari/issues/10596)) ([67f06c6](https://github.com/mdn/yari/commit/67f06c6abcbf70afa486db5909627102e1143485)) +* **deps-dev:** bump typescript-eslint from 7.0.2 to 7.1.0 ([#10598](https://github.com/mdn/yari/issues/10598)) ([ec31aab](https://github.com/mdn/yari/commit/ec31aab383104378441a4a5c21b294bd589888e5)) +* **deps:** bump @mdn/browser-compat-data from 5.5.11 to 5.5.12 ([#10597](https://github.com/mdn/yari/issues/10597)) ([7678024](https://github.com/mdn/yari/commit/7678024a37cc93a3eaa74188e19df7d52b2db4e6)) +* **deps:** bump @stripe/stripe-js from 3.0.5 to 3.0.6 ([#10600](https://github.com/mdn/yari/issues/10600)) ([715be74](https://github.com/mdn/yari/commit/715be74b7abe5cf19abb09f96d1a981b75dc0703)) +* **deps:** bump the sentry group with 2 updates ([#10595](https://github.com/mdn/yari/issues/10595)) ([a2a1f1b](https://github.com/mdn/yari/commit/a2a1f1b1ebbe6e25d4601603c1abe4dceb15b879)) + +## [2.39.5](https://github.com/mdn/yari/compare/v2.39.4...v2.39.5) (2024-02-26) + + +### Miscellaneous + +* **deps-dev:** bump @typescript-eslint/* from 5.62.0 to 7.0.2 ([#10592](https://github.com/mdn/yari/issues/10592)) ([e9e1932](https://github.com/mdn/yari/commit/e9e19321f3e999feb0c23fe0ef015131b75abf68)) +* **deps-dev:** bump eslint from 8.56.0 to 8.57.0 ([#10588](https://github.com/mdn/yari/issues/10588)) ([6e46748](https://github.com/mdn/yari/commit/6e46748bab07a0b39f8b686640203a4f0c369738)) +* **deps-dev:** bump eslint-plugin-jsx-a11y from 6.7.1 to 6.8.0 ([#9929](https://github.com/mdn/yari/issues/9929)) ([367f373](https://github.com/mdn/yari/commit/367f37392a2cab4d32f013a8d5b59b2df5f8579d)) +* **deps-dev:** bump fork-ts-checker-webpack-plugin from 6.5.0 to 9.0.2 ([#10591](https://github.com/mdn/yari/issues/10591)) ([0117ac1](https://github.com/mdn/yari/commit/0117ac173c4c32155ad168c45b0a50306259af20)) +* **deps-dev:** bump html-validate from 8.10.0 to 8.11.0 ([#10584](https://github.com/mdn/yari/issues/10584)) ([5cd05b4](https://github.com/mdn/yari/commit/5cd05b4237d4d063fb4877502cdd2c9c28b6fd9a)) +* **deps-dev:** bump html-validate from 8.9.1 to 8.10.0 ([#10569](https://github.com/mdn/yari/issues/10569)) ([daa4ef2](https://github.com/mdn/yari/commit/daa4ef28b9f5546c482d1cc0efbfe25c0a142045)) +* **deps-dev:** bump peggy from 3.0.2 to 4.0.0 ([#10516](https://github.com/mdn/yari/issues/10516)) ([bad77c6](https://github.com/mdn/yari/commit/bad77c63eb99fc5fb2461e35bf1b70e6eab24ce7)) +* **deps-dev:** bump peggy from 4.0.0 to 4.0.2 ([#10594](https://github.com/mdn/yari/issues/10594)) ([349a46a](https://github.com/mdn/yari/commit/349a46a26c79d41b3f27ad6cb53c22b5b9356a68)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.4.11 to 2.4.12 ([#10578](https://github.com/mdn/yari/issues/10578)) ([9a7fc22](https://github.com/mdn/yari/commit/9a7fc22252c8b1d784d04e0dff618d8ec46b13c1)) +* **deps-dev:** bump the types group with 1 update ([#10577](https://github.com/mdn/yari/issues/10577)) ([950a0b1](https://github.com/mdn/yari/commit/950a0b182dfe05affdb5d7d92da6875492f49eb1)) +* **deps-dev:** bump typescript from 5.1.6 to 5.3.3 ([#10147](https://github.com/mdn/yari/issues/10147)) ([640513a](https://github.com/mdn/yari/commit/640513a2ce14bf4ef72dea707941b16dcdc4bcae)) +* **deps-dev:** bump webpack-dev-server from 4.15.1 to 5.0.2 ([#10543](https://github.com/mdn/yari/issues/10543)) ([4c8bbf7](https://github.com/mdn/yari/commit/4c8bbf78e7e399fb3cc0546a31fa10fb0170b813)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.34 to 2.7.35 in /client/pwa ([#10583](https://github.com/mdn/yari/issues/10583)) ([2ec94d5](https://github.com/mdn/yari/commit/2ec94d5782fa175100ee17423d574e3ff4a8ed58)) +* **deps:** bump @mozilla/glean from 2.0.5 to 4.0.0 ([#10383](https://github.com/mdn/yari/issues/10383)) ([8f04cd7](https://github.com/mdn/yari/commit/8f04cd78ec22c4e0266d77e5ba2b9075f72ce116)) +* **deps:** bump @stripe/stripe-js from 2.4.0 to 3.0.5 ([#10570](https://github.com/mdn/yari/issues/10570)) ([c76d886](https://github.com/mdn/yari/commit/c76d886719d515611ef597016f2e4b03cf30d96e)) +* **deps:** bump @webref/css from 6.11.2 to 6.12.0 ([#10585](https://github.com/mdn/yari/issues/10585)) ([5fb4e32](https://github.com/mdn/yari/commit/5fb4e32fff73e2f80236b34f98633cab01576dc7)) +* **deps:** bump mdn-data from 2.4.0 to 2.4.1 ([#10586](https://github.com/mdn/yari/issues/10586)) ([0e6ef4c](https://github.com/mdn/yari/commit/0e6ef4c8032f5e8eb9904adc34a03a3df36a9328)) +* **deps:** bump open from 10.0.3 to 10.0.4 ([#10587](https://github.com/mdn/yari/issues/10587)) ([39a28c4](https://github.com/mdn/yari/commit/39a28c418ee8a3ff30b5f22c270d2a358e621733)) +* **deps:** bump the dependencies group in /deployer with 2 updates ([#10581](https://github.com/mdn/yari/issues/10581)) ([4a2fffe](https://github.com/mdn/yari/commit/4a2fffe67b008b248bfb72f1aefa889609e031a2)) +* **deps:** bump the dependencies group in /testing/integration with 1 update ([#10582](https://github.com/mdn/yari/issues/10582)) ([81c193c](https://github.com/mdn/yari/commit/81c193c433b914ef1ff28eed915a19eacfe59994)) +* **deps:** bump the sentry group with 2 updates ([#10576](https://github.com/mdn/yari/issues/10576)) ([bb90578](https://github.com/mdn/yari/commit/bb90578608ef0a1f207fae98202be40c285ef3ca)) +* **deps:** bump web-specs from 3.3.0 to 3.3.1 ([#10590](https://github.com/mdn/yari/issues/10590)) ([5f35595](https://github.com/mdn/yari/commit/5f35595bb7d4ba0f632b84237e4c24258b4ee058)) +* **macros/Firefox_for_developers:** remove the parameter and add zh-CN translation ([#10034](https://github.com/mdn/yari/issues/10034)) ([c8c3908](https://github.com/mdn/yari/commit/c8c39081c3d7cbd98e4c12e66e11d3d6a4fef1f9)) +* **macros:** mark DOMAttributeMethods as deprecated ([#10529](https://github.com/mdn/yari/issues/10529)) ([006eb85](https://github.com/mdn/yari/commit/006eb85729f34721eea92e5f2146f83dd5c37438)) + +## [2.39.4](https://github.com/mdn/yari/compare/v2.39.3...v2.39.4) (2024-02-21) + + +### Bug Fixes + +* **ai-help:** send correct context when editing question ([#10511](https://github.com/mdn/yari/issues/10511)) ([c49c125](https://github.com/mdn/yari/commit/c49c125e3cd217595095d5a2c755a6535ead43b7)) +* **bcd:** re-surface "see bug xxxxx" notes ([#10549](https://github.com/mdn/yari/issues/10549)) ([6da4660](https://github.com/mdn/yari/commit/6da4660634350f39e3adfa0afcf15e1fcf838bc1)) +* locale missing page - no data due to missing await ([#10550](https://github.com/mdn/yari/issues/10550)) ([d022ba5](https://github.com/mdn/yari/commit/d022ba56efbbacdc302996991e2c50ed0cb077d9)) + + +### Miscellaneous + +* **ai-help:** update Usage Guidance copy ([#10531](https://github.com/mdn/yari/issues/10531)) ([475fe4e](https://github.com/mdn/yari/commit/475fe4e26ec5d4e65243bbc84dff10d753f51c04)) +* **build:** remove the translation_of metadata ([#10037](https://github.com/mdn/yari/issues/10037)) ([e457ab8](https://github.com/mdn/yari/commit/e457ab8bee5c90d743d226e7a713f51d4b2cf9b4)) +* **deps-dev:** bump @swc/core from 1.4.1 to 1.4.2 ([#10547](https://github.com/mdn/yari/issues/10547)) ([ee212ec](https://github.com/mdn/yari/commit/ee212ecc1f48aed98a2ba5fd292765b84f67ab04)) +* **deps-dev:** bump browserslist from 4.22.3 to 4.23.0 ([#10526](https://github.com/mdn/yari/issues/10526)) ([7bf19e8](https://github.com/mdn/yari/commit/7bf19e80d7f5150be919b5e529cdfe5fcd41c19c)) +* **deps-dev:** bump eslint-plugin-jest from 27.8.0 to 27.9.0 ([#10544](https://github.com/mdn/yari/issues/10544)) ([5e74f17](https://github.com/mdn/yari/commit/5e74f17be451042495b705a73f3ed0e19e0d41d3)) +* **deps-dev:** bump postcss-preset-env from 9.3.0 to 9.4.0 ([#10555](https://github.com/mdn/yari/issues/10555)) ([aa8384d](https://github.com/mdn/yari/commit/aa8384d6c48eb19e3d321abcb05ec38db5f458a8)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.4.10 to 2.4.11 ([#10534](https://github.com/mdn/yari/issues/10534)) ([e14678d](https://github.com/mdn/yari/commit/e14678d3b32a7c22bde1f2d1a8a294077a6c3644)) +* **deps-dev:** bump react-router-dom from 6.22.0 to 6.22.1 ([#10546](https://github.com/mdn/yari/issues/10546)) ([5aa121f](https://github.com/mdn/yari/commit/5aa121fa363d14d09ee1b079acf8aa73b704c470)) +* **deps-dev:** bump sass from 1.70.0 to 1.71.0 ([#10536](https://github.com/mdn/yari/issues/10536)) ([b41eac2](https://github.com/mdn/yari/commit/b41eac27929ade4cd85a76a873f24944a005cdb0)) +* **deps-dev:** bump sass from 1.71.0 to 1.71.1 ([#10565](https://github.com/mdn/yari/issues/10565)) ([74c1448](https://github.com/mdn/yari/commit/74c1448abe481aea8ca40b1559c00e8e5410e07c)) +* **deps-dev:** bump sass-loader from 14.1.0 to 14.1.1 ([#10558](https://github.com/mdn/yari/issues/10558)) ([20075de](https://github.com/mdn/yari/commit/20075de977828a2dc4d9a822bef4af6d91f4c924)) +* **deps-dev:** bump swr from 2.2.4 to 2.2.5 ([#10538](https://github.com/mdn/yari/issues/10538)) ([4cc6e36](https://github.com/mdn/yari/commit/4cc6e3688b8ec80e91bc9d15be01c65523e96164)) +* **deps-dev:** bump the types group with 1 update ([#10542](https://github.com/mdn/yari/issues/10542)) ([6b95d7c](https://github.com/mdn/yari/commit/6b95d7ce3980ae332d75da3058b9f275f5e187f6)) +* **deps-dev:** bump the types group with 1 update ([#10552](https://github.com/mdn/yari/issues/10552)) ([f553b79](https://github.com/mdn/yari/commit/f553b79b3645c620ae69cad6b0ad8b61a2bc6b84)) +* **deps-dev:** bump webpack from 5.90.1 to 5.90.2 ([#10537](https://github.com/mdn/yari/issues/10537)) ([c976a8c](https://github.com/mdn/yari/commit/c976a8c6a46adfee78c42b6a960d157d4f3f7b08)) +* **deps-dev:** bump webpack from 5.90.1 to 5.90.2 in /client/pwa ([#10539](https://github.com/mdn/yari/issues/10539)) ([b485006](https://github.com/mdn/yari/commit/b485006bdae9dcddb7fbef4feac33b74d16063e9)) +* **deps-dev:** bump webpack from 5.90.2 to 5.90.3 ([#10553](https://github.com/mdn/yari/issues/10553)) ([52b9751](https://github.com/mdn/yari/commit/52b97510c87e23d611611e3e7e6d0d002b5435e2)) +* **deps-dev:** bump webpack from 5.90.2 to 5.90.3 in /client/pwa ([#10551](https://github.com/mdn/yari/issues/10551)) ([c326deb](https://github.com/mdn/yari/commit/c326debb90ad94e768ff4bd4dbc491cf36f9cc99)) +* **deps:** bump @codemirror/lang-javascript from 6.2.1 to 6.2.2 ([#10563](https://github.com/mdn/yari/issues/10563)) ([7052044](https://github.com/mdn/yari/commit/7052044cbcd0b3cbcd40003776327277ebc3a287)) +* **deps:** bump @codemirror/state from 6.4.0 to 6.4.1 ([#10559](https://github.com/mdn/yari/issues/10559)) ([5a8debb](https://github.com/mdn/yari/commit/5a8debb77a0eb010a040ba726a0181dd88f4544b)) +* **deps:** bump @mdn/browser-compat-data from 5.5.10 to 5.5.11 ([#10566](https://github.com/mdn/yari/issues/10566)) ([ab04c11](https://github.com/mdn/yari/commit/ab04c1104bd988f3a8a86bcfbd8b09e85254f929)) +* **deps:** bump @webref/css from 6.11.1 to 6.11.2 ([#10525](https://github.com/mdn/yari/issues/10525)) ([0759aff](https://github.com/mdn/yari/commit/0759aff7075500244df4a2dc335c9a0797d0325f)) +* **deps:** bump cryptography from 42.0.0 to 42.0.2 in /deployer ([#10540](https://github.com/mdn/yari/issues/10540)) ([dbd7f1c](https://github.com/mdn/yari/commit/dbd7f1ccf8cba54510a5288465b799771c789aea)) +* **deps:** bump cryptography from 42.0.2 to 42.0.4 in /deployer ([#10568](https://github.com/mdn/yari/issues/10568)) ([da1b839](https://github.com/mdn/yari/commit/da1b8398dd624400c6e72c30e199afaa053ada34)) +* **deps:** bump dotenv from 16.4.4 to 16.4.5 ([#10554](https://github.com/mdn/yari/issues/10554)) ([e42b736](https://github.com/mdn/yari/commit/e42b73663541d7ee707eebcd8bb8567f0556e9b3)) +* **deps:** bump inquirer from 9.2.14 to 9.2.15 ([#10556](https://github.com/mdn/yari/issues/10556)) ([cc69204](https://github.com/mdn/yari/commit/cc692045f5533ade6974da4f86cd1b8dc2b637b6)) +* **deps:** bump the dependencies group in /deployer with 3 updates ([#10541](https://github.com/mdn/yari/issues/10541)) ([50d18a1](https://github.com/mdn/yari/commit/50d18a10fe2c8eb0901df1950fe385056929f030)) +* **deps:** bump the dependencies group in /testing/integration with 2 updates ([#10548](https://github.com/mdn/yari/issues/10548)) ([2f4a09d](https://github.com/mdn/yari/commit/2f4a09d0021817207f1dc3a1dea368267ab49d28)) +* **deps:** bump the sentry group with 2 updates ([#10523](https://github.com/mdn/yari/issues/10523)) ([5edaf3c](https://github.com/mdn/yari/commit/5edaf3c2ae90085c343aca7917e6632630415bbb)) +* **deps:** bump the sentry group with 2 updates ([#10561](https://github.com/mdn/yari/issues/10561)) ([a8be690](https://github.com/mdn/yari/commit/a8be690e6f6802d8fcae9c336fdc4ee026d7e858)) +* **deps:** bump web-specs from 3.0.0 to 3.1.0 ([#10524](https://github.com/mdn/yari/issues/10524)) ([5aee08a](https://github.com/mdn/yari/commit/5aee08ae17675693180f4a0c0803c7d173e682ef)) +* **deps:** bump web-specs from 3.1.0 to 3.3.0 ([#10557](https://github.com/mdn/yari/issues/10557)) ([d4cd051](https://github.com/mdn/yari/commit/d4cd0514c8f8a25f7df11f7e0ca91c52a4006c16)) + +## [2.39.3](https://github.com/mdn/yari/compare/v2.39.2...v2.39.3) (2024-02-14) + + +### Bug Fixes + +* **macros/CSS_Ref:** fix special cases ([#10241](https://github.com/mdn/yari/issues/10241)) ([3cc3204](https://github.com/mdn/yari/commit/3cc32040d7ee25f8ab2dc4702fdf3e5362722455)) + + +### Miscellaneous + +* **deps-dev:** bump @swc/core from 1.4.0 to 1.4.1 ([#10508](https://github.com/mdn/yari/issues/10508)) ([52e49e2](https://github.com/mdn/yari/commit/52e49e27c26c0c63d3ba8f40215eb6e5790d9fbc)) +* **deps-dev:** bump diff from 5.1.0 to 5.2.0 ([#10509](https://github.com/mdn/yari/issues/10509)) ([7937e60](https://github.com/mdn/yari/commit/7937e604466f5ef83ca2fca77e0c604b47d767de)) +* **deps-dev:** bump eslint-plugin-jest from 27.6.3 to 27.8.0 ([#10513](https://github.com/mdn/yari/issues/10513)) ([f56840a](https://github.com/mdn/yari/commit/f56840ad4c6a8a41615a68618372f0c14fb85c9c)) +* **deps-dev:** bump husky from 9.0.10 to 9.0.11 ([#10518](https://github.com/mdn/yari/issues/10518)) ([02d1832](https://github.com/mdn/yari/commit/02d1832d8e43456f6d949b7aa961a63a2a093087)) +* **deps:** bump dotenv from 16.4.1 to 16.4.2 ([#10499](https://github.com/mdn/yari/issues/10499)) ([e3e3f72](https://github.com/mdn/yari/commit/e3e3f72952ca793478cb173a1c32792f28781178)) +* **deps:** bump dotenv from 16.4.2 to 16.4.3 ([#10510](https://github.com/mdn/yari/issues/10510)) ([7a76dab](https://github.com/mdn/yari/commit/7a76dabf0984c0ffa48954b9c4a5629f4bb07a4d)) +* **deps:** bump dotenv from 16.4.3 to 16.4.4 ([#10515](https://github.com/mdn/yari/issues/10515)) ([1493eb6](https://github.com/mdn/yari/commit/1493eb68dac74f83bfa297c9c9f1f1c9f3e11ae0)) +* **deps:** bump openai from 4.27.0 to 4.28.0 ([#10505](https://github.com/mdn/yari/issues/10505)) ([7fc08f4](https://github.com/mdn/yari/commit/7fc08f4a130403f0a2d2ad1e6ec70d836ddce936)) +* **deps:** bump pgvector from 0.1.7 to 0.1.8 ([#10498](https://github.com/mdn/yari/issues/10498)) ([bb646a5](https://github.com/mdn/yari/commit/bb646a578a5c706e835bab7dcfaaa73ab557fad9)) +* **deps:** bump pytest from 7.4.4 to 8.0.0 in /testing/integration ([#10500](https://github.com/mdn/yari/issues/10500)) ([524b202](https://github.com/mdn/yari/commit/524b2023d8c88f09596ac9d362c95a2b48a23a9c)) +* **deps:** bump the dependencies group in /deployer with 2 updates ([#10501](https://github.com/mdn/yari/issues/10501)) ([06cd562](https://github.com/mdn/yari/commit/06cd562a408dbfa8b0f45e096fd6f6ee9579b336)) +* **deps:** bump the sentry group with 2 updates ([#10512](https://github.com/mdn/yari/issues/10512)) ([46820bc](https://github.com/mdn/yari/commit/46820bcdbca00e4005ea80982876744ead07895d)) +* **deps:** bump web-specs from 2.79.0 to 3.0.0 ([#10478](https://github.com/mdn/yari/issues/10478)) ([ce83ddc](https://github.com/mdn/yari/commit/ce83ddcd242989ae79a8acc8fa39dec56cd2bd0e)) +* **macros:** Mark 'unimplemented_inline' as deprecated ([#10486](https://github.com/mdn/yari/issues/10486)) ([9d136b0](https://github.com/mdn/yari/commit/9d136b07dceb4418fefd621a79235858d422e61a)) + +## [2.39.2](https://github.com/mdn/yari/compare/v2.39.1...v2.39.2) (2024-02-09) + + +### Bug Fixes + +* **baseline:** blocklist some bcd keys from input-event ([#10493](https://github.com/mdn/yari/issues/10493)) ([c2a9ffc](https://github.com/mdn/yari/commit/c2a9ffc81b0265a2d58f8c8fbd62f01e94c987d5)) + + +### Miscellaneous + +* **ai-help:** remove old index script ([#10484](https://github.com/mdn/yari/issues/10484)) ([bacf525](https://github.com/mdn/yari/commit/bacf52544c1529b5f640837a740038c8011ccd6b)) +* **deps-dev:** bump postcss from 8.4.34 to 8.4.35 ([#10481](https://github.com/mdn/yari/issues/10481)) ([1140572](https://github.com/mdn/yari/commit/1140572b0228774efeac6bac5b4b75531ddd3800)) +* **deps-dev:** bump the types group with 1 update ([#10480](https://github.com/mdn/yari/issues/10480)) ([8b573ed](https://github.com/mdn/yari/commit/8b573edc92c78c45333b533f67b281a5d3ccb3e0)) +* **deps:** bump @mdn/browser-compat-data from 5.5.9 to 5.5.10 ([#10489](https://github.com/mdn/yari/issues/10489)) ([4cab20b](https://github.com/mdn/yari/commit/4cab20b642906a289d7c6fba19bd8a2219c63a5e)) +* **deps:** bump @webref/css from 6.11.0 to 6.11.1 ([#10491](https://github.com/mdn/yari/issues/10491)) ([e047988](https://github.com/mdn/yari/commit/e047988aa60c515ff18ad47d10e02b2c5ab76136)) +* **deps:** bump dexie from 3.2.4 to 3.2.5 ([#10490](https://github.com/mdn/yari/issues/10490)) ([a38c494](https://github.com/mdn/yari/commit/a38c4944308962ea18256e18a69a63b80a27a6eb)) +* **deps:** bump dexie from 3.2.4 to 3.2.5 in /client/pwa ([#10488](https://github.com/mdn/yari/issues/10488)) ([5253e44](https://github.com/mdn/yari/commit/5253e44ec8c4282480e09b00aa69cefaeb656592)) +* **deps:** bump openai from 4.26.1 to 4.27.0 ([#10492](https://github.com/mdn/yari/issues/10492)) ([2ef9ba3](https://github.com/mdn/yari/commit/2ef9ba302eb7da6c273f3a84ebeaf383fd75aa59)) + +## [2.39.1](https://github.com/mdn/yari/compare/v2.39.0...v2.39.1) (2024-02-07) + + +### Bug Fixes + +* **baseline:** add custom elements group to blocklist ([#10479](https://github.com/mdn/yari/issues/10479)) ([7991c74](https://github.com/mdn/yari/commit/7991c746feb1ea965b36ddbf6dc5855f767b8974)) +* **release-please:** disable include-component-in-tag ([#10417](https://github.com/mdn/yari/issues/10417)) ([22e2aae](https://github.com/mdn/yari/commit/22e2aae7e329609109668b37d1aa455626aa7a07)) +* **release-please:** specify last-release-sha ([#10419](https://github.com/mdn/yari/issues/10419)) ([215e4ed](https://github.com/mdn/yari/commit/215e4eda3f05e8e96808ecfa359dc88b10c5c7a3)) +* **workflows:** cache `@vscode/ripgrep` bin ([#10456](https://github.com/mdn/yari/issues/10456)) ([4a54637](https://github.com/mdn/yari/commit/4a54637a9f0ecfa4c943f309571f163e44b8f32d)) +* **workflows:** cache `@vscode/ripgrep` bin in test job ([#10471](https://github.com/mdn/yari/issues/10471)) ([5a0cec4](https://github.com/mdn/yari/commit/5a0cec440911fd873a1be08f60bf3a94dbca87f6)) + + +### Miscellaneous + +* **deps-dev:** bump @babel/eslint-parser from 7.23.9 to 7.23.10 ([#10436](https://github.com/mdn/yari/issues/10436)) ([6f900cd](https://github.com/mdn/yari/commit/6f900cdfb3d5613bd4eee89e4d0f13fac6e94de2)) +* **deps-dev:** bump @playwright/test from 1.41.1 to 1.41.2 ([#10446](https://github.com/mdn/yari/issues/10446)) ([6195f40](https://github.com/mdn/yari/commit/6195f406b6ed4a534b950ee445c83f263dd5aee0)) +* **deps-dev:** bump @swc/core from 1.3.107 to 1.4.0 ([#10453](https://github.com/mdn/yari/issues/10453)) ([bb360ed](https://github.com/mdn/yari/commit/bb360ed78507c1870c6f9fc30b718f7790a71d21)) +* **deps-dev:** bump @testing-library/react from 14.1.2 to 14.2.0 ([#10429](https://github.com/mdn/yari/issues/10429)) ([77c7c2c](https://github.com/mdn/yari/commit/77c7c2cf64e964aa8fae08e14c77ec9eed2d1ed2)) +* **deps-dev:** bump @testing-library/react from 14.2.0 to 14.2.1 ([#10441](https://github.com/mdn/yari/issues/10441)) ([91a1411](https://github.com/mdn/yari/commit/91a141150a7f4a725e3f1ae7fb70e8c013ac7a79)) +* **deps-dev:** bump css-loader from 6.9.1 to 6.10.0 ([#10426](https://github.com/mdn/yari/issues/10426)) ([01c70c8](https://github.com/mdn/yari/commit/01c70c898f9ac5cbd68c5d9df1b4c498510574f3)) +* **deps-dev:** bump dependencies of react-dev-utils ([#10461](https://github.com/mdn/yari/issues/10461)) ([4458db7](https://github.com/mdn/yari/commit/4458db795dd54facbc01b0ced6fcb5b511e83d8e)) +* **deps-dev:** bump eslint-plugin-unicorn from 50.0.1 to 51.0.0 ([#10469](https://github.com/mdn/yari/issues/10469)) ([b123234](https://github.com/mdn/yari/commit/b1232340c226d7587e0e5badedd5465fe2d5a57d)) +* **deps-dev:** bump eslint-plugin-unicorn from 51.0.0 to 51.0.1 ([#10477](https://github.com/mdn/yari/issues/10477)) ([9024655](https://github.com/mdn/yari/commit/9024655d87520b9aa45069fd329a3debf2d8eb1d)) +* **deps-dev:** bump husky from 9.0.6 to 9.0.7 ([#10422](https://github.com/mdn/yari/issues/10422)) ([7bbda7d](https://github.com/mdn/yari/commit/7bbda7d38d9a2872be8ddb8708b2b999372d4ee9)) +* **deps-dev:** bump husky from 9.0.7 to 9.0.10 ([#10445](https://github.com/mdn/yari/issues/10445)) ([f347bfc](https://github.com/mdn/yari/commit/f347bfc33bd48795b0e3760c3937b084189c1809)) +* **deps-dev:** bump mini-css-extract-plugin from 2.7.7 to 2.8.0 ([#10447](https://github.com/mdn/yari/issues/10447)) ([01f9593](https://github.com/mdn/yari/commit/01f95931097ff88890d248fc6fca55a4f586b246)) +* **deps-dev:** bump postcss from 8.4.33 to 8.4.34 ([#10467](https://github.com/mdn/yari/issues/10467)) ([4a662bb](https://github.com/mdn/yari/commit/4a662bbc1844bdf651d3fb93bd4dd6b05be3af3a)) +* **deps-dev:** bump postcss-loader from 8.0.0 to 8.1.0 ([#10431](https://github.com/mdn/yari/issues/10431)) ([62f0adb](https://github.com/mdn/yari/commit/62f0adb3afe3038fbcb13232e3b58f8e0208d3dc)) +* **deps-dev:** bump prettier from 3.2.4 to 3.2.5 ([#10455](https://github.com/mdn/yari/issues/10455)) ([67fdc91](https://github.com/mdn/yari/commit/67fdc91b248923662df9a36c00c6ce30de928dc7)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.4.9 to 2.4.10 ([#10427](https://github.com/mdn/yari/issues/10427)) ([58dcdf0](https://github.com/mdn/yari/commit/58dcdf0bddab403dbdd8d0383533484d873434b6)) +* **deps-dev:** bump react-router-dom from 6.21.3 to 6.22.0 ([#10444](https://github.com/mdn/yari/issues/10444)) ([31b94c6](https://github.com/mdn/yari/commit/31b94c6cf039439ecf0deb4306c4c5eadb72d311)) +* **deps-dev:** bump sass-loader from 14.0.0 to 14.1.0 ([#10428](https://github.com/mdn/yari/issues/10428)) ([ab2dbf6](https://github.com/mdn/yari/commit/ab2dbf69bc0f48294d0c1716d020e9270c401e45)) +* **deps-dev:** bump semver from 7.5.4 to 7.6.0 ([#10468](https://github.com/mdn/yari/issues/10468)) ([ce512f7](https://github.com/mdn/yari/commit/ce512f7762f8757de3a60b8f566a82de2ccaf9f2)) +* **deps-dev:** bump the types group with 1 update ([#10435](https://github.com/mdn/yari/issues/10435)) ([d88a713](https://github.com/mdn/yari/commit/d88a7139e033bc7909d4f35f1b56417c49f537fe)) +* **deps-dev:** bump the types group with 1 update ([#10440](https://github.com/mdn/yari/issues/10440)) ([8915582](https://github.com/mdn/yari/commit/89155828cfa519aa6e424780b546122b551554dd)) +* **deps-dev:** bump the types group with 1 update ([#10458](https://github.com/mdn/yari/issues/10458)) ([f0e7510](https://github.com/mdn/yari/commit/f0e7510ff30029e613f518b5bc25587782350177)) +* **deps-dev:** bump the types group with 1 update ([#10465](https://github.com/mdn/yari/issues/10465)) ([a94587d](https://github.com/mdn/yari/commit/a94587deaf827bd06be63d7216e08885c35efebc)) +* **deps-dev:** bump webpack from 5.90.0 to 5.90.1 ([#10442](https://github.com/mdn/yari/issues/10442)) ([f5cb5ea](https://github.com/mdn/yari/commit/f5cb5eab5a08c981743bc4bc4d52407c7efe22ba)) +* **deps-dev:** bump webpack from 5.90.0 to 5.90.1 in /client/pwa ([#10448](https://github.com/mdn/yari/issues/10448)) ([7476828](https://github.com/mdn/yari/commit/7476828393d6a085bc87b1708c954d5ceed04634)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.33 to 2.7.34 in /client/pwa ([#10420](https://github.com/mdn/yari/issues/10420)) ([4f84e9a](https://github.com/mdn/yari/commit/4f84e9af605a2ad03bb34eecccaf2635e02a8a1c)) +* **deps:** bump @mdn/browser-compat-data from 5.5.8 to 5.5.9 ([#10430](https://github.com/mdn/yari/issues/10430)) ([6c262f5](https://github.com/mdn/yari/commit/6c262f5574599addc1db45e24e70777e250e7884)) +* **deps:** bump @webref/css from 6.10.3 to 6.10.4 ([#10423](https://github.com/mdn/yari/issues/10423)) ([4a663e1](https://github.com/mdn/yari/commit/4a663e173d419dd509dd24335f998a713586f472)) +* **deps:** bump @webref/css from 6.10.4 to 6.11.0 ([#10432](https://github.com/mdn/yari/issues/10432)) ([db014f7](https://github.com/mdn/yari/commit/db014f71b16a2cb29aa6937b4d2dda3427a54b1f)) +* **deps:** bump actions/cache from 3 to 4 ([#10470](https://github.com/mdn/yari/issues/10470)) ([7389cc9](https://github.com/mdn/yari/commit/7389cc9d195fb5794b7f144189b4b1b94d7b6686)) +* **deps:** bump aws-actions/configure-aws-credentials from 4.0.1 to 4.0.2 ([#10475](https://github.com/mdn/yari/issues/10475)) ([e4b1549](https://github.com/mdn/yari/commit/e4b1549b3f23ebb82a65555ca58e45c583f2256b)) +* **deps:** bump cryptography from 41.0.6 to 42.0.0 in /deployer ([#10459](https://github.com/mdn/yari/issues/10459)) ([0e6bcdd](https://github.com/mdn/yari/commit/0e6bcdda0c55c440b5c7ee8ef493d4bed37a4561)) +* **deps:** bump fast-xml-parser from 4.1.3 to 4.3.4 ([#10460](https://github.com/mdn/yari/issues/10460)) ([610e106](https://github.com/mdn/yari/commit/610e106d981d781e776dc5502d59d7b2bd4566df)) +* **deps:** bump follow-redirects from 1.15.2 to 1.15.5 in /cloud-function ([#10464](https://github.com/mdn/yari/issues/10464)) ([8540bac](https://github.com/mdn/yari/commit/8540bacbb06ab0f6259cb5ea35d757926f5ac9e8)) +* **deps:** bump inquirer from 9.2.13 to 9.2.14 ([#10452](https://github.com/mdn/yari/issues/10452)) ([7cc2d4c](https://github.com/mdn/yari/commit/7cc2d4cd8a0b3dcbf4bba765d8307492eccbc393)) +* **deps:** bump is-svg v4 from 4.3.2 to 4.4.0 ([#10473](https://github.com/mdn/yari/issues/10473)) ([b5d8087](https://github.com/mdn/yari/commit/b5d80878520434e30b0ffcd058aea5e44bac2818)) +* **deps:** bump mdast-util-phrasing from 4.0.0 to 4.1.0 ([#10437](https://github.com/mdn/yari/issues/10437)) ([3dc7055](https://github.com/mdn/yari/commit/3dc7055d95947ab99b1d8100f90ff5e20ea7732e)) +* **deps:** bump openai from 4.26.0 to 4.26.1 ([#10454](https://github.com/mdn/yari/issues/10454)) ([a4138bd](https://github.com/mdn/yari/commit/a4138bdf682523e619e445ee6ffa624b81ce3a2d)) +* **deps:** bump semver v5 + v7 in /cloud-function ([#10474](https://github.com/mdn/yari/issues/10474)) ([a8e78ac](https://github.com/mdn/yari/commit/a8e78ac7ba3fe3d87eff849dde2ce2821585bb31)) +* **deps:** bump semver v5 from 5.7.1 to 5.7.2 ([#10472](https://github.com/mdn/yari/issues/10472)) ([5553816](https://github.com/mdn/yari/commit/555381642c82bba9fbfd54ae242712b7307ff24a)) +* **deps:** bump the dependencies group in /deployer with 1 update ([#10449](https://github.com/mdn/yari/issues/10449)) ([40e256d](https://github.com/mdn/yari/commit/40e256d4c068992294da6543a7486735012f6866)) +* **deps:** bump the dependencies group in /testing/integration with 1 update ([#10450](https://github.com/mdn/yari/issues/10450)) ([3d2e7ad](https://github.com/mdn/yari/commit/3d2e7ad4debcc05e98793b665ea55b3bfd34604d)) +* **deps:** bump the sentry group with 2 updates ([#10425](https://github.com/mdn/yari/issues/10425)) ([35adc26](https://github.com/mdn/yari/commit/35adc260ea472427eb028f7568629754aa7c5cb8)) +* **deps:** bump the sentry group with 2 updates ([#10476](https://github.com/mdn/yari/issues/10476)) ([76ffc20](https://github.com/mdn/yari/commit/76ffc20b31b0e9519c066b7cf68e61d7c711897e)) +* **deps:** bump web-specs from 2.77.0 to 2.78.0 ([#10421](https://github.com/mdn/yari/issues/10421)) ([bc7c5f6](https://github.com/mdn/yari/commit/bc7c5f69b27a01913644d38863e4db3575f80b70)) +* **deps:** bump web-specs from 2.78.0 to 2.79.0 ([#10466](https://github.com/mdn/yari/issues/10466)) ([542ad82](https://github.com/mdn/yari/commit/542ad82ce46fcd7563611ea02041e37f0776bdf3)) +* **deps:** resolve http-cache-semantics to >=4.1.1 ([#10462](https://github.com/mdn/yari/issues/10462)) ([85f7368](https://github.com/mdn/yari/commit/85f7368eea5d68e00bc8108a6606af6296d01f7f)) +* **deps:** resolve semver-regex to ^3.1.4 ([#10463](https://github.com/mdn/yari/issues/10463)) ([62eb5f5](https://github.com/mdn/yari/commit/62eb5f5db35b731e7b73a6a92240bd456066fb0d)) + +## [2.39.0](https://github.com/mdn/yari/compare/yari-v2.38.4...yari-v2.39.0) (2024-01-30) + + +### Features + +* **ai-help:** index content as markdown ([#10330](https://github.com/mdn/yari/issues/10330)) ([337d0b1](https://github.com/mdn/yari/commit/337d0b154b476e17d73a0e0a866f645add31bd37)) +* **build:** add Macro render report ([#10372](https://github.com/mdn/yari/issues/10372)) ([6ce14ab](https://github.com/mdn/yari/commit/6ce14aba7ffe037acab128af812cd153fe560d1b)) +* **macro/MDNSidebar:** rewrite macro + add missing pages ([#10329](https://github.com/mdn/yari/issues/10329)) ([35d448e](https://github.com/mdn/yari/commit/35d448e9c90a0eb8dee4f79472f3dca825a318e0)) +* **scripts:** use pg instead of supabase ([#10337](https://github.com/mdn/yari/issues/10337)) ([5ce3a65](https://github.com/mdn/yari/commit/5ce3a65e320b6005973be804c597283b2ff002f2)) + + +### Bug Fixes + +* **ai-help:** don't allow empty questions ([#10344](https://github.com/mdn/yari/issues/10344)) ([6cd6d4a](https://github.com/mdn/yari/commit/6cd6d4ad4e1879df199df6b6066da2b1479b96d5)) +* **ai-help:** example header highlighting ([#10366](https://github.com/mdn/yari/issues/10366)) ([bb5ef9a](https://github.com/mdn/yari/commit/bb5ef9a4e89c630c25e9d0e0fc15534f1129ea6d)) +* **bcd:** link to pages in same locale ([#10373](https://github.com/mdn/yari/issues/10373)) ([4ac6fdf](https://github.com/mdn/yari/commit/4ac6fdf6316e54119c2c90623305a58271604a39)) +* **macros/CSSSyntax:** cache parsed webref data ([#10225](https://github.com/mdn/yari/issues/10225)) ([078fa86](https://github.com/mdn/yari/commit/078fa8620ca65c7aba6b67d81a8f50de6d9854d1)) +* **plus:** scroll to anchor hook ([#10364](https://github.com/mdn/yari/issues/10364)) ([20db7d1](https://github.com/mdn/yari/commit/20db7d137a70f92b6d826eec306d873521b5e175)) +* **release-please:** fix config structure ([#10412](https://github.com/mdn/yari/issues/10412)) ([ac63c63](https://github.com/mdn/yari/commit/ac63c63e9970bb099470e369e6775546111a6f10)) +* **release-please:** move bootstrap-sha to config ([#10415](https://github.com/mdn/yari/issues/10415)) ([105d9f3](https://github.com/mdn/yari/commit/105d9f3c2f59f84679e084a863372fe0bc3db46c)) +* **release-please:** move release-type/changelog-sections to config file ([#10411](https://github.com/mdn/yari/issues/10411)) ([ea3a849](https://github.com/mdn/yari/commit/ea3a84900fa58e664048cc8b10d78a5d8c2d18a0)) +* **release-please:** specify last release ([#10416](https://github.com/mdn/yari/issues/10416)) ([e92d309](https://github.com/mdn/yari/commit/e92d309da051be77792dd0f66b7792946771fce0)) +* **release-please:** specify last-release-sha ([#10413](https://github.com/mdn/yari/issues/10413)) ([f8dc664](https://github.com/mdn/yari/commit/f8dc6644fa5310f821352fbe5dfbc7ae696bdd25)) +* **release-please:** use bootstrap-sha instead of last-release-sha ([#10414](https://github.com/mdn/yari/issues/10414)) ([1d86b6c](https://github.com/mdn/yari/commit/1d86b6cbe55254aa36a100cbf7f10d69ed514074)) + + +### Miscellaneous + +* **deps-dev:** bump @babel/core from 7.23.7 to 7.23.9 ([#10396](https://github.com/mdn/yari/issues/10396)) ([5cb1e98](https://github.com/mdn/yari/commit/5cb1e98bfc16539dd7fca02ec1503d16cf9f366c)) +* **deps-dev:** bump @babel/eslint-parser from 7.23.3 to 7.23.9 ([#10394](https://github.com/mdn/yari/issues/10394)) ([29b1d16](https://github.com/mdn/yari/commit/29b1d16a6d8c038d9bf44604c0e3e2961a0746ab)) +* **deps-dev:** bump @babel/preset-env from 7.23.8 to 7.23.9 ([#10390](https://github.com/mdn/yari/issues/10390)) ([afc1c1c](https://github.com/mdn/yari/commit/afc1c1c144715053bb6ba72e5377cc315a7546fc)) +* **deps-dev:** bump @swc/core from 1.3.105 to 1.3.106 ([#10379](https://github.com/mdn/yari/issues/10379)) ([1e54143](https://github.com/mdn/yari/commit/1e54143912b057bbc4b95376bb73f90ee1565887)) +* **deps-dev:** bump @swc/core from 1.3.106 to 1.3.107 ([#10406](https://github.com/mdn/yari/issues/10406)) ([e48be08](https://github.com/mdn/yari/commit/e48be086a2b3093e6324d70ab7c4d9bcd028ea2a)) +* **deps-dev:** bump black from 23.12.1 to 24.1.1 in /deployer ([#10402](https://github.com/mdn/yari/issues/10402)) ([d8f0ed2](https://github.com/mdn/yari/commit/d8f0ed21b7904c7ba727d413a2642f982f28a7de)) +* **deps-dev:** bump black from 23.12.1 to 24.1.1 in /testing/integration ([#10405](https://github.com/mdn/yari/issues/10405)) ([18992be](https://github.com/mdn/yari/commit/18992bee14820e0d18c7c1b9829f6a4880869199)) +* **deps-dev:** bump browserslist from 4.22.2 to 4.22.3 ([#10403](https://github.com/mdn/yari/issues/10403)) ([6da95a8](https://github.com/mdn/yari/commit/6da95a8f246366800bd882cf67631b2d05acfc2a)) +* **deps-dev:** bump flake8 from 6.1.0 to 7.0.0 in /testing/integration ([#10279](https://github.com/mdn/yari/issues/10279)) ([9838d6c](https://github.com/mdn/yari/commit/9838d6ca60bd72e0c32cff9f5ffa3546de3fc3d4)) +* **deps-dev:** bump husky from 8.0.3 to 9.0.6 ([#10391](https://github.com/mdn/yari/issues/10391)) ([a9292ce](https://github.com/mdn/yari/commit/a9292ce818e96b8e3fe93102984f171f6208df03)) +* **deps-dev:** bump pytest from 7.4.4 to 8.0.0 in /deployer ([#10401](https://github.com/mdn/yari/issues/10401)) ([4c8065b](https://github.com/mdn/yari/commit/4c8065be6a4d65a5ae843e3f73a5712bf539fb83)) +* **deps-dev:** bump source-map-loader from 4.0.2 to 5.0.0 ([#10328](https://github.com/mdn/yari/issues/10328)) ([7df9c6d](https://github.com/mdn/yari/commit/7df9c6d49a34d9074e3c5b6f0cba379801a59169)) +* **deps-dev:** bump webpack from 5.89.0 to 5.90.0 ([#10384](https://github.com/mdn/yari/issues/10384)) ([6370f06](https://github.com/mdn/yari/commit/6370f06303fa4d4235b851c52c20a901657d1107)) +* **deps-dev:** bump webpack from 5.89.0 to 5.90.0 in /client/pwa ([#10377](https://github.com/mdn/yari/issues/10377)) ([c4b1804](https://github.com/mdn/yari/commit/c4b180423909f780d2d9d2434e54cdc912446d9c)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.32 to 2.7.33 in /client/pwa ([#10399](https://github.com/mdn/yari/issues/10399)) ([54a2131](https://github.com/mdn/yari/commit/54a213196f88bd213ef104e63c74b6f4ccd252ef)) +* **deps:** bump @codemirror/lang-html from 6.4.7 to 6.4.8 ([#10367](https://github.com/mdn/yari/issues/10367)) ([5d88e37](https://github.com/mdn/yari/commit/5d88e37965f51bd0355e761161ecb9a9091a21f1)) +* **deps:** bump @codemirror/state from 6.3.3 to 6.4.0 ([#10244](https://github.com/mdn/yari/issues/10244)) ([1ddda23](https://github.com/mdn/yari/commit/1ddda23ada96976e23157141ecda95f586a35125)) +* **deps:** bump @fast-csv/parse from 4.3.6 to 5.0.0 ([#10320](https://github.com/mdn/yari/issues/10320)) ([04ec2ae](https://github.com/mdn/yari/commit/04ec2ae9a9f6cfeecdc66136399de1a1178b2fa5)) +* **deps:** bump @mdn/browser-compat-data from 5.5.7 to 5.5.8 ([#10395](https://github.com/mdn/yari/issues/10395)) ([0b032f1](https://github.com/mdn/yari/commit/0b032f1b6bce86b087d048913c64e5f33f79be87)) +* **deps:** bump @stripe/stripe-js from 2.3.0 to 2.4.0 ([#10368](https://github.com/mdn/yari/issues/10368)) ([c280d08](https://github.com/mdn/yari/commit/c280d08d311477bbadf34d4fa14ddefd974bc8b1)) +* **deps:** bump @webref/css from 6.10.2 to 6.10.3 ([#10381](https://github.com/mdn/yari/issues/10381)) ([ea944c6](https://github.com/mdn/yari/commit/ea944c6b48e0ec2522999ffa04e0bf8d4cc950c1)) +* **deps:** bump actions/cache from 3 to 4 ([#10339](https://github.com/mdn/yari/issues/10339)) ([698495f](https://github.com/mdn/yari/commit/698495f063cea3373f96144157bcecf8b9438de5)) +* **deps:** bump actions/labeler from 4.3.0 to 5.0.0 ([#10130](https://github.com/mdn/yari/issues/10130)) ([0e93b7e](https://github.com/mdn/yari/commit/0e93b7e8427fe8848ed8accc26ad94cc0f7d79a2)) +* **deps:** bump dotenv from 16.3.2 to 16.4.0 ([#10376](https://github.com/mdn/yari/issues/10376)) ([5d11e87](https://github.com/mdn/yari/commit/5d11e87b971867f85f7a125c16bb197f71ddb9ff)) +* **deps:** bump dotenv from 16.4.0 to 16.4.1 ([#10380](https://github.com/mdn/yari/issues/10380)) ([b912c14](https://github.com/mdn/yari/commit/b912c14674c9512681bf9aa6891c32eb3cea33f5)) +* **deps:** bump google-github-actions/release-please-action from 3 to 4 ([#10122](https://github.com/mdn/yari/issues/10122)) ([c9f1522](https://github.com/mdn/yari/commit/c9f15220c62aee979a39e446890f8426263b5198)) +* **deps:** bump inquirer from 9.2.12 to 9.2.13 ([#10404](https://github.com/mdn/yari/issues/10404)) ([fb2275f](https://github.com/mdn/yari/commit/fb2275fd6df3c43bc6cb2c49e55c52cb37f80dfd)) +* **deps:** bump loglevel from 1.8.1 to 1.9.1 ([#10389](https://github.com/mdn/yari/issues/10389)) ([471c5ca](https://github.com/mdn/yari/commit/471c5caca659dbd53f8339834961ad8dbdcfa828)) +* **deps:** bump lru-cache from 10.1.0 to 10.2.0 ([#10392](https://github.com/mdn/yari/issues/10392)) ([d433d64](https://github.com/mdn/yari/commit/d433d647e26f1a79c99c75372042cdd7d5857aba)) +* **deps:** bump mdn-data from 2.3.5 to 2.4.0 ([#10369](https://github.com/mdn/yari/issues/10369)) ([9bce11b](https://github.com/mdn/yari/commit/9bce11b6c50db97bde9afb87b34454c58dd3067a)) +* **deps:** bump open from 9.1.0 to 10.0.3 ([#10285](https://github.com/mdn/yari/issues/10285)) ([8b18d51](https://github.com/mdn/yari/commit/8b18d515d0785fd1949d7797457476b654d65175)) +* **deps:** bump openai from 4.25.0 to 4.26.0 ([#10397](https://github.com/mdn/yari/issues/10397)) ([082492b](https://github.com/mdn/yari/commit/082492b66d3f81019f6ca65039273710eb06b8bf)) +* **deps:** bump the dependencies group in /deployer with 2 updates ([#10400](https://github.com/mdn/yari/issues/10400)) ([40f4b21](https://github.com/mdn/yari/commit/40f4b21d6403bf04d11ddf5fe86527989a9415b9)) +* **deps:** bump the sentry group with 2 updates ([#10375](https://github.com/mdn/yari/issues/10375)) ([229b574](https://github.com/mdn/yari/commit/229b574f6ccb893957806d53bbf2a1b587e8a902)) +* **deps:** bump the sentry group with 2 updates ([#10378](https://github.com/mdn/yari/issues/10378)) ([c3a4ed7](https://github.com/mdn/yari/commit/c3a4ed71c624d23fb540464901c96e6fd05da71e)) +* **deps:** bump the sentry group with 2 updates ([#10388](https://github.com/mdn/yari/issues/10388)) ([fd50495](https://github.com/mdn/yari/commit/fd5049509319fae83e9361aa05f56e3f4bb46711)) +* **deps:** bump web-specs from 2.76.0 to 2.77.0 ([#10393](https://github.com/mdn/yari/issues/10393)) ([1b91378](https://github.com/mdn/yari/commit/1b913780596f9d59177fb27f1df66680f5c7b2bf)) +* **macros/CSSRef:** add media queries printing guide ([#10386](https://github.com/mdn/yari/issues/10386)) ([7034c60](https://github.com/mdn/yari/commit/7034c60ce418ec0e3bb2650621a61eb98453be67)) +* **macros/CSSSyntax:** add zh-CN translation ([#10275](https://github.com/mdn/yari/issues/10275)) ([402a365](https://github.com/mdn/yari/commit/402a3659aeebce6ed90d90c0e602a76191256715)) +* **macros/secureContext_inline:** replace notecard with badge ([#10214](https://github.com/mdn/yari/issues/10214)) ([285b449](https://github.com/mdn/yari/commit/285b4493ee836a7393e8f90627959a4e7e4bdca8)) +* **workflows:** use default runners ([#10387](https://github.com/mdn/yari/issues/10387)) ([82a01fa](https://github.com/mdn/yari/commit/82a01fa410e4244b3908b23d88d9fd0ea1d22d54)) + +## [2.38.4](https://github.com/mdn/yari/compare/v2.38.3...v2.38.4) (2024-01-22) + + +### Bug Fixes + +* **baseline:** hide status from async-clipboard subfeatures ([#10345](https://github.com/mdn/yari/issues/10345)) ([f1eb599](https://github.com/mdn/yari/commit/f1eb599f4bf5332ac312f4b7a234f4067e9c6aac)) +* **history:** show outline on focus-visible ([#10343](https://github.com/mdn/yari/issues/10343)) ([c658fd6](https://github.com/mdn/yari/commit/c658fd6198846f9c9d902fcfc1d0a25e8f1d12cb)) +* **playground:** only show for js,css,html ([#10338](https://github.com/mdn/yari/issues/10338)) ([f7144aa](https://github.com/mdn/yari/commit/f7144aab81709f31e05558978c5c8dbff68f572b)) + + +### Miscellaneous + +* **deps-dev:** bump @playwright/test from 1.40.1 to 1.41.0 ([#10331](https://github.com/mdn/yari/issues/10331)) ([5af3a5b](https://github.com/mdn/yari/commit/5af3a5be05191082d9c71685d79a7ee2e57a1e6a)) +* **deps-dev:** bump @playwright/test from 1.41.0 to 1.41.1 ([#10361](https://github.com/mdn/yari/issues/10361)) ([e07a25c](https://github.com/mdn/yari/commit/e07a25c3f1afd4169facd163dda464acb8d80fde)) +* **deps-dev:** bump @swc/core from 1.3.103 to 1.3.104 ([#10334](https://github.com/mdn/yari/issues/10334)) ([d91fe5b](https://github.com/mdn/yari/commit/d91fe5ba3874f3b8cce640046d1aa7e197a42226)) +* **deps-dev:** bump @swc/core from 1.3.104 to 1.3.105 ([#10358](https://github.com/mdn/yari/issues/10358)) ([18f095c](https://github.com/mdn/yari/commit/18f095c195929a04ad9339d1da8a8b2f91b9d95f)) +* **deps-dev:** bump css-loader from 6.9.0 to 6.9.1 ([#10347](https://github.com/mdn/yari/issues/10347)) ([9e7d950](https://github.com/mdn/yari/commit/9e7d95005e407acc6164262fc8693f4a1eeba250)) +* **deps-dev:** bump css-minimizer-webpack-plugin from 5.0.1 to 6.0.0 ([#10340](https://github.com/mdn/yari/issues/10340)) ([9772d1b](https://github.com/mdn/yari/commit/9772d1b0d92b9e4453be5351903be0da073a18ae)) +* **deps-dev:** bump eslint-plugin-unicorn from 49.0.0 to 50.0.1 ([#10217](https://github.com/mdn/yari/issues/10217)) ([ab19458](https://github.com/mdn/yari/commit/ab1945880be6b2ded7dd884f120654c8eb5dab4b)) +* **deps-dev:** bump flake8 from 6.1.0 to 7.0.0 in /deployer ([#10325](https://github.com/mdn/yari/issues/10325)) ([4939357](https://github.com/mdn/yari/commit/49393574bbcd6746cc6fa4d9c0457caa7a9f66d7)) +* **deps-dev:** bump jsdom from 23.2.0 to 24.0.0 ([#10357](https://github.com/mdn/yari/issues/10357)) ([fe5a032](https://github.com/mdn/yari/commit/fe5a032e0c4edc908aa60f9243119ad856a9c130)) +* **deps-dev:** bump postcss-loader from 7.3.4 to 8.0.0 ([#10332](https://github.com/mdn/yari/issues/10332)) ([7553f38](https://github.com/mdn/yari/commit/7553f38e3ca015ecb4c5b48372f3186f0cf25acd)) +* **deps-dev:** bump prettier from 3.1.1 to 3.2.4 ([#10333](https://github.com/mdn/yari/issues/10333)) ([f6bf57d](https://github.com/mdn/yari/commit/f6bf57d6778824177aacd8cbce0e67b042d0e56b)) +* **deps-dev:** bump react-router-dom from 6.21.2 to 6.21.3 ([#10349](https://github.com/mdn/yari/issues/10349)) ([bdc9602](https://github.com/mdn/yari/commit/bdc960246b4e2768be676b2676797791fc5bf5f6)) +* **deps-dev:** bump sass from 1.69.7 to 1.70.0 ([#10341](https://github.com/mdn/yari/issues/10341)) ([e7a7528](https://github.com/mdn/yari/commit/e7a75282a5fb7968085a46f217882c7df3eeaaf3)) +* **deps-dev:** bump sass-loader from 13.3.3 to 14.0.0 ([#10327](https://github.com/mdn/yari/issues/10327)) ([2123098](https://github.com/mdn/yari/commit/2123098c1b7e86d7821780cf43b6cc18b1eb8528)) +* **deps-dev:** bump style-dictionary from 3.9.1 to 3.9.2 ([#10342](https://github.com/mdn/yari/issues/10342)) ([7bb1681](https://github.com/mdn/yari/commit/7bb168180156b8c9f55575de7a8829a82de915dc)) +* **deps-dev:** bump ts-jest from 29.1.1 to 29.1.2 ([#10354](https://github.com/mdn/yari/issues/10354)) ([374d73c](https://github.com/mdn/yari/commit/374d73caddf76704e0c12f3f377fcd18de7a10a0)) +* **deps:** bump @mdn/browser-compat-data from 5.5.6 to 5.5.7 ([#10360](https://github.com/mdn/yari/issues/10360)) ([78b6215](https://github.com/mdn/yari/commit/78b62153acb7148dd0ff2ffc6b4c61c57e173c76)) +* **deps:** bump dotenv from 16.3.1 to 16.3.2 ([#10356](https://github.com/mdn/yari/issues/10356)) ([0fa6b6c](https://github.com/mdn/yari/commit/0fa6b6c8bf1bc214b1a75e8d65b7399ff107058d)) +* **deps:** bump file-type from 18.7.0 to 19.0.0 ([#10282](https://github.com/mdn/yari/issues/10282)) ([bb838e6](https://github.com/mdn/yari/commit/bb838e6f99a471c04fb2623245bb4978dcaceff7)) +* **deps:** bump mdn-data from 2.3.4 to 2.3.5 ([#10355](https://github.com/mdn/yari/issues/10355)) ([98c014d](https://github.com/mdn/yari/commit/98c014dfce75175fbaf6162ae3561ce96b01ae48)) +* **deps:** bump openai from 4.24.7 to 4.25.0 ([#10359](https://github.com/mdn/yari/issues/10359)) ([d55b32f](https://github.com/mdn/yari/commit/d55b32fc01511aeadf68bec17528af2ee9c8862a)) +* **deps:** bump the dependencies group in /deployer with 2 updates ([#10362](https://github.com/mdn/yari/issues/10362)) ([2caccc2](https://github.com/mdn/yari/commit/2caccc2ddbdd8208e27bff318aab3c33bae1c45a)) +* **deps:** bump the sentry group with 2 updates ([#10353](https://github.com/mdn/yari/issues/10353)) ([8cd6012](https://github.com/mdn/yari/commit/8cd6012b18ca8f3f5637737da2692bc02576ead2)) +* **macros/CSSRef:** update zh-CN translation ([#10229](https://github.com/mdn/yari/issues/10229)) ([44178d6](https://github.com/mdn/yari/commit/44178d6ed3486be24a8eba570365919483139389)) + +## [2.38.3](https://github.com/mdn/yari/compare/v2.38.2...v2.38.3) (2024-01-15) + + +### Bug Fixes + +* **macro:** update CSSRef macro ([#10303](https://github.com/mdn/yari/issues/10303)) ([5572142](https://github.com/mdn/yari/commit/5572142be83bffd3dffc7d81704ed0d86ec5cb4d)) +* **pong:** gcp sends gb cc rather than uk ([#10286](https://github.com/mdn/yari/issues/10286)) ([d65f8d0](https://github.com/mdn/yari/commit/d65f8d0dfc8b1431f4452741aca0a6945a7b1285)) + + +### Miscellaneous + +* **deps-dev:** bump @babel/core from 7.23.6 to 7.23.7 ([#10255](https://github.com/mdn/yari/issues/10255)) ([06b8410](https://github.com/mdn/yari/commit/06b841016bb2df1f2d804ef1abcd21227d2a59dc)) +* **deps-dev:** bump @babel/preset-env from 7.23.6 to 7.23.7 ([#10254](https://github.com/mdn/yari/issues/10254)) ([9867a4a](https://github.com/mdn/yari/commit/9867a4adc35d30b827b0cbfdddca89ceaac0b1aa)) +* **deps-dev:** bump @babel/preset-env from 7.23.7 to 7.23.8 ([#10292](https://github.com/mdn/yari/issues/10292)) ([54c242d](https://github.com/mdn/yari/commit/54c242d59a2b253a8e758f3476568b6ded95fa67)) +* **deps-dev:** bump @supabase/supabase-js from 2.39.1 to 2.39.2 ([#10258](https://github.com/mdn/yari/issues/10258)) ([f8770d0](https://github.com/mdn/yari/commit/f8770d0c2c294703544b199984a6904797c3162c)) +* **deps-dev:** bump @supabase/supabase-js from 2.39.2 to 2.39.3 ([#10311](https://github.com/mdn/yari/issues/10311)) ([3a1906f](https://github.com/mdn/yari/commit/3a1906f6d6f45c649d568b1d86516c5f72aeb8a3)) +* **deps-dev:** bump @swc/core from 1.3.101 to 1.3.102 ([#10253](https://github.com/mdn/yari/issues/10253)) ([0eff5c1](https://github.com/mdn/yari/commit/0eff5c11ee15c9dff042116471a4981b17d998bb)) +* **deps-dev:** bump @swc/core from 1.3.102 to 1.3.103 ([#10319](https://github.com/mdn/yari/issues/10319)) ([c0fc334](https://github.com/mdn/yari/commit/c0fc33409ef304ba6d29f4159dd538970e8bb272)) +* **deps-dev:** bump css-loader from 6.8.1 to 6.9.0 ([#10296](https://github.com/mdn/yari/issues/10296)) ([c7d6903](https://github.com/mdn/yari/commit/c7d6903416b317feacc47ba90980a3c9f97e4d04)) +* **deps-dev:** bump eslint-plugin-jest from 27.6.0 to 27.6.1 ([#10260](https://github.com/mdn/yari/issues/10260)) ([bda844f](https://github.com/mdn/yari/commit/bda844f7dd745f7e3ac15736c3c884fc26507464)) +* **deps-dev:** bump eslint-plugin-jest from 27.6.1 to 27.6.2 ([#10301](https://github.com/mdn/yari/issues/10301)) ([89b21af](https://github.com/mdn/yari/commit/89b21af95f3a3fd0f5caf2bb899f358b8b8143b2)) +* **deps-dev:** bump eslint-plugin-jest from 27.6.2 to 27.6.3 ([#10323](https://github.com/mdn/yari/issues/10323)) ([a6a3df4](https://github.com/mdn/yari/commit/a6a3df49178b8f6a07c2fae94e434fe521dddd04)) +* **deps-dev:** bump eslint-plugin-n from 16.4.0 to 16.5.0 ([#10208](https://github.com/mdn/yari/issues/10208)) ([71f358a](https://github.com/mdn/yari/commit/71f358a0cf7a88beff95eb2d58f393fb1a31b150)) +* **deps-dev:** bump eslint-plugin-n from 16.5.0 to 16.6.0 ([#10249](https://github.com/mdn/yari/issues/10249)) ([0be3709](https://github.com/mdn/yari/commit/0be3709708aab3079f37fc314fb9b70c9b4b1b3d)) +* **deps-dev:** bump eslint-plugin-n from 16.6.0 to 16.6.1 ([#10259](https://github.com/mdn/yari/issues/10259)) ([7e9342e](https://github.com/mdn/yari/commit/7e9342eb7f87c7e9e4a7dfb51efad07db40a81c0)) +* **deps-dev:** bump eslint-plugin-n from 16.6.1 to 16.6.2 ([#10288](https://github.com/mdn/yari/issues/10288)) ([e0ee14f](https://github.com/mdn/yari/commit/e0ee14f2f42f4a62c70cc723bb8cb6e0de201ec7)) +* **deps-dev:** bump html-validate from 8.7.4 to 8.8.0 ([#10233](https://github.com/mdn/yari/issues/10233)) ([6c11359](https://github.com/mdn/yari/commit/6c11359f5b70a42e09544ef4f543943865f0e544)) +* **deps-dev:** bump html-validate from 8.8.0 to 8.9.0 ([#10284](https://github.com/mdn/yari/issues/10284)) ([b2057f3](https://github.com/mdn/yari/commit/b2057f3163891905b72d5539c39161a3aff1177e)) +* **deps-dev:** bump html-validate from 8.9.0 to 8.9.1 ([#10298](https://github.com/mdn/yari/issues/10298)) ([86b99a0](https://github.com/mdn/yari/commit/86b99a03989fb431719b3d526deb603d6e5aa97e)) +* **deps-dev:** bump html-webpack-plugin from 5.5.4 to 5.6.0 ([#10209](https://github.com/mdn/yari/issues/10209)) ([432a25e](https://github.com/mdn/yari/commit/432a25e3724f1ea8dbde6ee942ce322ca38b60a2)) +* **deps-dev:** bump jsdom from 23.0.1 to 23.2.0 ([#10281](https://github.com/mdn/yari/issues/10281)) ([b9a5e06](https://github.com/mdn/yari/commit/b9a5e063dce902ebd67eeda54bbdb01e9421329f)) +* **deps-dev:** bump mdast-util-to-hast from 13.0.2 to 13.1.0 ([#10309](https://github.com/mdn/yari/issues/10309)) ([5376a56](https://github.com/mdn/yari/commit/5376a5683ea632fe5f33bcb247d34240b3e56f71)) +* **deps-dev:** bump mini-css-extract-plugin from 2.7.6 to 2.7.7 ([#10306](https://github.com/mdn/yari/issues/10306)) ([488392a](https://github.com/mdn/yari/commit/488392a7b9746bee56194c7c756c49859464925b)) +* **deps-dev:** bump postcss from 8.4.32 to 8.4.33 ([#10272](https://github.com/mdn/yari/issues/10272)) ([6b54c60](https://github.com/mdn/yari/commit/6b54c603da801cd0abbef4cbdf475084aa146960)) +* **deps-dev:** bump postcss-loader from 7.3.3 to 7.3.4 ([#10237](https://github.com/mdn/yari/issues/10237)) ([86775e7](https://github.com/mdn/yari/commit/86775e708bdc973dc4dac79253e32a728b9440db)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.4.7 to 2.4.8 ([#10236](https://github.com/mdn/yari/issues/10236)) ([a545511](https://github.com/mdn/yari/commit/a545511b8c4b101ab6690166cd35bfbef75d8f2e)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.4.8 to 2.4.9 ([#10271](https://github.com/mdn/yari/issues/10271)) ([938b380](https://github.com/mdn/yari/commit/938b380028647835b1be07fa675a043282877a1e)) +* **deps-dev:** bump react-router-dom from 6.21.0 to 6.21.1 ([#10222](https://github.com/mdn/yari/issues/10222)) ([18942b9](https://github.com/mdn/yari/commit/18942b9905ab306e8c3616f6672ff1d9009a13ba)) +* **deps-dev:** bump react-router-dom from 6.21.1 to 6.21.2 ([#10314](https://github.com/mdn/yari/issues/10314)) ([3a864b9](https://github.com/mdn/yari/commit/3a864b9b5b33557385cf0e3e4770eee37cca6062)) +* **deps-dev:** bump sass from 1.69.5 to 1.69.6 ([#10248](https://github.com/mdn/yari/issues/10248)) ([9903439](https://github.com/mdn/yari/commit/9903439804fcb38ffc24f0585830d1e5f69cebd6)) +* **deps-dev:** bump sass from 1.69.6 to 1.69.7 ([#10265](https://github.com/mdn/yari/issues/10265)) ([9872434](https://github.com/mdn/yari/commit/98724341b689690466949fa07b4d79c95af6c2be)) +* **deps-dev:** bump sass-loader from 13.3.2 to 13.3.3 ([#10230](https://github.com/mdn/yari/issues/10230)) ([9093877](https://github.com/mdn/yari/commit/909387748943476aa5d7a24bbfa2120be2ec5a1d)) +* **deps-dev:** bump source-map-loader from 4.0.1 to 4.0.2 ([#10240](https://github.com/mdn/yari/issues/10240)) ([9be8081](https://github.com/mdn/yari/commit/9be808105ee84ae73d4c73efcb63e6708a953a12)) +* **deps-dev:** bump style-loader from 3.3.3 to 3.3.4 ([#10295](https://github.com/mdn/yari/issues/10295)) ([8df8249](https://github.com/mdn/yari/commit/8df8249d61a5143a052b3ea7d95135f4915d108b)) +* **deps-dev:** bump tailwindcss from 3.3.7 to 3.4.0 ([#10212](https://github.com/mdn/yari/issues/10212)) ([8222708](https://github.com/mdn/yari/commit/82227080b4296ba62191a7fae425e2c41c4436a2)) +* **deps-dev:** bump tailwindcss from 3.4.0 to 3.4.1 ([#10283](https://github.com/mdn/yari/issues/10283)) ([8532390](https://github.com/mdn/yari/commit/8532390ac8761e67505550df69c5574080d08967)) +* **deps-dev:** bump terser-webpack-plugin from 5.3.9 to 5.3.10 ([#10245](https://github.com/mdn/yari/issues/10245)) ([fb4bc6f](https://github.com/mdn/yari/commit/fb4bc6f2bec9287b97a0b04f806cfc1affc278c8)) +* **deps-dev:** bump the types group with 1 update ([#10242](https://github.com/mdn/yari/issues/10242)) ([bc94d85](https://github.com/mdn/yari/commit/bc94d85a654be47567fae8a61ce9f2c9c3e33602)) +* **deps-dev:** bump the types group with 1 update ([#10280](https://github.com/mdn/yari/issues/10280)) ([b7c4ddd](https://github.com/mdn/yari/commit/b7c4ddd4ff0e388e922f887a7b9c8143ad7c3002)) +* **deps-dev:** bump the types group with 1 update ([#10316](https://github.com/mdn/yari/issues/10316)) ([8fc1359](https://github.com/mdn/yari/commit/8fc1359aa1d75a99bca947825d3db22aaec6dbc5)) +* **deps:** bump @mdn/browser-compat-data from 5.5.0 to 5.5.1 ([#10211](https://github.com/mdn/yari/issues/10211)) ([7bf2d1b](https://github.com/mdn/yari/commit/7bf2d1b9ea097bdafae49436d54a9302c881f298)) +* **deps:** bump @mdn/browser-compat-data from 5.5.1 to 5.5.2 ([#10227](https://github.com/mdn/yari/issues/10227)) ([563d3e6](https://github.com/mdn/yari/commit/563d3e6d7b30f7adcc5868bb8edfa4d414d64a73)) +* **deps:** bump @mdn/browser-compat-data from 5.5.2 to 5.5.3 ([#10252](https://github.com/mdn/yari/issues/10252)) ([1b7234f](https://github.com/mdn/yari/commit/1b7234fbb1cbc2a9c746c9428aeafcc0c4506a73)) +* **deps:** bump @mdn/browser-compat-data from 5.5.3 to 5.5.4 ([#10263](https://github.com/mdn/yari/issues/10263)) ([4ef40c6](https://github.com/mdn/yari/commit/4ef40c6cc8de6d1bb46d88033220ca40c1ad99e4)) +* **deps:** bump @mdn/browser-compat-data from 5.5.4 to 5.5.5 ([#10300](https://github.com/mdn/yari/issues/10300)) ([1c07e74](https://github.com/mdn/yari/commit/1c07e74aea2a41651023e046320104c4fc50c1f9)) +* **deps:** bump @mdn/browser-compat-data from 5.5.5 to 5.5.6 ([#10322](https://github.com/mdn/yari/issues/10322)) ([1584887](https://github.com/mdn/yari/commit/158488748d43b8532e95c77c39c50b2530a5660f)) +* **deps:** bump @stripe/stripe-js from 2.2.1 to 2.2.2 ([#10200](https://github.com/mdn/yari/issues/10200)) ([417f3b4](https://github.com/mdn/yari/commit/417f3b41c1b988e449efdddf2de6d7f35e3a1df6)) +* **deps:** bump @stripe/stripe-js from 2.2.2 to 2.3.0 ([#10290](https://github.com/mdn/yari/issues/10290)) ([681b0ee](https://github.com/mdn/yari/commit/681b0ee7f24b70cedc54543fab5d62991947e368)) +* **deps:** bump @webref/css from 6.10.0 to 6.10.1 ([#10220](https://github.com/mdn/yari/issues/10220)) ([a8347b6](https://github.com/mdn/yari/commit/a8347b6557cd7683824e0621e4a2e542fcf9a3d7)) +* **deps:** bump @webref/css from 6.10.1 to 6.10.2 ([#10302](https://github.com/mdn/yari/issues/10302)) ([6536270](https://github.com/mdn/yari/commit/653627037e2562ce50bb3de6b374aad2081fb152)) +* **deps:** bump follow-redirects from 1.15.2 to 1.15.4 ([#10293](https://github.com/mdn/yari/issues/10293)) ([1a79c0c](https://github.com/mdn/yari/commit/1a79c0c3c5f934f7dec91ad51d36c1a61f55744f)) +* **deps:** bump image-size from 1.0.2 to 1.1.0 ([#10247](https://github.com/mdn/yari/issues/10247)) ([863f4d4](https://github.com/mdn/yari/commit/863f4d4043e7a457373bde2fc37b65dbd384d29e)) +* **deps:** bump image-size from 1.1.0 to 1.1.1 ([#10264](https://github.com/mdn/yari/issues/10264)) ([7a2bc60](https://github.com/mdn/yari/commit/7a2bc60f3eca9f463bcd962bc0afdc5d0316d8dc)) +* **deps:** bump mdn-data from 2.3.0 to 2.3.2 ([#10246](https://github.com/mdn/yari/issues/10246)) ([fb40fef](https://github.com/mdn/yari/commit/fb40fef0fc64a9a9a89a648c9342f136684fa09e)) +* **deps:** bump mdn-data from 2.3.2 to 2.3.3 ([#10289](https://github.com/mdn/yari/issues/10289)) ([9249b86](https://github.com/mdn/yari/commit/9249b86f10c24cf0fc8f5f28339c046f1060a598)) +* **deps:** bump mdn-data from 2.3.3 to 2.3.4 ([#10318](https://github.com/mdn/yari/issues/10318)) ([459754c](https://github.com/mdn/yari/commit/459754c2a657c00d17fc65429586a44571d3ac86)) +* **deps:** bump openai from 4.23.0 to 4.24.0 ([#10210](https://github.com/mdn/yari/issues/10210)) ([c16b73d](https://github.com/mdn/yari/commit/c16b73d068ff9f7adf325e294a8eec4045bd726c)) +* **deps:** bump openai from 4.24.0 to 4.24.1 ([#10219](https://github.com/mdn/yari/issues/10219)) ([6e695c0](https://github.com/mdn/yari/commit/6e695c09f072715ff65c07475517e7d2cdfdb6c3)) +* **deps:** bump openai from 4.24.1 to 4.24.2 ([#10291](https://github.com/mdn/yari/issues/10291)) ([5fac284](https://github.com/mdn/yari/commit/5fac2847957028563c58156caabe647ef31846e4)) +* **deps:** bump openai from 4.24.2 to 4.24.3 ([#10308](https://github.com/mdn/yari/issues/10308)) ([e54751c](https://github.com/mdn/yari/commit/e54751c2f4d4c9fcedad54906924f577314c248d)) +* **deps:** bump openai from 4.24.3 to 4.24.4 ([#10313](https://github.com/mdn/yari/issues/10313)) ([227fb65](https://github.com/mdn/yari/commit/227fb6539dfd8db11e24c0ad49dd952338e873ab)) +* **deps:** bump openai from 4.24.4 to 4.24.7 ([#10321](https://github.com/mdn/yari/issues/10321)) ([06d75db](https://github.com/mdn/yari/commit/06d75db54b073d40b3b9ad650284a498b93b1301)) +* **deps:** bump remark-rehype from 11.0.0 to 11.1.0 ([#10307](https://github.com/mdn/yari/issues/10307)) ([3318c7f](https://github.com/mdn/yari/commit/3318c7fc13886e5afbbcb79bc4f9d44b5ecfec45)) +* **deps:** bump sse.js from 2.1.0 to 2.2.0 ([#10299](https://github.com/mdn/yari/issues/10299)) ([8da9563](https://github.com/mdn/yari/commit/8da956377d6b64520d8ddd4e39f03b969fcbff07)) +* **deps:** bump the dependencies group in /deployer with 2 updates ([#10228](https://github.com/mdn/yari/issues/10228)) ([29cc085](https://github.com/mdn/yari/commit/29cc0855e786d6c52ccb940ffffff0de97429701)) +* **deps:** bump the dependencies group in /deployer with 2 updates ([#10278](https://github.com/mdn/yari/issues/10278)) ([7f13c4e](https://github.com/mdn/yari/commit/7f13c4e7a77bb9303fc8f72c6b606f4a5506825b)) +* **deps:** bump the dependencies group in /testing/integration with 2 updates ([#10250](https://github.com/mdn/yari/issues/10250)) ([14c71fd](https://github.com/mdn/yari/commit/14c71fd1d61dc0c0cc9411c987dd98f87a757d28)) +* **deps:** bump the sentry group with 2 updates ([#10207](https://github.com/mdn/yari/issues/10207)) ([11c81e7](https://github.com/mdn/yari/commit/11c81e75e726d8a87c183a12e07dcaadc29b5d9f)) +* **deps:** bump the sentry group with 2 updates ([#10216](https://github.com/mdn/yari/issues/10216)) ([5d59c6b](https://github.com/mdn/yari/commit/5d59c6b3e367e0c3b2058d0294d825a5066d588d)) +* **deps:** bump the sentry group with 2 updates ([#10218](https://github.com/mdn/yari/issues/10218)) ([4203e42](https://github.com/mdn/yari/commit/4203e426658b7c1934056f47781d9f00661c9c87)) +* **deps:** bump the sentry group with 2 updates ([#10270](https://github.com/mdn/yari/issues/10270)) ([c9e12cf](https://github.com/mdn/yari/commit/c9e12cf5b95fb9ef3601f52b70fd5ea72508ccc1)) +* **deps:** bump the sentry group with 2 updates ([#10305](https://github.com/mdn/yari/issues/10305)) ([64ac276](https://github.com/mdn/yari/commit/64ac276449262aa9813c3954e016b30278091267)) +* **deps:** bump web-features from 0.5.0 to 0.5.1 ([#10294](https://github.com/mdn/yari/issues/10294)) ([a62cb27](https://github.com/mdn/yari/commit/a62cb2739821feb129f0d5b6f0c76edeaf3c680f)) +* **deps:** bump web-specs from 2.75.1 to 2.76.0 ([#10232](https://github.com/mdn/yari/issues/10232)) ([3f56dde](https://github.com/mdn/yari/commit/3f56dde92c0999b35cfd43e02ad40d2805ac69a1)) + +## [2.38.2](https://github.com/mdn/yari/compare/v2.38.1...v2.38.2) (2023-12-19) + + +### Bug Fixes + +* **ai-help:** avoid plainHTML for other locales ([#10206](https://github.com/mdn/yari/issues/10206)) ([fa38994](https://github.com/mdn/yari/commit/fa38994b16af3ece7523ac0e6e58b10884d95072)) +* **ai-help:** use GPT-3.5 for free users ([#10205](https://github.com/mdn/yari/issues/10205)) ([23b78d9](https://github.com/mdn/yari/commit/23b78d9a001bb5a50e318cb1c02a3ff695392ebc)) + + +### Miscellaneous + +* **deps-dev:** bump @supabase/supabase-js from 2.39.0 to 2.39.1 ([#10201](https://github.com/mdn/yari/issues/10201)) ([cbe98fe](https://github.com/mdn/yari/commit/cbe98fe00720a7f01004ccbd2ba32c5cc6ff5216)) +* **deps-dev:** bump @swc/core from 1.3.100 to 1.3.101 ([#10196](https://github.com/mdn/yari/issues/10196)) ([24e5d79](https://github.com/mdn/yari/commit/24e5d79c44fcd27d11000d4994161e3fd597a837)) +* **deps-dev:** bump eslint from 8.55.0 to 8.56.0 ([#10195](https://github.com/mdn/yari/issues/10195)) ([f41d7a6](https://github.com/mdn/yari/commit/f41d7a608a61db9fd79e80791ee7de732f9bc203)) +* **deps-dev:** bump eslint-plugin-import from 2.29.0 to 2.29.1 ([#10189](https://github.com/mdn/yari/issues/10189)) ([e7ed9fc](https://github.com/mdn/yari/commit/e7ed9fc91f22653f82a9edcb52350b776d1c47a8)) +* **deps-dev:** bump tailwindcss from 3.3.6 to 3.3.7 ([#10202](https://github.com/mdn/yari/issues/10202)) ([9345064](https://github.com/mdn/yari/commit/9345064f6ad374d6002b5ced25b6a99f71a766b5)) +* **deps-dev:** bump the dependencies group in /testing/integration with 1 update ([#10198](https://github.com/mdn/yari/issues/10198)) ([f91600b](https://github.com/mdn/yari/commit/f91600bfcb262a4b63d1fb2d143a3428d712cf3e)) +* **deps-dev:** bump the types group with 1 update ([#10192](https://github.com/mdn/yari/issues/10192)) ([e48f570](https://github.com/mdn/yari/commit/e48f5700a9a787a174ec5dc758c47f4d4389a725)) +* **deps:** bump @mdn/browser-compat-data from 5.4.5 to 5.5.0 ([#10193](https://github.com/mdn/yari/issues/10193)) ([ad64d39](https://github.com/mdn/yari/commit/ad64d391d36f4ae1cbbd13bea1e517d17800b803)) +* **deps:** bump openai from 4.21.0 to 4.22.0 ([#10190](https://github.com/mdn/yari/issues/10190)) ([e81dedc](https://github.com/mdn/yari/commit/e81dedc1819e9cad504b761e45e1ee94c413f7a8)) +* **deps:** bump openai from 4.22.0 to 4.23.0 ([#10194](https://github.com/mdn/yari/issues/10194)) ([0bc0169](https://github.com/mdn/yari/commit/0bc0169b4d6ab4b4ed563b80977595cbcacfda30)) +* **deps:** bump the dependencies group in /deployer with 2 updates ([#10197](https://github.com/mdn/yari/issues/10197)) ([4913773](https://github.com/mdn/yari/commit/4913773d169151afaca73bf4cb66123c250c7fe5)) +* **deps:** bump the sentry group with 2 updates ([#10188](https://github.com/mdn/yari/issues/10188)) ([2863745](https://github.com/mdn/yari/commit/2863745a8db5727b29e618f790f166d0850866ca)) +* **deps:** bump web-features from 0.5.0-alpha.2 to 0.5.0 ([#10204](https://github.com/mdn/yari/issues/10204)) ([cae6fb7](https://github.com/mdn/yari/commit/cae6fb72b9b1e3989d2b37c602ab1149bd997b74)) + +## [2.38.1](https://github.com/mdn/yari/compare/v2.38.0...v2.38.1) (2023-12-14) + + +### Bug Fixes + +* **macros/CSSSupport:** support nested @webref/css values ([#10183](https://github.com/mdn/yari/issues/10183)) ([b783aa9](https://github.com/mdn/yari/commit/b783aa99d3d503ab3e5da979078acd5e92e807c5)) + + +### Miscellaneous + +* **deps-dev:** bump prettier from 3.0.3 to 3.1.1 ([#10165](https://github.com/mdn/yari/issues/10165)) ([5c3841a](https://github.com/mdn/yari/commit/5c3841a5b6517a58dbf95ed2a8ca1f5f30a46538)) +* **deps-dev:** bump react-router-dom from 6.20.1 to 6.21.0 ([#10182](https://github.com/mdn/yari/issues/10182)) ([1b9286d](https://github.com/mdn/yari/commit/1b9286df28b9385f602c38310c4efe4304bded35)) +* **deps:** bump the sentry group with 2 updates ([#10180](https://github.com/mdn/yari/issues/10180)) ([8eda044](https://github.com/mdn/yari/commit/8eda044995f91c1a95fb001338f0126a5bd59ec9)) +* **pong:** set forwardedip/useragent on click/view requests ([#10185](https://github.com/mdn/yari/issues/10185)) ([323197b](https://github.com/mdn/yari/commit/323197bfd1c179d9954f9fc9068be1d580cf9dde)) + +## [2.38.0](https://github.com/mdn/yari/compare/v2.37.1...v2.38.0) (2023-12-14) + + +### Features + +* **ai-help:** release 2.0 ([#10155](https://github.com/mdn/yari/issues/10155)) ([427b2fc](https://github.com/mdn/yari/commit/427b2fc9915a692f331eb7b44ed2dc8f7824fadb)) + + +### Bug Fixes + +* **baseline:** update icons, add text to feedback link ([#10172](https://github.com/mdn/yari/issues/10172)) ([7b79d32](https://github.com/mdn/yari/commit/7b79d32d484bae3c8510537841d069b75a448d9d)) + + +### Miscellaneous + +* **deps-dev:** bump @babel/core from 7.23.5 to 7.23.6 ([#10169](https://github.com/mdn/yari/issues/10169)) ([faf1bf3](https://github.com/mdn/yari/commit/faf1bf34951779cb7c2c42c101f0d32c644ab2a4)) +* **deps-dev:** bump @babel/preset-env from 7.23.5 to 7.23.6 ([#10171](https://github.com/mdn/yari/issues/10171)) ([ee298fb](https://github.com/mdn/yari/commit/ee298fb94ecd7f39434d37ddc0f9891b97a5a2a5)) +* **deps-dev:** bump eslint-plugin-n from 16.3.1 to 16.4.0 ([#10160](https://github.com/mdn/yari/issues/10160)) ([45cdb04](https://github.com/mdn/yari/commit/45cdb04e1df8a7894d6b24e4d576ff9eac445b9d)) +* **deps-dev:** bump html-validate from 8.7.3 to 8.7.4 ([#10162](https://github.com/mdn/yari/issues/10162)) ([f98383a](https://github.com/mdn/yari/commit/f98383a83bbc8a5712996251a0217d2f12bb2f61)) +* **deps-dev:** bump stylelint-order from 6.0.3 to 6.0.4 ([#10163](https://github.com/mdn/yari/issues/10163)) ([6f3f6d8](https://github.com/mdn/yari/commit/6f3f6d8cb243e1189eb986ef5e2932fd81bcaedc)) +* **deps-dev:** bump stylelint-scss from 5.3.1 to 5.3.2 ([#10166](https://github.com/mdn/yari/issues/10166)) ([596fbe3](https://github.com/mdn/yari/commit/596fbe3dd923e5d8b211b32aeca49474e94aba35)) +* **deps-dev:** bump the types group with 1 update ([#10159](https://github.com/mdn/yari/issues/10159)) ([395b9e6](https://github.com/mdn/yari/commit/395b9e672457e6007770d06e81228aa1328d25f8)) +* **deps-dev:** bump the types group with 1 update ([#10174](https://github.com/mdn/yari/issues/10174)) ([6c724d8](https://github.com/mdn/yari/commit/6c724d87efc4723c6e2846afca26325060820c90)) +* **deps-dev:** bump ts-node from 10.9.1 to 10.9.2 ([#10161](https://github.com/mdn/yari/issues/10161)) ([bca6385](https://github.com/mdn/yari/commit/bca6385af7824ad110e8d8f497ecb3b1bca36b50)) +* **deps:** bump @mdn/browser-compat-data from 5.4.4 to 5.4.5 ([#10164](https://github.com/mdn/yari/issues/10164)) ([c96758e](https://github.com/mdn/yari/commit/c96758eb6be506dac792ed8b4a9ca727717a5ae5)) +* **deps:** bump @stripe/stripe-js from 2.2.0 to 2.2.1 ([#10170](https://github.com/mdn/yari/issues/10170)) ([a24ad91](https://github.com/mdn/yari/commit/a24ad915af8a88bcd843cde4167d4d7c07563fb3)) +* **deps:** bump google-github-actions/setup-gcloud from 1 to 2 ([#10167](https://github.com/mdn/yari/issues/10167)) ([4043270](https://github.com/mdn/yari/commit/4043270e7ad804b0e3b927c4f61f538e1183d296)) +* **deps:** bump openai from 4.20.1 to 4.21.0 ([#10176](https://github.com/mdn/yari/issues/10176)) ([cb4e277](https://github.com/mdn/yari/commit/cb4e27780566b9e511c876905318b459f777f755)) +* **deps:** bump sse.js from 1.0.0 to 2.1.0 ([#10150](https://github.com/mdn/yari/issues/10150)) ([1f87eef](https://github.com/mdn/yari/commit/1f87eef364430503cd8e7632561b0ec4d3b01e84)) +* **deps:** bump the dependencies group in /deployer with 1 update ([#10158](https://github.com/mdn/yari/issues/10158)) ([a0e23db](https://github.com/mdn/yari/commit/a0e23db72b8b8da6411e5790c2dd3b4909e874a6)) +* **deps:** bump web-features from 0.5.0-alpha.1 to 0.5.0-alpha.2 ([#10175](https://github.com/mdn/yari/issues/10175)) ([7d924d3](https://github.com/mdn/yari/commit/7d924d3bb724a6ff8be7e59f38f2e7ec567364fc)) +* **settings:** update Newsletter/Offline copy ([#10177](https://github.com/mdn/yari/issues/10177)) ([5dd7ea1](https://github.com/mdn/yari/commit/5dd7ea1b43cab6223e345eb043351538c2420257)) + +## [2.37.1](https://github.com/mdn/yari/compare/v2.37.0...v2.37.1) (2023-12-08) + + +### Bug Fixes + +* **auth-container:** always show login/signup in row ([#10125](https://github.com/mdn/yari/issues/10125)) ([233bed6](https://github.com/mdn/yari/commit/233bed6bc9bfb633d73d6519d121d08b748b7be2)) +* **css:** remove unused minmax function ([#10138](https://github.com/mdn/yari/issues/10138)) ([d8e84b5](https://github.com/mdn/yari/commit/d8e84b5bb069a3781800a1f6769a33ff3581e2b0)) +* **workflows:** use Node.js version from .nvmrc file ([#10153](https://github.com/mdn/yari/issues/10153)) ([97405ae](https://github.com/mdn/yari/commit/97405ae42d0151faea6b6bfc73af1fc55fbebe5f)) + + +### Miscellaneous + +* **deps-dev:** bump html-webpack-plugin from 5.5.3 to 5.5.4 ([#10149](https://github.com/mdn/yari/issues/10149)) ([abaa08d](https://github.com/mdn/yari/commit/abaa08dd85b4d17633e110fd00faa9f8c4387f91)) +* **deps-dev:** bump style-dictionary from 3.9.0 to 3.9.1 ([#10151](https://github.com/mdn/yari/issues/10151)) ([012c696](https://github.com/mdn/yari/commit/012c6965fd5e6f349a5a4b7cdbcf36e5c76241b4)) +* **deps-dev:** bump the types group with 1 update ([#10141](https://github.com/mdn/yari/issues/10141)) ([3f6a506](https://github.com/mdn/yari/commit/3f6a506cf24ed72ceca016295a74013e90d9891c)) +* **deps-dev:** bump typescript from 5.3.2 to 5.3.3 in /client/pwa ([#10148](https://github.com/mdn/yari/issues/10148)) ([4de571e](https://github.com/mdn/yari/commit/4de571eacd725a585196eddacfdc87bfd0f9fe0f)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.31 to 2.7.32 in /client/pwa ([#10135](https://github.com/mdn/yari/issues/10135)) ([1c0a83b](https://github.com/mdn/yari/commit/1c0a83b2f83e6ba27406c2070b3aa780e441f87e)) +* **deps:** bump @codemirror/state from 6.3.2 to 6.3.3 ([#10142](https://github.com/mdn/yari/issues/10142)) ([88dd100](https://github.com/mdn/yari/commit/88dd100a5b570a5a62dac476b9da6dc23c8210c9)) +* **deps:** bump @webref/css from 6.9.2 to 6.10.0 ([#10146](https://github.com/mdn/yari/issues/10146)) ([480edc5](https://github.com/mdn/yari/commit/480edc598def290a7f12de6a812e07f01b026ade)) +* **deps:** bump actions/setup-python from 4 to 5 ([#10144](https://github.com/mdn/yari/issues/10144)) ([b19c7da](https://github.com/mdn/yari/commit/b19c7dacc4b8da4fe18162d192b3ddbfccc2d286)) +* **deps:** bump the sentry group with 2 updates ([#10145](https://github.com/mdn/yari/issues/10145)) ([379b281](https://github.com/mdn/yari/commit/379b2818b9360b971c800682d352978b63329b94)) + +## [2.37.0](https://github.com/mdn/yari/compare/v2.36.1...v2.37.0) (2023-12-05) + + +### Features + +* **baseline:** update widget to reflect new definition ([#10128](https://github.com/mdn/yari/issues/10128)) ([8372e0b](https://github.com/mdn/yari/commit/8372e0b94c7de22ebfe467890c64e445bd84c3f3)) + +## [2.36.1](https://github.com/mdn/yari/compare/v2.36.0...v2.36.1) (2023-12-05) + + +### Bug Fixes + +* **baseline:** bcd link not localized ([#10124](https://github.com/mdn/yari/issues/10124)) ([0761a86](https://github.com/mdn/yari/commit/0761a86627c713c15fea4b3df19f2ca61c2c46e4)) +* **macros/EmbedLiveSample:** un-deprecate the 6th parameter (allowed features) ([#10106](https://github.com/mdn/yari/issues/10106)) ([012f5e4](https://github.com/mdn/yari/commit/012f5e433a6d3e0b81261cf53d351915eb5107b8)) +* **macros/GamesSidebar:** update WebVR -> WebXR in string map ([#10126](https://github.com/mdn/yari/issues/10126)) ([0670f6a](https://github.com/mdn/yari/commit/0670f6a7677bb1ceaeaa69a4d8c48472af3717cc)) + + +### Miscellaneous + +* **advertising:** update form link ([#10109](https://github.com/mdn/yari/issues/10109)) ([02af588](https://github.com/mdn/yari/commit/02af588c5865a075369d81141b8eb9ad7b58482c)) +* **deps-dev:** bump browserslist from 4.22.1 to 4.22.2 ([#10115](https://github.com/mdn/yari/issues/10115)) ([8221634](https://github.com/mdn/yari/commit/82216341c2e38b6b03ec78df5cf74ef3cff699fa)) +* **deps-dev:** bump eslint from 8.54.0 to 8.55.0 ([#10116](https://github.com/mdn/yari/issues/10116)) ([8ab0321](https://github.com/mdn/yari/commit/8ab0321bfefb70db132bb31cfc877284cba6ffc6)) +* **deps-dev:** bump postcss from 8.4.31 to 8.4.32 ([#10119](https://github.com/mdn/yari/issues/10119)) ([051dcaf](https://github.com/mdn/yari/commit/051dcaf80cbe6ddb4007d2c4633fe95d7fbdb6b0)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.4.6 to 2.4.7 ([#10117](https://github.com/mdn/yari/issues/10117)) ([6780a5a](https://github.com/mdn/yari/commit/6780a5a524739548be1d227e74b80452d53f9253)) +* **deps-dev:** bump react-router-dom from 6.20.0 to 6.20.1 ([#10120](https://github.com/mdn/yari/issues/10120)) ([6e6ab9e](https://github.com/mdn/yari/commit/6e6ab9e2dbd3d4201132180e9ec35d50cfee169b)) +* **deps-dev:** bump tailwindcss from 3.3.5 to 3.3.6 ([#10133](https://github.com/mdn/yari/issues/10133)) ([bfb7e6e](https://github.com/mdn/yari/commit/bfb7e6eb84eb0a59cc696ca7e7e22eab155eeebc)) +* **deps-dev:** bump the types group with 1 update ([#10113](https://github.com/mdn/yari/issues/10113)) ([68116f9](https://github.com/mdn/yari/commit/68116f940edd5a01667087e54f8a2d1ebc8c4511)) +* **deps-dev:** bump the types group with 1 update ([#10132](https://github.com/mdn/yari/issues/10132)) ([8eca5fe](https://github.com/mdn/yari/commit/8eca5fe429249906d6250327a4eb86c92b44e769)) +* **deps:** bump @mdn/browser-compat-data from 5.4.2 to 5.4.3 ([#10121](https://github.com/mdn/yari/issues/10121)) ([42d1752](https://github.com/mdn/yari/commit/42d17520d2fee32059bc3516ce4ddd5ab0e6a344)) +* **deps:** bump @mdn/browser-compat-data from 5.4.3 to 5.4.4 ([#10134](https://github.com/mdn/yari/issues/10134)) ([18d9592](https://github.com/mdn/yari/commit/18d95921979099f2b67b4d5fd8da84165426fbbc)) +* **deps:** bump @webref/css from 6.7.1 to 6.9.2 ([#10110](https://github.com/mdn/yari/issues/10110)) ([300e93e](https://github.com/mdn/yari/commit/300e93eb908684dfbcb4e3354bc8b2558eacf046)) +* **deps:** bump the dependencies group in /deployer with 1 update ([#10118](https://github.com/mdn/yari/issues/10118)) ([fd6147c](https://github.com/mdn/yari/commit/fd6147c71d1263b36ef2e37412668d994c166409)) +* **deps:** bump the sentry group with 2 updates ([#10131](https://github.com/mdn/yari/issues/10131)) ([21e2b32](https://github.com/mdn/yari/commit/21e2b32ded390b2a9001d825e0fe52485f57a3ae)) +* **deps:** bump web-specs from 2.74.1 to 2.75.1 ([#10108](https://github.com/mdn/yari/issues/10108)) ([a72963c](https://github.com/mdn/yari/commit/a72963cd842b55fa3a9f1a8d38424796f43dba8d)) +* **macros/CSSRef:** update "Using CSS math functions" slug ([#10112](https://github.com/mdn/yari/issues/10112)) ([d417c47](https://github.com/mdn/yari/commit/d417c478ab8832ec91698205182b9a98e155ff7e)) +* **macros/LearnSidebar:** update zh-CN translation ([#10100](https://github.com/mdn/yari/issues/10100)) ([8a3f78a](https://github.com/mdn/yari/commit/8a3f78aa0eb7d283f04508caafdfe020c3cee0f0)) +* **placement:** switch to BSA ([#10011](https://github.com/mdn/yari/issues/10011)) ([ea98829](https://github.com/mdn/yari/commit/ea98829430afe16a445b49ce2ef937afd869a8af)) +* **web-features:** pin package version ([#10123](https://github.com/mdn/yari/issues/10123)) ([aab3559](https://github.com/mdn/yari/commit/aab3559f1610d500890f711f14bb562f5c1ccb38)) + +## [2.36.0](https://github.com/mdn/yari/compare/v2.35.1...v2.36.0) (2023-11-30) + + +### Features + +* **menu:** highlight active items ([#9940](https://github.com/mdn/yari/issues/9940)) ([ecc9f54](https://github.com/mdn/yari/commit/ecc9f54f5efaacb0d635003c2546771289311edb)) + + +### Enhancements + +* **kumascript:** make `smartLink()`'s content parameter optional ([#9847](https://github.com/mdn/yari/issues/9847)) ([3ebd396](https://github.com/mdn/yari/commit/3ebd396e41b914bd6fc73384fc146ec4dcf3a910)) + + +### Miscellaneous + +* **ai-help:** include question number in metrics ([#10096](https://github.com/mdn/yari/issues/10096)) ([9657ea9](https://github.com/mdn/yari/commit/9657ea919fbbe1445147cae3d1902d24ce4413c1)) +* **blog:** enable LFS for mdn-studio ([#10027](https://github.com/mdn/yari/issues/10027)) ([25a50d7](https://github.com/mdn/yari/commit/25a50d7bed6294352c7054e33be68f407b223869)) +* **deps-dev:** bump @babel/core from 7.23.3 to 7.23.5 ([#10092](https://github.com/mdn/yari/issues/10092)) ([54e8da9](https://github.com/mdn/yari/commit/54e8da9c86f5472bd6609a643fcac857afd40726)) +* **deps-dev:** bump @babel/preset-env from 7.23.3 to 7.23.5 ([#10091](https://github.com/mdn/yari/issues/10091)) ([398c21f](https://github.com/mdn/yari/commit/398c21faeccb7aac7feb60469ea1bcbe1ba0f769)) +* **deps-dev:** bump @playwright/test from 1.40.0 to 1.40.1 ([#10094](https://github.com/mdn/yari/issues/10094)) ([b77edeb](https://github.com/mdn/yari/commit/b77edeb9697c6b64a3093d1eceef626d1fab5a73)) +* **deps-dev:** bump @supabase/supabase-js from 2.38.4 to 2.38.5 ([#10055](https://github.com/mdn/yari/issues/10055)) ([53298c4](https://github.com/mdn/yari/commit/53298c441bcb10170913378b56e833f0649c15af)) +* **deps-dev:** bump @supabase/supabase-js from 2.38.5 to 2.39.0 ([#10086](https://github.com/mdn/yari/issues/10086)) ([3e0f4d2](https://github.com/mdn/yari/commit/3e0f4d2ccb8db951d8b7acb079f94ad7e7b804b4)) +* **deps-dev:** bump @swc/core from 1.3.96 to 1.3.99 ([#10061](https://github.com/mdn/yari/issues/10061)) ([d4b5451](https://github.com/mdn/yari/commit/d4b54515e93c0736f47eaca9f3d7f66cc9ec4f2e)) +* **deps-dev:** bump @swc/core from 1.3.99 to 1.3.100 ([#10103](https://github.com/mdn/yari/issues/10103)) ([36011cd](https://github.com/mdn/yari/commit/36011cd05261ecb803f97bbe93aec2291cc9c5da)) +* **deps-dev:** bump html-validate from 8.7.2 to 8.7.3 ([#10076](https://github.com/mdn/yari/issues/10076)) ([223e2a0](https://github.com/mdn/yari/commit/223e2a0c9b8a4162868352588d805af6f25167a7)) +* **deps-dev:** bump jsdom from 22.1.0 to 23.0.1 ([#10102](https://github.com/mdn/yari/issues/10102)) ([b68ada2](https://github.com/mdn/yari/commit/b68ada212153e357a60070ba928a25fef4a52f2b)) +* **deps-dev:** bump react-router-dom from 6.19.0 to 6.20.0 ([#10073](https://github.com/mdn/yari/issues/10073)) ([37b108f](https://github.com/mdn/yari/commit/37b108fff67987e442ba7958874590ecff275172)) +* **deps-dev:** bump stylelint-prettier from 4.0.2 to 4.1.0 ([#10078](https://github.com/mdn/yari/issues/10078)) ([c28219e](https://github.com/mdn/yari/commit/c28219eaa96a4fceaba5c96661307b0de91032a4)) +* **deps-dev:** bump the types group with 1 update ([#10085](https://github.com/mdn/yari/issues/10085)) ([7d58067](https://github.com/mdn/yari/commit/7d580672e71593d37d4239b75f269dd68ab89290)) +* **deps-dev:** bump the types group with 3 updates ([#10067](https://github.com/mdn/yari/issues/10067)) ([93692ba](https://github.com/mdn/yari/commit/93692ba2a2778808e6ae306421d8b3ff973035f8)) +* **deps-dev:** bump the types group with 4 updates ([#10054](https://github.com/mdn/yari/issues/10054)) ([46f0e37](https://github.com/mdn/yari/commit/46f0e371f57b8644a25822399505bbf1010c6b56)) +* **deps-dev:** bump typescript from 5.2.2 to 5.3.2 in /client/pwa ([#10062](https://github.com/mdn/yari/issues/10062)) ([7c040a5](https://github.com/mdn/yari/commit/7c040a5a8f0c11731f21f30260b5dcc998323657)) +* **deps:** bump @codemirror/lang-html from 6.4.6 to 6.4.7 ([#10087](https://github.com/mdn/yari/issues/10087)) ([982b73e](https://github.com/mdn/yari/commit/982b73e086271c26c3a244f6ef548af58af6e681)) +* **deps:** bump @codemirror/state from 6.3.1 to 6.3.2 ([#10080](https://github.com/mdn/yari/issues/10080)) ([69f8fef](https://github.com/mdn/yari/commit/69f8fef361417c6f3f49c5b98d252a1ca31a0c60)) +* **deps:** bump @mdn/bcd-utils-api from 0.0.4 to 0.0.5 ([#10059](https://github.com/mdn/yari/issues/10059)) ([4dbf2b8](https://github.com/mdn/yari/commit/4dbf2b8c6608087a4b96f19eb11ba120ff5701cc)) +* **deps:** bump @mdn/browser-compat-data from 5.4.0 to 5.4.1 ([#10079](https://github.com/mdn/yari/issues/10079)) ([94b1f18](https://github.com/mdn/yari/commit/94b1f1839db37fba0c8607dc44e4e1b86e7a9c4f)) +* **deps:** bump @mdn/browser-compat-data from 5.4.1 to 5.4.2 ([#10093](https://github.com/mdn/yari/issues/10093)) ([03eae2a](https://github.com/mdn/yari/commit/03eae2a9d51b66cbb1f8bcf7e2c3f1128e45d7fa)) +* **deps:** bump @stripe/stripe-js from 2.1.11 to 2.2.0 ([#10058](https://github.com/mdn/yari/issues/10058)) ([1496846](https://github.com/mdn/yari/commit/149684667f6aa03f3e7041786d7db3f9868774dd)) +* **deps:** bump @vscode/ripgrep from 1.15.7 to 1.15.9 ([#10068](https://github.com/mdn/yari/issues/10068)) ([75c9292](https://github.com/mdn/yari/commit/75c929221e38bc7fffb5750cf8d831ec18119b6e)) +* **deps:** bump cryptography from 41.0.4 to 41.0.6 in /deployer ([#10090](https://github.com/mdn/yari/issues/10090)) ([d05e632](https://github.com/mdn/yari/commit/d05e6322a7945b3c30014995fec0436beddb5c3f)) +* **deps:** bump fs-extra from 11.1.1 to 11.2.0 ([#10089](https://github.com/mdn/yari/issues/10089)) ([fc18c48](https://github.com/mdn/yari/commit/fc18c48b7221f42dfd3d703b3aa5bdcbbb99610f)) +* **deps:** bump google-github-actions/auth from 1 to 2 ([#10095](https://github.com/mdn/yari/issues/10095)) ([bb60acd](https://github.com/mdn/yari/commit/bb60acd31e49862607db4721b4ca4c538e4569dc)) +* **deps:** bump lru-cache from 10.0.3 to 10.1.0 ([#10071](https://github.com/mdn/yari/issues/10071)) ([c301c5a](https://github.com/mdn/yari/commit/c301c5a90fdd23633a4db0cb7e43314bff16c6a8)) +* **deps:** bump openai from 4.19.0 to 4.19.1 ([#10060](https://github.com/mdn/yari/issues/10060)) ([3b95674](https://github.com/mdn/yari/commit/3b95674f6b9930cadabb4d8dfb6ded55ffe6818d)) +* **deps:** bump openai from 4.19.1 to 4.20.0 ([#10070](https://github.com/mdn/yari/issues/10070)) ([84ab0d9](https://github.com/mdn/yari/commit/84ab0d97b976483825f5374e5d28c4daa86f5b50)) +* **deps:** bump openai from 4.20.0 to 4.20.1 ([#10088](https://github.com/mdn/yari/issues/10088)) ([17f560b](https://github.com/mdn/yari/commit/17f560b92d6ee81975a082b7b78e5c9785c22767)) +* **deps:** bump pytest-rerunfailures from 12.0 to 13.0 in /testing/integration ([#10083](https://github.com/mdn/yari/issues/10083)) ([c778f2c](https://github.com/mdn/yari/commit/c778f2c0e406cb89528d1c36ba7786d00f5a807d)) +* **deps:** bump the dependencies group in /deployer with 1 update ([#10082](https://github.com/mdn/yari/issues/10082)) ([aded53c](https://github.com/mdn/yari/commit/aded53c3928b94417f8ea8bda055a52ae513ff27)) +* **deps:** bump the sentry group with 2 updates ([#10053](https://github.com/mdn/yari/issues/10053)) ([62331b1](https://github.com/mdn/yari/commit/62331b182016534f9c1c5f3c006b108e5cdfc242)) +* **deps:** bump the sentry group with 2 updates ([#10066](https://github.com/mdn/yari/issues/10066)) ([4b1fb81](https://github.com/mdn/yari/commit/4b1fb81f71149d07fe9f901f0d9deef0e1fe30a8)) +* **deps:** bump the sentry group with 2 updates ([#10084](https://github.com/mdn/yari/issues/10084)) ([87fdb66](https://github.com/mdn/yari/commit/87fdb66f8d861cd5162758a7976b107113f8c177)) +* **deps:** bump the sentry group with 2 updates ([#10101](https://github.com/mdn/yari/issues/10101)) ([3c314d8](https://github.com/mdn/yari/commit/3c314d8f3515d70902ff0ccae40e8c4fbad3584c)) +* **deps:** bump web-specs from 2.74.0 to 2.74.1 ([#10075](https://github.com/mdn/yari/issues/10075)) ([3061bc5](https://github.com/mdn/yari/commit/3061bc554749f88b653ab137153c1b38ae9ab426)) +* **macros/LearnSidebar:** add Games Developing section ([#10064](https://github.com/mdn/yari/issues/10064)) ([d4739d3](https://github.com/mdn/yari/commit/d4739d34f3175aeb2cda6f43db0ed90bc6652f3e)) +* **macros/LearnSidebar:** capitalize Node.js ([#10065](https://github.com/mdn/yari/issues/10065)) ([51712c2](https://github.com/mdn/yari/commit/51712c29658beabb315a143d5085cff7e9bd0b65)) +* **macros/SVGRef:** update zh-CN translation ([#10069](https://github.com/mdn/yari/issues/10069)) ([2fa5aa0](https://github.com/mdn/yari/commit/2fa5aa0c324f22ffce9c5d04c3542345a76ba884)) + +## [2.35.1](https://github.com/mdn/yari/compare/v2.35.0...v2.35.1) (2023-11-20) + + +### Miscellaneous + +* **deps-dev:** bump @playwright/test from 1.39.0 to 1.40.0 ([#10043](https://github.com/mdn/yari/issues/10043)) ([11ce3aa](https://github.com/mdn/yari/commit/11ce3aaff8a9e74fc5b94891950a8afed80f9dd7)) +* **deps-dev:** bump @testing-library/react from 14.1.0 to 14.1.2 ([#10045](https://github.com/mdn/yari/issues/10045)) ([9f2c925](https://github.com/mdn/yari/commit/9f2c92570e450d8cfb55a72e3a9ba28d3e9b4cc4)) +* **deps-dev:** bump eslint from 8.53.0 to 8.54.0 ([#10047](https://github.com/mdn/yari/issues/10047)) ([a572fdf](https://github.com/mdn/yari/commit/a572fdf3a159c32e6d1a0411fe0a0c597b9edf32)) +* **deps-dev:** bump html-validate from 8.7.0 to 8.7.1 ([#10017](https://github.com/mdn/yari/issues/10017)) ([c6baf8b](https://github.com/mdn/yari/commit/c6baf8ba8b0eb31e0b1325c978d7209391020e43)) +* **deps-dev:** bump html-validate from 8.7.1 to 8.7.2 ([#10046](https://github.com/mdn/yari/issues/10046)) ([4686f0b](https://github.com/mdn/yari/commit/4686f0bf94384d1cdda11cd6fa3fe8b06fa88e88)) +* **deps-dev:** bump react-router-dom from 6.18.0 to 6.19.0 ([#10041](https://github.com/mdn/yari/issues/10041)) ([38e6d4a](https://github.com/mdn/yari/commit/38e6d4a80deca95cbe0fa372e79e27a0167f99d4)) +* **deps-dev:** bump the dependencies group in /testing/integration with 1 update ([#10013](https://github.com/mdn/yari/issues/10013)) ([45820f4](https://github.com/mdn/yari/commit/45820f4ef72f42023a183afc37fc8bebf223818e)) +* **deps-dev:** bump ts-loader from 9.5.0 to 9.5.1 ([#10031](https://github.com/mdn/yari/issues/10031)) ([5f86c8f](https://github.com/mdn/yari/commit/5f86c8fc1ec9f0ebd7242abd2b6a0d61a47c9c1a)) +* **deps-dev:** bump ts-loader from 9.5.0 to 9.5.1 in /client/pwa ([#10030](https://github.com/mdn/yari/issues/10030)) ([9a1e3ad](https://github.com/mdn/yari/commit/9a1e3adbc53b68ca6e7ff2bb3ff57b944afcc31a)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.30 to 2.7.31 in /client/pwa ([#10038](https://github.com/mdn/yari/issues/10038)) ([21226a7](https://github.com/mdn/yari/commit/21226a735c13d0e682bb877fe636883bc3751524)) +* **deps:** bump @mdn/browser-compat-data from 5.3.30 to 5.3.31 ([#10032](https://github.com/mdn/yari/issues/10032)) ([5abb914](https://github.com/mdn/yari/commit/5abb914ae42a952371e410fb291bd06c5c31a571)) +* **deps:** bump @mdn/browser-compat-data from 5.3.31 to 5.4.0 ([#10049](https://github.com/mdn/yari/issues/10049)) ([5d8270b](https://github.com/mdn/yari/commit/5d8270baa046d001f918380cfb6f32978285ef5d)) +* **deps:** bump @vscode/ripgrep from 1.15.6 to 1.15.7 ([#10042](https://github.com/mdn/yari/issues/10042)) ([5affc92](https://github.com/mdn/yari/commit/5affc926f90a3d1b61b48a4e049125def9f06107)) +* **deps:** bump @webref/css from 6.0.0 to 6.7.1 ([#9731](https://github.com/mdn/yari/issues/9731)) ([4a50067](https://github.com/mdn/yari/commit/4a50067efea6b5bb45e1077d2d292dae32322378)) +* **deps:** bump file-type from 18.6.0 to 18.7.0 ([#10014](https://github.com/mdn/yari/issues/10014)) ([26275e2](https://github.com/mdn/yari/commit/26275e2668f66460daa05e004bc60f5d5b712563)) +* **deps:** bump lru-cache from 10.0.1 to 10.0.2 ([#10015](https://github.com/mdn/yari/issues/10015)) ([0afd35c](https://github.com/mdn/yari/commit/0afd35c3faddda3cbfcb9449366925dab0e7ab6c)) +* **deps:** bump lru-cache from 10.0.2 to 10.0.3 ([#10048](https://github.com/mdn/yari/issues/10048)) ([e218e00](https://github.com/mdn/yari/commit/e218e006adc897af67d9d2cdb9eb5af43568c9f7)) +* **deps:** bump openai from 4.17.3 to 4.17.4 ([#10018](https://github.com/mdn/yari/issues/10018)) ([7f707d8](https://github.com/mdn/yari/commit/7f707d85b1df5dc1c9aa9cf12a43422c7638cfde)) +* **deps:** bump openai from 4.17.4 to 4.17.5 ([#10025](https://github.com/mdn/yari/issues/10025)) ([fd2af62](https://github.com/mdn/yari/commit/fd2af62b839dda0ff26e112e14c82688cf35d80e)) +* **deps:** bump openai from 4.17.5 to 4.18.0 ([#10033](https://github.com/mdn/yari/issues/10033)) ([fa87b01](https://github.com/mdn/yari/commit/fa87b014f61ad5b93e0e078c7ed27c5ef97dcb8e)) +* **deps:** bump openai from 4.18.0 to 4.19.0 ([#10035](https://github.com/mdn/yari/issues/10035)) ([48dbc83](https://github.com/mdn/yari/commit/48dbc833d3578a162952c3c8d9dd86a6c9f14e64)) +* **deps:** bump react-markdown from 9.0.0 to 9.0.1 ([#10024](https://github.com/mdn/yari/issues/10024)) ([35532d9](https://github.com/mdn/yari/commit/35532d9a6d320fcf10e38903cfb553c4794d248d)) +* **deps:** bump the dependencies group in /deployer with 1 update ([#10050](https://github.com/mdn/yari/issues/10050)) ([606520e](https://github.com/mdn/yari/commit/606520e3b3b4952daed5490e0c27ad6545d80404)) +* **deps:** bump the dependencies group in /deployer with 2 updates ([#10012](https://github.com/mdn/yari/issues/10012)) ([55e1c7f](https://github.com/mdn/yari/commit/55e1c7f47874ff8c00e2a1b5a5fbe5fe6609a33f)) +* **deps:** bump the sentry group with 2 updates ([#10022](https://github.com/mdn/yari/issues/10022)) ([821327f](https://github.com/mdn/yari/commit/821327f0599ad672652bc46e988049815ab554b2)) +* **deps:** bump web-specs from 2.73.0 to 2.74.0 ([#10023](https://github.com/mdn/yari/issues/10023)) ([4cb364b](https://github.com/mdn/yari/commit/4cb364b64693f01a1172e105713de97222407811)) +* **macros/CSSRef:** add "Using CSS math functions" ([#10026](https://github.com/mdn/yari/issues/10026)) ([d727fd8](https://github.com/mdn/yari/commit/d727fd820a5dd158a5725fee278a28653ad2dab3)) +* **macros/HTTPSidebar:** remove Cookie Security link ([#9654](https://github.com/mdn/yari/issues/9654)) ([4618778](https://github.com/mdn/yari/commit/46187786c61eeda9fb0a10eaa660a60307ab25dd)) + +## [2.35.0](https://github.com/mdn/yari/compare/v2.34.2...v2.35.0) (2023-11-10) + + +### Features + +* **macro-usage-report:** add CSV output format ([#9996](https://github.com/mdn/yari/issues/9996)) ([85e9afa](https://github.com/mdn/yari/commit/85e9afaf136828618945551d99710b2fdbc5c7ee)) + + +### Miscellaneous + +* **deps-dev:** bump @babel/core from 7.23.2 to 7.23.3 ([#9986](https://github.com/mdn/yari/issues/9986)) ([19c2d93](https://github.com/mdn/yari/commit/19c2d939ba81673bf2bdf0befbb0c584b7890eba)) +* **deps-dev:** bump @babel/eslint-parser from 7.22.15 to 7.23.3 ([#9991](https://github.com/mdn/yari/issues/9991)) ([e96005e](https://github.com/mdn/yari/commit/e96005e97a40d9dc411442d469bdadd35b8c914f)) +* **deps-dev:** bump @babel/preset-env from 7.23.2 to 7.23.3 ([#9987](https://github.com/mdn/yari/issues/9987)) ([2d059c8](https://github.com/mdn/yari/commit/2d059c82d2879aa3b084935deaeec8a9b0d3fb05)) +* **deps-dev:** bump eslint-plugin-n from 16.3.0 to 16.3.1 ([#9999](https://github.com/mdn/yari/issues/9999)) ([4d24433](https://github.com/mdn/yari/commit/4d24433a17762eed5a1994c6a0a231ccf6e65ab3)) +* **deps:** bump @mdn/browser-compat-data from 5.3.29 to 5.3.30 ([#10000](https://github.com/mdn/yari/issues/10000)) ([0d4d603](https://github.com/mdn/yari/commit/0d4d603de9b2ae344370c7adc2819d0182d891a1)) +* **deps:** bump markdown dependencies ([#9980](https://github.com/mdn/yari/issues/9980)) ([49979f1](https://github.com/mdn/yari/commit/49979f19c6d062fd6f725549295b62415f59de19)) +* **deps:** bump mdn-data from 2.2.0 to 2.3.0 ([#9989](https://github.com/mdn/yari/issues/9989)) ([696bd7e](https://github.com/mdn/yari/commit/696bd7ec19dd43ffa0a06ae43ea9c3cf741d64bd)) +* **deps:** bump openai from 4.16.1 to 4.17.0 ([#9990](https://github.com/mdn/yari/issues/9990)) ([7a66c1b](https://github.com/mdn/yari/commit/7a66c1bf664ad340018a0d3a8aa5a98d029c7d05)) +* **deps:** bump openai from 4.17.0 to 4.17.3 ([#9998](https://github.com/mdn/yari/issues/9998)) ([209ef20](https://github.com/mdn/yari/commit/209ef20fe1bc00ced7014c0973fb6c32e4b03755)) +* **deps:** bump the sentry group with 2 updates ([#9983](https://github.com/mdn/yari/issues/9983)) ([e094662](https://github.com/mdn/yari/commit/e094662180d23678189b8f0038331b9fca060d52)) +* **deps:** bump the sentry group with 2 updates ([#9997](https://github.com/mdn/yari/issues/9997)) ([c2264e4](https://github.com/mdn/yari/commit/c2264e41051ff80d01e16b580a8e0c177e9380da)) +* **deps:** bump web-specs from 2.72.0 to 2.73.0 ([#10001](https://github.com/mdn/yari/issues/10001)) ([4afa36d](https://github.com/mdn/yari/commit/4afa36d07bcfc9c54da77cb14d39a2725ca3ec66)) +* **flaws:** exclude /discord from broken-link flaw ([#10007](https://github.com/mdn/yari/issues/10007)) ([c72d8bc](https://github.com/mdn/yari/commit/c72d8bca2fdcab7aecb7ccad6b4ba2e38b62f6a5)) +* **footer:** update Careers link ([#9995](https://github.com/mdn/yari/issues/9995)) ([abc8f4e](https://github.com/mdn/yari/commit/abc8f4eedd1a616bbe6f428eb1687a9ac79cb2c3)) +* **macros/CSSRef:** add Border-radius generator ([#9994](https://github.com/mdn/yari/issues/9994)) ([b499b71](https://github.com/mdn/yari/commit/b499b719bb8ce11011252198127227652d10aa7b)) +* **macros:** delete {spec,spec2,SpecName} macros ([#9982](https://github.com/mdn/yari/issues/9982)) ([4cfbb82](https://github.com/mdn/yari/commit/4cfbb82c173883b46fca945dcaadf1c62d149717)) + +## [2.34.2](https://github.com/mdn/yari/compare/v2.34.1...v2.34.2) (2023-11-08) + + +### Bug Fixes + +* **ai-help:** destructure embedding response properly ([#9977](https://github.com/mdn/yari/issues/9977)) ([a80a0d6](https://github.com/mdn/yari/commit/a80a0d64003a9660dcf467647ec34c1980380130)) +* **ai-help:** revert "chore(deps): bump unified from 10.1.2 to 11.0.4 + remark-{gfm,parse,rehype} + rehype-{format,stringify} ([#9896](https://github.com/mdn/yari/issues/9896))" ([#9978](https://github.com/mdn/yari/issues/9978)) ([58b53db](https://github.com/mdn/yari/commit/58b53dbbd5a26a5845a4273ea9ef8c0c2dbe0965)) +* **baseline:** hide banner on subgrid ([#9979](https://github.com/mdn/yari/issues/9979)) ([1fc8c92](https://github.com/mdn/yari/commit/1fc8c9252320cd71e63dd9fb341152ae40d2cd5a)) +* **discord:** add /discord redirect with updated signup link ([#9976](https://github.com/mdn/yari/issues/9976)) ([3544491](https://github.com/mdn/yari/commit/354449185424b5aa2ec13f14e73afbff30a07546)) + + +### Miscellaneous + +* **deps-dev:** bump @testing-library/react from 14.0.0 to 14.1.0 ([#9967](https://github.com/mdn/yari/issues/9967)) ([45aa619](https://github.com/mdn/yari/commit/45aa6198ac5fc6b065ba1d17eac627772477af85)) +* **deps-dev:** bump eslint-plugin-n from 16.2.0 to 16.3.0 ([#9971](https://github.com/mdn/yari/issues/9971)) ([3907390](https://github.com/mdn/yari/commit/39073909822feb7a9bd68821141b2a5d1ed45ca4)) +* **deps-dev:** bump stylelint-scss from 5.3.0 to 5.3.1 ([#9965](https://github.com/mdn/yari/issues/9965)) ([83ae6b7](https://github.com/mdn/yari/commit/83ae6b778d116bd4663e230cac966d8670027b8f)) +* **deps-dev:** bump the types group with 8 updates ([#9964](https://github.com/mdn/yari/issues/9964)) ([3b195e5](https://github.com/mdn/yari/commit/3b195e5a4441e5d3a322b77afefe376098fe2461)) +* **deps:** bump @mdn/browser-compat-data from 5.3.28 to 5.3.29 ([#9966](https://github.com/mdn/yari/issues/9966)) ([3ee6b43](https://github.com/mdn/yari/commit/3ee6b437432d0bff7db95b4fb9e264c6c83a3a11)) +* **deps:** bump cookie from 0.5.0 to 0.6.0 ([#9969](https://github.com/mdn/yari/issues/9969)) ([c67e0f2](https://github.com/mdn/yari/commit/c67e0f2c438dc88c1afbb43616d362962e79b93c)) +* **deps:** bump inquirer from 9.2.11 to 9.2.12 ([#9970](https://github.com/mdn/yari/issues/9970)) ([580ca34](https://github.com/mdn/yari/commit/580ca3442239436f4c661fd5fc9692b29e3289c6)) +* **deps:** bump openai from 4.15.4 to 4.16.1 ([#9972](https://github.com/mdn/yari/issues/9972)) ([3043174](https://github.com/mdn/yari/commit/30431746d2e9669f763fe10a66e506e3b35fbbc7)) +* **deps:** bump the sentry group with 2 updates ([#9963](https://github.com/mdn/yari/issues/9963)) ([4642daf](https://github.com/mdn/yari/commit/4642daf20dfdb404b4decd71e9ebb5dc1c1de112)) +* **deps:** bump web-specs from 2.71.0 to 2.72.0 ([#9973](https://github.com/mdn/yari/issues/9973)) ([2693dba](https://github.com/mdn/yari/commit/2693dbae3898d98376149549bb7a97111c739f75)) + +## [2.34.1](https://github.com/mdn/yari/compare/v2.34.0...v2.34.1) (2023-11-08) + + +### Bug Fixes + +* **links:** adopt visited link colors from Firefox ([#9961](https://github.com/mdn/yari/issues/9961)) ([29839fb](https://github.com/mdn/yari/commit/29839fbad99deafae9cb5728a6931ba6b50b79bc)) +* **node:** support v20 + suppress experimental warnings ([#9517](https://github.com/mdn/yari/issues/9517)) ([4401c3e](https://github.com/mdn/yari/commit/4401c3eb833cd1970a095730902f249ec7623711)) + +## [2.34.0](https://github.com/mdn/yari/compare/v2.33.1...v2.34.0) (2023-11-07) + + +### Features + +* **links:** distinguish visited links (v2) ([#9931](https://github.com/mdn/yari/issues/9931)) ([76b9e7a](https://github.com/mdn/yari/commit/76b9e7ae23d464ec2dc821b2c2733d7f7de8bbc8)) +* **sidebar:** add Colors category to Guides ([#9936](https://github.com/mdn/yari/issues/9936)) ([20e5826](https://github.com/mdn/yari/commit/20e5826e9e598481ebf0a26cf35e578cb01ace75)) + + +### Bug Fixes + +* **build:** sort meta files ([#9899](https://github.com/mdn/yari/issues/9899)) ([37bf90c](https://github.com/mdn/yari/commit/37bf90c69034855c41e20dfa951364522740e77b)) +* **document-survey:** hide for writers ([#9893](https://github.com/mdn/yari/issues/9893)) ([ee8a59d](https://github.com/mdn/yari/commit/ee8a59db5b5e495493e577bef8819cc6d9a7b356)) + + +### Enhancements + +* **opengraph:** fix og:image and add og:{image:*,site_name,type} ([#9795](https://github.com/mdn/yari/issues/9795)) ([a9ee3d3](https://github.com/mdn/yari/commit/a9ee3d3438cbecf283f36a95cd58dac38b6280a5)) + + +### Miscellaneous + +* **deps-dev:** bump @babel/preset-env from 7.22.20 to 7.23.2 ([#9807](https://github.com/mdn/yari/issues/9807)) ([a9af0dc](https://github.com/mdn/yari/commit/a9af0dcc547a611a0be7743133a5feac55e99076)) +* **deps-dev:** bump @swc/core from 1.3.80 to 1.3.96 ([#9944](https://github.com/mdn/yari/issues/9944)) ([d2d0ef5](https://github.com/mdn/yari/commit/d2d0ef5eec1a626d6621b9bb14147d87a3432046)) +* **deps-dev:** bump bfj from 7.0.2 to 8.0.0 ([#9626](https://github.com/mdn/yari/issues/9626)) ([cd2c8be](https://github.com/mdn/yari/commit/cd2c8be08cc4df11e3dd45c067b912db8325ef6d)) +* **deps-dev:** bump eslint from 8.52.0 to 8.53.0 ([#9946](https://github.com/mdn/yari/issues/9946)) ([b8999e3](https://github.com/mdn/yari/commit/b8999e330461e790a7458240552c3a341982c60b)) +* **deps-dev:** bump eslint-plugin-n from 16.0.1 to 16.2.0 ([#9798](https://github.com/mdn/yari/issues/9798)) ([423c86e](https://github.com/mdn/yari/commit/423c86e44221192daf8a000d8a8152ceca2625b7)) +* **deps-dev:** bump the types group with 1 update ([#9943](https://github.com/mdn/yari/issues/9943)) ([f16866f](https://github.com/mdn/yari/commit/f16866f294f58f5469090019375c8fc941b134d4)) +* **deps-dev:** remove use-debounce ([#9952](https://github.com/mdn/yari/issues/9952)) ([5d52f54](https://github.com/mdn/yari/commit/5d52f54e33d311fcf099e2d96c526f5d74eec7da)) +* **deps:** bump async from 3.2.4 to 3.2.5 ([#9947](https://github.com/mdn/yari/issues/9947)) ([e241ff4](https://github.com/mdn/yari/commit/e241ff47b56070c8f29af001175472b2639d8bf7)) +* **deps:** bump cryptography from 41.0.3 to 41.0.4 in /deployer ([#9709](https://github.com/mdn/yari/issues/9709)) ([f8e1d7a](https://github.com/mdn/yari/commit/f8e1d7a1141331147d38b2c5fb97360c967d62d4)) +* **deps:** bump fdir from 6.1.0 to 6.1.1 ([#9945](https://github.com/mdn/yari/issues/9945)) ([1390df5](https://github.com/mdn/yari/commit/1390df51635df56ba160e8f0de6623ea8c8dcb00)) +* **deps:** bump openai from 4.14.2 to 4.15.4 ([#9949](https://github.com/mdn/yari/issues/9949)) ([abfbcff](https://github.com/mdn/yari/commit/abfbcff4d398163c92b6186a2d30f23111f0f1bf)) +* **deps:** bump rehype-raw from 6.1.1 to 7.0.0 ([#9560](https://github.com/mdn/yari/issues/9560)) ([3c85a4a](https://github.com/mdn/yari/commit/3c85a4ab3e20e1f9dfa9e29c8b440277dfa302c1)) +* **deps:** bump rehype-sanitize from 5.0.1 to 6.0.0 ([#9558](https://github.com/mdn/yari/issues/9558)) ([db843b0](https://github.com/mdn/yari/commit/db843b08b49429d075e493cdc75e6242641b459f)) +* **deps:** bump sse.js from 0.6.1 to 1.0.0 ([#9594](https://github.com/mdn/yari/issues/9594)) ([32154e6](https://github.com/mdn/yari/commit/32154e6ece47665be04a44935beee2a396691a14)) +* **deps:** bump the dependencies group in /deployer with 1 update ([#9950](https://github.com/mdn/yari/issues/9950)) ([2d7e33b](https://github.com/mdn/yari/commit/2d7e33b3bcf53c439734cf106623161025f80783)) +* **deps:** bump unified from 10.1.2 to 11.0.4 + remark-{gfm,parse,rehype} + rehype-{format,stringify} ([#9896](https://github.com/mdn/yari/issues/9896)) ([ef5800a](https://github.com/mdn/yari/commit/ef5800a9eb174be852a8edcf31c9683defbbf77b)) +* **footer:** add mastodon svg icon ([#9689](https://github.com/mdn/yari/issues/9689)) ([321caf4](https://github.com/mdn/yari/commit/321caf4703d326ad52dd9c1041398010d73ff633)) +* **macros:** remove TenthCampaignQuote macro ([#9906](https://github.com/mdn/yari/issues/9906)) ([9507664](https://github.com/mdn/yari/commit/9507664915c0158c661d305f66e834edad790f9a)) +* **markdown:** migrate to mdast-util-to-hast ([#9941](https://github.com/mdn/yari/issues/9941)) ([54eba1d](https://github.com/mdn/yari/commit/54eba1dfc39b9ac42af5c42633a61510c185a340)) +* **pong:** update mapping ([#9884](https://github.com/mdn/yari/issues/9884)) ([6c044cc](https://github.com/mdn/yari/commit/6c044ccd20e7e1041445a03b13cb5bc36914653f)) +* **telemetry:** measure top-level menu link clicks ([#9938](https://github.com/mdn/yari/issues/9938)) ([9c176c0](https://github.com/mdn/yari/commit/9c176c0f7b46193d22a98619279e95a5677447cb)) +* **telemetry:** send geo_iso with pings ([#9909](https://github.com/mdn/yari/issues/9909)) ([2c94a69](https://github.com/mdn/yari/commit/2c94a6955654051f17eb92b4630e445919a8763d)) + +## [2.33.1](https://github.com/mdn/yari/compare/v2.33.0...v2.33.1) (2023-11-03) + + +### Bug Fixes + +* **links:** revert distinguish visited links ([3bae299](https://github.com/mdn/yari/commit/3bae2998df7296591368004fd06d5b6b5358bb2f)) + + +### Miscellaneous + +* **deps-dev:** bump postcss-preset-env from 9.2.0 to 9.3.0 ([#9923](https://github.com/mdn/yari/issues/9923)) ([e095444](https://github.com/mdn/yari/commit/e0954449274a5225e56a6bd84afec280b14b378d)) +* **deps-dev:** bump react-router-dom from 6.17.0 to 6.18.0 ([#9925](https://github.com/mdn/yari/issues/9925)) ([cd21c6d](https://github.com/mdn/yari/commit/cd21c6dcc0d2855e9e38759300ac805368e50dd5)) +* **deps-dev:** bump stylelint-config-recommended-scss from 13.0.0 to 13.1.0 ([#9935](https://github.com/mdn/yari/issues/9935)) ([ca191b0](https://github.com/mdn/yari/commit/ca191b0211a7162e18f0504b2605a44eedbf880e)) +* **deps-dev:** bump the types group with 1 update ([#9928](https://github.com/mdn/yari/issues/9928)) ([414cc21](https://github.com/mdn/yari/commit/414cc21e5b1b06bbf828478d983f4c66ce7c15d5)) +* **deps:** bump @mdn/browser-compat-data from 5.3.27 to 5.3.28 ([#9926](https://github.com/mdn/yari/issues/9926)) ([48c8ce0](https://github.com/mdn/yari/commit/48c8ce03141eefde73bd8110772ddad90b45959f)) +* **deps:** bump @stripe/stripe-js from 2.1.10 to 2.1.11 ([#9933](https://github.com/mdn/yari/issues/9933)) ([8054bbd](https://github.com/mdn/yari/commit/8054bbd1f3fffba02eab8dd8928d856977baf7be)) +* **deps:** bump file-type from 18.5.0 to 18.6.0 ([#9924](https://github.com/mdn/yari/issues/9924)) ([ecd9779](https://github.com/mdn/yari/commit/ecd9779409c5de32d20839c45bb4c745350fd324)) +* **deps:** bump mdn-data from 2.1.0 to 2.2.0 ([#9934](https://github.com/mdn/yari/issues/9934)) ([32c0c00](https://github.com/mdn/yari/commit/32c0c00815ac5d1efeca63d17c236266906d4a17)) +* **macros/JsSidebar:** update zh-CN translation ([#9849](https://github.com/mdn/yari/issues/9849)) ([9867d52](https://github.com/mdn/yari/commit/9867d52abdebea25beb6e4d4878bd902a03664c4)) +* **macros/LearnSidebar:** add some pages under MathML ([#9937](https://github.com/mdn/yari/issues/9937)) ([060e53a](https://github.com/mdn/yari/commit/060e53a002761656bbad954a1675ee0a8b8ef109)) +* **macros/WebAssemblySidebar:** add zh-CN translation ([#9932](https://github.com/mdn/yari/issues/9932)) ([870285a](https://github.com/mdn/yari/commit/870285aed1e0218adbc4abf1660ccd519413496c)) +* **telemetry:** measure menu clicks ([#9918](https://github.com/mdn/yari/issues/9918)) ([c4c5d79](https://github.com/mdn/yari/commit/c4c5d79f201cd2fe3844414dcaf5edc8b9bd5246)) + +## [2.33.0](https://github.com/mdn/yari/compare/v2.32.0...v2.33.0) (2023-10-31) + + +### Features + +* **links:** distinguish visited links ([#9907](https://github.com/mdn/yari/issues/9907)) ([8f84da3](https://github.com/mdn/yari/commit/8f84da3bcc0bc6e1b87c15078c14a1d140925688)) +* **theme:** sync body background-color with theme-color meta tag ([#9325](https://github.com/mdn/yari/issues/9325)) ([5001b04](https://github.com/mdn/yari/commit/5001b04890f796b388024b2d23c4c5b0caf88f73)) + + +### Bug Fixes + +* **client:** rendering locale in column header on /translations/dashboard ([24bf873](https://github.com/mdn/yari/commit/24bf8738815cc0884eb47e3ae0f4ce1973906389)) +* correct some typos ([#9858](https://github.com/mdn/yari/issues/9858)) ([925538e](https://github.com/mdn/yari/commit/925538e166bd71d2befb3fb46741d7b6624a4978)) +* **docs:** link first child of every description term in post-processing ([#9862](https://github.com/mdn/yari/issues/9862)) ([0295813](https://github.com/mdn/yari/commit/029581391fa2a57f843d55f47390ec8c0c4b6732)) +* **images:** avoid blurry images ([#9591](https://github.com/mdn/yari/issues/9591)) ([0829b7e](https://github.com/mdn/yari/commit/0829b7ee43815d86f9c91ef6797cedc7d4f1e1f3)) +* **mandala:** remove rotation and color animation ([#9916](https://github.com/mdn/yari/issues/9916)) ([e687a03](https://github.com/mdn/yari/commit/e687a03e2354412f4dad45e80d4ebaa9d7926d5a)) +* **plus:** load stripe.js for fraud prevention ([#9318](https://github.com/mdn/yari/issues/9318)) ([88f000e](https://github.com/mdn/yari/commit/88f000e037fbad71ed2779159aa4e7f47568cadc)) +* **translations/dashboard:** fix Popularity rank column header ([#9908](https://github.com/mdn/yari/issues/9908)) ([24bf873](https://github.com/mdn/yari/commit/24bf8738815cc0884eb47e3ae0f4ce1973906389)) + + +### Miscellaneous + +* **deps-dev:** bump {react-router,react-router-dom} from 6.16.0 to 6.17.0 ([#9832](https://github.com/mdn/yari/issues/9832)) ([fd72a19](https://github.com/mdn/yari/commit/fd72a19b394e9c4123b4670deae140b6549ec93f)) +* **deps-dev:** bump eslint-plugin-unicorn from 48.0.1 to 49.0.0 ([#9904](https://github.com/mdn/yari/issues/9904)) ([0de918b](https://github.com/mdn/yari/commit/0de918bcc291a48299dce76c8f251224705e86eb)) +* **deps-dev:** bump stylelint-scss from 5.2.1 to 5.3.0 ([#9905](https://github.com/mdn/yari/issues/9905)) ([5efd040](https://github.com/mdn/yari/commit/5efd04052a81c7d145dc8b7f1d212dbbfc5b0211)) +* **deps-dev:** bump the types group with 1 update ([#9913](https://github.com/mdn/yari/issues/9913)) ([3b2dc06](https://github.com/mdn/yari/commit/3b2dc06f522bbdf0e730fe054f588d3bbc46b204)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.29 to 2.7.30 in /client/pwa ([#9823](https://github.com/mdn/yari/issues/9823)) ([a19c79c](https://github.com/mdn/yari/commit/a19c79ced150ca79f54dbd55781488124b5e8b0d)) +* **deps:** bump openai from 3.3.0 to 4.14.0 ([#9888](https://github.com/mdn/yari/issues/9888)) ([607c938](https://github.com/mdn/yari/commit/607c9385f804bdb8c25e4a66870444516aa59b3f)) +* **deps:** bump openai from 4.14.0 to 4.14.1 ([#9903](https://github.com/mdn/yari/issues/9903)) ([101b682](https://github.com/mdn/yari/commit/101b68220aa0ec8d264d37fd7050669613e72655)) +* **deps:** bump openai from 4.14.1 to 4.14.2 ([#9914](https://github.com/mdn/yari/issues/9914)) ([b60d0c0](https://github.com/mdn/yari/commit/b60d0c0e4b204993b4ded647d0256e6692b92195)) +* **deps:** bump the dependencies group in /deployer with 3 updates ([#9900](https://github.com/mdn/yari/issues/9900)) ([fe6c535](https://github.com/mdn/yari/commit/fe6c535a812511c57faa6ce722bc66d50e7c6c76)) +* **deps:** bump the dependencies group in /testing/integration with 2 updates ([#9902](https://github.com/mdn/yari/issues/9902)) ([521b8af](https://github.com/mdn/yari/commit/521b8af6bb26cd0370f845fc32d6e63b88eb97ff)) +* **deps:** bump the sentry group with 2 updates ([#9901](https://github.com/mdn/yari/issues/9901)) ([881e66c](https://github.com/mdn/yari/commit/881e66c4c648f776d314ed8d2bfe1fdf2d61c5ef)) +* **deps:** bump the sentry group with 2 updates ([#9912](https://github.com/mdn/yari/issues/9912)) ([3c371ce](https://github.com/mdn/yari/commit/3c371ce6ae1cfdf853b309a9a1d6d150bb26f0ef)) +* **macros/MathMLRef:** update zh-CN translation ([#9915](https://github.com/mdn/yari/issues/9915)) ([d7f3e7d](https://github.com/mdn/yari/commit/d7f3e7d6859d4742a42481af842c045691ec8268)) +* **macros/Non-standard_Header:** remove "Firefox OS" ([#9827](https://github.com/mdn/yari/issues/9827)) ([fd2a66e](https://github.com/mdn/yari/commit/fd2a66e5eeed6174872e5ce98b8d114d621072a3)) +* **telemetry:** measure TOC clicks ([#9919](https://github.com/mdn/yari/issues/9919)) ([69a0276](https://github.com/mdn/yari/commit/69a02760b76e017bc7017252d9a60f598b154b56)) + +## [2.32.0](https://github.com/mdn/yari/compare/v2.31.0...v2.32.0) (2023-10-27) + + +### Features + +* **ai-help:** index full docs as well ([#9608](https://github.com/mdn/yari/issues/9608)) ([9355a64](https://github.com/mdn/yari/commit/9355a643b601052c1ef3c426d6f6323f3baec2aa)) +* **blog:** add toc ([#9707](https://github.com/mdn/yari/issues/9707)) ([e31ba94](https://github.com/mdn/yari/commit/e31ba94d319097bf35cd04941f34c7b85902fb40)) +* **docs:** add anchor links on description terms ([#8413](https://github.com/mdn/yari/issues/8413)) ([ff73a32](https://github.com/mdn/yari/commit/ff73a329eb76647137fab808c34b9d39a87dee24)) +* **playground:** allow img from blob and data ([#9771](https://github.com/mdn/yari/issues/9771)) ([77e4c6e](https://github.com/mdn/yari/commit/77e4c6eb70fa2875c349ed22af75bcb04637f78c)) +* **pong:** bottom banner ([#9883](https://github.com/mdn/yari/issues/9883)) ([d533e90](https://github.com/mdn/yari/commit/d533e904eda86653d87d067eb82b507b8d0aeb83)) + + +### Bug Fixes + +* **a11y:** fix tab order reset in the header ([#9851](https://github.com/mdn/yari/issues/9851)) ([b12f554](https://github.com/mdn/yari/commit/b12f554af27d7c43e061ae2cbc864249ef371943)) +* **baseline:** not appearing on translated docs ([#9662](https://github.com/mdn/yari/issues/9662)) ([788c883](https://github.com/mdn/yari/commit/788c8838ebfcf871da8b02e5d36df6ac8ecd39d6)) +* **blog:** move toc to left on large screens ([#9772](https://github.com/mdn/yari/issues/9772)) ([002bddd](https://github.com/mdn/yari/commit/002bddda521c38fe8f179104076ef103a761a1ac)) +* **client:** avoid CSS warning in Firefox ([#9727](https://github.com/mdn/yari/issues/9727)) ([967b786](https://github.com/mdn/yari/commit/967b7867dc09bad5776a5aa10ea51924e376724d)) +* **client:** make alt text on images appear in dark mode ([#9250](https://github.com/mdn/yari/issues/9250)) ([f432df1](https://github.com/mdn/yari/commit/f432df149368369940ab52ee5aecadd2132fb424)) +* **docs:** restore behavior of description term links ([#9811](https://github.com/mdn/yari/issues/9811)) ([0cad7f4](https://github.com/mdn/yari/commit/0cad7f46a432684f0baabd2cff9725ee3ca54a90)) +* **flaws:** ignore casing of text fragments ([#9882](https://github.com/mdn/yari/issues/9882)) ([fc51e08](https://github.com/mdn/yari/commit/fc51e088e03a7429ee9033d092841e9e5a285f4d)) +* **images:** use dark text on white background ([#9863](https://github.com/mdn/yari/issues/9863)) ([90c868e](https://github.com/mdn/yari/commit/90c868eb8bbcffb515ffc82309bb871b34e323cb)) +* **macros/LiveSampleLink:** add fallback to prebuilt samples ([#9738](https://github.com/mdn/yari/issues/9738)) ([4e36847](https://github.com/mdn/yari/commit/4e3684717b4857818eeeb901486eaf6be255b626)) +* **macros/WebExtExamples:** update branch name ([#9730](https://github.com/mdn/yari/issues/9730)) ([4f05c30](https://github.com/mdn/yari/commit/4f05c30e99ab4a15c119d3c47ef3e2f15fc77f42)) +* **ssr:** use absolute href for alternate rss link ([#9794](https://github.com/mdn/yari/issues/9794)) ([5150c6c](https://github.com/mdn/yari/commit/5150c6ca1fa85a01d3ed563e50805823fba9f0e7)) +* update branch name with `main` ([4f05c30](https://github.com/mdn/yari/commit/4f05c30e99ab4a15c119d3c47ef3e2f15fc77f42)) + + +### Enhancements + +* **docs:** distinguish nested definition lists ([#9836](https://github.com/mdn/yari/issues/9836)) ([f8b48f2](https://github.com/mdn/yari/commit/f8b48f2dae9b302e0b6fa56887de8271c75af2e1)) +* **search:** split query at dot ([#9840](https://github.com/mdn/yari/issues/9840)) ([9286d7b](https://github.com/mdn/yari/commit/9286d7b7022fbc2f8690160b9e73ef539279d115)) + + +### Miscellaneous + +* **ai-help:** fix typo in modal ([#9792](https://github.com/mdn/yari/issues/9792)) ([4ccfa53](https://github.com/mdn/yari/commit/4ccfa53e9b3f2659c0fe31646c0973307724d37b)) +* **blog:** type buildBlog() param type ([#9830](https://github.com/mdn/yari/issues/9830)) ([55d9d83](https://github.com/mdn/yari/commit/55d9d834a5f620e9160b9008e715db1b615d6067)) +* **deps-dev:** bump @babel/core from 7.22.20 to 7.23.0 ([#9718](https://github.com/mdn/yari/issues/9718)) ([d8cf162](https://github.com/mdn/yari/commit/d8cf1628878e182b4408e8b72e9787f61074f76d)) +* **deps-dev:** bump @babel/core from 7.23.0 to 7.23.2 ([#9803](https://github.com/mdn/yari/issues/9803)) ([a240c5f](https://github.com/mdn/yari/commit/a240c5f4a16287335236ef9a799d564fd9fe903a)) +* **deps-dev:** bump @playwright/test from 1.38.1 to 1.39.0 ([#9805](https://github.com/mdn/yari/issues/9805)) ([b996e36](https://github.com/mdn/yari/commit/b996e3648c16f9b36f87e4af570dfffbf400c27c)) +* **deps-dev:** bump @supabase/supabase-js from 2.36.0 to 2.37.0 ([#9756](https://github.com/mdn/yari/issues/9756)) ([b38d6c2](https://github.com/mdn/yari/commit/b38d6c223d0f1ae13bb3928ddcb3e1669bd069a4)) +* **deps-dev:** bump @supabase/supabase-js from 2.37.0 to 2.38.0 ([#9767](https://github.com/mdn/yari/issues/9767)) ([62fd1f7](https://github.com/mdn/yari/commit/62fd1f7f7d2e91c88cc98327e1a04c884da9c0b9)) +* **deps-dev:** bump @supabase/supabase-js from 2.38.0 to 2.38.2 ([#9860](https://github.com/mdn/yari/issues/9860)) ([96356eb](https://github.com/mdn/yari/commit/96356eb369e7700dfe50f566ec7c55823f10d072)) +* **deps-dev:** bump @supabase/supabase-js from 2.38.2 to 2.38.4 ([#9895](https://github.com/mdn/yari/issues/9895)) ([5f15c1c](https://github.com/mdn/yari/commit/5f15c1c4f3bd3b2ccdbcdde0fc14f5bca6b9ffff)) +* **deps-dev:** bump browserslist from 4.21.11 to 4.22.1 ([#9746](https://github.com/mdn/yari/issues/9746)) ([b41c144](https://github.com/mdn/yari/commit/b41c1444d9a9a37eddb233d72a33c88c8d41476b)) +* **deps-dev:** bump eslint from 8.49.0 to 8.50.0 ([#9723](https://github.com/mdn/yari/issues/9723)) ([59f5d5c](https://github.com/mdn/yari/commit/59f5d5c32746daf0fb28e9828d3fd0717bb7405e)) +* **deps-dev:** bump eslint from 8.50.0 to 8.51.0 ([#9777](https://github.com/mdn/yari/issues/9777)) ([9d709cb](https://github.com/mdn/yari/commit/9d709cbf1cc7d2a47911bc731af943e126efd977)) +* **deps-dev:** bump eslint from 8.51.0 to 8.52.0 ([#9868](https://github.com/mdn/yari/issues/9868)) ([a35c689](https://github.com/mdn/yari/commit/a35c68903c67b5c096778105d21cd2bd2b8854f6)) +* **deps-dev:** bump eslint-plugin-import from 2.28.1 to 2.29.0 ([#9866](https://github.com/mdn/yari/issues/9866)) ([ceae0a9](https://github.com/mdn/yari/commit/ceae0a907ab3cee272342a977d79acbec12461b3)) +* **deps-dev:** bump eslint-plugin-jest from 27.4.0 to 27.4.2 ([#9752](https://github.com/mdn/yari/issues/9752)) ([f0635e5](https://github.com/mdn/yari/commit/f0635e59afd3cfbea5e04439248d6eab3b8a51ce)) +* **deps-dev:** bump eslint-plugin-jest from 27.4.2 to 27.4.3 ([#9870](https://github.com/mdn/yari/issues/9870)) ([96c200f](https://github.com/mdn/yari/commit/96c200f6ef584782786ff4081836e1fb21e1faee)) +* **deps-dev:** bump eslint-plugin-jest from 27.4.3 to 27.6.0 ([#9894](https://github.com/mdn/yari/issues/9894)) ([7088721](https://github.com/mdn/yari/commit/7088721ab54ee56d761a2c4dfa57ab19d29a2a04)) +* **deps-dev:** bump html-validate from 8.4.0 to 8.4.1 ([#9722](https://github.com/mdn/yari/issues/9722)) ([f424396](https://github.com/mdn/yari/commit/f424396395e12a92fc5b432e0a74cd217ea03a78)) +* **deps-dev:** bump html-validate from 8.4.1 to 8.5.0 ([#9753](https://github.com/mdn/yari/issues/9753)) ([f12e7ac](https://github.com/mdn/yari/commit/f12e7ac17e75ccc7c92b916d9fc82f63ef6c33fb)) +* **deps-dev:** bump html-validate from 8.5.0 to 8.6.0 ([#9825](https://github.com/mdn/yari/issues/9825)) ([deb99ee](https://github.com/mdn/yari/commit/deb99eea167a3262d77638ba5d9997cbd54ad902)) +* **deps-dev:** bump html-validate from 8.6.0 to 8.7.0 ([#9867](https://github.com/mdn/yari/issues/9867)) ([abb0b35](https://github.com/mdn/yari/commit/abb0b35c0fdb85ede3d3c8c2b82ae3b72c6f09a0)) +* **deps-dev:** bump postcss from 8.4.30 to 8.4.31 ([#9745](https://github.com/mdn/yari/issues/9745)) ([c0a2447](https://github.com/mdn/yari/commit/c0a2447993134ee8f5a51507b5258a85fce1d4cc)) +* **deps-dev:** bump postcss-preset-env from 9.1.4 to 9.2.0 ([#9788](https://github.com/mdn/yari/issues/9788)) ([fa44bbd](https://github.com/mdn/yari/commit/fa44bbd521fc696d48f0f97b1994ebd6feae811a)) +* **deps-dev:** bump prettier-plugin-packagejson from 2.4.5 to 2.4.6 ([#9747](https://github.com/mdn/yari/issues/9747)) ([e96e6f2](https://github.com/mdn/yari/commit/e96e6f2b67665b42fe5229c7933ff044cbadf358)) +* **deps-dev:** bump resolve from 1.22.6 to 1.22.8 ([#9797](https://github.com/mdn/yari/issues/9797)) ([00ad090](https://github.com/mdn/yari/commit/00ad0901e22f475b79c3acd171c1b00561f0daee)) +* **deps-dev:** bump sass from 1.68.0 to 1.69.0 ([#9773](https://github.com/mdn/yari/issues/9773)) ([cff107f](https://github.com/mdn/yari/commit/cff107f7cf7cd9fca332165066b1d44a27dddd3e)) +* **deps-dev:** bump sass from 1.69.0 to 1.69.1 ([#9787](https://github.com/mdn/yari/issues/9787)) ([513ceb1](https://github.com/mdn/yari/commit/513ceb11c5894d6d5eaec706a9d882bc37a39559)) +* **deps-dev:** bump sass from 1.69.1 to 1.69.2 ([#9799](https://github.com/mdn/yari/issues/9799)) ([5551811](https://github.com/mdn/yari/commit/555181138412f796a05f95bcf8af126cc00dadf8)) +* **deps-dev:** bump sass from 1.69.2 to 1.69.3 ([#9809](https://github.com/mdn/yari/issues/9809)) ([dd54570](https://github.com/mdn/yari/commit/dd545703deaed608945cd8d09f17c26d0b60805e)) +* **deps-dev:** bump sass from 1.69.3 to 1.69.4 ([#9843](https://github.com/mdn/yari/issues/9843)) ([c35017f](https://github.com/mdn/yari/commit/c35017f87778b97016d5e6bb57ec3fb534de7027)) +* **deps-dev:** bump sass from 1.69.4 to 1.69.5 ([#9889](https://github.com/mdn/yari/issues/9889)) ([0076cdd](https://github.com/mdn/yari/commit/0076cdd80a32ebe571ae026b4a65b0ded6ecb958)) +* **deps-dev:** bump style-dictionary from 3.8.0 to 3.9.0 ([#9878](https://github.com/mdn/yari/issues/9878)) ([9d82514](https://github.com/mdn/yari/commit/9d82514651ad04c92e8c28ee92609628423d0645)) +* **deps-dev:** bump stylelint from 15.10.3 to 15.11.0 ([#9834](https://github.com/mdn/yari/issues/9834)) ([2b214a7](https://github.com/mdn/yari/commit/2b214a7ad56662fd55ae24b9298c8507c4032e7c)) +* **deps-dev:** bump swr from 2.2.2 to 2.2.4 ([#9728](https://github.com/mdn/yari/issues/9728)) ([ffca12e](https://github.com/mdn/yari/commit/ffca12e2c0a479b224d3e709e2f7795bd823df5b)) +* **deps-dev:** bump tailwindcss from 3.3.3 to 3.3.4 ([#9879](https://github.com/mdn/yari/issues/9879)) ([5720eba](https://github.com/mdn/yari/commit/5720ebaf990a9fe44382375e38ff7bd893b80452)) +* **deps-dev:** bump tailwindcss from 3.3.4 to 3.3.5 ([#9887](https://github.com/mdn/yari/issues/9887)) ([9bac3e7](https://github.com/mdn/yari/commit/9bac3e70e6b6cb4276281e65882dd58548989f08)) +* **deps-dev:** bump the dependencies group in /testing/integration with 1 update ([#9872](https://github.com/mdn/yari/issues/9872)) ([6a40572](https://github.com/mdn/yari/commit/6a40572b0cbf73ed1abfdc14a4226d62f43858b6)) +* **deps-dev:** bump the types group with 1 update ([#9717](https://github.com/mdn/yari/issues/9717)) ([f5c7bf3](https://github.com/mdn/yari/commit/f5c7bf34b999cd146f812b7ee00f6571062114f9)) +* **deps-dev:** bump the types group with 1 update ([#9751](https://github.com/mdn/yari/issues/9751)) ([a8f941d](https://github.com/mdn/yari/commit/a8f941da9241be9e9178e443fbb3666af0405d27)) +* **deps-dev:** bump the types group with 1 update ([#9776](https://github.com/mdn/yari/issues/9776)) ([98955f9](https://github.com/mdn/yari/commit/98955f9690c79c7955b406735e41f29019e8ee83)) +* **deps-dev:** bump the types group with 1 update ([#9871](https://github.com/mdn/yari/issues/9871)) ([96107df](https://github.com/mdn/yari/commit/96107df0121726425d848d40b3a9db825c4ab70d)) +* **deps-dev:** bump the types group with 1 update ([#9886](https://github.com/mdn/yari/issues/9886)) ([17d061b](https://github.com/mdn/yari/commit/17d061b331675d66a667df6b61c0135e6d39a070)) +* **deps-dev:** bump the types group with 2 updates ([#9769](https://github.com/mdn/yari/issues/9769)) ([c660e6a](https://github.com/mdn/yari/commit/c660e6a928f7f8ed04a852a47a88694b718aed17)) +* **deps-dev:** bump the types group with 2 updates ([#9785](https://github.com/mdn/yari/issues/9785)) ([ad1f351](https://github.com/mdn/yari/commit/ad1f351850a77e6cfb0db72dd485e2d87ee07008)) +* **deps-dev:** bump the types group with 3 updates ([#9796](https://github.com/mdn/yari/issues/9796)) ([3a9160f](https://github.com/mdn/yari/commit/3a9160f5c73f97b96fa8f02d0949646aafeee6ac)) +* **deps-dev:** bump the types group with 5 updates ([#9741](https://github.com/mdn/yari/issues/9741)) ([0bd5489](https://github.com/mdn/yari/commit/0bd5489ea8556b07b79e66aecc2fe3b7ffed022b)) +* **deps-dev:** bump the types group with 8 updates ([#9857](https://github.com/mdn/yari/issues/9857)) ([4a2afa9](https://github.com/mdn/yari/commit/4a2afa9c1d86353fcca94d6a7d5685a27f6f7b0e)) +* **deps-dev:** bump ts-loader from 9.4.4 to 9.5.0 ([#9779](https://github.com/mdn/yari/issues/9779)) ([50bcf9b](https://github.com/mdn/yari/commit/50bcf9b0a198ed287cb009be29219664347004c2)) +* **deps-dev:** bump ts-loader from 9.4.4 to 9.5.0 in /client/pwa ([#9780](https://github.com/mdn/yari/issues/9780)) ([788536c](https://github.com/mdn/yari/commit/788536c2ce45bbdb82107f750a8e972cdfb7fae7)) +* **deps-dev:** bump webpack from 5.88.2 to 5.89.0 ([#9824](https://github.com/mdn/yari/issues/9824)) ([de5e07d](https://github.com/mdn/yari/commit/de5e07d086e3de4fea422d48f88a4fa70037aa78)) +* **deps-dev:** bump webpack from 5.88.2 to 5.89.0 in /client/pwa ([#9822](https://github.com/mdn/yari/issues/9822)) ([46b4315](https://github.com/mdn/yari/commit/46b4315191168e8ead29a5a7c49ab125b2fc88e9)) +* **deps:** bump @codemirror/state from 6.2.1 to 6.3.0 ([#9802](https://github.com/mdn/yari/issues/9802)) ([4f2b754](https://github.com/mdn/yari/commit/4f2b7541658d2223573d250cb808ef0e37998920)) +* **deps:** bump @codemirror/state from 6.3.0 to 6.3.1 ([#9846](https://github.com/mdn/yari/issues/9846)) ([f80e45b](https://github.com/mdn/yari/commit/f80e45b180dbee1194cb0da4e0238bedae0c8c73)) +* **deps:** bump @mdn/browser-compat-data from 5.3.18 to 5.3.19 ([#9735](https://github.com/mdn/yari/issues/9735)) ([b81f2c1](https://github.com/mdn/yari/commit/b81f2c1b887548ba454948137aa51bb8c78433ab)) +* **deps:** bump @mdn/browser-compat-data from 5.3.19 to 5.3.20 ([#9764](https://github.com/mdn/yari/issues/9764)) ([158a7f2](https://github.com/mdn/yari/commit/158a7f2b2ae6b3ff16da6d784286787bf1163da3)) +* **deps:** bump @mdn/browser-compat-data from 5.3.20 to 5.3.21 ([#9778](https://github.com/mdn/yari/issues/9778)) ([2496594](https://github.com/mdn/yari/commit/2496594791914f6553df7d76e59f60e11b344d0b)) +* **deps:** bump @mdn/browser-compat-data from 5.3.21 to 5.3.22 ([#9800](https://github.com/mdn/yari/issues/9800)) ([7dbcb55](https://github.com/mdn/yari/commit/7dbcb55bc53fe6cdef532b5e2d7ca7c33c29a875)) +* **deps:** bump @mdn/browser-compat-data from 5.3.22 to 5.3.23 ([#9815](https://github.com/mdn/yari/issues/9815)) ([88f1882](https://github.com/mdn/yari/commit/88f18820c0786c3c6077675ff25363b73908a939)) +* **deps:** bump @mdn/browser-compat-data from 5.3.23 to 5.3.24 ([#9844](https://github.com/mdn/yari/issues/9844)) ([19767f0](https://github.com/mdn/yari/commit/19767f0d22bb03dcf1d16124fca5a5e328cf6d40)) +* **deps:** bump @mdn/browser-compat-data from 5.3.24 to 5.3.25 ([#9861](https://github.com/mdn/yari/issues/9861)) ([6d9d212](https://github.com/mdn/yari/commit/6d9d21226e26c484712653767bd9edf5cd5f03f0)) +* **deps:** bump @mdn/browser-compat-data from 5.3.25 to 5.3.26 ([#9877](https://github.com/mdn/yari/issues/9877)) ([b6c3932](https://github.com/mdn/yari/commit/b6c3932e05301755d0f47fae95dd60bb16513f6a)) +* **deps:** bump @mdn/browser-compat-data from 5.3.26 to 5.3.27 ([#9897](https://github.com/mdn/yari/issues/9897)) ([16c3faa](https://github.com/mdn/yari/commit/16c3faa2feccd270d9e0023cd86102b6f732146d)) +* **deps:** bump @mozilla/glean from 2.0.2 to 2.0.5 ([#9854](https://github.com/mdn/yari/issues/9854)) ([8f021d4](https://github.com/mdn/yari/commit/8f021d4b768dcf74c0c1d3bef78674c6c89bfcd3)) +* **deps:** bump @vscode/ripgrep from 1.15.5 to 1.15.6 ([#9806](https://github.com/mdn/yari/issues/9806)) ([f46ba3a](https://github.com/mdn/yari/commit/f46ba3a7d8701ee705d317f9ed4b6c5d39e6930b)) +* **deps:** bump actions/setup-node from 3 to 4 ([#9874](https://github.com/mdn/yari/issues/9874)) ([dc681e7](https://github.com/mdn/yari/commit/dc681e777781a5301c960db6741b2d32f2eb2af1)) +* **deps:** bump aws-actions/configure-aws-credentials from 2.2.0 to 4.0.1 ([#9766](https://github.com/mdn/yari/issues/9766)) ([780c56a](https://github.com/mdn/yari/commit/780c56af628320b835a1d1c4fea951bf351982da)) +* **deps:** bump the dependencies group in /deployer with 1 update ([#9750](https://github.com/mdn/yari/issues/9750)) ([fb30ad1](https://github.com/mdn/yari/commit/fb30ad191743d11bdad49c767c27587520e46248)) +* **deps:** bump the dependencies group in /deployer with 1 update ([#9781](https://github.com/mdn/yari/issues/9781)) ([32be848](https://github.com/mdn/yari/commit/32be848db7cf0e4659a9d128f7e6113026752193)) +* **deps:** bump the dependencies group in /deployer with 1 update ([#9820](https://github.com/mdn/yari/issues/9820)) ([b064256](https://github.com/mdn/yari/commit/b064256872bcf9a93107bddfef588bd9fc00d8d3)) +* **deps:** bump the dependencies group in /deployer with 3 updates ([#9865](https://github.com/mdn/yari/issues/9865)) ([3385d97](https://github.com/mdn/yari/commit/3385d974cf8f42f1c99e49e0a7214f899316f8b2)) +* **deps:** bump the sentry group with 2 updates ([#9725](https://github.com/mdn/yari/issues/9725)) ([a0bb09a](https://github.com/mdn/yari/commit/a0bb09ae8ab8a075b5b5813d857683eabd1dc7cb)) +* **deps:** bump the sentry group with 2 updates ([#9733](https://github.com/mdn/yari/issues/9733)) ([ae738eb](https://github.com/mdn/yari/commit/ae738eb994ece344af55963e68e4ac6d9ad3c9c0)) +* **deps:** bump the sentry group with 2 updates ([#9763](https://github.com/mdn/yari/issues/9763)) ([108de5c](https://github.com/mdn/yari/commit/108de5ce3f8af3eacf151333f0bfb5e27d24c1dd)) +* **deps:** bump the sentry group with 2 updates ([#9821](https://github.com/mdn/yari/issues/9821)) ([d77b49b](https://github.com/mdn/yari/commit/d77b49bb8e32fba1306b3a7fde73050822e25e85)) +* **deps:** bump the sentry group with 2 updates ([#9841](https://github.com/mdn/yari/issues/9841)) ([cbd7201](https://github.com/mdn/yari/commit/cbd7201daf528c1a7377535965f910629d15ff06)) +* **deps:** bump the sentry group with 2 updates ([#9875](https://github.com/mdn/yari/issues/9875)) ([90f9642](https://github.com/mdn/yari/commit/90f96422f5fa6f60f3205ce83f9b269e364214d0)) +* **deps:** bump the sentry group with 2 updates ([#9885](https://github.com/mdn/yari/issues/9885)) ([58b33b9](https://github.com/mdn/yari/commit/58b33b9bd90fc9651caf82daa153c972db5d27a1)) +* **deps:** bump urllib3 from 1.26.14 to 1.26.17 in /testing/integration ([#9760](https://github.com/mdn/yari/issues/9760)) ([e3f651a](https://github.com/mdn/yari/commit/e3f651aafcb54bdc9b1772178845d136efdaf920)) +* **deps:** bump urllib3 from 1.26.14 to 1.26.18 in /deployer ([#9837](https://github.com/mdn/yari/issues/9837)) ([7cad968](https://github.com/mdn/yari/commit/7cad9684c37481c7566153d045cf06601a5df6ac)) +* **deps:** bump urllib3 from 1.26.17 to 1.26.18 in /testing/integration ([#9838](https://github.com/mdn/yari/issues/9838)) ([3a2b92f](https://github.com/mdn/yari/commit/3a2b92ff02c40ab84ae77965de82eec7c11e6790)) +* **deps:** bump web-specs from 2.68.0 to 2.70.0 ([#9804](https://github.com/mdn/yari/issues/9804)) ([e393894](https://github.com/mdn/yari/commit/e393894d6294372673e12d034be38135a92857fb)) +* **deps:** bump web-specs from 2.70.0 to 2.71.0 ([#9814](https://github.com/mdn/yari/issues/9814)) ([c528fb9](https://github.com/mdn/yari/commit/c528fb96be3e94bc610c4c53bf60c9cb357e5848)) +* **featured-articles:** font-palette -> nesting ([#9892](https://github.com/mdn/yari/issues/9892)) ([d1f6bf3](https://github.com/mdn/yari/commit/d1f6bf320e5de9a88d046b5b101eb2b85fb3e4f7)) +* **flaws:** exclude /en-US/blog/* from broken-link flaw ([#9839](https://github.com/mdn/yari/issues/9839)) ([546f4fe](https://github.com/mdn/yari/commit/546f4fe74547f9905e54cd5cc634a92e7f4d05c9)) +* **github:** add CODEOWNERS ([#9873](https://github.com/mdn/yari/issues/9873)) ([6d4878a](https://github.com/mdn/yari/commit/6d4878a4e8ccce77f56b2457d19621f8257ef768)) +* **glean:** add page's UTM parameters to pings ([#9595](https://github.com/mdn/yari/issues/9595)) ([4c72586](https://github.com/mdn/yari/commit/4c7258670fbcb0b71036d2d9f604c58f48e2f0e2)) +* **labeler:** add more labels ([#9784](https://github.com/mdn/yari/issues/9784)) ([a0a543d](https://github.com/mdn/yari/commit/a0a543df0251a40fbd7528e56f4dd3d9b3887a76)) +* **macros/CSSRef:** update zh-CN translation of CSSRef ([#9791](https://github.com/mdn/yari/issues/9791)) ([48ad86d](https://github.com/mdn/yari/commit/48ad86d48d4431ce1ff30c6a0f9883c318ad4991)) +* **macros/HTMLSidebar:** update zh-CN translation ([#9790](https://github.com/mdn/yari/issues/9790)) ([8bf7a7e](https://github.com/mdn/yari/commit/8bf7a7e1fe487b817b08b906ca35af84e3b970fb)) +* **macros/LearnSidebar:** add "HTML forms in legacy browsers" ([#9202](https://github.com/mdn/yari/issues/9202)) ([89f4b29](https://github.com/mdn/yari/commit/89f4b299edc175405e16773a90a5c16ed54f9828)) +* **macros/LearnSidebar:** update zh-CN translation ([#9630](https://github.com/mdn/yari/issues/9630)) ([41ec69a](https://github.com/mdn/yari/commit/41ec69abdecbf96033d261598ad21a9b12581f46)) +* **macros:** delete {{htmlattrxref}} macro ([#9789](https://github.com/mdn/yari/issues/9789)) ([d640774](https://github.com/mdn/yari/commit/d640774ee23d2e7a056daeb187e5cb8f892ddff0)) +* **macros:** delete {{SectionOnPage}} macro ([#9436](https://github.com/mdn/yari/issues/9436)) ([54dce18](https://github.com/mdn/yari/commit/54dce187bcaed195e7e86592c3a3045c558ed26e)) +* **redirects:** remove broken redirect rules ([#9762](https://github.com/mdn/yari/issues/9762)) ([ad64ce5](https://github.com/mdn/yari/commit/ad64ce52a5b1058129c1f75d907999a8e1cc5650)) +* **telemetry:** measure "Add/edit note" on collection items ([#9850](https://github.com/mdn/yari/issues/9850)) ([47d3686](https://github.com/mdn/yari/commit/47d3686b6cb4e9734e1e40db92a22c72b0dfbf30)) + +## [2.31.0](https://github.com/mdn/yari/compare/v2.30.0...v2.31.0) (2023-09-22) + + +### Features + +* **glean:** add is_baseline metric to pings ([#9476](https://github.com/mdn/yari/issues/9476)) ([231d6aa](https://github.com/mdn/yari/commit/231d6aab8f1c8efe159d268c261446c5b7ae12d9)) + + +### Bug Fixes + +* **client/public:** avoid global variable ([#9619](https://github.com/mdn/yari/issues/9619)) ([47c26df](https://github.com/mdn/yari/commit/47c26df8c646b179599f898d176218fe4dad367f)) +* **eslint:** support running in git submodule ([#9578](https://github.com/mdn/yari/issues/9578)) ([c40fb92](https://github.com/mdn/yari/commit/c40fb92112503476b38dbabd6374bad597ff8099)) +* **placement:** fix firing multiple impressions ([#9631](https://github.com/mdn/yari/issues/9631)) ([b8da642](https://github.com/mdn/yari/commit/b8da64244b1f148b732e9937aff80d8cdb586d17)) + + +### Miscellaneous + +* **banners:** remove unused cta code ([#8872](https://github.com/mdn/yari/issues/8872)) ([063449c](https://github.com/mdn/yari/commit/063449c97109a3fefecb4cb96cd7f5aac120d055)) +* **dependabot:** group pip minor/patch updates ([#9687](https://github.com/mdn/yari/issues/9687)) ([80c9cf4](https://github.com/mdn/yari/commit/80c9cf493077da694723235c33a549454ecc1801)) +* **deps-dev:** bump @babel/core from 7.22.11 to 7.22.15 ([#9613](https://github.com/mdn/yari/issues/9613)) ([40c9acb](https://github.com/mdn/yari/commit/40c9acbd647d883c30c0acd2272a72e6d8c97f15)) +* **deps-dev:** bump @babel/core from 7.22.15 to 7.22.17 ([#9640](https://github.com/mdn/yari/issues/9640)) ([9bed1cc](https://github.com/mdn/yari/commit/9bed1cce9b7d72cc5a65168da2108195f3f43461)) +* **deps-dev:** bump @babel/core from 7.22.17 to 7.22.19 ([#9668](https://github.com/mdn/yari/issues/9668)) ([934b7bb](https://github.com/mdn/yari/commit/934b7bbb9303f45f947392abf3f26d8363a47e5c)) +* **deps-dev:** bump @babel/core from 7.22.19 to 7.22.20 ([#9684](https://github.com/mdn/yari/issues/9684)) ([86d2bf8](https://github.com/mdn/yari/commit/86d2bf805985f0c64a93d3cdb7dcda2281c11f3a)) +* **deps-dev:** bump @babel/eslint-parser from 7.22.11 to 7.22.15 ([#9612](https://github.com/mdn/yari/issues/9612)) ([d1192cc](https://github.com/mdn/yari/commit/d1192cc956b2cb344ce256ae812e2379f4eabb7b)) +* **deps-dev:** bump @babel/preset-env from 7.22.10 to 7.22.14 ([#9588](https://github.com/mdn/yari/issues/9588)) ([e4ab1b8](https://github.com/mdn/yari/commit/e4ab1b8da72a561150f8e3f1a4a8cd61fe79f0b9)) +* **deps-dev:** bump @babel/preset-env from 7.22.14 to 7.22.15 ([#9611](https://github.com/mdn/yari/issues/9611)) ([fe52e46](https://github.com/mdn/yari/commit/fe52e468ca64d62124d87cf4b2499e2bb16ea6b3)) +* **deps-dev:** bump @babel/preset-env from 7.22.15 to 7.22.20 ([#9680](https://github.com/mdn/yari/issues/9680)) ([1147b41](https://github.com/mdn/yari/commit/1147b418df2efd44f5005dd0e3f2cc2210accc9c)) +* **deps-dev:** bump @playwright/test from 1.37.1 to 1.38.0 ([#9661](https://github.com/mdn/yari/issues/9661)) ([1d1a9b4](https://github.com/mdn/yari/commit/1d1a9b4bb30b8b1405c841d398e4779d98fd8576)) +* **deps-dev:** bump @playwright/test from 1.38.0 to 1.38.1 ([#9712](https://github.com/mdn/yari/issues/9712)) ([357650c](https://github.com/mdn/yari/commit/357650cb894f42ab931559bff52504ce4023f5e5)) +* **deps-dev:** bump @supabase/supabase-js from 2.33.1 to 2.33.2 ([#9643](https://github.com/mdn/yari/issues/9643)) ([5192acc](https://github.com/mdn/yari/commit/5192acc214f7fcddb6782054d625d7c8d2b6e82c)) +* **deps-dev:** bump @supabase/supabase-js from 2.33.2 to 2.34.0 ([#9698](https://github.com/mdn/yari/issues/9698)) ([bfe19cb](https://github.com/mdn/yari/commit/bfe19cb725e0c0de89f3a602dcf676949462752f)) +* **deps-dev:** bump @supabase/supabase-js from 2.34.0 to 2.36.0 ([#9705](https://github.com/mdn/yari/issues/9705)) ([f117a58](https://github.com/mdn/yari/commit/f117a58f152159411f17fe772761009128765795)) +* **deps-dev:** bump @types/cli-progress from 3.11.0 to 3.11.1 ([#9610](https://github.com/mdn/yari/issues/9610)) ([8d88356](https://github.com/mdn/yari/commit/8d88356e0d5b6d150f6991ec544eedfdb5606a66)) +* **deps-dev:** bump @types/cli-progress from 3.11.1 to 3.11.2 ([#9625](https://github.com/mdn/yari/issues/9625)) ([106a6f4](https://github.com/mdn/yari/commit/106a6f47230caefe7e3ceaa3f550ea34da9f8d42)) +* **deps-dev:** bump babel-jest from 29.6.4 to 29.7.0 ([#9651](https://github.com/mdn/yari/issues/9651)) ([910df81](https://github.com/mdn/yari/commit/910df814a9ea4aff68a40f56b30094b7f0878224)) +* **deps-dev:** bump black from 23.7.0 to 23.9.1 in /deployer ([#9635](https://github.com/mdn/yari/issues/9635)) ([b17be3f](https://github.com/mdn/yari/commit/b17be3f590ae740c69c27ed9ce3d7135be0bde0c)) +* **deps-dev:** bump black from 23.7.0 to 23.9.1 in /testing/integration ([#9637](https://github.com/mdn/yari/issues/9637)) ([4ce6f69](https://github.com/mdn/yari/commit/4ce6f690e9b5453360c439c905f34a6d3aa47720)) +* **deps-dev:** bump browserslist from 4.21.10 to 4.21.11 ([#9714](https://github.com/mdn/yari/issues/9714)) ([67ab003](https://github.com/mdn/yari/commit/67ab0037ca65bda7c8dc6cd0d34386abf0f667e3)) +* **deps-dev:** bump camelcase from 7.0.1 to 8.0.0 ([#9473](https://github.com/mdn/yari/issues/9473)) ([5237040](https://github.com/mdn/yari/commit/5237040364a00768fc926089365ccc2fc53fc7af)) +* **deps-dev:** bump eslint from 8.48.0 to 8.49.0 ([#9641](https://github.com/mdn/yari/issues/9641)) ([76f8d44](https://github.com/mdn/yari/commit/76f8d444e4e112ce49504e09ec9376445a10953e)) +* **deps-dev:** bump eslint-plugin-jest from 27.2.3 to 27.4.0 ([#9678](https://github.com/mdn/yari/issues/9678)) ([c92ae09](https://github.com/mdn/yari/commit/c92ae0940d1e0bffcb69c07e6e82e11c19c02c14)) +* **deps-dev:** bump html-validate from 8.3.0 to 8.4.0 ([#9638](https://github.com/mdn/yari/issues/9638)) ([bd38165](https://github.com/mdn/yari/commit/bd381656a7c3274c44af96abcf73d04d83224ff4)) +* **deps-dev:** bump jest from 29.6.4 to 29.7.0 ([#9649](https://github.com/mdn/yari/issues/9649)) ([06376f7](https://github.com/mdn/yari/commit/06376f7d2ef9ee26b8aebd57debdbcc8482dde26)) +* **deps-dev:** bump jest-environment-jsdom from 29.6.4 to 29.7.0 ([#9652](https://github.com/mdn/yari/issues/9652)) ([a7e4348](https://github.com/mdn/yari/commit/a7e4348ee5dc226cb7e5864fd2b299176d1e9709)) +* **deps-dev:** bump jest-resolve from 29.6.4 to 29.7.0 ([#9648](https://github.com/mdn/yari/issues/9648)) ([0f1482c](https://github.com/mdn/yari/commit/0f1482c9584c5e44fa2d2f1c0c8d5f634e555778)) +* **deps-dev:** bump postcss from 8.4.29 to 8.4.30 ([#9691](https://github.com/mdn/yari/issues/9691)) ([1866b43](https://github.com/mdn/yari/commit/1866b43a5b17cc8f86a3b142f769e37dfc85d6c3)) +* **deps-dev:** bump postcss-preset-env from 9.1.2 to 9.1.3 ([#9599](https://github.com/mdn/yari/issues/9599)) ([d406235](https://github.com/mdn/yari/commit/d406235c65448a1f25930728f2bf7d3b8ee8cbb7)) +* **deps-dev:** bump postcss-preset-env from 9.1.3 to 9.1.4 ([#9693](https://github.com/mdn/yari/issues/9693)) ([d60e844](https://github.com/mdn/yari/commit/d60e8445fa82a3b7c9e5c9cd8a61f160bd499fed)) +* **deps-dev:** bump pytest from 7.4.0 to 7.4.1 in /deployer ([#9605](https://github.com/mdn/yari/issues/9605)) ([6af6523](https://github.com/mdn/yari/commit/6af6523c4e2a902f1c79d243124c36428f4ac1ac)) +* **deps-dev:** bump pytest from 7.4.1 to 7.4.2 in /deployer ([#9634](https://github.com/mdn/yari/issues/9634)) ([dfec24b](https://github.com/mdn/yari/commit/dfec24ba35632e97ba5dd7b716f53476639dbdd6)) +* **deps-dev:** bump react-router-dom from 6.15.0 to 6.16.0 ([#9658](https://github.com/mdn/yari/issues/9658)) ([850b484](https://github.com/mdn/yari/commit/850b4840d3a02c344796ce6e43157b57e71b4911)) +* **deps-dev:** bump resolve from 1.22.4 to 1.22.5 ([#9670](https://github.com/mdn/yari/issues/9670)) ([68c324e](https://github.com/mdn/yari/commit/68c324eaa063082de446cd7245ac66ddf30199b3)) +* **deps-dev:** bump resolve from 1.22.5 to 1.22.6 ([#9683](https://github.com/mdn/yari/issues/9683)) ([bbeeb1f](https://github.com/mdn/yari/commit/bbeeb1ff39627b022b393205a7e5dd2a2e52d4d6)) +* **deps-dev:** bump sass from 1.66.1 to 1.67.0 ([#9660](https://github.com/mdn/yari/issues/9660)) ([bf57253](https://github.com/mdn/yari/commit/bf5725382a8213df973235020688f13040e1ecd0)) +* **deps-dev:** bump sass from 1.67.0 to 1.68.0 ([#9706](https://github.com/mdn/yari/issues/9706)) ([845de9d](https://github.com/mdn/yari/commit/845de9d04ca6e5f0fe4242d15de13d5165c011b8)) +* **deps-dev:** bump stylelint-config-recommended-scss from 12.0.0 to 13.0.0 ([#9601](https://github.com/mdn/yari/issues/9601)) ([c547306](https://github.com/mdn/yari/commit/c54730604a7d6882480c2279d17721b006b19af3)) +* **deps-dev:** bump stylelint-scss from 5.1.0 to 5.2.0 ([#9669](https://github.com/mdn/yari/issues/9669)) ([fed559f](https://github.com/mdn/yari/commit/fed559f75c98575ddfed86407f8fa0ee60f7c9b6)) +* **deps-dev:** bump stylelint-scss from 5.2.0 to 5.2.1 ([#9677](https://github.com/mdn/yari/issues/9677)) ([81cf182](https://github.com/mdn/yari/commit/81cf182cae4dabdc8ff0d5af1307872006d5a03e)) +* **deps-dev:** bump the types group with 1 update ([#9675](https://github.com/mdn/yari/issues/9675)) ([1d1dde8](https://github.com/mdn/yari/commit/1d1dde8d4aa7b2e5294c12d8b558aab50fc2ad4f)) +* **deps-dev:** bump the types group with 1 update ([#9690](https://github.com/mdn/yari/issues/9690)) ([932f95b](https://github.com/mdn/yari/commit/932f95b6fb7db48682056092138b6f46c0ca5942)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.24 to 2.7.28 in /client/pwa ([#9606](https://github.com/mdn/yari/issues/9606)) ([88afdeb](https://github.com/mdn/yari/commit/88afdeb317f13dbe5b5600ba83bdd23db523bc18)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.28 to 2.7.29 in /client/pwa ([#9616](https://github.com/mdn/yari/issues/9616)) ([540f1fc](https://github.com/mdn/yari/commit/540f1fca60ae61966b3a500caa244977a70472aa)) +* **deps:** bump @mdn/browser-compat-data from 5.3.14 to 5.3.15 ([#9644](https://github.com/mdn/yari/issues/9644)) ([b79267f](https://github.com/mdn/yari/commit/b79267f60cac9767ae4f50b0fc7e32c64e37a25d)) +* **deps:** bump @mdn/browser-compat-data from 5.3.15 to 5.3.16 ([#9681](https://github.com/mdn/yari/issues/9681)) ([d30f7d5](https://github.com/mdn/yari/commit/d30f7d5421f902ae173e0e879c7c0b74ceae297a)) +* **deps:** bump @mdn/browser-compat-data from 5.3.16 to 5.3.17 ([#9700](https://github.com/mdn/yari/issues/9700)) ([e38a5bd](https://github.com/mdn/yari/commit/e38a5bd842a3520779f6749c6b4f9a892a0e6471)) +* **deps:** bump @mdn/browser-compat-data from 5.3.17 to 5.3.18 ([#9710](https://github.com/mdn/yari/issues/9710)) ([050b4ae](https://github.com/mdn/yari/commit/050b4ae3f5c95016f31e5b952e9565c7d6e61297)) +* **deps:** bump @mozilla/glean from 2.0.1 to 2.0.2 ([#9667](https://github.com/mdn/yari/issues/9667)) ([6a1680a](https://github.com/mdn/yari/commit/6a1680aad8012e380e4f20ade1f9f250919113a0)) +* **deps:** bump @sentry/* from 7.63.0 to 7.67.0 ([#9614](https://github.com/mdn/yari/issues/9614)) ([bdef8e9](https://github.com/mdn/yari/commit/bdef8e9e09a57dfc2b9e7ff61b473f72633a95c5)) +* **deps:** bump @sentry/* from 7.67.0 to 7.68.0 ([#9620](https://github.com/mdn/yari/issues/9620)) ([7c10c85](https://github.com/mdn/yari/commit/7c10c8582a53b2b2ffd880a3a267fb46a7b9c4ba)) +* **deps:** bump @webref/css from 5.4.4 to 6.0.0 ([#9621](https://github.com/mdn/yari/issues/9621)) ([6769c39](https://github.com/mdn/yari/commit/6769c39ea5919ba3ed89913451d60b8802928c96)) +* **deps:** bump actions/checkout from 3 to 4 ([#9609](https://github.com/mdn/yari/issues/9609)) ([2b8ea58](https://github.com/mdn/yari/commit/2b8ea58fcb28d86ce35dfb6e6e5694ad2277377e)) +* **deps:** bump boto3 from 1.28.35 to 1.28.40 in /deployer ([#9604](https://github.com/mdn/yari/issues/9604)) ([d0b966d](https://github.com/mdn/yari/commit/d0b966d6a1bc903c70ccde44a368b31561d7e2ca)) +* **deps:** bump boto3 from 1.28.40 to 1.28.42 in /deployer ([#9622](https://github.com/mdn/yari/issues/9622)) ([036c053](https://github.com/mdn/yari/commit/036c053372bdd004e81570571a95177d17804ada)) +* **deps:** bump boto3 from 1.28.42 to 1.28.44 in /deployer ([#9633](https://github.com/mdn/yari/issues/9633)) ([2b343cb](https://github.com/mdn/yari/commit/2b343cbeb286368fdc03201362158aa103d9f189)) +* **deps:** bump boto3 from 1.28.44 to 1.28.49 in /deployer ([#9674](https://github.com/mdn/yari/issues/9674)) ([270c069](https://github.com/mdn/yari/commit/270c0695c5ab78a5be555e797ce15e2510176732)) +* **deps:** bump certifi from 2022.12.7 to 2023.7.22 in /deployer ([#9686](https://github.com/mdn/yari/issues/9686)) ([f6021d4](https://github.com/mdn/yari/commit/f6021d47358e1a41483e5226e857fe6d10aa034b)) +* **deps:** bump certifi from 2022.12.7 to 2023.7.22 in /testing/integration ([#9685](https://github.com/mdn/yari/issues/9685)) ([51e2467](https://github.com/mdn/yari/commit/51e2467ccf119ab698152607acce1ff9f981e41a)) +* **deps:** bump cryptography from 41.0.0 to 41.0.3 in /deployer ([#9602](https://github.com/mdn/yari/issues/9602)) ([00fab4d](https://github.com/mdn/yari/commit/00fab4d8069d88682fb4359b53db67759ac24e84)) +* **deps:** bump dayjs from 1.11.9 to 1.11.10 ([#9702](https://github.com/mdn/yari/issues/9702)) ([60a64bc](https://github.com/mdn/yari/commit/60a64bc019b80e6d13e3de100b20a97203d11d0a)) +* **deps:** bump inquirer from 9.2.10 to 9.2.11 ([#9645](https://github.com/mdn/yari/issues/9645)) ([f02fc39](https://github.com/mdn/yari/commit/f02fc396218499843c3c04fcf2a0ae5784b3e694)) +* **deps:** bump pytest from 7.4.0 to 7.4.1 in /testing/integration ([#9603](https://github.com/mdn/yari/issues/9603)) ([ae232da](https://github.com/mdn/yari/commit/ae232da32b40fed4ae6f88cb6d86a64ea8abd2ed)) +* **deps:** bump pytest from 7.4.1 to 7.4.2 in /testing/integration ([#9636](https://github.com/mdn/yari/issues/9636)) ([9be6c40](https://github.com/mdn/yari/commit/9be6c40f862f9f3bcb4e43bf0e6e2aaf698bb496)) +* **deps:** bump the sentry group with 2 updates ([#9656](https://github.com/mdn/yari/issues/9656)) ([478dc9d](https://github.com/mdn/yari/commit/478dc9dba84176dbf406e1c1af085cd8d13175dc)) +* **deps:** bump the sentry group with 2 updates ([#9697](https://github.com/mdn/yari/issues/9697)) ([171432d](https://github.com/mdn/yari/commit/171432da029d73e091968f7a638b743e57bfadd5)) +* **deps:** bump web-specs from 2.66.0 to 2.67.0 ([#9618](https://github.com/mdn/yari/issues/9618)) ([f9bc331](https://github.com/mdn/yari/commit/f9bc3319b78d0c2df568a217d87e1c4a50a90acd)) +* **deps:** bump web-specs from 2.67.0 to 2.68.0 ([#9701](https://github.com/mdn/yari/issues/9701)) ([bfe8d3d](https://github.com/mdn/yari/commit/bfe8d3d8d188f82e7de0e209d483a04060888458)) +* **glean:** renew metrics ([#9592](https://github.com/mdn/yari/issues/9592)) ([0fd72d0](https://github.com/mdn/yari/commit/0fd72d0f5912b6064d61761e0db1931fd5ca1e7d)) +* **menu:** remove playground new tag ([#9629](https://github.com/mdn/yari/issues/9629)) ([f2ed581](https://github.com/mdn/yari/commit/f2ed5816bfb59c48b60868b2e78338c9dac106cc)) +* **plus:** prepare account rebranding ([#9708](https://github.com/mdn/yari/issues/9708)) ([19b5f89](https://github.com/mdn/yari/commit/19b5f89368485e8bc5100b47e49b8097cf39ecc0)) + +## [2.30.0](https://github.com/mdn/yari/compare/v2.29.0...v2.30.0) (2023-08-30) + + +### Features + +* **ai-help:** add syntax highlighting for code examples ([#9510](https://github.com/mdn/yari/issues/9510)) ([e9f49cd](https://github.com/mdn/yari/commit/e9f49cd51f9ef50cca3da5d69bf3e596d9715424)) + + +### Bug Fixes + +* **ai-help:** nonsense prepended when copying message ([#9484](https://github.com/mdn/yari/issues/9484)) ([117f5bf](https://github.com/mdn/yari/commit/117f5bf3b88db498c5fb0160a5fc988570810908)) +* **glean:** fix url metrics ([#9516](https://github.com/mdn/yari/issues/9516)) ([f962258](https://github.com/mdn/yari/commit/f962258b33fe7dbfcd9235a7a1e754b552f1385a)) + + +### Miscellaneous + +* **ai-help:** make feedback link external ([#9511](https://github.com/mdn/yari/issues/9511)) ([b73eef0](https://github.com/mdn/yari/commit/b73eef07234ed61a09e9fe00e60e6ca9e0f38fdb)) +* **ai-help:** use private repo for internal feedback ([#9506](https://github.com/mdn/yari/issues/9506)) ([77585e7](https://github.com/mdn/yari/commit/77585e7cce221e82af1f51ac49e74fb27432a528)) +* **deps-dev:** bump @babel/core from 7.22.10 to 7.22.11 ([#9553](https://github.com/mdn/yari/issues/9553)) ([58abe5c](https://github.com/mdn/yari/commit/58abe5ce2613620deb6f604a3a87db18d9492d14)) +* **deps-dev:** bump @babel/eslint-parser from 7.22.10 to 7.22.11 ([#9551](https://github.com/mdn/yari/issues/9551)) ([b7f6022](https://github.com/mdn/yari/commit/b7f6022a2649ac60c25a88c72d12ec527b0ebfec)) +* **deps-dev:** bump @playwright/test from 1.36.2 to 1.37.0 ([#9482](https://github.com/mdn/yari/issues/9482)) ([9acac73](https://github.com/mdn/yari/commit/9acac73ca8a28e16908198dfafd70d6d255037ad)) +* **deps-dev:** bump @playwright/test from 1.37.0 to 1.37.1 ([#9512](https://github.com/mdn/yari/issues/9512)) ([fa500a5](https://github.com/mdn/yari/commit/fa500a5776b46801eb535f1a262fb48ab8246264)) +* **deps-dev:** bump @pmmmwh/react-refresh-webpack-plugin from 0.5.10 to 0.5.11 ([#9498](https://github.com/mdn/yari/issues/9498)) ([e09ed3b](https://github.com/mdn/yari/commit/e09ed3bc39900f500a02e6a29d335926e0673d09)) +* **deps-dev:** bump @supabase/supabase-js from 2.32.0 to 2.33.0 ([#9530](https://github.com/mdn/yari/issues/9530)) ([b4a79fa](https://github.com/mdn/yari/commit/b4a79fa23c5bd874c350dc1453cfc1ab7532572c)) +* **deps-dev:** bump @supabase/supabase-js from 2.33.0 to 2.33.1 ([#9538](https://github.com/mdn/yari/issues/9538)) ([ac4c916](https://github.com/mdn/yari/commit/ac4c916784d951664e2943aa800a9ce497d4727b)) +* **deps-dev:** bump @svgr/webpack from 8.0.1 to 8.1.0 ([#9497](https://github.com/mdn/yari/issues/9497)) ([5b37beb](https://github.com/mdn/yari/commit/5b37beb2797f0936490782c19ee661f4eee527b0)) +* **deps-dev:** bump @swc/core from 1.3.74 to 1.3.76 ([#9472](https://github.com/mdn/yari/issues/9472)) ([7fa71ff](https://github.com/mdn/yari/commit/7fa71ff2b31fec656879770a57a52ae9c0a9c2f6)) +* **deps-dev:** bump @swc/core from 1.3.76 to 1.3.77 ([#9502](https://github.com/mdn/yari/issues/9502)) ([f049ab3](https://github.com/mdn/yari/commit/f049ab3578a5b4f1b64637b8b9f34fe221d1e261)) +* **deps-dev:** bump @swc/core from 1.3.77 to 1.3.78 ([#9513](https://github.com/mdn/yari/issues/9513)) ([0e692c9](https://github.com/mdn/yari/commit/0e692c9d19ad52b7d4d353653e47c2deca8a3f18)) +* **deps-dev:** bump @swc/core from 1.3.78 to 1.3.79 ([#9554](https://github.com/mdn/yari/issues/9554)) ([923abb3](https://github.com/mdn/yari/commit/923abb3b928ec39736e1fd1a7747d2b89bba3169)) +* **deps-dev:** bump @swc/core from 1.3.79 to 1.3.80 ([#9562](https://github.com/mdn/yari/issues/9562)) ([afcf585](https://github.com/mdn/yari/commit/afcf585592ac50c18be254451a714825df0271a7)) +* **deps-dev:** bump @types/jest from 29.5.3 to 29.5.4 ([#9539](https://github.com/mdn/yari/issues/9539)) ([e9ffa21](https://github.com/mdn/yari/commit/e9ffa215ac549c5e248900c533746ed4b2cfadad)) +* **deps-dev:** bump @types/react from 18.2.19 to 18.2.20 ([#9471](https://github.com/mdn/yari/issues/9471)) ([36b894c](https://github.com/mdn/yari/commit/36b894cb8fd7e3e7e55220c32bf58ce3e554b882)) +* **deps-dev:** bump @types/react from 18.2.20 to 18.2.21 ([#9540](https://github.com/mdn/yari/issues/9540)) ([6bc317a](https://github.com/mdn/yari/commit/6bc317a734dcc57f3c467ec72d28c618aa38b3d7)) +* **deps-dev:** bump babel-jest from 29.6.2 to 29.6.3 ([#9531](https://github.com/mdn/yari/issues/9531)) ([22389de](https://github.com/mdn/yari/commit/22389de5b849a7e2eb52f2d9d0ca877bb1e556d6)) +* **deps-dev:** bump babel-jest from 29.6.3 to 29.6.4 ([#9547](https://github.com/mdn/yari/issues/9547)) ([c527a45](https://github.com/mdn/yari/commit/c527a4544ca5318f6403dd733c6cf537d1ca81d4)) +* **deps-dev:** bump eslint from 8.46.0 to 8.47.0 ([#9494](https://github.com/mdn/yari/issues/9494)) ([7c59989](https://github.com/mdn/yari/commit/7c5998957da04549503c7230424f579f15f08209)) +* **deps-dev:** bump eslint from 8.47.0 to 8.48.0 ([#9568](https://github.com/mdn/yari/issues/9568)) ([c2ed16a](https://github.com/mdn/yari/commit/c2ed16ad62d44592e71be9ea0433e63e351a7ca3)) +* **deps-dev:** bump eslint-plugin-import from 2.28.0 to 2.28.1 ([#9523](https://github.com/mdn/yari/issues/9523)) ([a49bc15](https://github.com/mdn/yari/commit/a49bc158562a28a6b7f1eb173a4e7e5a9a28bf16)) +* **deps-dev:** bump eslint-plugin-react from 7.33.1 to 7.33.2 ([#9503](https://github.com/mdn/yari/issues/9503)) ([70975cc](https://github.com/mdn/yari/commit/70975cce6a16cefb4821fc8ae2225bc4b0226653)) +* **deps-dev:** bump html-validate from 8.2.0 to 8.3.0 ([#9522](https://github.com/mdn/yari/issues/9522)) ([cec9e01](https://github.com/mdn/yari/commit/cec9e01258e091b8cab6b0ad4bce7724da25f2e7)) +* **deps-dev:** bump jest from 29.6.2 to 29.6.3 ([#9533](https://github.com/mdn/yari/issues/9533)) ([b2dbd58](https://github.com/mdn/yari/commit/b2dbd58c25e646c62326f90a200d529f83dd9bab)) +* **deps-dev:** bump jest from 29.6.3 to 29.6.4 ([#9546](https://github.com/mdn/yari/issues/9546)) ([1452d48](https://github.com/mdn/yari/commit/1452d48fc5c310d8953d6692a3bc35787c9b51d4)) +* **deps-dev:** bump jest-environment-jsdom from 29.6.2 to 29.6.3 ([#9534](https://github.com/mdn/yari/issues/9534)) ([bb8110d](https://github.com/mdn/yari/commit/bb8110d1933f1d4e81619b269d66a426abfa78dc)) +* **deps-dev:** bump jest-environment-jsdom from 29.6.3 to 29.6.4 ([#9543](https://github.com/mdn/yari/issues/9543)) ([9738525](https://github.com/mdn/yari/commit/9738525982d5019bfc7fd6dacc9dca16bbfb6685)) +* **deps-dev:** bump jest-resolve from 29.6.2 to 29.6.3 ([#9532](https://github.com/mdn/yari/issues/9532)) ([0a5b01e](https://github.com/mdn/yari/commit/0a5b01eff32041213abd2e33d06b90090128e4d3)) +* **deps-dev:** bump jest-resolve from 29.6.3 to 29.6.4 ([#9544](https://github.com/mdn/yari/issues/9544)) ([6a7cacb](https://github.com/mdn/yari/commit/6a7cacb53dca436bdb9abfb2003487a7e73e9eed)) +* **deps-dev:** bump postcss from 8.4.27 to 8.4.28 ([#9501](https://github.com/mdn/yari/issues/9501)) ([9e29236](https://github.com/mdn/yari/commit/9e292368a66a5e622f03bd500dddf34e7c0d5a59)) +* **deps-dev:** bump postcss from 8.4.28 to 8.4.29 ([#9584](https://github.com/mdn/yari/issues/9584)) ([61c0d2e](https://github.com/mdn/yari/commit/61c0d2ef1f0def169ed8513785d0a511db8874d9)) +* **deps-dev:** bump postcss-preset-env from 9.1.1 to 9.1.2 ([#9567](https://github.com/mdn/yari/issues/9567)) ([b9e5677](https://github.com/mdn/yari/commit/b9e5677c5da85905cbaa25a79c1e49e56a690645)) +* **deps-dev:** bump prettier from 3.0.1 to 3.0.2 ([#9500](https://github.com/mdn/yari/issues/9500)) ([2e55aab](https://github.com/mdn/yari/commit/2e55aab442fcaaae9142a38fbe457e24503bed4c)) +* **deps-dev:** bump prettier from 3.0.2 to 3.0.3 ([#9580](https://github.com/mdn/yari/issues/9580)) ([8a674eb](https://github.com/mdn/yari/commit/8a674eb83871e0a0e2598ac54d34db0b6fe61cdf)) +* **deps-dev:** bump react-router-dom from 6.14.2 to 6.15.0 ([#9480](https://github.com/mdn/yari/issues/9480)) ([19b2684](https://github.com/mdn/yari/commit/19b2684923c61f27e6f8b48b5c4b5cf75f994662)) +* **deps-dev:** bump sass from 1.64.2 to 1.65.1 ([#9470](https://github.com/mdn/yari/issues/9470)) ([e547cc5](https://github.com/mdn/yari/commit/e547cc5a05964909b987035de821ef5ef704a70e)) +* **deps-dev:** bump sass from 1.65.1 to 1.66.0 ([#9515](https://github.com/mdn/yari/issues/9515)) ([59ab4be](https://github.com/mdn/yari/commit/59ab4be0199997b0c76e38e2509418e98448ee5c)) +* **deps-dev:** bump sass from 1.66.0 to 1.66.1 ([#9527](https://github.com/mdn/yari/issues/9527)) ([ba488df](https://github.com/mdn/yari/commit/ba488df8eee8a4596c86aa31f56f3d0735acdfe2)) +* **deps-dev:** bump stylelint from 15.10.2 to 15.10.3 ([#9520](https://github.com/mdn/yari/issues/9520)) ([a1c9f1a](https://github.com/mdn/yari/commit/a1c9f1aee3ae4df485c860275ef6cb4ee35537c8)) +* **deps-dev:** bump swr from 2.2.0 to 2.2.1 ([#9489](https://github.com/mdn/yari/issues/9489)) ([d07a245](https://github.com/mdn/yari/commit/d07a2456c18aa69286ec60dcb3e38253987584c9)) +* **deps-dev:** bump swr from 2.2.1 to 2.2.2 ([#9564](https://github.com/mdn/yari/issues/9564)) ([f8e2515](https://github.com/mdn/yari/commit/f8e251549e4b638b30efb5204c3345d248729f38)) +* **deps-dev:** bump typescript from 5.1.6 to 5.2.2 in /client/pwa ([#9550](https://github.com/mdn/yari/issues/9550)) ([bf35eb8](https://github.com/mdn/yari/commit/bf35eb8043bb5bb16ff6b93d5b6d71331d438702)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.22 to 2.7.23 in /client/pwa ([#9475](https://github.com/mdn/yari/issues/9475)) ([9565dea](https://github.com/mdn/yari/commit/9565dea0bec771591ea1e370ba1ea25e584329b8)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.23 to 2.7.24 in /client/pwa ([#9483](https://github.com/mdn/yari/issues/9483)) ([886b2c8](https://github.com/mdn/yari/commit/886b2c8090af69467d31caef77fb446831f6acdd)) +* **deps:** bump @caporal/core from 2.0.2 to 2.0.7 ([#9573](https://github.com/mdn/yari/issues/9573)) ([2514929](https://github.com/mdn/yari/commit/2514929546d4efe95eae46b12d8630d6ce6f8095)) +* **deps:** bump @codemirror/lang-html from 6.4.5 to 6.4.6 ([#9575](https://github.com/mdn/yari/issues/9575)) ([5a49794](https://github.com/mdn/yari/commit/5a49794e214121095c4cfa610093e56b690b61f7)) +* **deps:** bump @codemirror/lang-javascript from 6.1.9 to 6.2.0 ([#9566](https://github.com/mdn/yari/issues/9566)) ([a6de79c](https://github.com/mdn/yari/commit/a6de79ca8e69239e532f995c6bd15e0bb2d19c41)) +* **deps:** bump @codemirror/lang-javascript from 6.2.0 to 6.2.1 ([#9577](https://github.com/mdn/yari/issues/9577)) ([4aec0c7](https://github.com/mdn/yari/commit/4aec0c74012beddb25a379de0cb47f861f7dd1ac)) +* **deps:** bump @mdn/browser-compat-data from 5.3.10 to 5.3.11 ([#9521](https://github.com/mdn/yari/issues/9521)) ([4766cc3](https://github.com/mdn/yari/commit/4766cc3b54c3e998e8871a457846a481df3f8760)) +* **deps:** bump @mdn/browser-compat-data from 5.3.11 to 5.3.12 ([#9537](https://github.com/mdn/yari/issues/9537)) ([efa43f3](https://github.com/mdn/yari/commit/efa43f38ddd9c812b3a246c6e46d3dd1d8181b2e)) +* **deps:** bump @mdn/browser-compat-data from 5.3.12 to 5.3.13 ([#9569](https://github.com/mdn/yari/issues/9569)) ([88bf17f](https://github.com/mdn/yari/commit/88bf17fad7a2c223e468113a7154db0231e4f8ec)) +* **deps:** bump @mdn/browser-compat-data from 5.3.13 to 5.3.14 ([#9582](https://github.com/mdn/yari/issues/9582)) ([5829c19](https://github.com/mdn/yari/commit/5829c19ae5424e9161ba09e0566834b2aa086101)) +* **deps:** bump @mdn/browser-compat-data from 5.3.8 to 5.3.9 ([#9491](https://github.com/mdn/yari/issues/9491)) ([f77c6c1](https://github.com/mdn/yari/commit/f77c6c17ab4e8aa79b7bb6698aa486a1b644ee58)) +* **deps:** bump @mdn/browser-compat-data from 5.3.9 to 5.3.10 ([#9504](https://github.com/mdn/yari/issues/9504)) ([1712031](https://github.com/mdn/yari/commit/171203131fd5a0680927d9b58612b0107e36b7cb)) +* **deps:** bump @sentry/integrations from 7.62.0 to 7.63.0 ([#9479](https://github.com/mdn/yari/issues/9479)) ([65fc7f3](https://github.com/mdn/yari/commit/65fc7f3ede11dae51981bf879836fa26fcb704c3)) +* **deps:** bump @sentry/node from 7.62.0 to 7.63.0 ([#9478](https://github.com/mdn/yari/issues/9478)) ([8c0f7a4](https://github.com/mdn/yari/commit/8c0f7a4f34cb0776473969b5650b2c44089153f4)) +* **deps:** bump boto3 from 1.28.20 to 1.28.25 in /deployer ([#9487](https://github.com/mdn/yari/issues/9487)) ([c33610e](https://github.com/mdn/yari/commit/c33610e2bda1dc13e882b54620405b025526342d)) +* **deps:** bump boto3 from 1.28.25 to 1.28.30 in /deployer ([#9528](https://github.com/mdn/yari/issues/9528)) ([924565a](https://github.com/mdn/yari/commit/924565a0809a81c208b39dd7e7b95d3df4f632f1)) +* **deps:** bump boto3 from 1.28.30 to 1.28.35 in /deployer ([#9570](https://github.com/mdn/yari/issues/9570)) ([fb8234f](https://github.com/mdn/yari/commit/fb8234f0055c095f5ba23e4d61eb44e1be68a861)) +* **deps:** bump click from 8.1.6 to 8.1.7 in /deployer ([#9529](https://github.com/mdn/yari/issues/9529)) ([c0899fb](https://github.com/mdn/yari/commit/c0899fb9d74d32658bfee200a3d52c0b205e3575)) +* **deps:** bump fdir from 6.0.2 to 6.1.0 ([#9495](https://github.com/mdn/yari/issues/9495)) ([d0943e7](https://github.com/mdn/yari/commit/d0943e79b4d2372e761ff063cc2a97e57495a908)) +* **deps:** bump lru-cache from 10.0.0 to 10.0.1 ([#9481](https://github.com/mdn/yari/issues/9481)) ([729ff13](https://github.com/mdn/yari/commit/729ff1399decfa8cef06cf89c0cc688130f7ed3f)) +* **deps:** bump mdn-data from 2.0.32 to 2.0.33 ([#9519](https://github.com/mdn/yari/issues/9519)) ([2f1dd00](https://github.com/mdn/yari/commit/2f1dd00f2bb4d69c9d8393c7c9d44e0dc43bbb3a)) +* **deps:** bump mdn-data from 2.0.33 to 2.1.0 ([#9583](https://github.com/mdn/yari/issues/9583)) ([09da070](https://github.com/mdn/yari/commit/09da070f299a42a4929d9ee1a4ba57ca6de43dd0)) +* **deps:** bump open-editor from 4.1.0 to 4.1.1 ([#9563](https://github.com/mdn/yari/issues/9563)) ([db34a2b](https://github.com/mdn/yari/commit/db34a2b52d24dcc4bd61fc4a412dc5f4d6e21828)) +* **deps:** bump rehype-stringify from 9.0.3 to 9.0.4 ([#9507](https://github.com/mdn/yari/issues/9507)) ([58f9052](https://github.com/mdn/yari/commit/58f9052b92e964657ba33dd2e40eed298053eca6)) +* **deps:** bump web-specs from 2.65.0 to 2.66.0 ([#9559](https://github.com/mdn/yari/issues/9559)) ([05a59e7](https://github.com/mdn/yari/commit/05a59e7d2fa2e24e265d48f63ee7a17b240de3be)) +* **deps:** upgrade to glean 2.x ([#9509](https://github.com/mdn/yari/issues/9509)) ([098c5a3](https://github.com/mdn/yari/commit/098c5a3140691501e4022388955924b281f2ecfe)) +* **glean:** migrate to using data-glean everywhere ([#9496](https://github.com/mdn/yari/issues/9496)) ([bd99229](https://github.com/mdn/yari/commit/bd9922925f9ed1c97c2ed6b0abef84b86c539119)) +* **language-menu:** use proper <a> tags ([#9505](https://github.com/mdn/yari/issues/9505)) ([af58be3](https://github.com/mdn/yari/commit/af58be3bd60fe4b169e585dd04dba0b81115091a)) +* update .nvmrc ([#9518](https://github.com/mdn/yari/issues/9518)) ([02a19a6](https://github.com/mdn/yari/commit/02a19a6035533f065a4a4ce60f094aca740c6031)) + +## [2.29.0](https://github.com/mdn/yari/compare/v2.28.4...v2.29.0) (2023-08-10) + + +### Features + +* **docs:** add LaTeX syntax highlighting ([#9366](https://github.com/mdn/yari/issues/9366)) ([bea1c54](https://github.com/mdn/yari/commit/bea1c542019f57e73086601bac66f8f57ab94b38)) +* **npm:** add yari-build-blog command ([#9468](https://github.com/mdn/yari/issues/9468)) ([9414524](https://github.com/mdn/yari/commit/941452496a8a0df411403713a91f0b5dbf709c0d)) +* **prism:** enable Nginx syntax highlighting ([#9419](https://github.com/mdn/yari/issues/9419)) ([e52f10e](https://github.com/mdn/yari/commit/e52f10e2d95d1479172f014858bc58aec1f80f26)) + + +### Bug Fixes + +* **signup-link:** clicking led to 404 ([#9390](https://github.com/mdn/yari/issues/9390)) ([24bdfe2](https://github.com/mdn/yari/commit/24bdfe2e35eb6a604a7a374ff644316f440ee7cd)) + + +### Enhancements + +* **signup:** replace "Get MDN Plus" with "Sign up for free" ([#9357](https://github.com/mdn/yari/issues/9357)) ([2abbeba](https://github.com/mdn/yari/commit/2abbeba53717d0b47edc38c483d3b5aeb0c6ee04)) + + +### Miscellaneous + +* **baseline:** add glean metrics ([#9391](https://github.com/mdn/yari/issues/9391)) ([2843109](https://github.com/mdn/yari/commit/284310954ff5dd9f3e0c4ed329ce0efa2dc0a7ca)) +* **deps-dev:** bump @babel/core from 7.22.9 to 7.22.10 ([#9457](https://github.com/mdn/yari/issues/9457)) ([74cf94b](https://github.com/mdn/yari/commit/74cf94b73de13986ce730ecd74f2c5eaa59f9c81)) +* **deps-dev:** bump @babel/eslint-parser from 7.22.9 to 7.22.10 ([#9461](https://github.com/mdn/yari/issues/9461)) ([0d3c74d](https://github.com/mdn/yari/commit/0d3c74d3c10bb90136958213c76a3cb1d237007e)) +* **deps-dev:** bump @babel/preset-env from 7.22.9 to 7.22.10 ([#9462](https://github.com/mdn/yari/issues/9462)) ([51cac03](https://github.com/mdn/yari/commit/51cac03b9ea9e62634147824c19abd5789268b12)) +* **deps-dev:** bump @playwright/test from 1.36.1 to 1.36.2 ([#9383](https://github.com/mdn/yari/issues/9383)) ([64cd7f3](https://github.com/mdn/yari/commit/64cd7f3854453b79c97f5a17a330480205f5f779)) +* **deps-dev:** bump @supabase/supabase-js from 2.26.0 to 2.29.0 ([#9371](https://github.com/mdn/yari/issues/9371)) ([690cbe4](https://github.com/mdn/yari/commit/690cbe48be67194c9bf703fae27a5e610b182ef8)) +* **deps-dev:** bump @supabase/supabase-js from 2.29.0 to 2.30.0 ([#9386](https://github.com/mdn/yari/issues/9386)) ([307328b](https://github.com/mdn/yari/commit/307328bc6bab2c9f31cfebf83342a7651b55ef0d)) +* **deps-dev:** bump @supabase/supabase-js from 2.30.0 to 2.31.0 ([#9400](https://github.com/mdn/yari/issues/9400)) ([9b3efc4](https://github.com/mdn/yari/commit/9b3efc4384c5e95167fed7fd72d7c9d39456b659)) +* **deps-dev:** bump @supabase/supabase-js from 2.31.0 to 2.32.0 ([#9448](https://github.com/mdn/yari/issues/9448)) ([6309b3a](https://github.com/mdn/yari/commit/6309b3a211cc90ebdf8cd7bd47a56a74290fead6)) +* **deps-dev:** bump @swc/core from 1.3.70 to 1.3.71 ([#9382](https://github.com/mdn/yari/issues/9382)) ([50951df](https://github.com/mdn/yari/commit/50951dff01449e3ce3777b1bf9559de78ec7d087)) +* **deps-dev:** bump @swc/core from 1.3.71 to 1.3.72 ([#9415](https://github.com/mdn/yari/issues/9415)) ([dd73fef](https://github.com/mdn/yari/commit/dd73fef1ed5033121e9cdfd9a1c19a043d693cbd)) +* **deps-dev:** bump @swc/core from 1.3.72 to 1.3.73 ([#9427](https://github.com/mdn/yari/issues/9427)) ([99aeb77](https://github.com/mdn/yari/commit/99aeb77091a7913ea4bcab67a365376847415d29)) +* **deps-dev:** bump @swc/core from 1.3.73 to 1.3.74 ([#9435](https://github.com/mdn/yari/issues/9435)) ([8835882](https://github.com/mdn/yari/commit/883588240aedc2be3b2769a8083b43bb622210ba)) +* **deps-dev:** bump @types/react from 18.2.15 to 18.2.16 ([#9380](https://github.com/mdn/yari/issues/9380)) ([b587d67](https://github.com/mdn/yari/commit/b587d676da050a4f784fedcbe90e2fd6610e3d4d)) +* **deps-dev:** bump @types/react from 18.2.16 to 18.2.17 ([#9394](https://github.com/mdn/yari/issues/9394)) ([8adcc68](https://github.com/mdn/yari/commit/8adcc6843ac65853f918e314665a9e4f16f4e7d3)) +* **deps-dev:** bump @types/react from 18.2.17 to 18.2.18 ([#9424](https://github.com/mdn/yari/issues/9424)) ([9c072fa](https://github.com/mdn/yari/commit/9c072faf6e87150a67098fa1f9608fe4d12e35f8)) +* **deps-dev:** bump @types/react from 18.2.18 to 18.2.19 ([#9459](https://github.com/mdn/yari/issues/9459)) ([11be7f2](https://github.com/mdn/yari/commit/11be7f2c487514f9896a901a9c5fa04c8cd782ea)) +* **deps-dev:** bump babel-jest from 29.6.1 to 29.6.2 ([#9397](https://github.com/mdn/yari/issues/9397)) ([b4fa6a9](https://github.com/mdn/yari/commit/b4fa6a918e899350ab8924fde4e20208010e7f39)) +* **deps-dev:** bump browserslist from 4.21.9 to 4.21.10 ([#9416](https://github.com/mdn/yari/issues/9416)) ([afec285](https://github.com/mdn/yari/commit/afec2853ff2c9f013bf2244da74e6d32dd455581)) +* **deps-dev:** bump eslint from 8.45.0 to 8.46.0 ([#9414](https://github.com/mdn/yari/issues/9414)) ([cf3f0c8](https://github.com/mdn/yari/commit/cf3f0c867a8be585acfa3892042e505153052935)) +* **deps-dev:** bump eslint-plugin-import from 2.27.5 to 2.28.0 ([#9403](https://github.com/mdn/yari/issues/9403)) ([e4de45d](https://github.com/mdn/yari/commit/e4de45d36ad17ecad6c6620c45288e1c511ecd9c)) +* **deps-dev:** bump eslint-plugin-react from 7.33.0 to 7.33.1 ([#9412](https://github.com/mdn/yari/issues/9412)) ([8dd1e33](https://github.com/mdn/yari/commit/8dd1e33ccc73f4b06f383b198e4591297e6b961d)) +* **deps-dev:** bump eslint-plugin-unicorn from 48.0.0 to 48.0.1 ([#9388](https://github.com/mdn/yari/issues/9388)) ([f5c09b1](https://github.com/mdn/yari/commit/f5c09b14753a48701ab4ca923bdbb2dd03cd7f76)) +* **deps-dev:** bump flake8 from 6.0.0 to 6.1.0 in /deployer ([#9413](https://github.com/mdn/yari/issues/9413)) ([9a34047](https://github.com/mdn/yari/commit/9a34047376858770277d442d83b48dfe03903b33)) +* **deps-dev:** bump flake8 from 6.0.0 to 6.1.0 in /testing/integration ([#9418](https://github.com/mdn/yari/issues/9418)) ([f78b51c](https://github.com/mdn/yari/commit/f78b51c80cbe760e80620c2890723a0b7f1db5fd)) +* **deps-dev:** bump html-validate from 8.0.5 to 8.1.0 ([#9372](https://github.com/mdn/yari/issues/9372)) ([adef74d](https://github.com/mdn/yari/commit/adef74dd7900e4232e44e579ff7d317f2037543c)) +* **deps-dev:** bump html-validate from 8.1.0 to 8.2.0 ([#9458](https://github.com/mdn/yari/issues/9458)) ([703105b](https://github.com/mdn/yari/commit/703105b4c42e937fdf489dbbeca4a03d95830d9b)) +* **deps-dev:** bump jest from 29.6.1 to 29.6.2 ([#9395](https://github.com/mdn/yari/issues/9395)) ([d3a0a5a](https://github.com/mdn/yari/commit/d3a0a5a0be5a98e33b4f2ce7cef33060e4674312)) +* **deps-dev:** bump jest-environment-jsdom from 29.6.1 to 29.6.2 ([#9398](https://github.com/mdn/yari/issues/9398)) ([e6c8def](https://github.com/mdn/yari/commit/e6c8deff2e366daece830a413bbe007d5caa7df8)) +* **deps-dev:** bump jest-resolve from 29.6.1 to 29.6.2 ([#9399](https://github.com/mdn/yari/issues/9399)) ([d14803b](https://github.com/mdn/yari/commit/d14803bede3ca304c7b319dfa9c382d93f851adc)) +* **deps-dev:** bump postcss from 8.4.26 to 8.4.27 ([#9368](https://github.com/mdn/yari/issues/9368)) ([d67949a](https://github.com/mdn/yari/commit/d67949a5463660904c9125dbd5c249d633fbb9ad)) +* **deps-dev:** bump postcss-preset-env from 9.0.0 to 9.1.0 ([#9381](https://github.com/mdn/yari/issues/9381)) ([9073be3](https://github.com/mdn/yari/commit/9073be378e9b49c7fefbfdedfaa1f36579ff7966)) +* **deps-dev:** bump postcss-preset-env from 9.1.0 to 9.1.1 ([#9452](https://github.com/mdn/yari/issues/9452)) ([2de57bb](https://github.com/mdn/yari/commit/2de57bb8a556477e449ad7596795852d9524b386)) +* **deps-dev:** bump prettier from 3.0.0 to 3.0.1 ([#9434](https://github.com/mdn/yari/issues/9434)) ([650ad9c](https://github.com/mdn/yari/commit/650ad9cd4d13c107576ed31caea81d017126b022)) +* **deps-dev:** bump resolve from 1.22.3 to 1.22.4 ([#9451](https://github.com/mdn/yari/issues/9451)) ([dc9b506](https://github.com/mdn/yari/commit/dc9b50668d20eb4d63322fffe36f47da71373192)) +* **deps-dev:** bump sass from 1.64.0 to 1.64.1 ([#9369](https://github.com/mdn/yari/issues/9369)) ([d18ac68](https://github.com/mdn/yari/commit/d18ac6816c77cb7ddfd9785981193f77cc723694)) +* **deps-dev:** bump sass from 1.64.1 to 1.64.2 ([#9421](https://github.com/mdn/yari/issues/9421)) ([915c05d](https://github.com/mdn/yari/commit/915c05d52f5c589ceb7fe75997762bcb530acd51)) +* **deps-dev:** bump stylelint-prettier from 4.0.0 to 4.0.1 ([#9401](https://github.com/mdn/yari/issues/9401)) ([01cd900](https://github.com/mdn/yari/commit/01cd9000e517782ab4507391ae096b80c1621844)) +* **deps-dev:** bump stylelint-prettier from 4.0.1 to 4.0.2 ([#9402](https://github.com/mdn/yari/issues/9402)) ([fb768ee](https://github.com/mdn/yari/commit/fb768eebeb2e13977f8f8353a035aa903106ca4a)) +* **deps-dev:** bump stylelint-scss from 5.0.1 to 5.1.0 ([#9466](https://github.com/mdn/yari/issues/9466)) ([5457ea2](https://github.com/mdn/yari/commit/5457ea2abbbba22a96e8b2cfc958c312d7534d91)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.20 to 2.7.21 in /client/pwa ([#9456](https://github.com/mdn/yari/issues/9456)) ([e524911](https://github.com/mdn/yari/commit/e524911a7af91b73bdc2ca3f8acf99955a424c94)) +* **deps:** bump [@zip](https://github.com/zip).js/zip.js from 2.7.21 to 2.7.22 in /client/pwa ([#9467](https://github.com/mdn/yari/issues/9467)) ([7032c39](https://github.com/mdn/yari/commit/7032c39f419953427a9f1e00364c42bd6c622dca)) +* **deps:** bump @codemirror/lang-css from 6.2.0 to 6.2.1 ([#9454](https://github.com/mdn/yari/issues/9454)) ([fe57e28](https://github.com/mdn/yari/commit/fe57e285f3737d439a98fe76dffb4978484c8ae0)) +* **deps:** bump @mdn/browser-compat-data from 5.3.4 to 5.3.5 ([#9370](https://github.com/mdn/yari/issues/9370)) ([f9d6129](https://github.com/mdn/yari/commit/f9d6129d6d9c3002eadd1d8fa3dc8c81f4b84b23)) +* **deps:** bump @mdn/browser-compat-data from 5.3.5 to 5.3.6 ([#9387](https://github.com/mdn/yari/issues/9387)) ([508de8c](https://github.com/mdn/yari/commit/508de8ce7e9c879b758b58c425a33e5d31471cd4)) +* **deps:** bump @mdn/browser-compat-data from 5.3.6 to 5.3.7 ([#9431](https://github.com/mdn/yari/issues/9431)) ([bb4d297](https://github.com/mdn/yari/commit/bb4d297be2dc566f188bcb65e5a2f3e80fc04f8b)) +* **deps:** bump @mdn/browser-compat-data from 5.3.7 to 5.3.8 ([#9449](https://github.com/mdn/yari/issues/9449)) ([893e871](https://github.com/mdn/yari/commit/893e871a36ad8e196bf49298df442e04c67c0757)) +* **deps:** bump @sentry/integrations from 7.60.0 to 7.60.1 ([#9393](https://github.com/mdn/yari/issues/9393)) ([7ba941d](https://github.com/mdn/yari/commit/7ba941d53ae4afed5a23252bbd2e6cf96306822e)) +* **deps:** bump @sentry/integrations from 7.60.1 to 7.61.0 ([#9426](https://github.com/mdn/yari/issues/9426)) ([7e2231b](https://github.com/mdn/yari/commit/7e2231b2b529ca4d42cbf8c0aff6804f0216a070)) +* **deps:** bump @sentry/integrations from 7.61.0 to 7.61.1 ([#9438](https://github.com/mdn/yari/issues/9438)) ([63c0859](https://github.com/mdn/yari/commit/63c0859d02bfba940fec7497b81ee9ca17cbfedd)) +* **deps:** bump @sentry/integrations from 7.61.1 to 7.62.0 ([#9464](https://github.com/mdn/yari/issues/9464)) ([1d6e6da](https://github.com/mdn/yari/commit/1d6e6da947a92203a012ca00ae1e15f837201a04)) +* **deps:** bump @sentry/node from 7.60.0 to 7.60.1 ([#9396](https://github.com/mdn/yari/issues/9396)) ([e2b3671](https://github.com/mdn/yari/commit/e2b3671f1de1d5313f3dd98fcd89e258246356a8)) +* **deps:** bump @sentry/node from 7.60.1 to 7.61.0 ([#9422](https://github.com/mdn/yari/issues/9422)) ([b8692c9](https://github.com/mdn/yari/commit/b8692c9fff690f58a9e8c6247e1d94e95b5b9962)) +* **deps:** bump @sentry/node from 7.61.0 to 7.61.1 ([#9437](https://github.com/mdn/yari/issues/9437)) ([56abc25](https://github.com/mdn/yari/commit/56abc2502ed8a9f32b0bb31553c6647cb962dcb2)) +* **deps:** bump @sentry/node from 7.61.1 to 7.62.0 ([#9465](https://github.com/mdn/yari/issues/9465)) ([9e260c6](https://github.com/mdn/yari/commit/9e260c631d49e1f59c3d1fbccffe1fbca5dfd36a)) +* **deps:** bump boto3 from 1.28.15 to 1.28.20 in /deployer ([#9446](https://github.com/mdn/yari/issues/9446)) ([e9cdc09](https://github.com/mdn/yari/commit/e9cdc09bd0288e67705d4738501ca442c9e8004c)) +* **deps:** bump boto3 from 1.28.3 to 1.28.9 in /deployer ([#9375](https://github.com/mdn/yari/issues/9375)) ([bb73d4e](https://github.com/mdn/yari/commit/bb73d4e8a9c74eb4c92e2ebc1a228b68a65006fb)) +* **deps:** bump boto3 from 1.28.9 to 1.28.15 in /deployer ([#9411](https://github.com/mdn/yari/issues/9411)) ([a2d03dd](https://github.com/mdn/yari/commit/a2d03dd216c06765dcc852ff6380aec2ed003bf4)) +* **deps:** bump click from 8.1.5 to 8.1.6 in /deployer ([#9377](https://github.com/mdn/yari/issues/9377)) ([d11b0a8](https://github.com/mdn/yari/commit/d11b0a8ba59d6c68e763eb8922ed7ce12fef2cae)) +* **deps:** bump fdir from 6.0.1 to 6.0.2 ([#9423](https://github.com/mdn/yari/issues/9423)) ([7c9edbd](https://github.com/mdn/yari/commit/7c9edbd708df6e1ff6d417ecc8787cd5261406ac)) +* **deps:** bump inquirer from 9.2.8 to 9.2.9 ([#9417](https://github.com/mdn/yari/issues/9417)) ([429c0a3](https://github.com/mdn/yari/commit/429c0a34181533a35d242659343591970e17335f)) +* **deps:** bump inquirer from 9.2.9 to 9.2.10 ([#9453](https://github.com/mdn/yari/issues/9453)) ([ea6427c](https://github.com/mdn/yari/commit/ea6427c5e1479e355d1d95257ad310699d871436)) +* **deps:** bump open-editor from 4.0.0 to 4.1.0 ([#9450](https://github.com/mdn/yari/issues/9450)) ([0c22184](https://github.com/mdn/yari/commit/0c22184c78d4b0d630e97679dc5bfc509063e7b4)) +* **deps:** bump pygithub from 1.59.0 to 1.59.1 in /deployer ([#9447](https://github.com/mdn/yari/issues/9447)) ([4b177e9](https://github.com/mdn/yari/commit/4b177e9d8b0bc76ced696e56fe119bbb96a27ebc)) +* **deps:** bump selectolax from 0.3.14 to 0.3.15 in /deployer ([#9376](https://github.com/mdn/yari/issues/9376)) ([1374a74](https://github.com/mdn/yari/commit/1374a7400b50610ea2a4dd1f6545cd613d360966)) +* **deps:** bump selectolax from 0.3.15 to 0.3.16 in /deployer ([#9410](https://github.com/mdn/yari/issues/9410)) ([3c2a19e](https://github.com/mdn/yari/commit/3c2a19e60be313ae536a00f9a561cf3a8a903469)) +* **deps:** bump web-specs from 2.63.0 to 2.64.0 ([#9389](https://github.com/mdn/yari/issues/9389)) ([22c5441](https://github.com/mdn/yari/commit/22c54413805f59b83c02280f324ebf6ba54ceaa4)) +* **deps:** bump web-specs from 2.64.0 to 2.64.1 ([#9404](https://github.com/mdn/yari/issues/9404)) ([f309a76](https://github.com/mdn/yari/commit/f309a768faf35aa0b53f4a9322ff59d35ca904b6)) +* **deps:** bump web-specs from 2.64.1 to 2.65.0 ([#9425](https://github.com/mdn/yari/issues/9425)) ([3217c18](https://github.com/mdn/yari/commit/3217c1858963a15fde215ba28cf164854f71f68a)) +* **docs/learn:** add user research survey banner ([#9405](https://github.com/mdn/yari/issues/9405)) ([65f1e4b](https://github.com/mdn/yari/commit/65f1e4b793f5ce7fd0d4a4a0a2b623db67af336d)) +* **docs/learn:** remove user research survey banner ([#9441](https://github.com/mdn/yari/issues/9441)) ([e49d8aa](https://github.com/mdn/yari/commit/e49d8aa4ff7b20fe80058ec179868f14718130c7)) +* **survey:** add august 2023 discoverability survey ([#9440](https://github.com/mdn/yari/issues/9440)) ([84ae026](https://github.com/mdn/yari/commit/84ae02688d27855ee9a8f7e056808c93bb31a28b)) +* update minimum node version from 18.0 to 18.16 ([#9384](https://github.com/mdn/yari/issues/9384)) ([efbeb7d](https://github.com/mdn/yari/commit/efbeb7d241bcdb45102da66efcd07101842c3eb4)) + +## [2.28.4](https://github.com/mdn/yari/compare/v2.28.3...v2.28.4) (2023-07-21) + + +### Bug Fixes + +* **deployer:** escape markdown markup in link text ([#8996](https://github.com/mdn/yari/issues/8996)) ([810edfa](https://github.com/mdn/yari/commit/810edfa2935a36d76381811f3844d509dacf6e61)) +* **play:** fix cursor jump on first edit ([#9356](https://github.com/mdn/yari/issues/9356)) ([216400e](https://github.com/mdn/yari/commit/216400ea6d43baba352210ff2050e20281ebd0e8)) + + +### Enhancements + +* **build:** handle missing BLOG_ROOT + log rg errors ([#9340](https://github.com/mdn/yari/issues/9340)) ([dab1fd9](https://github.com/mdn/yari/commit/dab1fd92d636c36073ef1c11933026fc347c5c75)) +* **document-survey:** adjust margins and widths ([#9364](https://github.com/mdn/yari/issues/9364)) ([c4ac8ce](https://github.com/mdn/yari/commit/c4ac8ce4df76136cbf61e728c370a7c22dd6707d)) + + +### Miscellaneous + +* **deps-dev:** bump eslint-plugin-react from 7.32.2 to 7.33.0 ([#9363](https://github.com/mdn/yari/issues/9363)) ([d53569d](https://github.com/mdn/yari/commit/d53569d9b650e0cd4553e4ea5eab7e6f6697262b)) +* **deps-dev:** bump sass from 1.63.6 to 1.64.0 ([#9355](https://github.com/mdn/yari/issues/9355)) ([f9f31cf](https://github.com/mdn/yari/commit/f9f31cfa5c74228b8d67350ba80812be628af7d0)) +* **deps-dev:** bump stylelint from 15.10.1 to 15.10.2 ([#9344](https://github.com/mdn/yari/issues/9344)) ([4ba0be2](https://github.com/mdn/yari/commit/4ba0be23e6fc0c8fd021f92b3636ea724d9b514b)) +* **deps-dev:** migrate to stylelint-config-recommended-scss ([#9341](https://github.com/mdn/yari/issues/9341)) ([62a544c](https://github.com/mdn/yari/commit/62a544c65becd55f0b9c427467870770781544d9)) +* **deps:** bump @mdn/browser-compat-data from 5.3.3 to 5.3.4 ([#9343](https://github.com/mdn/yari/issues/9343)) ([f2e7d16](https://github.com/mdn/yari/commit/f2e7d1656d0b9acee64f5033d47a0e1fe6044c01)) +* **deps:** bump @sentry/integrations from 7.59.2 to 7.59.3 ([#9354](https://github.com/mdn/yari/issues/9354)) ([427b03a](https://github.com/mdn/yari/commit/427b03ad8bc16eee63fe024a9455b85fc80358a4)) +* **deps:** bump @sentry/integrations from 7.59.3 to 7.60.0 ([#9361](https://github.com/mdn/yari/issues/9361)) ([ea3d030](https://github.com/mdn/yari/commit/ea3d030f10769f1f9c2e7f58fd74d657a48fa615)) +* **deps:** bump @sentry/node from 7.57.0 to 7.59.2 ([#9331](https://github.com/mdn/yari/issues/9331)) ([ed51740](https://github.com/mdn/yari/commit/ed51740026f7cf631fa77a908b59df069f3f2c1e)) +* **deps:** bump @sentry/node from 7.59.2 to 7.59.3 ([#9353](https://github.com/mdn/yari/issues/9353)) ([550acac](https://github.com/mdn/yari/commit/550acacf82959124c553f55464656fbbba6702e3)) +* **deps:** bump @sentry/node from 7.59.3 to 7.60.0 ([#9362](https://github.com/mdn/yari/issues/9362)) ([f028242](https://github.com/mdn/yari/commit/f028242d163b62d911ad66868231207e0f985832)) +* **prod-build:** update AI Help index ([22f19fc](https://github.com/mdn/yari/commit/22f19fc4ee83b4851dbdde71750142fc454866a5)) + +## [2.28.3](https://github.com/mdn/yari/compare/v2.28.2...v2.28.3) (2023-07-18) + + +### Bug Fixes + +* **build:** copy fallback images from en-US to l10n ([#7917](https://github.com/mdn/yari/issues/7917)) ([86a4e6f](https://github.com/mdn/yari/commit/86a4e6fbaaa1ad85a8c47c065f4c15eb4e6d4efc)) +* **cloud-function:** remove deprecated X-XSS-Protection header ([#9240](https://github.com/mdn/yari/issues/9240)) ([4a02f2e](https://github.com/mdn/yari/commit/4a02f2ed871fbef498f16862dc0adc238bfae58c)) +* **deps-dev:** add @babel/plugin-proposal-private-property-in-object ([#9338](https://github.com/mdn/yari/issues/9338)) ([0b4f31a](https://github.com/mdn/yari/commit/0b4f31ac84bab7cd3048467e20c3643e486c385d)) +* **flaws:** stop reporting absolute MDN blog links as broken ([#9080](https://github.com/mdn/yari/issues/9080)) ([e59323f](https://github.com/mdn/yari/commit/e59323f9409ec6294d6addbbc52f062a62b167d1)) + + +### Enhancements + +* **release-please:** include chore/enhance commits ([#9339](https://github.com/mdn/yari/issues/9339)) ([ec97a3d](https://github.com/mdn/yari/commit/ec97a3d837660a0d228db724cb162ac6aed89d62)) + + +### Miscellaneous + +* **deps-dev:** bump @playwright/test from 1.36.0 to 1.36.1 ([#9315](https://github.com/mdn/yari/issues/9315)) ([df09d78](https://github.com/mdn/yari/commit/df09d78d6b72246fdb849d9cc65aafb37fb9716f)) +* **deps-dev:** bump @swc/core from 1.3.69 to 1.3.70 ([#9329](https://github.com/mdn/yari/issues/9329)) ([8f5348b](https://github.com/mdn/yari/commit/8f5348be763fde399a4d98ea3495fe57d20956f7)) +* **deps-dev:** bump @types/mdast from 3.0.11 to 4.0.0 ([#9251](https://github.com/mdn/yari/issues/9251)) ([a3406e5](https://github.com/mdn/yari/commit/a3406e584003b593cc5ec2fde4d6a02dc7d5e73f)) +* **deps-dev:** bump black from 23.3.0 to 23.7.0 in /deployer ([#9312](https://github.com/mdn/yari/issues/9312)) ([34db2f5](https://github.com/mdn/yari/commit/34db2f5bb74a4f92d0f1ceecae7c03edc6db1c5d)) +* **deps-dev:** bump black in /testing/integration ([#9310](https://github.com/mdn/yari/issues/9310)) ([5e45251](https://github.com/mdn/yari/commit/5e45251370e7bb1dccf42ff0d72840740001edbc)) +* **deps-dev:** bump eslint from 8.44.0 to 8.45.0 ([#9316](https://github.com/mdn/yari/issues/9316)) ([f67677d](https://github.com/mdn/yari/commit/f67677d1ee27c255665437fa2e61f78c456f7831)) +* **deps-dev:** bump eslint-plugin-unicorn from 47.0.0 to 48.0.0 ([#9317](https://github.com/mdn/yari/issues/9317)) ([8661a5c](https://github.com/mdn/yari/commit/8661a5c5701a322b4b04e524fa5bbfa65738c07d)) +* **deps-dev:** bump html-validate from 7.18.0 to 8.0.5 ([#9089](https://github.com/mdn/yari/issues/9089)) ([c77a3eb](https://github.com/mdn/yari/commit/c77a3ebef8f1382ca2769c3ed3981bb069d05900)) +* **deps-dev:** bump postcss-preset-env from 8.5.1 to 9.0.0 ([#9217](https://github.com/mdn/yari/issues/9217)) ([d8b361c](https://github.com/mdn/yari/commit/d8b361c67663ee06f28c5db270d5b5863091bf2e)) +* **deps-dev:** bump react-router-dom from 6.14.1 to 6.14.2 ([#9328](https://github.com/mdn/yari/issues/9328)) ([60974a2](https://github.com/mdn/yari/commit/60974a25bf5db00aa770afa8176d0c1304f568be)) +* **deps-dev:** bump stylelint-config-recommended from 12.0.0 to 13.0.0 ([#9247](https://github.com/mdn/yari/issues/9247)) ([e6487bc](https://github.com/mdn/yari/commit/e6487bc297d891bffe3721cf328314f02eb3d7c8)) +* **deps-dev:** bump typescript from 5.0.4 to 5.1.6 ([#9196](https://github.com/mdn/yari/issues/9196)) ([c41afe5](https://github.com/mdn/yari/commit/c41afe5585f91be7d0d3953368d242e668177c4c)) +* **deps-dev:** bump webpack from 5.88.1 to 5.88.2 ([#9333](https://github.com/mdn/yari/issues/9333)) ([5a4ca67](https://github.com/mdn/yari/commit/5a4ca676ba22fe7361e55f3c7d417ae7decdf349)) +* **deps-dev:** bump webpack from 5.88.1 to 5.88.2 in /client/pwa ([#9334](https://github.com/mdn/yari/issues/9334)) ([369f103](https://github.com/mdn/yari/commit/369f103eb3ef7df35821d1d5914206162fa7d77a)) +* **deps-dev:** bump workbox-webpack-plugin from 6.6.1 to 7.0.0 ([#8990](https://github.com/mdn/yari/issues/8990)) ([b443c6d](https://github.com/mdn/yari/commit/b443c6de256d6d880391840654b756616e175144)) +* **deps-dev:** remove @types/hast ([#9335](https://github.com/mdn/yari/issues/9335)) ([933dfc3](https://github.com/mdn/yari/commit/933dfc383ebffdade99e75f51650ace2d1324c05)) +* **deps:** bump aws-actions/configure-aws-credentials ([#9091](https://github.com/mdn/yari/issues/9091)) ([5224452](https://github.com/mdn/yari/commit/52244529e364cc8a6d9d2fa23b4a290e12165013)) +* **deps:** bump boto3 from 1.28.1 to 1.28.3 in /deployer ([#9311](https://github.com/mdn/yari/issues/9311)) ([914b9ef](https://github.com/mdn/yari/commit/914b9ef4dbd634135a1b91cdba74f6d99a425ebc)) +* **deps:** bump click from 8.1.4 to 8.1.5 in /deployer ([#9314](https://github.com/mdn/yari/issues/9314)) ([f1f7cb3](https://github.com/mdn/yari/commit/f1f7cb342331edfdf311f8b25ce7a34cbf5bb55e)) +* **deps:** bump cryptography from 39.0.2 to 41.0.0 in /deployer ([#9006](https://github.com/mdn/yari/issues/9006)) ([db086f5](https://github.com/mdn/yari/commit/db086f502d9254dfe390432729e249cdf8e59dc5)) +* **deps:** bump got from 12.6.0 to 13.0.0 ([#8959](https://github.com/mdn/yari/issues/8959)) ([d1511c5](https://github.com/mdn/yari/commit/d1511c524a851aa05547f7c4a24497941b019846)) +* **deps:** bump inquirer from 9.2.7 to 9.2.8 ([#9297](https://github.com/mdn/yari/issues/9297)) ([102a212](https://github.com/mdn/yari/commit/102a212ab08fb2987b0e917541a6ec71c7aa7d58)) +* **deps:** bump lru-cache from 9.1.2 to 10.0.0 ([#9104](https://github.com/mdn/yari/issues/9104)) ([aac219a](https://github.com/mdn/yari/commit/aac219a4c86357900ae7ef292aa5ea73efc1eeb6)) +* **deps:** bump mdast-util-from-markdown from 1.3.1 to 2.0.0 ([#9266](https://github.com/mdn/yari/issues/9266)) ([f2c7a3b](https://github.com/mdn/yari/commit/f2c7a3b6ff52b410a95b8730c271b75b18d90489)) +* **deps:** bump mdast-util-phrasing from 3.0.1 to 4.0.0 ([#9269](https://github.com/mdn/yari/issues/9269)) ([9e22f54](https://github.com/mdn/yari/commit/9e22f546491c5179fcd6dcd9a2dca237088b2060)) +* **deps:** bump pytest-rerunfailures in /testing/integration ([#9265](https://github.com/mdn/yari/issues/9265)) ([a7a26a2](https://github.com/mdn/yari/commit/a7a26a2d70e9dbac10bd6dc3603c21de7a9103bc)) +* **deps:** bump unist-builder from 3.0.1 to 4.0.0 ([#9252](https://github.com/mdn/yari/issues/9252)) ([bc63711](https://github.com/mdn/yari/commit/bc63711be98b96de94f272a286232031f8233645)) +* **deps:** bump unist-util-visit from 4.1.2 to 5.0.0 ([#9255](https://github.com/mdn/yari/issues/9255)) ([1d23f5b](https://github.com/mdn/yari/commit/1d23f5bcf3fb07e6d796d1d7f745836f04fd4a7f)) +* **deps:** bump word-wrap from 1.2.3 to 1.2.4 ([#9337](https://github.com/mdn/yari/issues/9337)) ([5e07bdc](https://github.com/mdn/yari/commit/5e07bdc54bfdc3e7271124203ba3ab543a93c6ec)) +* **deps:** remove html-react-parser ([#9336](https://github.com/mdn/yari/issues/9336)) ([acf220c](https://github.com/mdn/yari/commit/acf220c8f978c21132149b0791d22f7eeb6e8b63)) +* **macros:** delete {{Interwiki}} macro ([#9264](https://github.com/mdn/yari/issues/9264)) ([74431cf](https://github.com/mdn/yari/commit/74431cf1e67a72e8c4caa87e69bc48540a36bf2e)) +* **server:** remove dev middlewares + merge start:{dev-server,server} scripts ([#8950](https://github.com/mdn/yari/issues/8950)) ([2805415](https://github.com/mdn/yari/commit/2805415bbe2543dc72f40d0c220c6c437ab3e95b)) +* **sidebar-filter:** remove feedback footer ([#9242](https://github.com/mdn/yari/issues/9242)) ([c8af475](https://github.com/mdn/yari/commit/c8af475e5d1bddc70fd9f3b2340230989e50d27f)) + +## [2.28.2](https://github.com/mdn/yari/compare/v2.28.1...v2.28.2) (2023-07-14) + + +### Bug Fixes + +* **blog:** ignore hidden code blocks when calculating read time ([#9302](https://github.com/mdn/yari/issues/9302)) ([9f237bd](https://github.com/mdn/yari/commit/9f237bd5b16f4e4655e1ae783e598e0657b2d884)) +* **build:** avoid breadcrumbs over-shortening ([#8830](https://github.com/mdn/yari/issues/8830)) ([285d200](https://github.com/mdn/yari/commit/285d20030a6a5808bba6eb8cb72056872dc1c249)) +* **macros/cssxref:** use en-US page to fetch front matter key ([#8884](https://github.com/mdn/yari/issues/8884)) ([7330766](https://github.com/mdn/yari/commit/733076609ecf56080e07a0fe9978b147eedeb954)) + +## [2.28.1](https://github.com/mdn/yari/compare/v2.28.0...v2.28.1) (2023-07-08) + + +### Bug Fixes + +* **ai-help:** add beta disclaimer banner ([#9261](https://github.com/mdn/yari/issues/9261)) ([eb8bde1](https://github.com/mdn/yari/commit/eb8bde1ec8467a48133aad1fa35f6b4d773b7010)) +* **ai-help:** enhance issue reporting ([#9262](https://github.com/mdn/yari/issues/9262)) ([2c9e4bb](https://github.com/mdn/yari/commit/2c9e4bb6a9c429659df5f4cbb286510175c90d33)) +* **macros/AddonSidebar:** inline "Using_the_JavaScript_APIs" redirect ([#9212](https://github.com/mdn/yari/issues/9212)) ([d29617c](https://github.com/mdn/yari/commit/d29617c103418321184d25dad722af0cfc40698c)) +* **playground:** don't extract inline css ([#9203](https://github.com/mdn/yari/issues/9203)) ([5324a5d](https://github.com/mdn/yari/commit/5324a5d9800dd0727cf05ae2adfd5237289b2ef2)) + +## [2.28.0](https://github.com/mdn/yari/compare/v2.27.0...v2.28.0) (2023-07-05) + + +### Features + +* **ai-explain:** add ai-explain to code blocks ([#9188](https://github.com/mdn/yari/issues/9188)) ([e342081](https://github.com/mdn/yari/commit/e342081cbf92073ca2071e8af8a9a329b05f3d29)) +* **ai-help:** add "Report issue with this answer on GitHub" link ([#9238](https://github.com/mdn/yari/issues/9238)) ([9f9cb5a](https://github.com/mdn/yari/commit/9f9cb5ae7cb8818ca8c13dc864537c5684830dff)) + + +### Bug Fixes + +* **ai-explain:** feedback copy ([0a80005](https://github.com/mdn/yari/commit/0a8000540cd824bc9d30111e57ec4ae8651e7ed3)) +* **ai-explain:** pause ai-explain ([1bf2856](https://github.com/mdn/yari/commit/1bf285612ca2a2741795916fbe7fd2549e6b0013)) +* **ai-help:** add short and extended explanatory guidance ([#9215](https://github.com/mdn/yari/issues/9215)) ([1da1d4e](https://github.com/mdn/yari/commit/1da1d4e93f98e44b15ad277deed6129f35a47e1e)) + +## [2.27.0](https://github.com/mdn/yari/compare/v2.26.0...v2.27.0) (2023-06-27) + + +### Features + +* **plus:** add AI Help frontend ([#9116](https://github.com/mdn/yari/issues/9116)) ([ab93937](https://github.com/mdn/yari/commit/ab9393793d31bc33902049677cec1c968ad3877e)) +* **surveys:** add Blog Feedback survey ([#9173](https://github.com/mdn/yari/issues/9173)) ([b4f6115](https://github.com/mdn/yari/commit/b4f61155a1aadca72eab7a7b8f0514820e5ae114)) + + +### Bug Fixes + +* **live-sample:** use getElementsByClassName ([#9182](https://github.com/mdn/yari/issues/9182)) ([5615b63](https://github.com/mdn/yari/commit/5615b636a4fcda62b0fec57e577903a62710665c)) +* **playground:** only initialize once ([#9176](https://github.com/mdn/yari/issues/9176)) ([005b0f8](https://github.com/mdn/yari/commit/005b0f803ecc48ac0480daaa4dd5d8317fba3b51)) + +## [2.26.0](https://github.com/mdn/yari/compare/v2.25.0...v2.26.0) (2023-06-26) + + +### Features + +* **blog:** add author avatars ([#9131](https://github.com/mdn/yari/issues/9131)) ([f8d0251](https://github.com/mdn/yari/commit/f8d025145ce8b3ed1dd9b14174c0359ba76a1190)) +* **blog:** previous/next links at end of posts ([#8922](https://github.com/mdn/yari/issues/8922)) ([1da298c](https://github.com/mdn/yari/commit/1da298c5246cd449c211a14ff24023251c26788d)) +* **blog:** show newsletter form or link below posts ([#8920](https://github.com/mdn/yari/issues/8920)) ([203b298](https://github.com/mdn/yari/commit/203b29811797b9396425bd0e8219bb0e6fb82eae)) +* **footer:** add blog feed icon ([#9060](https://github.com/mdn/yari/issues/9060)) ([0f6a075](https://github.com/mdn/yari/commit/0f6a075ed99ba4f997e624e9be04132ebbe5eae8)) +* **playground:** Introduce the MDN Playground ([#9117](https://github.com/mdn/yari/issues/9117)) ([b3050a4](https://github.com/mdn/yari/commit/b3050a428e237aeb6a27d0ef2cead1f50912c511)) +* **sidebar:** add filter ([#8968](https://github.com/mdn/yari/issues/8968)) ([3a4c28d](https://github.com/mdn/yari/commit/3a4c28dbfaab6a61ca6bee8606f9a5bc5d36400b)) + + +### Bug Fixes + +* **gcp:** cache volatile content for 1h ([#9050](https://github.com/mdn/yari/issues/9050)) ([78c6e35](https://github.com/mdn/yari/commit/78c6e357ebd433742ad2486716f777401f54c946)) +* **github:** include build/** in search results ([#9030](https://github.com/mdn/yari/issues/9030)) ([16f8fd3](https://github.com/mdn/yari/commit/16f8fd38fbdbd1301198fd5e7f2422fede8d930e)) +* **glean:** avoid gleanClick changing between re-renders ([#9108](https://github.com/mdn/yari/issues/9108)) ([db88b56](https://github.com/mdn/yari/commit/db88b56bb86d9900a62b00ca3476a93f169056c4)) +* **icons:** use rotated thumbs-up as thumbs-down ([#9107](https://github.com/mdn/yari/issues/9107)) ([f05db31](https://github.com/mdn/yari/commit/f05db31ff1b8e4af385072c55aeec96f6dbe12c4)) +* **livesamples:** use correct legacy url ([#9158](https://github.com/mdn/yari/issues/9158)) ([1da46c9](https://github.com/mdn/yari/commit/1da46c950fcb18642e0a5ce0eb74248201361bea)) +* **playground:** console scroll to bottom ([#9153](https://github.com/mdn/yari/issues/9153)) ([85871bb](https://github.com/mdn/yari/commit/85871bbdae0d3a7bb6025704d30a3b26c33346b5)) +* **playground:** render SVGs ([#9141](https://github.com/mdn/yari/issues/9141)) ([0caebd9](https://github.com/mdn/yari/commit/0caebd91d34b66b13b39530afc10c43cd3211787)) +* prevent live-sample render errors killing the whole build ([#9155](https://github.com/mdn/yari/issues/9155)) ([c99d7fe](https://github.com/mdn/yari/commit/c99d7fee024d224f36edfa069d5f0fdd4833a4cd)) +* **prod:** set ORIGIN_PLAY for cloud function ([#9136](https://github.com/mdn/yari/issues/9136)) ([e50d50c](https://github.com/mdn/yari/commit/e50d50c70ce55f248b613ff67dda0fabfb240257)) + +## [2.25.0](https://github.com/mdn/yari/compare/v2.24.0...v2.25.0) (2023-06-06) + + +### Features + +* **client/env:** split CRUD_MODE into WRITER_MODE and DEV_MODE ([#8383](https://github.com/mdn/yari/issues/8383)) ([675a854](https://github.com/mdn/yari/commit/675a854205c05576eb34b85f813577d6bd1106f0)) + +## [2.24.0](https://github.com/mdn/yari/compare/v2.23.1...v2.24.0) (2023-06-05) + + +### Features + +* **docs:** allow audio (mp3/ogg), video (mp4/webm) and font (woff2) attachments ([#7605](https://github.com/mdn/yari/issues/7605)) ([73f8dbc](https://github.com/mdn/yari/commit/73f8dbc6c8baf66a116225cae29c19e80d5b6b4a)) +* **macros:** add GlossarySidebar macro ([#8997](https://github.com/mdn/yari/issues/8997)) ([e704315](https://github.com/mdn/yari/commit/e7043154bf532cb1a81f1857ba9b4b9f80250498)) +* **macros:** add XsltSidebar for XSLT pages ([#9021](https://github.com/mdn/yari/issues/9021)) ([bddd9f7](https://github.com/mdn/yari/commit/bddd9f7eb1bb3e545b16eb68b62d644909fb68d4)) +* **placement:** hp takeover ([#9022](https://github.com/mdn/yari/issues/9022)) ([2ff4a7b](https://github.com/mdn/yari/commit/2ff4a7b11475d8dac0a072475d5cd08a99d558a4)) +* pride month 2023 ([#8979](https://github.com/mdn/yari/issues/8979)) ([776e70a](https://github.com/mdn/yari/commit/776e70a2085252c155596df4a5b79a170e506319)) + + +### Bug Fixes + +* **constants:** add Polish to RETIRED_LOCALES ([#8970](https://github.com/mdn/yari/issues/8970)) ([08c15a3](https://github.com/mdn/yari/commit/08c15a3c33ac1eb4801a8b478cb1e99548a9ecab)) +* **toolbar:** reduce height if read-only ([#8976](https://github.com/mdn/yari/issues/8976)) ([9e91c72](https://github.com/mdn/yari/commit/9e91c723a088cbfd8ab9bc148aae4a907a80baa5)) + +## [2.23.1](https://github.com/mdn/yari/compare/v2.23.0...v2.23.1) (2023-05-29) + + +### Bug Fixes + +* **kumascript:** mention path in render error message ([#8936](https://github.com/mdn/yari/issues/8936)) ([27938ad](https://github.com/mdn/yari/commit/27938adc275d599363b09d526395ab7c739d025b)) +* **kumascript:** mention path in render error message (v2) ([#8953](https://github.com/mdn/yari/issues/8953)) ([a9d7370](https://github.com/mdn/yari/commit/a9d737026ac159458a18ed261321e14751aff382)) + +## [2.23.0](https://github.com/mdn/yari/compare/v2.22.0...v2.23.0) (2023-05-25) + + +### Features + +* **newsletter:** add public sign-up page ([#8686](https://github.com/mdn/yari/issues/8686)) ([bf3fbf7](https://github.com/mdn/yari/commit/bf3fbf70d0487fb6cb66026bcf9a9942bb64e63a)) + + +### Bug Fixes + +* **cloud-function:** strip X-Forwarded-Host + Forwarded headers ([#8894](https://github.com/mdn/yari/issues/8894)) ([74bab35](https://github.com/mdn/yari/commit/74bab354a076ad044d909b30991784cd163ace1a)) +* **csp,fundamental-redirects:** replace media.*.mdn.mozit.cloud with mdn.dev ([#8873](https://github.com/mdn/yari/issues/8873)) ([2c81bf5](https://github.com/mdn/yari/commit/2c81bf58e0ab533960b716f00d6e5b43f4d46dd0)) +* **quicksearch:** opened pages don't scroll to top ([#8911](https://github.com/mdn/yari/issues/8911)) ([964251b](https://github.com/mdn/yari/commit/964251b2fa54532eae121f61e57700378e920d25)) + +## [2.22.0](https://github.com/mdn/yari/compare/v2.21.0...v2.22.0) (2023-05-19) + + +### Features + +* **syntax-highlight:** add apacheconf to Prism.js languages ([#8862](https://github.com/mdn/yari/issues/8862)) ([8b8ae3d](https://github.com/mdn/yari/commit/8b8ae3d1e7e5ec63599946a1ad8a699d93a7ffa0)) + + +### Bug Fixes + +* **blog:** hydration error on date ([#8871](https://github.com/mdn/yari/issues/8871)) ([a271858](https://github.com/mdn/yari/commit/a271858662aef8963ca4a5826636d077db5431c8)) +* **content:** only collect required translations ([#8806](https://github.com/mdn/yari/issues/8806)) ([5ec562c](https://github.com/mdn/yari/commit/5ec562cd2d59d0fd0e4f5d3cb8ac48e2a4985274)) +* **sidebar:** incorrect offset and z-index on mobile ([#8856](https://github.com/mdn/yari/issues/8856)) ([af1cfdc](https://github.com/mdn/yari/commit/af1cfdc4b728a85df9263986809dbd3df1a37f14)) +* **top-banner:** adjust width ([#8863](https://github.com/mdn/yari/issues/8863)) ([f5c6dbc](https://github.com/mdn/yari/commit/f5c6dbc5f674a5c4967aa331c88d01abe74c0f94)) +* **ui:** gap at top of page in tablet mode ([#8885](https://github.com/mdn/yari/issues/8885)) ([dd98b12](https://github.com/mdn/yari/commit/dd98b127bdc8ce655a38ba4db37343af86345f9d)) +* **workflows:** rate limit downloading ripgrep ([#8865](https://github.com/mdn/yari/issues/8865)) ([6187817](https://github.com/mdn/yari/commit/61878177d153cf17c8d968ed4de953bc4a81589e)) + +## [2.21.0](https://github.com/mdn/yari/compare/v2.20.3...v2.21.0) (2023-05-15) + + +### Features + +* **build:** collect errors + warnings with @sentry/node ([#8571](https://github.com/mdn/yari/issues/8571)) ([f18d609](https://github.com/mdn/yari/commit/f18d609c6ddfda87efca707234f9d4a6c49798df)) +* **ci:** add xyz-build ([#8661](https://github.com/mdn/yari/issues/8661)) ([77df4fc](https://github.com/mdn/yari/commit/77df4fc754464e4ba241589d8f5f21d0a9dc8a23)) + + +### Bug Fixes + +* avoid leading double slash ([#8846](https://github.com/mdn/yari/issues/8846)) ([0fb0fa9](https://github.com/mdn/yari/commit/0fb0fa9008d8e866367a37288050ca1e40be443a)) +* **CSS:** last elements inside blockquotes do not need bottom margin ([#8855](https://github.com/mdn/yari/issues/8855)) ([80094ea](https://github.com/mdn/yari/commit/80094ea5054fec899b15a2d4e2310053eac542eb)) +* **macros/PWASidebar:** remove structural overview page ([#8845](https://github.com/mdn/yari/issues/8845)) ([93ac66f](https://github.com/mdn/yari/commit/93ac66fb39b7614c8f33f16a8dd4a84026acaa70)) + +## [2.20.3](https://github.com/mdn/yari/compare/v2.20.2...v2.20.3) (2023-05-11) + + +### Bug Fixes + +* **lint-staged:** use negative pattern correctly ([#8842](https://github.com/mdn/yari/issues/8842)) ([8e74e5f](https://github.com/mdn/yari/commit/8e74e5fb0518d8b140a41a965e71ab267e11bef5)) +* **npm-publish:** setup node with registry url ([#8841](https://github.com/mdn/yari/issues/8841)) ([660a28b](https://github.com/mdn/yari/commit/660a28ba34772eba75a602de01a1fa2aa8865992)) + +## [2.20.2](https://github.com/mdn/yari/compare/v2.20.1...v2.20.2) (2023-05-11) + + +### Bug Fixes + +* **npm-publish:** restore --access public option ([#8839](https://github.com/mdn/yari/issues/8839)) ([c5f8c48](https://github.com/mdn/yari/commit/c5f8c48ada5b17ef672810e09ca399ea518a46fa)) + +## [2.20.1](https://github.com/mdn/yari/compare/v2.20.0...v2.20.1) (2023-05-11) + + +### Bug Fixes + +* **dev:** TypeScript errors when running `yarn dev` ([#8835](https://github.com/mdn/yari/issues/8835)) ([039515b](https://github.com/mdn/yari/commit/039515b730f6a636e0791e683604ae7fa8ad5072)) +* **npm-publish:** revert renaming of NPM_AUTH_TOKEN ([#8831](https://github.com/mdn/yari/issues/8831)) ([3ccc923](https://github.com/mdn/yari/commit/3ccc923e6690fa81b08435cf6e4ca44812fd06a4)) + +## [2.20.0](https://github.com/mdn/yari/compare/v2.19.0...v2.20.0) (2023-05-10) + + +### Features + +* **docs:** baseline indicator ([#8772](https://github.com/mdn/yari/issues/8772)) ([35786d8](https://github.com/mdn/yari/commit/35786d80399b225507530931286deaa55b0c9a82)) + +## [2.19.0](https://github.com/mdn/yari/compare/v2.18.1...v2.19.0) (2023-05-10) + + +### Features + +* **banner:** add blog announcement banner ([#8801](https://github.com/mdn/yari/issues/8801)) ([2e730ae](https://github.com/mdn/yari/commit/2e730ae35c5634e10b3ab2202e605a6e4f09c647)) +* **fundamental-redirects:** redirect archived media ([#8785](https://github.com/mdn/yari/issues/8785)) ([784beeb](https://github.com/mdn/yari/commit/784beeb2d7eda26c47528e58164693952d0c30db)) + + +### Bug Fixes + +* **blog:** add build step ([e1366c5](https://github.com/mdn/yari/commit/e1366c558cbb254d195a45d5605b632b63e24356)) +* **ci:** limit failing CI from running on forks ([877d6fa](https://github.com/mdn/yari/commit/877d6fa3569a306fd8e76f2556cd3d3577f49953)) +* **cloud-function:** fix fxa webhooks ([#8706](https://github.com/mdn/yari/issues/8706)) ([d6421a5](https://github.com/mdn/yari/commit/d6421a56c93655047a9c52205cdff1f675877f1f)) +* **jest:** reduce memory usage ([#8753](https://github.com/mdn/yari/issues/8753)) ([47910ee](https://github.com/mdn/yari/commit/47910ee04e30ac129459a8c1628ac375518884c3)) +* **jest:** use --rootDir option ([#8754](https://github.com/mdn/yari/issues/8754)) ([80f51f4](https://github.com/mdn/yari/commit/80f51f4a15680a0737b776d8ef5b6d630d634677)) +* **layout:** consolidate sticky header ([#8781](https://github.com/mdn/yari/issues/8781)) ([496ab9f](https://github.com/mdn/yari/commit/496ab9f36773d86b6d8f7478deaa34e106353b88)) +* **ssr:** add hreflang to alternate rss link ([#8756](https://github.com/mdn/yari/issues/8756)) ([f71415e](https://github.com/mdn/yari/commit/f71415ef6d3f22db9a74b33711133dfb440129f5)) +* **sync:** don't deploy to static/static ([#8803](https://github.com/mdn/yari/issues/8803)) ([c453e79](https://github.com/mdn/yari/commit/c453e79f2cb922bf429a3caf2d553a2d353bb39b)) +* **sync:** skip rsync for static ([#8805](https://github.com/mdn/yari/issues/8805)) ([8951f2a](https://github.com/mdn/yari/commit/8951f2a3af2b6ac19eff2a45aafc1bb7e029cdb2)) +* tool `yarn content move` converts double quotes to single quotes in title ([#8623](https://github.com/mdn/yari/issues/8623)) ([7da24a4](https://github.com/mdn/yari/commit/7da24a408ae8ea628feaf7e55b18d6f32b6a39ad)) +* Wrap SVG Mandala to reduce CPU usage ([#8622](https://github.com/mdn/yari/issues/8622)) ([35c9ae9](https://github.com/mdn/yari/commit/35c9ae91e548d417c836e437ecda3e8546888180)) diff --git a/vendor/yari/CODE_OF_CONDUCT.md b/vendor/yari/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..595d0048b --- /dev/null +++ b/vendor/yari/CODE_OF_CONDUCT.md @@ -0,0 +1,12 @@ +# Community Participation Guidelines + +This repository is governed by Mozilla's code of conduct and etiquette +guidelines. For more details, please read the +[Mozilla Community Participation Guidelines](https://www.mozilla.org/about/governance/policies/participation/). + +## How to Report + +For more information on how to report violations of the Community Participation +Guidelines, please read our +[How to Report](https://www.mozilla.org/about/governance/policies/participation/reporting/) +page. diff --git a/vendor/yari/LICENSE b/vendor/yari/LICENSE new file mode 100644 index 000000000..a612ad981 --- /dev/null +++ b/vendor/yari/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/vendor/yari/Procfile.dev b/vendor/yari/Procfile.dev new file mode 100644 index 000000000..4b6cd7474 --- /dev/null +++ b/vendor/yari/Procfile.dev @@ -0,0 +1,4 @@ +server: yarn start:server +type-check: cd client && tsc --noEmit --watch +web: yarn start:client +ssr: yarn watch:ssr diff --git a/vendor/yari/Procfile.rari b/vendor/yari/Procfile.rari new file mode 100644 index 000000000..a39285dfe --- /dev/null +++ b/vendor/yari/Procfile.rari @@ -0,0 +1,2 @@ +server: yarn start:rari-server +web: yarn start:client diff --git a/vendor/yari/Procfile.rari.dev b/vendor/yari/Procfile.rari.dev new file mode 100644 index 000000000..303a7b4a0 --- /dev/null +++ b/vendor/yari/Procfile.rari.dev @@ -0,0 +1,4 @@ +server: yarn start:rari-server +type-check: cd client && tsc --noEmit --watch +web: yarn start:client +ssr: yarn watch:ssr diff --git a/vendor/yari/Procfile.start b/vendor/yari/Procfile.start new file mode 100644 index 000000000..a5108c2c7 --- /dev/null +++ b/vendor/yari/Procfile.start @@ -0,0 +1,2 @@ +server: yarn start:server +web: yarn start:client diff --git a/vendor/yari/README.md b/vendor/yari/README.md new file mode 100644 index 000000000..248cb0c20 --- /dev/null +++ b/vendor/yari/README.md @@ -0,0 +1,302 @@ +# Yari + +![Testing](https://github.com/mdn/yari/workflows/Testing%20Yari/badge.svg) +![Prod Build](https://github.com/mdn/yari/workflows/Prod%20Build/badge.svg) + +## Quickstart + +Development on `yari` involves updating the machinery that renders MDN content +or improving the structure and styling of the MDN UI (e.g. the styling of the +header). If you are more interested in contributing to the MDN content, you +should check out the [content](https://github.com/mdn/content) repo README +instead. + +Before you can start working with Yari, you need to: + + + + +1. Install [git](https://git-scm.com/), [Node.js](https://nodejs.org), and + [Yarn 1](https://classic.yarnpkg.com/en/docs/install). + +1. [Fork](https://docs.github.com/en/github/getting-started-with-github/fork-a-repo) + the MDN [content](https://github.com/mdn/content) and + [yari](https://github.com/mdn/yari) repositories using the Fork button on + GitHub. + +1. Clone the forked repositories to your computer using the following commands + (replace `[your account]` with the account you forked the repositories to): + + git clone https://github.com/[your_account]/content.git + git clone https://github.com/[your_account]/yari.git + + + +To run Yari locally, you'll first need to install its dependencies and build the +app locally. Do this like so: + + cd yari + yarn install + +See the [troubleshooting](#troubleshooting) section below if you run into +problems. + +Now copy the `.env-dist` file to `.env`: + + cp .env-dist .env + +If you followed the instructions above and cloned the `content` repo as a +sibling of your `yari` repo, the `CONTENT_ROOT` environment variable is already +set and Yari will be able to find the content it needs to render. + +At this point, you can get started. Run the following lines to compile required +files, start the Yari web server running, and open it in your browser: + + yarn dev + open http://localhost:3000 + +If you prefer you can use `yarn start`, which will re-use any previously +compiled files; this is "riskier" but faster. `yarn dev` always ensures that +everything is up-to-date. + +The `yarn start` command also starts a server with slightly different behavior — +it doesn't automatically reload when its source code files change, so use with +caution. + +See also our [reviewing guide](docs/REVIEWING.md) for information on how to +review Yari changes. + +### Pull request requirements + +Firstly, thank you for your interest in contributing to Yari! We do have a few +requirements when it comes to pull requests: + +1. Please make use of a + [feature branch workflow](https://www.atlassian.com/git/tutorials/comparing-workflows/feature-branch-workflow). +2. We prefer if you use the + [conventional commits format](https://www.conventionalcommits.org/) when + making pull requests. +3. Lastly, we require that all commits are signed. Please see the documentation + [about signed commits](https://docs.github.com/en/authentication/managing-commit-signature-verification/about-commit-signature-verification) + and + [how to sign yours](https://docs.github.com/en/authentication/managing-commit-signature-verification/signing-commits) + on GitHub. + +Thank you for your understanding! We look forward to your contributions. + +### How to stay up-to-date + +Periodically, the code and the content changes. Make sure you stay up-to-date +with something along the following lines (replace `yari-origin` with whatever +you called [the remote location](https://git-scm.com/docs/git-remote) of the +original yari repo): + + git pull yari-origin main + yarn + yarn dev + +When you embark on making a change, do it on a new branch, for example +`git checkout -b my-new-branch`. + +## License + +All source code is [MPL-2.0](https://www.mozilla.org/en-US/MPL/2.0/). + +For content, see its +[license](https://github.com/mdn/content/blob/main/LICENSE.md) in the +[mdn/content repository](https://github.com/mdn/content). + +## Supported Platforms + +`yari` runs on Linux in CI, and when building for Production. + +We also support Windows and MacOS, however we don't aim to proactively catch +issues with CI on those platforms. If bugs arise, we welcome issues being filed, +or PRs being opened to fix them. + +## How it works + +Yari does a number of things, the most important of which is to render and serve +the MDN content found in the [content repo](https://github.com/mdn/content). +Each document is stored as an `index.md` (recommended) or `index.html` file that +contains metadata presented as YAML +[front-matter](https://github.com/mdn/content#fundamental-concepts) followed by +the document source. + +The builder converts these "source files" into "build files" using a CLI tool +that iterates over the files, builds the HTML, and lastly packages it up with +the front-end code, ready to be served as static files. + +## Development + +The `yarn start` command encapsulates the front-end dev server (on +) and the `server` (on ). + +All the sub-commands of `yarn start` can be broken down and run individually if +you want to work more rapidly. + +### Setting up `$EDITOR` + +If you configure an environment variable called `EDITOR`, either on your system +as a whole or in the root `.env` file, it can be used in the development server +to link to sources which, when clicked, open in your preferred editor/IDE. For +example, in the root of the repo you could run: + + echo 'EDITOR=code' >> .env + +Now clicking certain links will open files directly in the currently open VS +Code IDE (replace `code` in the above command with a different text editor name +if needed, e.g. `atom` or whatever). To test it, view any document on + and click the "Open in your editor" button. + +### How the server works + +The `server` has two main jobs: + +1. Simulate serving the site (e.g. from a server, S3 or a CDN). +2. Trigger builds of documents that haven't been built, by URL. + +### Linting + +All JavaScript and TypeScript code needs to be formatted with `prettier` and +it's easy to test this with: + + yarn prettier-check + +And conveniently, if you're not even interested in what the flaws were, run: + + yarn prettier-format + +When you ran `yarn` for the first time (`yarn` is an alias for `yarn install`) +it automatically sets up a `git` pre-commit hook that uses `lint-staged` — a +wrapper for `prettier` that checks only the files in the git commit. + +If you have doubts about formatting, submit your pull request anyway. If you +have formatting flaws, the +[pull request checks](https://github.com/features/actions) should catch it. + +### Upgrading Packages + +We maintain the dependencies using `Dependabot` in GitHub but if you want to +manually upgrade them you can use: + + yarn upgrade-interactive --latest + +## Building + +The `server` builds content automatically (on-the-fly) when you're viewing +pages, but you can pre-emptively build all the content in advance if desired. +One potential advantage is that you can get a more complete list of all possible +"flaws" across all documents before you even visit them. + +The most fundamental CLI command is: + + yarn build + +### What gets built + +Every `index.html` becomes two files: + +- `index.html` — a fully formed and complete HTML file +- `index.json` — the state information React needs to build the page in the + client + +### Flaw checks + +When building you can enable specific "flaw checks" and their level of handling. +Some flaws are "cosmetic" and some are more severe but they should never block a +full build. + +More information about how to set flaws can be found in `docs/envvars.md`. + +Essentially, the default is to _warn_ about any flaw and you can see those flaws +when using . For completed builds, all flaws are ignored. +This makes the build faster and there's also no good place to display the flaws +in a production-grade build. + +**In the future**, we might make the default flaw level `error` instead. That +means that any new edits to (or creation of) any document will break in +continuous integration if there's a single flaw and the onus will be on you to +fix it. + +## Icons and logos + +The various formats and sizes of the favicon are generated from the file +`mdn-web-docs.svg` in the repository root. This file is then converted to +favicons using [realfavicongenerator.net](https://realfavicongenerator.net/). To +generate new favicons, edit or replace the `mdn-web-docs.svg` file and then +re-upload that to realfavicongenerator.net. + +## Contact + +If you want to talk to us, ask questions, and find out more, join the discussion +on the +[MDN Web Docs chat room](https://chat.mozilla.org/#/room/#mdn:mozilla.org) on +[Matrix](https://wiki.mozilla.org/Matrix). + +## Troubleshooting + +Some common issues and how to resolve them. + +### `Error: ENOSPC: System limit for number of file watchers reached` + +There are two options to resolve this. + +1. Disable the watcher via + [`REACT_APP_NO_WATCHER`](docs/envvars.md#react_app_no_watcher) + + `echo REACT_APP_NO_WATCHER=true >> .env` + +2. Increase `max_user_watches`:\ + See + +### `Error: Cannot find module 'levenary'` + +We can't know for sure what's causing this error but speculate a bug in how +`yarn` fails to resolve if certain `@babel` helper libs should install its own +sub-dependencies. A sure way to solve it is to run: + + rm -fr node_modules + yarn install + +### `Error: listen EADDRINUSE: address already in use :::5042` + +The default server port `:5042` might be in use by another process. To resolve +this, you can pick any unused port (e.g., 6000) and run the following: + + echo SERVER_PORT=6000 >> .env + +### Problems running with rari on Windows + +Download and install: + +Microsoft Visual C++ Redistributable for Visual Studio 2019 ( +[x86](https://aka.ms/vs/16/release/VC_redist.x86.exe), +[ARM64](https://aka.ms/vs/16/release/VC_redist.arm64.exe) ) + +### Yarn install errors + +If you get errors while installing dependencies via yarn on a Mac, you may need +to install some additional packages. Check the error message for the package +name causing the problem. + +1. First, install [brew](https://brew.sh/) if you haven’t already + +1. To fix problems with `gifsicle`: + + brew install automake autoconf libtool + +1. To fix problems with `pngquant-bin`: + + brew install pkg-config + +1. To fix problems with `mozjpeg`: + + brew install libpng sudo ln -s + /opt/homebrew/Cellar/libpng/1.6.40/lib/libpng16.a /usr/local/lib/libpng16.a + +You may need to adjust the path to `libpng16.a` depending on the version of +`libpng` you have installed. diff --git a/vendor/yari/SECURITY.md b/vendor/yari/SECURITY.md new file mode 100644 index 000000000..f7a2c218e --- /dev/null +++ b/vendor/yari/SECURITY.md @@ -0,0 +1,13 @@ +# Security Policy + +## Reporting a Vulnerability + +If you've discovered a security issue, please report it through the form linked +below, which will create a secure, private ticket. +https://bugzilla.mozilla.org/form.web.bounty + +MDN may be eligible for +[Mozilla's Security Bug Bounty Program](https://www.mozilla.org/en-US/security/bug-bounty/). +You can find more information about the bounty program in the +[Mozilla Web Bug Bounty FAQ](https://www.mozilla.org/en-US/security/bug-bounty/faq-webapp/). +You can use the above form even if you are not interested in a bounty reward. diff --git a/vendor/yari/bins/build.mjs b/vendor/yari/bins/build.mjs new file mode 100644 index 000000000..92cbba6f8 --- /dev/null +++ b/vendor/yari/bins/build.mjs @@ -0,0 +1,23 @@ +#!/usr/bin/env node +import { rariBin } from "@mdn/rari"; +import { spawn } from "cross-spawn"; +import dotenv from "dotenv"; +import path from "node:path"; +import { cwd } from "node:process"; + +import { BUILD_OUT_ROOT } from "../libs/env/index.js"; + +dotenv.config({ + path: path.join(cwd(), process.env.ENV_FILE || ".env"), + quiet: true, +}); + +process.env.BUILD_OUT_ROOT = process.env.BUILD_OUT_ROOT || BUILD_OUT_ROOT; + +const child = spawn(rariBin, ["build", ...process.argv.slice(2)], { + stdio: "inherit", +}); + +child.on("close", (code) => { + process.exitCode = code; +}); diff --git a/vendor/yari/bins/server.mjs b/vendor/yari/bins/server.mjs new file mode 100644 index 000000000..e7c750364 --- /dev/null +++ b/vendor/yari/bins/server.mjs @@ -0,0 +1,53 @@ +#!/usr/bin/env node +import { concurrently } from "concurrently"; +import { rariBin } from "@mdn/rari"; +import { filename } from "../server/filename.js"; +import dotenv from "dotenv"; +import path from "node:path"; +import { cwd } from "node:process"; + +dotenv.config({ + path: path.join(cwd(), process.env.ENV_FILE || ".env"), + quiet: true, +}); + +const { commands, result } = concurrently( + [ + { + command: `node ${filename}`, + name: "server", + env: { + RARI: true, + }, + prefixColor: "red", + }, + { + command: `"${rariBin}" serve -vv`, + name: "rari", + prefixColor: "blue", + env: { + ...process.env, + }, + }, + ], + { + killOthers: ["failure", "success"], + restartTries: 0, + handleInput: true, + inputStream: process.stdin, + } +); + +const stop = new Promise((resolve, reject) => { + process.on("SIGINT", () => { + commands.forEach((cmd) => cmd.kill()); // Terminate all concurrently-run processes + reject(); + }); + result.finally(() => resolve(null)); +}); +try { + await stop; + console.log("All tasks completed successfully."); +} catch { + console.log("Killed ☠️"); +} diff --git a/vendor/yari/bins/tool.mjs b/vendor/yari/bins/tool.mjs new file mode 100644 index 000000000..56a00dac8 --- /dev/null +++ b/vendor/yari/bins/tool.mjs @@ -0,0 +1,24 @@ +#!/usr/bin/env node +import { rariBin } from "@mdn/rari"; +import { spawn } from "cross-spawn"; + +import dotenv from "dotenv"; +import path from "node:path"; +import { cwd } from "node:process"; + +import { BUILD_OUT_ROOT } from "../libs/env/index.js"; + +dotenv.config({ + path: path.join(cwd(), process.env.ENV_FILE || ".env"), + quiet: true, +}); + +process.env.BUILD_OUT_ROOT = process.env.BUILD_OUT_ROOT || BUILD_OUT_ROOT; + +const child = spawn(rariBin, ["content", ...process.argv.slice(2)], { + stdio: "inherit", +}); + +child.on("close", (code) => { + process.exitCode = code; +}); diff --git a/vendor/yari/build/blog.ts b/vendor/yari/build/blog.ts new file mode 100644 index 000000000..4caafa0bc --- /dev/null +++ b/vendor/yari/build/blog.ts @@ -0,0 +1,519 @@ +import fs from "node:fs/promises"; +import path from "node:path"; + +import { fdir } from "fdir"; +import { Feed } from "feed"; +import frontmatter from "front-matter"; + +import * as kumascript from "../kumascript/index.js"; + +import LANGUAGES_RAW from "../libs/languages/index.js"; +import { BLOG_ROOT, BUILD_OUT_ROOT, BASE_URL } from "../libs/env/index.js"; +import { + BlogPostData, + BlogPostFrontmatter, + BlogPostMetadataLinks, + BlogPostLimitedMetadata, + BlogPostMetadata, + AuthorFrontmatter, + AuthorMetadata, +} from "../libs/types/blog.js"; +import { + findPostFileBySlug, + injectLoadingLazyAttributes, + injectNoTranslate, + makeTOC, + postLocalFileLinks, + postProcessExternalLinks, + postProcessSmallerHeadingIDs, +} from "./utils.js"; +import { slugToFolder } from "../libs/slug-utils/index.js"; +import { wrapCodeExamples } from "./code-headers.js"; +import { wrapTables } from "./wrap-tables.js"; +import { Doc } from "../libs/types/document.js"; +import { extractSections } from "./extract-sections.js"; +import { HydrationData } from "../libs/types/hydration.js"; +import { DEFAULT_LOCALE } from "../libs/constants/index.js"; +import { memoize } from "../content/utils.js"; +import { buildSitemap } from "./sitemaps.js"; +import { type Locale } from "../libs/types/core.js"; + +const READ_TIME_FILTER = /[\w<>.,!?]+/; +const HIDDEN_CODE_BLOCK_MATCH = /```.*hidden[\s\S]*?```/g; + +function calculateReadTime(copy: string): number { + return Math.max( + 1, + Math.round( + copy + .replace(HIDDEN_CODE_BLOCK_MATCH, "") + .split(/\s+/) + .filter((w) => READ_TIME_FILTER.test(w)).length / 220 + ) + ); +} + +async function getLinks(slug: string): Promise { + const posts = await allPostFrontmatter(); + const index = posts.findIndex((post) => post.slug === slug); + const filterFrontmatter = ( + f?: BlogPostFrontmatter + ): BlogPostLimitedMetadata => f && { title: f.title, slug: f.slug }; + return { + previous: filterFrontmatter(posts[index + 1]), + next: filterFrontmatter(posts[index - 1]), + }; +} + +async function getAuthor( + slug: string | AuthorFrontmatter +): Promise { + if (typeof slug === "string") { + const filePath = path.join(BLOG_ROOT, "..", "authors", slug, "index.md"); + const attributes = await readAuthor(filePath); + return parseAuthor(slug, attributes); + } + return slug; +} + +async function readAuthor(filePath: string): Promise { + try { + const raw = await fs.readFile(filePath, "utf-8"); + const { attributes } = frontmatter(raw); + return attributes; + } catch (e: any) { + if (e.code === "ENOENT") { + console.warn("Couldn't find author metadata:", filePath); + return {}; + } + throw e; + } +} + +function parseAuthor( + slug: string, + { name, link, avatar }: AuthorFrontmatter +): AuthorMetadata { + return { + name, + link, + avatar_url: avatar + ? `/${DEFAULT_LOCALE}/blog/author/${slug}/${avatar}` + : undefined, + }; +} + +async function readPost( + file: string, + options?: { + readTime?: boolean; + previousNext?: boolean; + } +): Promise<{ blogMeta: BlogPostMetadata; body: string }> { + const raw = await fs.readFile(file, "utf-8"); + + const { attributes, body } = frontmatter(raw); + const blogMeta: BlogPostMetadata = { + ...attributes, + author: await getAuthor(attributes.author), + }; + + const { readTime = true, previousNext = true } = options || {}; + + if (readTime) { + blogMeta.readTime = calculateReadTime(body); + } + + if (previousNext) { + blogMeta.links = await getLinks(blogMeta.slug); + } + + return { blogMeta, body }; +} + +export function findPostPathBySlug(slug: string): string | null { + const file = findPostFileBySlug(slug); + if (!file) { + return null; + } + return path.dirname(file); +} + +export async function findPostLiveSampleBySlug( + slug: string, + id: string +): Promise { + const file = findPostFileBySlug(slug); + if (!file) { + return null; + } + const { blogMeta, body } = await readPost(file); + + const url = `/${DEFAULT_LOCALE}/blog/${blogMeta.slug}`; + const { liveSamples } = await buildPost({ + url, + rawBody: body, + metadata: { locale: DEFAULT_LOCALE, ...blogMeta }, + isMarkdown: true, + fileInfo: { + path: file, + }, + }); + return liveSamples.find((page) => page.id.toLowerCase() === id)?.html; +} + +export async function findPostBySlug( + slug: string +): Promise { + const file = findPostFileBySlug(slug); + if (!file) { + return null; + } + const { blogMeta, body } = await readPost(file); + + const url = `/${DEFAULT_LOCALE}/blog/${blogMeta.slug}`; + const { doc } = await buildPost({ + url, + rawBody: body, + metadata: { locale: DEFAULT_LOCALE, ...blogMeta }, + isMarkdown: true, + fileInfo: { + path: file, + }, + }); + return { doc, blogMeta }; +} + +async function allPostFiles(): Promise { + const api = new fdir() + .withFullPaths() + .withErrors() + .filter((filePath) => filePath.endsWith("index.md")) + .crawl(BLOG_ROOT); + return await api.withPromise(); +} + +async function allAuthorFiles(): Promise { + try { + return await new fdir() + .withFullPaths() + .withErrors() + .filter((filePath) => filePath.endsWith("index.md")) + .crawl(path.join(BLOG_ROOT, "..", "authors")) + .withPromise(); + } catch (e: any) { + if (e.code === "ENOENT") { + console.warn("Warning: blog authors directory doesn't exist"); + return []; + } + throw e; + } +} + +export const allPostFrontmatter = memoize( + async ({ + includeUnpublished, + }: { includeUnpublished?: boolean } = {}): Promise => { + return ( + await Promise.all( + (await allPostFiles()).map( + async (file) => + (await readPost(file, { previousNext: false })).blogMeta + ) + ) + ) + .filter( + ({ published = true, date }) => + includeUnpublished || (published && Date.parse(date) <= Date.now()) + ) + .sort( + (a, b) => + Date.parse(b.date) - Date.parse(a.date) || + (a.title > b.title ? 1 : -1) + ); + } +); + +export async function buildBlogIndex(options: { verbose?: boolean }) { + const prefix = "blog"; + const locale = DEFAULT_LOCALE; + + const context: HydrationData = { + hyData: { + posts: await allPostFrontmatter(), + }, + pageTitle: "MDN Blog", + url: `/${locale}/${prefix}/`, + }; + + const outPath = path.join(BUILD_OUT_ROOT, locale.toLowerCase(), `${prefix}`); + + await fs.mkdir(outPath, { recursive: true }); + const jsonFilePath = path.join(outPath, "index.json"); + + await fs.mkdir(outPath, { recursive: true }); + await fs.writeFile(jsonFilePath, JSON.stringify(context)); + + if (options.verbose) { + console.log("Wrote", jsonFilePath); + } +} + +export async function buildBlogPosts(options: { + verbose?: boolean; + noIndexing?: boolean; +}) { + const prefix = "blog"; + const locale = DEFAULT_LOCALE; + + for (const file of await allPostFiles()) { + const dirname = path.dirname(file); + console.log(`building: ${file}`); + + const { blogMeta, body } = await readPost(file); + + const { published = true, date } = blogMeta; + if (!published || Date.now() < Date.parse(date)) { + console.log(`skipped: ${file} (unpublished or date in the future)`); + continue; + } + + const url = `/${locale}/${prefix}/${blogMeta.slug}/`; + const renderUrl = `/${locale}/${prefix}/${blogMeta.slug}`; + const renderDoc: BlogPostDoc = { + url: renderUrl, + rawBody: body, + metadata: { locale, ...blogMeta }, + isMarkdown: true, + fileInfo: { + path: file, + }, + }; + const { doc: builtDoc, liveSamples } = await buildPost(renderDoc); + const { doc } = { + doc: { ...builtDoc, summary: blogMeta.description, mdn_url: url }, + }; + + const context: HydrationData = { + doc, + blogMeta, + pageTitle: blogMeta.title, + locale, + noIndexing: options.noIndexing, + image: blogMeta.image?.file && `${BASE_URL}${url}${blogMeta.image?.file}`, + url, + }; + + const outPath = path.join( + BUILD_OUT_ROOT, + locale.toLowerCase(), + `${prefix}/${slugToFolder(blogMeta.slug)}` + ); + + await fs.mkdir(outPath, { recursive: true }); + + for (const { id, html } of liveSamples) { + const liveSamplePath = path.join(outPath, `_sample_.${id}.html`); + await fs.writeFile(liveSamplePath, html); + if (options.verbose) { + console.log("Wrote", liveSamplePath); + } + } + + for (const asset of await fs.readdir(dirname)) { + if (asset === "index.md") { + continue; + } + const from = path.join(dirname, asset); + const to = path.join(outPath, asset); + await fs.copyFile(from, to); + } + + const jsonFilePath = path.join(outPath, "index.json"); + + await fs.mkdir(outPath, { recursive: true }); + await fs.writeFile(jsonFilePath, JSON.stringify(context)); + + if (options.verbose) { + console.log("Wrote", jsonFilePath); + } + } +} + +export interface BlogPostDoc { + url: string; + rawBody: string; + metadata: BlogPostMetadata & { locale: Locale }; + isMarkdown: true; + fileInfo: { + path: string; + }; +} + +export async function buildPost( + document: BlogPostDoc +): Promise<{ doc: Doc; liveSamples: any }> { + const { metadata } = document; + + interface LiveSample { + id: string; + html: string; + } + + const doc = { locale: DEFAULT_LOCALE } as Partial; + let $ = null; + const liveSamples: LiveSample[] = []; + + [$] = await kumascript.render(document.url, {}, document); + + const liveSamplePages = await kumascript.buildLiveSamplePages( + document.url, + document.metadata.title, + $, + document.rawBody + ); + for (const liveSamplePage of liveSamplePages) { + const { id } = liveSamplePage; + const { html } = liveSamplePage; + + liveSamples.push({ id: id.toLowerCase(), html }); + } + + $("[data-token]").removeAttr("data-token"); + $("[data-flaw-src]").removeAttr("data-flaw-src"); + + doc.title = metadata.title || ""; + doc.mdn_url = document.url; + doc.locale = metadata.locale; + doc.native = LANGUAGES_RAW[DEFAULT_LOCALE]?.native; + + if ($("math").length > 0) { + doc.hasMathML = true; + } + $("div.hidden").remove(); + wrapCodeExamples($); + injectNoTranslate($); + injectLoadingLazyAttributes($); + postProcessExternalLinks($); + postLocalFileLinks($, doc); + postProcessSmallerHeadingIDs($); + wrapTables($); + try { + const [sections] = await extractSections($); + doc.body = sections; + } catch (error) { + console.error( + `Extracting sections failed in ${doc.mdn_url} (${document.fileInfo.path})` + ); + throw error; + } + + doc.pageTitle = `${doc.title} | MDN Blog`; + + doc.noIndexing = false; + doc.toc = makeTOC(doc); + + return { doc: doc as Doc, liveSamples }; +} + +export async function buildBlogFeed(options: { verbose?: boolean }) { + const prefix = "blog"; + const locale = DEFAULT_LOCALE; + const feed = new Feed({ + title: "MDN Blog", + description: + "The MDN Web Docs blog publishes articles about web development, open source software, web platform updates, tutorials, changes and updates to MDN, and more.", + id: `${BASE_URL}/${locale}/blog/`, + link: `${BASE_URL}/${locale}/blog/`, + language: "en", + image: `${BASE_URL}/mdn-social-share.png`, + favicon: `${BASE_URL}/favicon.ico`, + copyright: "All rights reserved 2023, MDN", + }); + const posts = await allPostFrontmatter(); + + posts.forEach((post) => { + const link = `${BASE_URL}/${DEFAULT_LOCALE}/blog/${post.slug}/`; + const image = + post.image?.file && + `${BASE_URL}/${DEFAULT_LOCALE}/blog/${post.slug}/${post.image?.file}`; + feed.addItem({ + title: post.title, + id: post.slug, + link, + guid: link, + description: post.description, + author: [ + { + name: + (typeof post.author === "string" + ? post.author + : post.author?.name) || "The MDN Team", + link: + typeof post.author === "string" ? post.author : post.author?.link, + }, + ], + date: new Date(post.date), + image, + }); + }); + + const outPath = path.join(BUILD_OUT_ROOT, locale.toLowerCase(), prefix); + await fs.mkdir(outPath, { recursive: true }); + const filePath = path.join(outPath, "rss.xml"); + await fs.writeFile(filePath, feed.rss2()); + if (options.verbose) { + console.log("Wrote", filePath); + } +} + +export async function buildAuthors(options: { verbose?: boolean }) { + for (const filePath of await allAuthorFiles()) { + const dirname = path.dirname(filePath); + const slug = path.basename(dirname); + const outPath = path.join( + BUILD_OUT_ROOT, + DEFAULT_LOCALE.toLowerCase(), + "blog", + "author", + slug + ); + await fs.mkdir(outPath, { recursive: true }); + + const { avatar } = await readAuthor(filePath); + if (avatar) { + const from = path.join(dirname, avatar); + const to = path.join(outPath, avatar); + await fs.copyFile(from, to); + if (options.verbose) { + console.log("Copied", from, "to", to); + } + } + } +} + +export async function buildBlogSitemap(options: { verbose?: boolean }) { + const posts = await allPostFrontmatter(); + + const items = posts.map((post) => ({ + slug: `${post.slug}/`, + modified: new Date(post.date).toISOString(), + })); + + const index = { + slug: "", + modified: items + .map((p) => p.modified) + .sort((a, b) => b.localeCompare(a)) + .at(0), + }; + + const sitemapFilePath = await buildSitemap([index, ...items], { + slugPrefix: `/${DEFAULT_LOCALE}/blog/`, + pathSuffix: [DEFAULT_LOCALE, "blog"], + }); + + if (options.verbose) { + console.log("Wrote", sitemapFilePath); + } +} diff --git a/vendor/yari/build/build-blog.ts b/vendor/yari/build/build-blog.ts new file mode 100644 index 000000000..a10d28bdd --- /dev/null +++ b/vendor/yari/build/build-blog.ts @@ -0,0 +1,14 @@ +#!/usr/bin/env node +import { + buildAuthors, + buildBlogFeed, + buildBlogIndex, + buildBlogPosts, + buildBlogSitemap, +} from "./blog.js"; + +await buildBlogIndex({ verbose: true }); +await buildBlogPosts({ verbose: true }); +await buildAuthors({ verbose: true }); +await buildBlogFeed({ verbose: true }); +await buildBlogSitemap({ verbose: true }); diff --git a/vendor/yari/build/build-curriculum.ts b/vendor/yari/build/build-curriculum.ts new file mode 100644 index 000000000..2eed4d2e9 --- /dev/null +++ b/vendor/yari/build/build-curriculum.ts @@ -0,0 +1,5 @@ +#!/usr/bin/env node +import { buildCurriculum, buildCurriculumSitemap } from "./curriculum.js"; + +await buildCurriculum({ verbose: true }); +await buildCurriculumSitemap({ verbose: true }); diff --git a/vendor/yari/build/build-options.ts b/vendor/yari/build/build-options.ts new file mode 100644 index 000000000..65472028b --- /dev/null +++ b/vendor/yari/build/build-options.ts @@ -0,0 +1,118 @@ +import dotenv from "dotenv"; +dotenv.config({ quiet: true }); + +import { FLAW_LEVELS, VALID_FLAW_CHECKS } from "../libs/constants/index.js"; +import { + DEFAULT_FLAW_LEVELS, + FILES, + FOLDERSEARCH, + NO_PROGRESSBAR, + FIX_FLAWS, + FIX_FLAWS_DRY_RUN, + FIX_FLAWS_TYPES, + FIX_FLAWS_VERBOSE, +} from "../libs/env/index.js"; + +const options = Object.freeze({ + flawLevels: parseFlawLevels(DEFAULT_FLAW_LEVELS), + files: parseFiles(FILES), + folderSearch: parseFolderSearch(FOLDERSEARCH), + // Obviously false if the env var for NO_PROGRESSBAR was set but also, + // if you're going to display flaws, it's going to use stdout anyway. + noProgressbar: NO_PROGRESSBAR || FIX_FLAWS_DRY_RUN || FIX_FLAWS_VERBOSE, + fixFlaws: FIX_FLAWS, + fixFlawsDryRun: FIX_FLAWS_DRY_RUN, + fixFlawsTypes: FIX_FLAWS_TYPES, + fixFlawsVerbose: FIX_FLAWS_VERBOSE, +}); + +function parseFiles(filesStringList: string): Set { + // The get-diff-action, which we use in the "PR Builds" CI, + // will make this a massive string that looks like + // this: `'content/files/en-us/a/index.html','content/files/en-us/a/index.html'` + // so we need to turn that into an array: + // ["content/files/en-us/a/index.html", "content/files/en-us/b/index.html"]` + // Note, when you use get-diff-action in GitHub Actions, it's a comma + // but if you use the manually `git diff --name-only ...` on your command + // line it's a newline. + return new Set( + filesStringList + .split(/[,\n]/) + .map((item) => { + // Remove any single or double-quote bookends. + return item.replace(/^(['"])(.*)\1$/, "$2"); + }) + .filter((s) => s) + ); +} + +function parseFolderSearch(searchpattern) { + if (searchpattern) { + // TODO: Consider turning it into a regex if there are * or $ or ^ in it + return searchpattern.toLowerCase(); + } + return null; +} + +// Override based on env vars but only for options that are *not* +// exclusive to building everything. +function parseFlawLevels(flawChecks) { + const checks = flawChecks + .split(",") + .map((x) => x.trim()) + .filter((x) => x) + .map((x) => x.split(":").map((s) => s.trim())); + + // Check that it doesn't contain more than 1 wildcard, + // because that'd make no sense. + const wildcards = checks.filter((tuple) => tuple[0] === "*"); + if (wildcards.length > 1) { + throw new Error(`Can only be 1 wild card (not: ${wildcards})`); + } + + // Put any wildcards (e.g. '*:warn') first + checks.sort((a, b) => { + if (a[0] === "*" && b[0] !== "*") { + return -1; + } else if (a[0] !== "*" && b[0] === "*") { + return 1; + } + return 0; + }); + + const checked = new Map(); + + // Unless specified, set 'ignore' on all of them first. + for (const check of VALID_FLAW_CHECKS) { + checked.set(check, FLAW_LEVELS.IGNORE); + } + + const levelValues = Object.values(FLAW_LEVELS); + + for (const tuple of checks) { + if (tuple.length !== 2) { + throw new Error(`Not a tuple pair of 2 (${tuple})`); + } + const [identifier, level] = tuple; + if (!levelValues.includes(level)) { + throw new Error(`Invalid level: '${level}' (only ${levelValues})`); + } + if (identifier === "*") { + for (const check of VALID_FLAW_CHECKS) { + checked.set(check, level); + } + } else if (!VALID_FLAW_CHECKS.has(identifier)) { + throw new Error( + `Unrecognized flaw identifier: '${identifier}' (only ${[ + ...VALID_FLAW_CHECKS, + ]})` + ); + } else { + checked.set(identifier, level); + } + } + + return checked; +} + +export default options; diff --git a/vendor/yari/build/check-images.ts b/vendor/yari/build/check-images.ts new file mode 100644 index 000000000..abb5835dd --- /dev/null +++ b/vendor/yari/build/check-images.ts @@ -0,0 +1,374 @@ +// XXX Consider moving this to 'flaws.js' +// Or, something. Checking for flaws should be very different from checking +// for images. + +import path from "node:path"; + +import imagesize from "image-size"; + +import { Document, FileAttachment } from "../content/index.js"; +import { FLAW_LEVELS } from "../libs/constants/index.js"; +import { findMatchesInText, findMatchesInMarkdown } from "./matches.js"; +import * as cheerio from "cheerio"; +import { Doc } from "../libs/types/document.js"; + +const { default: sizeOf } = imagesize; + +/** + * Mutate the `$` instance for image reference and if appropriate, + * log them as flaws if they're not passing linting. + * + */ +export function checkImageReferences( + doc: Partial, + $: cheerio.CheerioAPI, + options, + { url, rawContent } +): Map { + // imageMap is a map of basename to full path + const imageMap = new Map(); + + const checkImages = options.flawLevels.get("images") !== FLAW_LEVELS.IGNORE; + + const checked = new Map(); + + function addImageFlaw( + $img: cheerio.Cheerio, + src: string, + { + explanation, + externalImage = false, + suggestion = null, + }: { + explanation: string; + externalImage?: boolean; + suggestion?: string; + } + ) { + // If the document has *two* `` tags, this function + // (addImageFlaw) is called two times. We can then assume the + // findMatchesInText() will find it two times too. For each call, + // we need to match the call based in counting matches from findMatchesInText(). + const matches = doc.isMarkdown + ? findMatchesInMarkdown(src, rawContent, { type: "image" }) + : findMatchesInText(src, rawContent, { attribute: "src" }); + const checkedBefore = checked.get(src) ?? 0; + if (matches.length <= checkedBefore) { + console.warn( + `Could not find enough matches for src: ${src}, index ${checkedBefore} out of bounds` + ); + return; + } + const match = matches[checkedBefore]; + if (!("images" in doc.flaws)) { + doc.flaws.images = []; + } + const fixable = Boolean(suggestion); + if (suggestion) { + $img.attr("src", suggestion); + } + const id = `image${doc.flaws.images.length + 1}`; + $img.attr("data-flaw", id); + doc.flaws.images.push({ + id, + src, + fixable, + suggestion, + explanation, + externalImage, + ...match, + }); + + // Use this to remember which in the list of matches we've dealt with. + checked.set(src, checkedBefore + 1); + } + + $("img[src]").each((i, element) => { + const img = $(element); + const src = img.attr("src"); + + // These two lines is to simulate what a browser would do. + const baseURL = `http://yari.placeholder${url}/`; + // Make a special exception for the legacy images that start with `/files/...` + // If you just pretend their existing URL is static external domain, it + // will be recognized as an external image (which is fixable). + const absoluteURL = /^\/files\/\d+/.test(src) + ? new URL(`https://mdn.mozillademos.org${src}`) + : new URL(src, baseURL); + + // NOTE: Checking for lacking 'alt' text is to be done as part + // of https://github.com/mdn/yari/issues/1018 which would need + // a new function dedicated to that. + let finalSrc = null; + + if (!src.split("#")[0].trim()) { + if (checkImages) { + addImageFlaw(img, src, { + explanation: "Empty img 'src' attribute", + }); + } + } else if (absoluteURL.host !== "yari.placeholder") { + // It's a remote file. Don't bother much with this. Unless... + if (checkImages) { + if (absoluteURL.protocol === "http:") { + // Force the image to be HTTPS + absoluteURL.protocol = "https:"; + addImageFlaw(img, src, { + explanation: "Insecure URL", + suggestion: absoluteURL.toString(), + }); + } else if (absoluteURL.hostname === "developer.mozilla.org") { + // Suppose they typed this: + // + // and the current page you're on is /en-US/docs/Foo then the + // suggestion should be just `img.png`. + const suggestion = absoluteURL.pathname.includes(`${doc.mdn_url}/`) + ? absoluteURL.pathname.replace(`${doc.mdn_url}/`, "") + : absoluteURL.pathname; + addImageFlaw(img, src, { + explanation: "Unnecessarily absolute URL", + suggestion, + }); + // This one's a bit of an exception. Going forward the suggestion + // might be something like `screenshot.png` for the sake of rendering + // it now, we still want the full relative URL. + img.attr("src", absoluteURL.pathname); + } else if ( + absoluteURL.hostname !== "mdn.github.io" || + !absoluteURL.pathname.startsWith("/shared-assets/") + ) { + addImageFlaw(img, src, { + explanation: "External image URL", + externalImage: true, + suggestion: null, + }); + } + } + } else { + // Remember, you can not have search parameters on local images. + // It might make sense on something like `https://unsplash.it/image/abc?size=100` + // but all our images are going to be static. + finalSrc = absoluteURL.pathname; + // We can use the `finalSrc` to look up and find the image independent + // of the correct case because `FileAttachment.findByURLWithFallback` + // operates case insensitively. + + const filePath = FileAttachment.findByURLWithFallback(finalSrc); + + if (filePath) { + imageMap.set(path.basename(filePath), filePath); + } + + if (checkImages) { + if (!filePath) { + // E.g. or + addImageFlaw(img, src, { + explanation: "Pathname should always be lowercase", + suggestion: src.toLowerCase(), + }); + } + } else { + // This will always be non-null because independent of the + // image name, if the file didn't exist the document doesn't exist. + const parentDocument = Document.findByURL(path.dirname(finalSrc)); + + // Base the final URL on the parent document + image file name lowercase. + finalSrc = `${parentDocument.url}/${path + .basename(finalSrc) + .toLowerCase()}`; + + if (src.startsWith("/")) { + // E.g. tags that set a `style="width: XXXpx; height: YYYpx"` + * and or not have the `width="XXX" height="XXX"` plain attributes. + * + * Don't check the `src` attribute. + * + * TODO: Perhaps in the future, we can also check if the `style` attribute + * has some hardcoded patterns for margins and borders that would be + * best to set "centrally" with a style sheet. + */ +export function checkImageWidths( + doc: Partial, + $: cheerio.CheerioAPI, + options, + { rawContent } +) { + const checkImages = + options.flawLevels.get("image_widths") !== FLAW_LEVELS.IGNORE; + + const checked = new Map(); + + function addStyleFlaw( + $img: cheerio.Cheerio, + style: string, + suggestion: string + ) { + if (!("image_widths" in doc.flaws)) { + doc.flaws.image_widths = []; + } + const id = `image_widths${doc.flaws.image_widths.length + 1}`; + $img.attr("data-flaw", id); + const matches = findMatchesInText(style, rawContent, { + attribute: "style", + }); + const checkedBefore = checked.get(style) || 0; + matches.forEach((match, i) => { + if (i !== checkedBefore) { + return; + } + const fixable = suggestion !== null; + let explanation = ""; + if (style.includes("width") && style.includes("height")) { + explanation = "'width' and 'height'"; + } else if (style.includes("height")) { + explanation = "'height'"; + } else { + explanation = "'height'"; + } + explanation += " set in 'style' attribute on tag."; + doc.flaws.image_widths.push({ + id, + style, + fixable, + suggestion, + explanation, + ...match, + }); + // Use this to remember which in the list of matches we've dealt with. + checked.set(style, checkedBefore + 1); + }); + } + + $("img").each((i, element) => { + const img = $(element); + // If it already has a `width` attribute, leave this as is. + if (!img.attr("width")) { + // Remove any `width` or `height` specified in the `style` attribute + // because this is best to leave so the browser doesn't stretch + // the image if its specified dimension (even if it's accurate!) + // can't be kept in the given context. + if (img.attr("style")) { + if (img.attr("style").includes("@")) { + console.warn( + "Dare to use regex on inline `img[style]` values that use media queries of any kind.", + img.attr("style") + ); + return; + } + // The confidence to use a regex instead of a proper CSS parser is + // because we're only ever looking at the CSS in `img[style]` contexts. + // These are much simpler than the kind of CSS you should never go + // near with a regex. + const originalStyleValue = img.attr("style"); + const newStyleValue = originalStyleValue + .split(";") + .map((each) => each.split(":")) + .filter((parts) => { + return !["width", "height"].includes(parts[0].trim()); + }) + .map((parts) => parts.join(":")) + .join(";") + .trim(); + + let suggestion = null; + if (newStyleValue !== originalStyleValue) { + // If there's nothing left, don't just set a new value, make + // it delete the 'style' attribute altogether. + if (newStyleValue) { + suggestion = newStyleValue; + img.attr("style", newStyleValue); + } else { + suggestion = ""; + img.removeAttr("style"); + } + // Remember, only if you're interested in checking for flaws, do we + // record this. But we also apply the fix nomatter what. + if (checkImages) { + addStyleFlaw(img, originalStyleValue, suggestion); + } + } + } + + // If image is local, get its dimension and set the `width` and `height` + // HTML attributes. + const imgSrc = img.attr("src"); + + if (!imgSrc) { + console.warn( + `In ${doc.mdn_url} there's an img tag without src (${$.html(img)})` + ); + return; + } + + // Only proceed if it's not an external image. + // But beyond that, suppose the `` tag looks anything other than + // `` then we can't assume the `img[src]` can + // be resolved. For example, suppose the HTML contains `` + // then it's a broken image and it's handled by the `checkImageReferences()` + // function. Stay away from those. + if (!imgSrc) { + if (options.flawLevels.get("image_widths") === FLAW_LEVELS.ERROR) { + throw new Error( + `images width flaws: ${JSON.stringify(doc.flaws.image_widths)}` + ); + } + } else if (!imgSrc.includes("://") && imgSrc.startsWith("/")) { + const filePath = FileAttachment.findByURLWithFallback(imgSrc); + if (filePath) { + const dimensions = sizeOf(filePath); + img.attr("width", `${dimensions.width}`); + img.attr("height", `${dimensions.height}`); + } + } + } + }); + + if ( + doc.flaws.image_widths && + doc.flaws.image_widths.length && + options.flawLevels.get("image_widths") === FLAW_LEVELS.ERROR + ) { + throw new Error( + `images width flaws: ${JSON.stringify(doc.flaws.image_widths)}` + ); + } +} diff --git a/vendor/yari/build/cli.ts b/vendor/yari/build/cli.ts new file mode 100644 index 000000000..e6ece9144 --- /dev/null +++ b/vendor/yari/build/cli.ts @@ -0,0 +1,614 @@ +#!/usr/bin/env node +import crypto from "node:crypto"; +import fs from "node:fs"; +import path from "node:path"; + +import chalk from "chalk"; +import cliProgress from "cli-progress"; +import caporal from "@caporal/core"; +import { select } from "@inquirer/prompts"; + +import { Document, slugToFolder, translationsOf } from "../content/index.js"; +import { + CONTENT_ROOT, + CONTENT_TRANSLATED_ROOT, + BUILD_OUT_ROOT, + SENTRY_DSN_BUILD, +} from "../libs/env/index.js"; +import { DEFAULT_LOCALE, VALID_LOCALES } from "../libs/constants/index.js"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +import options from "./build-options.js"; +import { + buildDocument, + BuiltDocument, + renderContributorsTxt, +} from "./index.js"; +import { Doc, DocMetadata, Flaws } from "../libs/types/document.js"; +import SearchIndex from "./search-index.js"; +import { buildSitemapIndex, buildSitemap } from "./sitemaps.js"; +import { humanFileSize } from "./utils.js"; +import { initSentry } from "./sentry.js"; +import { macroRenderTimes } from "../kumascript/src/render.js"; +import { ssrDocument } from "./ssr.js"; +import { HydrationData } from "../libs/types/hydration.js"; + +const { program } = caporal; + +export type DocumentBuild = SkippedDocumentBuild | InteractiveDocumentBuild; + +export interface SkippedDocumentBuild { + doc: Record; + skip: true; +} + +export interface InteractiveDocumentBuild { + document: any; + doc: BuiltDocument; + skip: false; +} + +interface GlobalMetadata { + [locale: string]: Array; +} + +interface BuildMetadata { + [locale: string]: { + baseline?: { + total: number; + high: number; + highPaths: string[]; + low: number; + lowPaths: string[]; + not: number; + notPaths: string[]; + }; + }; +} + +async function buildDocumentInteractive( + documentPath: string, + interactive: boolean, + invalidate = false +): Promise { + try { + const document = invalidate + ? Document.read(documentPath, Document.MEMOIZE_INVALIDATE) + : Document.read(documentPath); + + if (!document) { + throw new Error(`${documentPath} could not be read`); + } + + if (!interactive) { + document.translations = translationsOf( + document.metadata.slug, + document.metadata.locale + ); + } + + return { + document, + doc: await buildDocument(document, { + plainHTML: document.metadata.locale === DEFAULT_LOCALE, + }), + skip: false, + }; + } catch (e) { + if (!interactive) { + throw e; + } + console.error(e); + const action = await select({ + message: "What to do?", + choices: [ + { name: "re-run", value: "r" }, + { name: "skip", value: "s" }, + { name: "quit", value: "q" }, + ], + default: "r", + }); + if (action === "r") { + return await buildDocumentInteractive(documentPath, interactive, true); + } + if (action === "s") { + return { doc: {}, skip: true }; + } + throw e; + } +} + +export interface BuiltDocuments { + slugPerLocale: Record< + string, + { + slug: string; + modified: string; + }[] + >; + peakHeapBytes: number; + totalFlaws: any; +} + +async function buildDocuments( + files: string[] = null, + quiet = false, + interactive = false, + noHTML = false, + locales: Map = new Map() +): Promise { + // If a list of files was set, it came from the CLI. + // Override whatever was in the build options. + const findAllOptions = { + ...options, + locales, + }; + if (files) { + findAllOptions.files = new Set(files); + } + + const metadata: GlobalMetadata = {}; + const buildMetadata: BuildMetadata = {}; + + function updateBaselineBuildMetadata(doc: Doc) { + if (typeof doc.baseline?.baseline === "undefined") { + return; + } + + if (typeof buildMetadata[doc.locale] === "undefined") { + buildMetadata[doc.locale] = {}; + } + if (typeof buildMetadata[doc.locale].baseline === "undefined") { + buildMetadata[doc.locale].baseline = { + total: 0, + high: 0, + highPaths: [], + low: 0, + lowPaths: [], + not: 0, + notPaths: [], + }; + } + + buildMetadata[doc.locale].baseline.total++; + const key = doc.baseline.baseline || "not"; + buildMetadata[doc.locale].baseline[key]++; + buildMetadata[doc.locale].baseline[`${key}Paths`].push(doc.mdn_url); + } + + const documents = await Document.findAll(findAllOptions); + const progressBar = new cliProgress.SingleBar( + {}, + cliProgress.Presets.shades_grey + ); + + const docPerLocale: Record = {}; + const searchIndex = new SearchIndex(); + + if (!documents.count) { + throw new Error("No documents to build found"); + } + + let peakHeapBytes = 0; + + // For keeping track of the total counts of flaws + const totalFlaws = new Map(); + + function appendTotalFlaws(flaws: Flaws) { + for (const [key, actualFlaws] of Object.entries(flaws)) { + const count = actualFlaws.length; + if (!totalFlaws.has(key)) { + totalFlaws.set(key, 0); + } + totalFlaws.set(key, (totalFlaws.get(key) as number) + count); + } + } + + if (!options.noProgressbar) { + progressBar.start(documents.count, 0); + } + + for (const documentPath of documents.iterPaths()) { + const result = await buildDocumentInteractive(documentPath, interactive); + + const isSkippedDocumentBuild = ( + result: SkippedDocumentBuild | InteractiveDocumentBuild + ): result is SkippedDocumentBuild => result.skip !== false; + + if (isSkippedDocumentBuild(result)) { + continue; + } + + const { + doc: { doc: builtDocument, liveSamples, fileAttachmentMap, plainHTML }, + document, + } = result; + + const outPath = path.join(BUILD_OUT_ROOT, slugToFolder(document.url)); + fs.mkdirSync(outPath, { recursive: true }); + + if (builtDocument.flaws) { + appendTotalFlaws(builtDocument.flaws); + } + + if (builtDocument.baseline) { + updateBaselineBuildMetadata(builtDocument); + } + + const context: HydrationData = { + doc: builtDocument, + url: builtDocument.mdn_url, + }; + + if (!noHTML) { + fs.writeFileSync(path.join(outPath, "index.html"), ssrDocument(context)); + } + if (plainHTML) { + fs.writeFileSync(path.join(outPath, "plain.html"), plainHTML); + } + + // This is exploiting the fact that renderHTML has the side-effect of + // mutating the built document which makes this not great and refactor-worthy. + const docString = JSON.stringify(context); + fs.writeFileSync(path.join(outPath, "index.json"), docString); + fs.writeFileSync( + path.join(outPath, "contributors.txt"), + renderContributorsTxt( + document.metadata.contributors, + builtDocument.source.github_url.replace("/blob/", "/commits/") + ) + ); + + for (const { id, html, slug } of liveSamples) { + let liveSamplePath: string; + if (slug) { + // Since we no longer build all live samples we have to build live samples + // for foreign slugs. If slug is truthy it's a different slug than the current + // document. So we need to set up the folder. + console.warn( + `Building live sample from another page: ${id} in ${documentPath}` + ); + const liveSampleBasePath = path.join( + BUILD_OUT_ROOT, + slugToFolder(slug) + ); + liveSamplePath = path.join(liveSampleBasePath, `_sample_.${id}.html`); + fs.mkdirSync(liveSampleBasePath, { recursive: true }); + } else { + liveSamplePath = path.join(outPath, `_sample_.${id}.html`); + } + fs.writeFileSync(liveSamplePath, html); + } + + for (const [basename, filePath] of fileAttachmentMap) { + // We *could* use symlinks instead. But, there's no point :) + // Yes, a symlink is less disk I/O but it's nominal. + fs.copyFileSync(filePath, path.join(outPath, basename)); + } + + // Collect active documents' slugs to be used in sitemap building and + // search index building. + if (!builtDocument.noIndexing) { + const { locale, slug } = document.metadata; + if (!docPerLocale[locale]) { + docPerLocale[locale] = []; + } + docPerLocale[locale].push({ + slug, + modified: document.metadata.modified, + }); + + searchIndex.add(document); + } + + const hash = crypto.createHash("sha256").update(docString).digest("hex"); + const { + body: _, + toc: __, + sidebarHTML: ___, + sidebarMacro: ____, + ...builtMetadata + } = builtDocument; + builtMetadata.hash = hash; + + fs.writeFileSync( + path.join(outPath, "metadata.json"), + JSON.stringify(builtMetadata) + ); + if (metadata[document.metadata.locale]) { + metadata[document.metadata.locale].push(builtMetadata); + } else { + metadata[document.metadata.locale] = [builtMetadata]; + } + + if (!options.noProgressbar) { + progressBar.increment(); + } else if (!quiet) { + console.log(outPath); + } + const heapBytes = process.memoryUsage().heapUsed; + if (heapBytes > peakHeapBytes) { + peakHeapBytes = heapBytes; + } + } + + if (!options.noProgressbar) { + progressBar.stop(); + } + + for (const [locale, docs] of Object.entries(docPerLocale)) { + await buildSitemap(docs, { + slugPrefix: `/${locale}/docs/`, + pathSuffix: [locale], + }); + } + + searchIndex.sort(); + for (const [locale, items] of Object.entries(searchIndex.getItems())) { + fs.writeFileSync( + path.join(BUILD_OUT_ROOT, locale.toLowerCase(), "search-index.json"), + JSON.stringify(items) + ); + } + + for (const [locale, meta] of Object.entries(metadata)) { + const sortedMeta = meta + .slice() + .sort((a, b) => a.mdn_url.localeCompare(b.mdn_url)); + fs.writeFileSync( + path.join(BUILD_OUT_ROOT, locale.toLowerCase(), "metadata.json"), + JSON.stringify(sortedMeta) + ); + } + + // allBrowserCompat.txt is used by differy, see: + // https://github.com/search?q=repo%3Amdn%2Fdiffery+allBrowserCompat&type=code + const allBrowserCompat = new Set(); + Object.values(metadata).forEach((localeMeta) => + localeMeta.forEach((doc) => + doc.browserCompat?.forEach((query) => allBrowserCompat.add(query)) + ) + ); + fs.writeFileSync( + path.join(BUILD_OUT_ROOT, "allBrowserCompat.txt"), + [...allBrowserCompat].sort().join(" ") + ); + + for (const [locale, meta] of Object.entries(buildMetadata)) { + if (meta.baseline) { + // Sort to avoid build difference. + meta.baseline.highPaths.sort(); + meta.baseline.lowPaths.sort(); + meta.baseline.notPaths.sort(); + } + + // have to write per-locale because we build each locale concurrently + fs.writeFileSync( + path.join(BUILD_OUT_ROOT, locale.toLowerCase(), "build.json"), + JSON.stringify(meta) + ); + } + + return { slugPerLocale: docPerLocale, peakHeapBytes, totalFlaws }; +} + +function formatTotalFlaws(flawsCountMap, header = "Total_Flaws_Count") { + if (!flawsCountMap.size) { + return ""; + } + const keys = [...flawsCountMap.keys()]; + const longestKey = Math.max(...keys.map((k) => k.length)); + const out = ["\n"]; + out.push(header); + for (const key of keys.sort()) { + out.push( + `${key.padEnd(longestKey + 1)} ${flawsCountMap.get(key).toLocaleString()}` + ); + } + out.push("\n"); + return out.join("\n"); +} + +function nsToMs(bigint: bigint) { + return Number(bigint / BigInt(1_000)) / 1_000; +} + +function formatMacroRenderReport(header = "Macro render report") { + const out = ["\n"]; + out.push(header); + + // Prepare data. + const stats = Object.entries(macroRenderTimes).map(([name, times]) => { + const sortedTimes = times.slice().sort(compareBigInt); + return { + name, + min: sortedTimes.at(0), + max: sortedTimes.at(-1), + count: times.length, + sum: times.reduce((acc, value) => acc + value, BigInt(0)), + }; + }); + + // Sort by total render time. + stats.sort(({ sum: a }, { sum: b }) => Number(b - a)); + + // Format data. + out.push( + ["name", "count", "min (ms)", "avg (ms)", "max (ms)", "sum (ms)"].join(",") + ); + for (const { name, min, max, count, sum } of stats) { + const avg = sum / BigInt(count); + out.push([name, count, ...[min, avg, max, sum].map(nsToMs)].join(",")); + } + + out.push("\n"); + return out.join("\n"); +} + +interface BuildArgsAndOptions { + args: { + files?: string[]; + }; + options: { + quiet?: boolean; + interactive?: boolean; + nohtml?: boolean; + locale?: string[]; + notLocale?: string[]; + sitemapIndex?: boolean; + }; +} + +if (SENTRY_DSN_BUILD) { + initSentry(SENTRY_DSN_BUILD); +} + +program + .name("[DEPRECATED] build") + .option("-i, --interactive", "Ask what to do when encountering flaws", { + default: false, + }) + .option("-n, --nohtml", "Do not render index.html", { + default: false, + }) + .option("-l, --locale ", "Filtered specific locales", { + default: [], + validator: [...VALID_LOCALES.keys()], + }) + .option("--not-locale ", "Exclude specific locales", { + default: [], + validator: [...VALID_LOCALES.keys()], + }) + .option("--sitemap-index", "Build a sitemap index file", { + default: false, + }) + .argument("[files...]", "specific files to build") + .action(async ({ args, options }: BuildArgsAndOptions) => { + try { + if (!options.nohtml) { + console.warn( + "WARNING: Rendering index.html files as part of the build command is now DEPRECATED, and will no longer be supported in Yari in the near future. To resolve this warning, add the `-n` (`--nohtml`) option. For details, see: https://github.com/mdn/yari/pull/10953" + ); + } + + if (!options.quiet) { + const roots = [ + ["CONTENT_ROOT", CONTENT_ROOT], + ["CONTENT_TRANSLATED_ROOT", CONTENT_TRANSLATED_ROOT], + ]; + for (const [key, value] of roots) { + console.log( + `${chalk.grey((key + ":").padEnd(25, " "))}${ + value ? chalk.white(value) : chalk.grey("not set") + }` + ); + } + } + + if (options.sitemapIndex) { + if (!options.quiet) { + console.log(chalk.yellow("Building sitemap index file...")); + } + const sitemapsBuilt = await buildSitemapIndex(); + + if (!options.quiet) { + for (const sitemaps of sitemapsBuilt) { + console.log( + chalk.green( + `Wrote sitemap index referencing ${sitemaps.length} sitemaps:\n${sitemaps.map((s) => `- ${s}`).join("\n")}` + ) + ); + } + } + return; + } + const { files } = args; + + let locales = new Map(); + if (options.notLocale && options.notLocale.length > 0) { + if (options.locale && options.locale.length) { + throw new Error( + "Can't use --not-locale and --locale at the same time" + ); + } + const notLocales = Array.isArray(options.notLocale) + ? options.notLocale + : [options.notLocale]; + + locales = new Map( + [...VALID_LOCALES.keys()] + .filter((locale) => !notLocales.includes(locale)) + .map((locale) => [locale, true]) + ); + } else { + // 'true' means we include this locale and all others get excluded. + // Some day we might make it an option to set `--not-locale` to + // filter out specific locales. + locales = new Map( + // The `options.locale` is either an empty array (e.g. no --locale used), + // a string (e.g. one single --locale) or an array of strings + // (e.g. multiple --locale options). + (Array.isArray(options.locale) + ? options.locale + : [options.locale] + ).map((locale) => [locale, true]) + ); + } + + const t0 = new Date(); + const { slugPerLocale, peakHeapBytes, totalFlaws } = await buildDocuments( + files, + Boolean(options.quiet), + Boolean(options.interactive), + Boolean(options.nohtml), + locales + ); + const t1 = new Date(); + const count = Object.values(slugPerLocale).reduce( + (a, b) => a + b.length, + 0 + ); + const seconds = (t1.getTime() - t0.getTime()) / 1000; + const took = + seconds > 60 + ? `${(seconds / 60).toFixed(1)} minutes` + : `${seconds.toFixed(1)} seconds`; + if (!options.quiet) { + console.log( + chalk.green( + `Built ${count.toLocaleString()} pages in ${took}, at a rate of ${( + count / seconds + ).toFixed(1)} documents per second.` + ) + ); + if (locales.size) { + console.log( + chalk.yellow( + `(only building locales: ${[...locales.keys()].join(", ")})` + ) + ); + } + console.log(`Peak heap memory usage: ${humanFileSize(peakHeapBytes)}`); + console.log(formatTotalFlaws(totalFlaws)); + console.log(formatMacroRenderReport()); + } + } catch (error) { + // So you get a stacktrace in the CLI output + console.error(error); + // So that the CLI ultimately fails + throw error; + } + }); + +console.warn("\n🗑️ This command is deprecated, and will be removed soon.\n"); + +program.run(); +function compareBigInt(a: bigint, b: bigint): number { + if (a < b) { + return -1; + } else if (a > b) { + return 1; + } else { + return 0; + } +} diff --git a/vendor/yari/build/code-headers.ts b/vendor/yari/build/code-headers.ts new file mode 100644 index 000000000..8b0823fb3 --- /dev/null +++ b/vendor/yari/build/code-headers.ts @@ -0,0 +1,45 @@ +import * as cheerio from "cheerio"; + +// Over the years we have accumulated some weird
 tags whose
+// brush is more or less "junk".
+// TODO: Perhaps, if you have a doc with 
 tags that matches
+// this, it should become a flaw.
+const IGNORE = new Set(["none", "text", "plain", "unix"]);
+
+/**
+ * Mutate the `$` instance by adding headers to 
 tags containing code blocks.
+ *
+ */
+export function wrapCodeExamples($: cheerio.CheerioAPI) {
+  // Our content will be like this: `
` or
+  // `
` so we're technically not looking for an exact
+  // match. The wildcard would technically match `
`
+  // too. But within the loop, we do a more careful regex on the class name
+  // and only proceed if it's something sensible.
+  $("pre[class*=brush]").each((_, element) => {
+    // The language is whatever string comes after the `brush(:)`
+    // portion of the class name.
+    const $pre = $(element);
+
+    const className = $pre.attr("class").toLowerCase();
+    const match = className.match(/brush:?\s*([\w_-]+)/);
+    if (!match) {
+      return;
+    }
+    const name = match[1].replace("-nolint", "");
+    if (IGNORE.has(name)) {
+      // Seems to exist a couple of these in our docs. Just bail.
+      return;
+    }
+    const code = $pre.text();
+    $pre.wrapAll(`
`); + if (!$pre.hasClass("hidden")) { + $( + `
${name}
` + ).insertBefore($pre); + } + const $code = $("").text(code); + + $pre.empty().append($code); + }); +} diff --git a/vendor/yari/build/curriculum.ts b/vendor/yari/build/curriculum.ts new file mode 100644 index 000000000..068c7fc15 --- /dev/null +++ b/vendor/yari/build/curriculum.ts @@ -0,0 +1,475 @@ +import path from "node:path"; +import fs from "node:fs/promises"; + +import { fdir } from "fdir"; +import frontmatter from "front-matter"; + +import { BUILD_OUT_ROOT, CURRICULUM_ROOT } from "../libs/env/index.js"; +import { DocParent } from "../libs/types/document.js"; +import { CURRICULUM_TITLE, DEFAULT_LOCALE } from "../libs/constants/index.js"; +import * as kumascript from "../kumascript/index.js"; +import LANGUAGES_RAW from "../libs/languages/index.js"; +import { wrapCodeExamples } from "./code-headers.js"; +import { + escapeRegExp, + injectLoadingLazyAttributes, + injectNoTranslate, + makeTOC, + postLocalFileLinks, + postProcessCurriculumLinks, + postProcessExternalLinks, + postProcessSmallerHeadingIDs, +} from "./utils.js"; +import { wrapTables } from "./wrap-tables.js"; +import { extractSections } from "./extract-sections.js"; +import { + CurriculumFrontmatter, + CurriculumData, + CurriculumMetaData, + CurriculumIndexEntry, + PrevNext, + Template, + CurriculumDoc, + ReadCurriculum, + CurriculumBuildData, +} from "../libs/types/curriculum.js"; +import { HydrationData } from "../libs/types/hydration.js"; +import { memoize, slugToFolder } from "../content/utils.js"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +import { CheerioAPI } from "cheerio"; +import { buildSitemap } from "./sitemaps.js"; + +export const allFiles = memoize(async () => { + const api = new fdir() + .withFullPaths() + .withErrors() + .filter((filePath) => filePath.endsWith(".md")) + .crawl(path.join(CURRICULUM_ROOT, "curriculum")); + return (await api.withPromise()).sort(); +}); + +export const buildIndex = memoize(async () => { + const files = await allFiles(); + const modules = await Promise.all( + files.map( + async (file) => + ( + await readCurriculumPage(file, { + previousNext: false, + forIndex: true, + }) + ).meta + ) + ); + return modules; +}); + +export function fileToSlug(file: string) { + return file + .replace(`${CURRICULUM_ROOT}/`, "") + .replace(/(\d+-|\.md$|\/0?-?README)/g, ""); +} + +export async function slugToFile(slug: string) { + const all = await allFiles(); + const re = new RegExp( + path.join( + escapeRegExp(CURRICULUM_ROOT), + "curriculum", + `${slug + .split("/") + .map((x) => String.raw`(\d+-)?${escapeRegExp(x)}`) + .join("/")}.md` + ) + ); + return all.find((x) => { + return re.test(x); + }); +} + +export async function buildCurriculumIndex( + mapper: (x: CurriculumMetaData) => CurriculumIndexEntry = (x) => x +): Promise { + const index: CurriculumMetaData[] = await buildIndex(); + + const curriculumIndex = index.reduce((item, meta) => { + const currentLevel = meta.slug.split("/").length; + const last = item.length ? item[item.length - 1] : null; + const entry = mapper(meta); + if (currentLevel > 2) { + if (last) { + if (!last.children) { + last.children = [entry]; + } else { + last.children.push(entry); + } + return item; + } + } + + item.push({ ...entry }); + return item; + }, []); + + return curriculumIndex; +} + +async function buildCurriculumSidebar(): Promise { + const index = await buildCurriculumIndex(({ url, slug, title }) => { + return { url, slug, title }; + }); + + return index; +} + +// This consumes (as in modifies) index. +function prevNextFromIndex( + i: number, + index: CurriculumMetaData[] | CurriculumIndexEntry[] +): PrevNext { + const prevEntry = i > 0 ? index[i - 1] : undefined; + const nextEntry = i < index.length - 1 ? index[i + 1] : undefined; + + const prev = prevEntry && { url: prevEntry.url, title: prevEntry.title }; + const next = nextEntry && { url: nextEntry.url, title: nextEntry.title }; + + return { prev, next }; +} + +async function buildPrevNextOverview(slug: string): Promise { + const index = (await buildCurriculumIndex()).filter( + (x) => x?.children?.length + ); + const i = index.findIndex((x) => x.slug === slug); + return prevNextFromIndex(i, index); +} + +async function buildPrevNextModule(slug: string): Promise { + const index = await buildIndex(); + const i = index.findIndex((x) => x.slug === slug); + return prevNextFromIndex(i, index); +} + +function breadcrumbPath( + url: string, + entries: CurriculumIndexEntry[] +): DocParent[] | null { + for (const entry of entries) { + if (entry.url === url) { + return [{ uri: entry.url, title: entry.title }]; + } + if (entry.children?.length) { + const found = breadcrumbPath(url, entry.children); + if (found) { + return [{ uri: entry.url, title: entry.title }, ...found]; + } + } + } + return null; +} + +async function buildParents(url: string): Promise { + const index = await buildCurriculumIndex(({ url, title }) => { + return { url, title }; + }); + const parents = breadcrumbPath(url, index); + if (parents) { + const { url, title } = index[0]; + if (parents[0]?.uri !== url) { + return [{ uri: url, title }, ...parents]; + } + return parents; + } + + return []; +} + +async function readCurriculumPage( + file: string, + options?: { + previousNext?: boolean; + forIndex?: boolean; + } +): Promise { + const raw = await fs.readFile(file, "utf-8"); + const { attributes, body: rawBody } = frontmatter(raw); + const filename = file.replace(CURRICULUM_ROOT, "").replace(/^\/?/, ""); + const title = rawBody.match(/^[\w\n]*#+(.*\n)/)[1]?.trim() || ""; + const body = rawBody.replace(/^[\w\n]*#+(.*\n)/, ""); + + const slug = fileToSlug(file); + const url = `/${DEFAULT_LOCALE}/${slug}/`; + + let sidebar: CurriculumIndexEntry[]; + let parents: DocParent[]; + + let modules: CurriculumIndexEntry[]; + let prevNext: PrevNext; + let group: string; + if (!options?.forIndex) { + if (attributes.template === Template.Landing) { + modules = (await buildCurriculumIndex()) + ?.filter((x) => x.children?.length) + .map(({ url, title, summary, topic, slug, children }) => ({ + url, + title, + summary, + topic, + slug, + children: children.length + ? children.map(({ url, title, summary, topic, slug }) => ({ + url, + title, + summary, + topic, + slug, + })) + : undefined, + })); + } else if (attributes.template === Template.Overview) { + modules = (await buildCurriculumIndex()) + ?.find((x) => x.slug === slug) + ?.children.map(({ url, title, summary, topic, slug }) => ({ + url, + title, + summary, + topic, + slug, + })); + } + if (attributes.template === Template.Module) { + prevNext = await buildPrevNextModule(slug); + } else if (attributes.template === Template.Overview) { + prevNext = await buildPrevNextOverview(slug); + } + + sidebar = await buildCurriculumSidebar(); + parents = await buildParents(url); + if (parents.length > 1) { + const title = parents.at(-2)?.title; + if (title?.endsWith(" modules")) { + group = title; + } + } + } + + return { + meta: { + filename, + slug, + url, + title, + sidebar, + modules, + parents, + prevNext, + group, + ...attributes, + }, + body, + }; +} + +export async function findCurriculumPageBySlug( + slug: string +): Promise { + const file = + (await slugToFile(slug)) || (await slugToFile(path.join(slug, "README"))); + let module: ReadCurriculum; + try { + module = await readCurriculumPage(file, { forIndex: false }); + } catch (e) { + console.error(`No file found for ${slug}: ${e}`); + return null; + } + const { body, meta } = module; + + const d: CurriculumBuildData = { + url: meta.url, + rawBody: body, + metadata: { locale: DEFAULT_LOCALE, ...meta }, + isMarkdown: true, + fileInfo: { + path: file, + }, + }; + + const doc = await buildCurriculumPage(d); + return { doc }; +} + +export async function buildCurriculumPage( + document: CurriculumBuildData +): Promise { + const { metadata } = document; + + const doc = { locale: DEFAULT_LOCALE } as Partial; + + const renderUrl = document.url.replace(/\/$/, ""); + const [$] = await kumascript.render(renderUrl, {}, document); + + $("[data-token]").removeAttr("data-token"); + $("[data-flaw-src]").removeAttr("data-flaw-src"); + + doc.title = metadata.title; + doc.mdn_url = document.url; + doc.locale = metadata.locale; + doc.native = LANGUAGES_RAW[DEFAULT_LOCALE]?.native; + + if ($("math").length > 0) { + doc.hasMathML = true; + } + $("div.hidden").remove(); + wrapCodeExamples($); + injectNoTranslate($); + injectLoadingLazyAttributes($); + postProcessCurriculumLinks($, (p: string | undefined) => { + const [head, hash] = p?.split("#") || []; + const slug = fileToSlug( + path.normalize(path.join(path.dirname(document.fileInfo.path), head)) + ).replace(/\/$/, ""); + return `/${DEFAULT_LOCALE}/${slug}/${hash ? `#${hash}` : ""}`; + }); + postProcessExternalLinks($); + postLocalFileLinks($, doc); + postProcessSmallerHeadingIDs($); + wrapTables($); + setCurriculumTypes($); + try { + const [sections] = await extractSections($); + doc.body = sections; + } catch (error) { + console.error( + `Extracting sections failed in ${doc.mdn_url} (${document.fileInfo.path})` + ); + throw error; + } + + doc.pageTitle = doc.title + ? `${doc.title} | ${CURRICULUM_TITLE}` + : CURRICULUM_TITLE; + + doc.noIndexing = false; + doc.toc = makeTOC(doc, true); + doc.sidebar = metadata.sidebar; + doc.modules = metadata.modules; + doc.prevNext = metadata.prevNext; + doc.parents = metadata.parents; + doc.topic = metadata.topic; + doc.group = metadata.group; + doc.template = metadata.template || Template.Default; + + return doc as CurriculumDoc; +} + +export async function buildCurriculum(options: { + verbose?: boolean; + noIndexing?: boolean; +}) { + const locale = DEFAULT_LOCALE; + + for (const file of await allFiles()) { + const { meta, body } = await readCurriculumPage(file, { + forIndex: false, + }); + + const renderDoc: CurriculumBuildData = { + url: meta.url, + rawBody: body, + metadata: { locale, ...meta }, + isMarkdown: true, + fileInfo: { + path: file, + }, + }; + const builtDoc = await buildCurriculumPage(renderDoc); + const { doc } = { + doc: { ...builtDoc, summary: meta.summary, mdn_url: meta.url }, + }; + + const context: HydrationData = { + doc, + pageTitle: meta.title, + locale, + noIndexing: options.noIndexing, + url: `/${locale}/${meta.slug}/`, + }; + + const outPath = path.join( + BUILD_OUT_ROOT, + locale.toLowerCase(), + slugToFolder(meta.slug) + ); + + await fs.mkdir(outPath, { recursive: true }); + + const jsonFilePath = path.join(outPath, "index.json"); + + await fs.mkdir(outPath, { recursive: true }); + await fs.writeFile(jsonFilePath, JSON.stringify(context)); + + if (options.verbose) { + console.log("Wrote", jsonFilePath); + } + } +} + +function setCurriculumTypes($: CheerioAPI) { + $("p").each((_, child) => { + const p = $(child); + const text = p.text(); + switch (text) { + case "Learning outcomes:": + p.addClass("curriculum-outcomes"); + break; + case "General resources:": + case "Resources:": + p.addClass("curriculum-resources"); + break; + } + }); + + $("p.curriculum-resources + ul > li").each((_, child) => { + const li = $(child); + const externalLinks = li.find("a.external"); + if (externalLinks.length) { + li.addClass("curriculum-external-li"); + } + }); + + $("blockquote").each((_, child) => { + const bq = $(child); + + const [p] = bq.find("p"); + + if (p) { + const notes = $(p); + if (/((general )?notes?):/i.test(notes.text())) { + bq.addClass("curriculum-notes"); + } + } + }); +} + +export async function buildCurriculumSitemap(options: { verbose?: boolean }) { + const index = await buildCurriculumIndex(); + const items = []; + while (index.length) { + const current = index.shift(); + items.push({ + slug: current.url, + }); + if (current.children) { + index.push(...current.children); + } + } + + const sitemapFilePath = await buildSitemap(items, { + pathSuffix: [DEFAULT_LOCALE, "curriculum"], + }); + + if (options.verbose) { + console.log("Wrote", sitemapFilePath); + } +} diff --git a/vendor/yari/build/document-utils.ts b/vendor/yari/build/document-utils.ts new file mode 100644 index 000000000..f807be908 --- /dev/null +++ b/vendor/yari/build/document-utils.ts @@ -0,0 +1,75 @@ +import { Document } from "../content/index.js"; + +const TRANSFORM_STRINGS = new Map( + Object.entries({ + "Web technology for developers": "References", + "Learn web development": "Learn", + "HTML: HyperText Markup Language": "HTML", + "CSS: Cascading Style Sheets": "CSS", + "Graphics on the Web": "Graphics", + "HTML elements reference": "Elements", + "JavaScript reference": "Reference", + "JavaScript Guide": "Guide", + "Structuring the web with HTML": "HTML", + "Learn to style HTML using CSS": "CSS", + "Web forms — Working with user data": "Forms", + }) +); +/** + * Temporary fix for long titles in breadcrumbs + * @see https://github.com/mdn/yari-private/issues/612 + * @param title : the title of the document + * @returns transformed title or original title as a string + */ +function transformTitle(title: string) { + // if the title contains a string like `: The Input (Form Input) element`, + // return only the `` portion of the title + const htmlTagTopic = /^<\w+>/.exec(title)?.[0]; + // if the above did not match, see if it is one of the strings in the + // transformStrings object and return the relevant replacement or + // the unmodified title string + return htmlTagTopic ?? TRANSFORM_STRINGS.get(title) ?? title; +} + +/** + * The breadcrumb is an array of parents including the document itself. + * It is only added to the document if there are actual parents. + */ +export function addBreadcrumbData(url, document) { + const parents = []; + const split = url.split("/"); + + let parentURL; + // If the URL was something like `/en-US/docs/Foo/Bar` when you split + // that, the array becomes `['', 'en-US', 'docs', 'Foo', 'Bar']` + // And as length, that's `[1, 2, 3, 4, 5]`. Therefore, there's never + // any point of going for 1, 2, or 3 since that's just the home page + // which we don't ever include in the breadcrumb trail. + while (split.length > 4) { + split.pop(); + parentURL = split.join("/"); + // This test makes it possible to "skip" certain URIs that might not + // be a page on its own. For example: /en-US/docs/Web/ is a page, + // and so is /en-US/ but there might not be a page for /end-US/docs/. + + const parentDoc = Document.findByURL(parentURL); + if (parentDoc) { + parents.unshift({ + uri: parentURL, + title: + parentDoc.metadata["short-title"] || + transformTitle(parentDoc.metadata.title), + }); + } + } + + if (!document.short_title) { + document.short_title = transformTitle(document.title); + } + + parents.push({ + uri: url, + title: document.short_title, + }); + document.parents = parents; +} diff --git a/vendor/yari/build/extract-sections.ts b/vendor/yari/build/extract-sections.ts new file mode 100644 index 000000000..10bfb47b0 --- /dev/null +++ b/vendor/yari/build/extract-sections.ts @@ -0,0 +1,453 @@ +import * as cheerio from "cheerio"; +import { ProseSection, Section } from "../libs/types/document.js"; +import { extractSpecifications } from "./extract-specifications.js"; + +type SectionsAndFlaws = [Section[], string[]]; + +export async function extractSections( + $: cheerio.CheerioAPI +): Promise<[Section[], string[]]> { + const flaws: string[] = []; + const sections: Section[] = []; + const section = cheerio + .load("
", { + // decodeEntities: false + })("div") + .eq(0); + + const body = $("body")[0] as cheerio.ParentNode; + const iterable = [...(body.childNodes as cheerio.Element[])]; + + let c = 0; + for (const child of iterable) { + if ( + (child as cheerio.Element).tagName === "h2" || + (child as cheerio.Element).tagName === "h3" + ) { + if (c) { + const [subSections, subFlaws] = await addSections(section.clone()); + sections.push(...subSections); + flaws.push(...subFlaws); + section.empty(); + } + c = 0; + } + // We *could* wrap this in something like `if (child.tagName) {` + // which would exclude any node that isn't a tag, such as comments. + // That might make the DOM nodes more compact and memory efficient. + c++; + section.append(child); + } + + if (c) { + // last straggler + const [subSections, subFlaws] = await addSections(section); + sections.push(...subSections); + flaws.push(...subFlaws); + } + + // Check for and mutate possible duplicated IDs. + // If a HTML document has...: + // + //

Check these examples

+ // ... + //

Examples

+ // + // then this can cause various problems. For example, the anchor links + // won't work. The Table of Contents won't be able to do a loop with unique + // `key={section.id}` values. + // The reason we need to loop through to get a list of all existing IDs + // first is because we might have this: + // + //

Foo X

+ //

Foo Y

+ //

Foo Z

+ // + // So when you encounter `

Foo Y

` you'll know that you + // can't suggest it to be `

Foo Y

` because that ID + // is taken by another one, later. + const allIDs = new Set( + sections + .map((section) => section.value.id) + .filter(Boolean) + .map((id) => id.toLowerCase()) + ); + + const seenIDs = new Set(); + for (const section of sections) { + const originalID = section.value.id; + if (!originalID) { + // Not all sections have an ID. For example, prose sections that don't + // start with a

. + // Since we're primarily concerned about *uniqueness* here, let's just + // skip worrying about these. + continue; + } + // We normalize all IDs to lowercase so that `id="Foo"` === `id="foo"`. + const id = originalID.toLowerCase(); + if (seenIDs.has(id)) { + // That's bad! We have to come up with a new ID but it can't be one + // that's used by another other section. + let increment = 2; + let newID = `${originalID}_${increment}`; + while ( + seenIDs.has(newID.toLowerCase()) || + allIDs.has(newID.toLowerCase()) + ) { + increment++; + newID = `${originalID}_${increment}`; + } + section.value.id = newID; + seenIDs.add(newID.toLowerCase()); + flaws.push( + `'${originalID}' is not a unique ID in this HTML (temporarily changed to ${section.value.id})` + ); + } else { + seenIDs.add(id); + } + } + + return [sections, flaws]; +} + +/** Return an array of new sections to be added to the complete document. + * + * Generally, this function is called with a cheerio (`$`) section that + * has HTML in it. The task is to structure that a little bit. + * If the HTML inside the '$' is: + * + *

Foo

+ *

Bla bla

+ *
  • One
+ * + * then, the expected output is to return: + * + * [{ + * type: "prose", + * id: "foo", + * title: "Foo" + * content: "

Bla bla

\n

  • One
" + * }] + * + * The reason it's always returning an array is because of special + * sections. A special section is one where we try to transform it + * first. For example BCD tables. If the input is this: + * + *

Browser Compat

+ *
...
+ * + * Then, extract the ID, get the structured data and eventually return this: + * + * [{ + * type: "browser_compatibility", + * value: { + * query: "foo.bar.thing", + * id: "browser_compat", + * title: "Browser Compat", + * data: {....} + * }] + * + * Another example is for the specification section. If the input is this: + * + *

Specifications

+ *
...
+ * + * Then, extract the data-bcd-query and return this: + * + * [{ + * type: "specifications", + * value: { + * query: "foo.bar.thing", + * id: "specifications", + * title: "Specifications", + * specifications: {....} + * }] + */ +async function addSections( + $: cheerio.Cheerio +): Promise { + const flaws: string[] = []; + + const countPotentialSpecialDivs = $.find("div.bc-data, div.bc-specs").length; + if (countPotentialSpecialDivs) { + /** If there's exactly 1 special table the only section to add is something + * like this: + * { + * "type": "browser_compatibility", + * "value": { + * "title": "Browser compatibility", + * "id": "browser_compatibility", + * "query": "html.elements.video", + * "data": {....} + * } + * + * Where the 'title' and 'id' values comes from the

tag (if available). + * + * However, if there are **multiple special tables**, + * it needs to return something like this: + * + * [{ + * "type": "prose", + * "value": { + * "id": "browser_compatibility", + * "title": "Browser compatibility" + * "content": "Possible stuff before the table" + * }, + * { + * "type": "browser_compatibility", + * "value": { + * "query": "html.elements.video", + * "data": {.... + * }, + * { + * "type": "prose", + * "value": { + * "content": "Any other stuff before table maybe" + * }, + */ + if (countPotentialSpecialDivs > 1) { + const subSections: Section[] = []; + const section = cheerio + .load("
", { + // decodeEntities: false + })("div") + .eq(0); + + // Loop over each and every "root element" in the node and keep piling + // them up in a buffer, until you encounter a `div.bc-data` or `div.bc-specs` then + // add that to the stack, clear and repeat. + const div = $[0] as cheerio.ParentNode; + const iterable = [...(div.childNodes as cheerio.Element[])]; + let c = 0; + let countSpecialDivsFound = 0; + for (const child of iterable) { + if ( + child.tagName === "div" && + child.attribs && + child.attribs.class && + (child.attribs.class.includes("bc-data") || + child.attribs.class.includes("bc-specs")) + ) { + countSpecialDivsFound++; + if (c) { + const [proseSections, proseFlaws] = _addSectionProse( + section.clone() + ); + subSections.push(...proseSections); + flaws.push(...proseFlaws); + section.empty(); + c = 0; // reset the counter + } + section.append(child); + // XXX That `_addSingleSpecialSection(section.clone())` might return a + // and empty array and that means it failed and we should + // bail. + subSections.push( + ...(await _addSingleSpecialSection(section.clone())) + ); + section.empty(); + } else { + section.append(child); + c++; + } + } + if (c) { + const [proseSections, proseFlaws] = _addSectionProse(section.clone()); + subSections.push(...proseSections); + flaws.push(...proseFlaws); + } + if (countSpecialDivsFound !== countPotentialSpecialDivs) { + const leftoverCount = countPotentialSpecialDivs - countSpecialDivsFound; + const explanation = `${leftoverCount} 'div.bc-data' or 'div.bc-specs' element${ + leftoverCount > 1 ? "s" : "" + } found but deeply nested.`; + flaws.push(explanation); + } + return [subSections, flaws]; + } + const specialSections = await _addSingleSpecialSection($); + + // The _addSingleSpecialSection() function will have sucked up the

or

+ // and the `div.bc-data` or `div.bc-specs` to turn it into a special section. + // First remove that, then put whatever HTML is left as a prose + // section underneath. + $.find("div.bc-data, h2, h3").remove(); + $.find("div.bc-specs, h2, h3").remove(); + const [proseSections, proseFlaws] = _addSectionProse($); + specialSections.push(...proseSections); + flaws.push(...proseFlaws); + + if (specialSections.length) { + return [specialSections, flaws]; + } + } + + // all else, leave as is + const [proseSections, proseFlaws] = _addSectionProse($); + flaws.push(...proseFlaws); + + return [proseSections, flaws]; +} + +async function _addSingleSpecialSection( + $: cheerio.Cheerio +): Promise { + let id: string | null = null; + let title: string | null = null; + let isH3 = false; + + const h2s = $.find("h2"); + if (h2s.length === 1) { + id = h2s.attr("id"); + title = h2s.text(); + } else { + const h3s = $.find("h3"); + if (h3s.length === 1) { + id = h3s.attr("id"); + title = h3s.text(); + isH3 = true; + } + } + + let dataQuery = ""; + let hasMultipleQueries = false; + let specURLsString = ""; + let specialSectionType: string | null = null; + if ($.find("div.bc-data").length) { + specialSectionType = "browser_compatibility"; + const elem = $.find("div.bc-data"); + // Macro adds "data-query", but some translated-content still uses "id". + dataQuery = (elem.attr("data-query") || elem.attr("id")) ?? ""; + hasMultipleQueries = elem.attr("data-multiple") === "true"; + } else if ($.find("div.bc-specs").length) { + specialSectionType = "specifications"; + dataQuery = $.find("div.bc-specs").attr("data-bcd-query") ?? ""; + specURLsString = $.find("div.bc-specs").attr("data-spec-urls") ?? ""; + } + + // Some old legacy documents haven't been re-rendered yet, since it + // was added, so the `div.bc-data` tag doesn't have a `id="bcd:..."` + // or `data-bcd="..."` attribute. If that's the case, bail and fall + // back on a regular prose section :( + if (!dataQuery && specURLsString === "") { + // I wish there was a good place to log this! + return _addSectionProse($)[0]; + } + const query = dataQuery.replace(/^bcd:/, ""); + + if (specialSectionType === "browser_compatibility") { + if (hasMultipleQueries) { + title = query; + id = query; + isH3 = true; + } + + return [ + { + type: specialSectionType, + value: { + title, + id, + isH3, + query, + }, + }, + ]; + } else if (specialSectionType === "specifications") { + const specifications = await extractSpecifications(query, specURLsString); + + return [ + { + type: "specifications", + value: { + title, + id, + isH3, + specifications, + query, + }, + }, + ]; + } + + throw new Error(`Unrecognized special section type '${specialSectionType}'`); +} + +function _addSectionProse( + $: cheerio.Cheerio +): SectionsAndFlaws { + let id: string | null = null; + let title: string | null = null; + let isH3 = false; + + const flaws: string[] = []; + + // The way this works... + // Given a section of HTML, try to extract a id, title, + + let h2found = false; + const h2s = $.find("h2"); + h2s.each((i) => { + const h2 = h2s.eq(i); + + if (i) { + // Excess! + flaws.push( + `Excess

tag that is NOT at root-level (id='${h2.attr( + "id" + )}', text='${h2.text()}')` + ); + } else { + // First element + id = h2.attr("id") ?? ""; + title = h2.html() ?? ""; + h2.remove(); + } + h2found = true; + }); + + // If there was no

, look through all the

s. + if (!h2found) { + const h3s = $.find("h3"); + h3s.each((i) => { + const h3 = h3s.eq(i); + if (i) { + // Excess! + flaws.push( + `Excess

tag that is NOT at root-level (id='${h3.attr( + "id" + )}', text='${h3.text()}')` + ); + } else { + id = h3.attr("id") ?? ""; + title = h3.html() ?? ""; + if (id && title) { + isH3 = true; + h3.remove(); + } + } + }); + } + + if (id) { + // Remove trailing underscores (https://github.com/mdn/yari/issues/5492). + id = id.replace(/_+$/g, ""); + } + + const value: ProseSection["value"] = { + id, + title, + isH3, + content: $.html()?.trim(), + }; + + const sections: ProseSection[] = []; + if (value.content || value.title) { + sections.push({ + type: "prose", + value, + }); + } + + return [sections, flaws]; +} diff --git a/vendor/yari/build/extract-sidebar.ts b/vendor/yari/build/extract-sidebar.ts new file mode 100644 index 000000000..f44e0c197 --- /dev/null +++ b/vendor/yari/build/extract-sidebar.ts @@ -0,0 +1,44 @@ +import * as cheerio from "cheerio"; +import { Doc } from "../libs/types/document.js"; + +/** Extract and mutate the $ if it as a "Quick_links" section. + * But only if it exists. + * + * If you had this: + * + * const $ = cheerio.load(` + * + *

Headline

+ *

Text

+ * `) + * const sidebar = extractSidebar($); + * console.log(sidebar); + * // '' + * console.log($.html()); + * // '

Headline

\n

Text

' + * + * ...give or take some whitespace. + */ + +export function extractSidebar($: cheerio.CheerioAPI, doc: Partial) { + const search = $("#Quick_links"); + + if (!search.length) { + doc.sidebarHTML = ""; + return; + } + + // Open menu and highlight current page. + search.find(`a[href='${doc.mdn_url}']`).each((_i, el) => { + $(el).parents("details").prop("open", true); + $(el).attr("aria-current", "page"); + // Highlight, unless it already is highlighted (e.g. heading). + if ($(el).find("em,strong").length === 0) { + $(el).parent().wrapInner(""); + } + }); + + doc.sidebarHTML = search.html(); + doc.sidebarMacro = search.attr("data-macro"); + search.remove(); +} diff --git a/vendor/yari/build/extract-specifications.ts b/vendor/yari/build/extract-specifications.ts new file mode 100644 index 000000000..a57c8a6f5 --- /dev/null +++ b/vendor/yari/build/extract-specifications.ts @@ -0,0 +1,121 @@ +import { packageBCD } from "./resolve-bcd.js"; +import bcd from "@mdn/browser-compat-data/types"; +import { Specification } from "../libs/types/document.js"; +import web from "../kumascript/src/api/web.js"; +import { getWebSpec } from "./web-specs.js"; + +export async function extractSpecifications( + query: string | undefined, + specURLsString: string +): Promise { + if (query === undefined && specURLsString === "") { + return []; + } + + // Collect spec URLs from a BCD feature, a 'spec-urls' value, or both; + // For a BCD feature, it can either be a string or an array of strings. + let specURLs: string[] = []; + + function getSpecURLs(data: bcd.Identifier) { + // If we’re processing data for just one feature, then the 'data' + // variable will have a __compat key. So we get the one spec_url + // value from that, and move on. + // + // The value may have data for subfeatures too — each subfeature with + // its own __compat key that may have a spec_url — but in that case, + // for the purposes of the Specifications section, we don’t want to + // recurse through all the subfeatures to get those spec_url values; + // instead we only want the spec_url from the top-level __compat key. + if (data && data.__compat) { + const compat = data.__compat; + if (compat.spec_url) { + if (Array.isArray(compat.spec_url)) { + specURLs.push(...compat.spec_url); + } else { + specURLs.push(compat.spec_url); + } + } + } else { + // If we get here, we’re processing data for two or more features + // and the 'data' variable will contain multiple blocks (objects) + // — one for each feature. + if (!data) { + return; + } + for (const block of Object.values(data)) { + if (!block) { + continue; + } + if (!("__compat" in block)) { + // Some features — e.g., css.properties.justify-content — have + // no compat data themselves but have subfeatures with compat + // data. So we recurse through the nested property values until + // we either do or don’t find any subfeatures with spec URLs. + // Otherwise, if we’re processing multiple top-level features + // (that is, from a browser-compat value which is an array), + // we’d end up entirely missing the data for this feature. + getSpecURLs(block as bcd.Identifier); + } else { + // If we get here, we’ve got a __compat key, and we can extract + // any spec URLs its value may contain. + const compat = block.__compat; + if (compat && compat.spec_url) { + if (Array.isArray(compat.spec_url)) { + specURLs.push(...compat.spec_url); + } else { + specURLs.push(compat.spec_url); + } + } + } + } + } + } + + // The `spec-url` frontmatter takes precedence over spec URLs derived from `browser-compat` frontmatter. + if (query && !specURLsString) { + for (const feature of query.split(",").map((id) => id.trim())) { + const { data } = packageBCD(feature); + // If 'data' is non-null, we have data for one or more BCD features + // that we can extract spec URLs from. + getSpecURLs(data); + } + } + + if (specURLsString !== "") { + // If specURLsString is non-empty, then it has the string contents + // of the document’s 'spec-urls' frontmatter key: one or more URLs. + specURLs.push(...specURLsString.split(",").map((url) => url.trim())); + } + + // Eliminate any duplicate spec URLs + specURLs = [...new Set(specURLs)]; + + // Use BCD specURLs to look up more specification data + // from the web-specs package + const specifications = ( + await Promise.all( + specURLs.map(async (specURL) => { + const spec = await getWebSpec(specURL); + const specificationsData = { + bcdSpecificationURL: specURL, + title: "Unknown specification", + }; + if (spec) { + specificationsData.title = spec.title; + } else { + const specList = web.getJSONData("SpecData"); + const titleFromSpecData = Object.keys(specList).find( + (key) => specList[key]["url"] === specURL.split("#")[0] + ); + if (titleFromSpecData) { + specificationsData.title = titleFromSpecData; + } + } + + return specificationsData; + }) + ) + ).filter(Boolean); + + return specifications; +} diff --git a/vendor/yari/build/extract-summary.ts b/vendor/yari/build/extract-summary.ts new file mode 100644 index 000000000..6bd2ab2cb --- /dev/null +++ b/vendor/yari/build/extract-summary.ts @@ -0,0 +1,58 @@ +import * as cheerio from "cheerio"; +import { ProseSection, Section } from "../libs/types/document.js"; + +/** + * Given an array of sections, return a plain text + * string of a summary. No HTML or Kumascript allowed. + */ + +export function extractSummary(sections: Section[]): string { + let summary = ""; // default and fallback is an empty string. + + function extractFirstGoodParagraph($): string { + const seoSummary = $("span.seoSummary, .summary"); + if (seoSummary.length && seoSummary.text()) { + return seoSummary.text(); + } + let summary = ""; + $("p").each((i, p) => { + // The `.each()` can only take a callback, so we need a solution + // to exit early once we've found the first working summary. + if (summary) return; // it already been found! + const text = $(p).text().trim(); + // Avoid those whose paragraph is just a failing KS macro + if (text && !text.includes("Redirect") && !text.startsWith("{{")) { + summary = text; + } + }); + return summary; + } + // If the sections contains a "Summary" one, use that, otherwise + // use the first prose one. + const summarySections = sections.filter( + (section: Section): section is ProseSection => + section.type === "prose" && section.value.title === "Summary" + ); + if (summarySections.length) { + const $ = cheerio.load(summarySections[0].value.content ?? ""); + summary = extractFirstGoodParagraph($); + } else { + for (const section of sections) { + if ( + section.type !== "prose" || + !section.value || + !section.value.content + ) { + continue; + } + const $ = cheerio.load(section.value.content); + // Remove non-p tags that we should not be looking inside. + $("div.notecard, div.note, div.blockIndicator").remove(); + summary = extractFirstGoodParagraph($); + if (summary) { + break; + } + } + } + return summary; +} diff --git a/vendor/yari/build/flaws/bad-bcd-queries.ts b/vendor/yari/build/flaws/bad-bcd-queries.ts new file mode 100644 index 000000000..b3e0819a9 --- /dev/null +++ b/vendor/yari/build/flaws/bad-bcd-queries.ts @@ -0,0 +1,34 @@ +import { packageBCD } from "../resolve-bcd.js"; +import * as cheerio from "cheerio"; +import { Doc } from "../../libs/types/document.js"; +import { Flaw } from "./index.js"; + +// Bad BCD queries are when the `
` tags have an +// ID (or even lack the `id` attribute) that don't match anything in the +// @mdn/browser-compat-data package. E.g. Something like this: +// +//
+ +export function getBadBCDQueriesFlaws( + doc: Partial, + $: cheerio.CheerioAPI +): Flaw[] { + return $("div.bc-data") + .map((i, element) => { + const $element = $(element); + // Macro adds "data-query", but some translated-content still uses "id". + const dataQuery = $element.attr("data-query") || $element.attr("id"); + if (!dataQuery) { + return "BCD table without 'data-query' or 'id' attribute"; + } + const query = dataQuery.replace(/^bcd:/, ""); + return !packageBCD(query).data && `No BCD data for query: ${query}`; + }) + .get() + .filter((explanation) => !!explanation) + .map((explanation, i) => ({ + id: `bad_bcd_queries${i + 1}`, + explanation, + suggestion: null, + })); +} diff --git a/vendor/yari/build/flaws/broken-links.ts b/vendor/yari/build/flaws/broken-links.ts new file mode 100644 index 000000000..b08fc6aea --- /dev/null +++ b/vendor/yari/build/flaws/broken-links.ts @@ -0,0 +1,389 @@ +import fs from "node:fs"; + +import { Document, Redirect, FileAttachment } from "../../content/index.js"; +import { findMatchesInText, findMatchesInMarkdown } from "../matches.js"; +import { + DEFAULT_LOCALE, + FLAW_LEVELS, + VALID_LOCALES, +} from "../../libs/constants/index.js"; +import { isValidLocale } from "../../libs/locale-utils/index.js"; +import * as cheerio from "cheerio"; +import { Doc } from "../../libs/types/document.js"; +import { Flaw } from "./index.js"; +import { ONLY_AVAILABLE_IN_ENGLISH } from "../../libs/l10n/l10n.js"; +import web from "../../kumascript/src/api/web.js"; +import mdn from "../../kumascript/src/api/mdn.js"; + +const _safeToHttpsDomains = new Map(); + +function getSafeToHttpDomains() { + if (!_safeToHttpsDomains.size) { + const fileParsed = JSON.parse( + fs.readFileSync( + new URL("safe-to-https-domains.json", import.meta.url), + "utf-8" + ) + ); + Object.entries(fileParsed).forEach(([key, value]) => + _safeToHttpsDomains.set(key, value) + ); + } + return _safeToHttpsDomains; +} + +function isHomepageURL(url) { + // Return true if the URL is something like `/` or `/en-US` or `/fr/` + if (url === "/") { + return true; + } + if (!url.endsWith("/")) { + url += "/"; + } + const split = url.split("/"); + return split.length === 3 && isValidLocale(split[1]); +} + +function mutateLink( + $element: cheerio.Cheerio, + suggestion: string = null, + enUSFallback: string = null, + isSelfLink = false +) { + if (isSelfLink) { + $element.attr("aria-current", "page"); + } else if (enUSFallback) { + const locale = $element.attr("href").match(/^\/([^/]+)\//)[1]; + // If we have an English (US) fallback, then we use this first. + // As we still suggest the translated version even if we only + // have an English (US) version. + $element.attr("href", enUSFallback); + $element.addClass("only-in-en-us"); + $element.attr("title", ONLY_AVAILABLE_IN_ENGLISH(locale)); + } else if (suggestion) { + $element.attr("href", suggestion); + } else { + $element.addClass("page-not-created"); + const locale = $element.attr("href")?.match(/^\/([^/]+)\//)?.[1] || "en-US"; + const titleWhenMissing = (mdn as any).getLocalString.call( + { env: { locale } }, + web.getJSONData("L10n-Common"), + "summary" + ); + $element.attr("title", titleWhenMissing); + const href = $element.attr("href"); + $element.attr("href", null); + $element.attr("data-href", href); + } +} + +// The 'broken_links' flaw check looks for internal links that +// link to a document that's going to fail with a 404 Not Found. +export function getBrokenLinksFlaws( + doc: Partial, + $: cheerio.CheerioAPI, + { rawContent }, + level +) { + const flaws: Flaw[] = []; + + // This is needed because the same href can occur multiple time. + // For example: + // + // + // (again!) + // In this case, when we call `addBrokenLink()` that third time, we know + // this refers to the second time it appears. That's important for the + // sake of finding which match, in the original source (rawContent), + // it belongs to. + const checked = new Map(); + + // Our cache for looking things up by `href`. This basically protects + // us from calling `findMatchesInText()` more than once. + const matches = new Map(); + + // A closure function to help making it easier to append flaws + function addBrokenLink( + $element: cheerio.Cheerio, + index: number, + href: string, + suggestion: string = null, + explanation: string = null, + enUSFallback: string = null, + isSelfLink = false + ) { + mutateLink($element, suggestion, enUSFallback, isSelfLink); + if (level === FLAW_LEVELS.IGNORE) { + // Note, even if not interested in flaws, we still need to apply the + // suggestion. For example, in production builds, we don't care about + // logging flaws, but because not all `broken_links` flaws have been + // manually fixed at the source. + return; + } + + explanation = explanation || `Can't resolve ${href}`; + + if (!matches.has(href)) { + matches.set( + href, + + doc.isMarkdown + ? findMatchesInMarkdown(href, rawContent, { type: "link" }) + : findMatchesInText(href, rawContent, { + attribute: "href", + }) + ); + } + + matches.get(href).forEach((match, i) => { + if (i !== index) { + return; + } + const id = `link${flaws.length + 1}`; + const fixable = !!suggestion; + $element.attr("data-flaw", id); + flaws.push( + Object.assign({ explanation, id, href, suggestion, fixable }, match) + ); + }); + } + + function checkHash( + hash: string, + a: cheerio.Cheerio, + href: string + ) { + if (hash.startsWith(":~:")) { + // Ignore fragment directives. + return; + } + if (hash !== hash.toLowerCase()) { + addBrokenLink( + a, + checked.get(href), + href, + href.replace(`#${hash}`, `#${hash.toLowerCase()}`), + "Anchor not lowercase" + ); + } + } + + $("a[href]").each((i, element) => { + const a = $(element); + let href = a.attr("href"); + try { + // When Markdown turns into HTML it will encode the `href` values in the + // links. To be able to treat it as if it was from its raw value, + // we first decode it. That way we can find out it was originally written + // in the `index.md` file, for example. + // But not all URLs can be applied with `decodeURI`. For example: + // https://www.ecma-international.org/ecma-262/6.0/#sec-get-%typedarray%.prototype.buffer + // can't be decoded in Node. + // So that's why we do this decoding very defensively. + href = decodeURI(href); + } catch (error) { + console.warn(`Unable to decodeURI '${href}'. Will proceed without.`); + } + + // This gives us insight into how many times this exact `href` + // has been encountered in the doc. + // Then, when we call addBrokenLink() we can include an index so that + // that function knows which match it's referring to. + checked.set(href, checked.has(href) ? checked.get(href) + 1 : 0); + + // Note, a lot of links are like this: + // + // which means the author wanted the link to work in any language. + // When checking it against disk, we'll have to assume a locale. + const hrefSplit = href.split("#"); + let hrefNormalized = hrefSplit[0]; + if (hrefNormalized.startsWith("/docs/")) { + const thisDocumentLocale = doc.mdn_url.split("/")[1]; + hrefNormalized = `/${thisDocumentLocale}${hrefNormalized}`; + } + + if ( + hrefNormalized.endsWith("/contributors.txt") && + hrefNormalized.startsWith("/") && + !href.startsWith("//") + ) { + // Do nothing. The /contributors.txt URLs are special Yari URLs. + return; + } + + if (href.startsWith("http://")) { + let domain = null; + try { + domain = new URL(href).hostname; + } catch (err) { + return addBrokenLink( + a, + checked.get(href), + href, + null, + "Not a valid link URL" + ); + } + // If a URL's domain is in the list that getSafeToHttpDomains() provides, + // that means we've tested that you can turn that into a HTTPS link + // simply by replacing the `http://` for `https://`. + // Using `.get(domain)` is smart because if the domain isn't known you + // get `undefined` otherwise you get `true` or `false`. And we're only + // interested in the `true`. + if (getSafeToHttpDomains().get(domain)) { + addBrokenLink( + a, + checked.get(href), + href, + href.replace("http://", "https://"), + "Is currently http:// but can become https://" + ); + } + // Note! If it's not known that the URL's domain can be turned into https:// + // we do nothing here. No flaw. It's unfortunate that we still have http:// + // links in our content but that's a reality of MDN being 15+ years old. + } else if ( + href.startsWith("https://developer.mozilla.org/") && + !href.startsWith("https://developer.mozilla.org/en-US/curriculum/") && + !href.startsWith("https://developer.mozilla.org/en-US/observatory") && + !href.startsWith("https://developer.mozilla.org/en-US/blog/") + ) { + // It might be a working 200 OK link but the link just shouldn't + // have the full absolute URL part in it. + const absoluteURL = new URL(href); + addBrokenLink( + a, + checked.get(href), + href, + absoluteURL.pathname + absoluteURL.search + absoluteURL.hash + ); + } else if (isHomepageURL(hrefNormalized)) { + // But did you spell it perfectly? + const homepageLocale = hrefNormalized.split("/")[1]; + if ( + hrefNormalized !== "/" && + (VALID_LOCALES.get(homepageLocale.toLowerCase()) !== homepageLocale || + !hrefNormalized.endsWith("/")) + ) { + addBrokenLink( + a, + checked.get(href), + href, + `/${VALID_LOCALES.get(homepageLocale.toLowerCase())}/` + ); + } + } else if (hrefNormalized.toLowerCase() === doc.mdn_url.toLowerCase()) { + if (hrefSplit.length > 1) { + addBrokenLink( + a, + checked.get(href), + href, + `#${hrefSplit[1]}`, + "No need for the pathname in anchor links if it's the same page", + null, + true + ); + } else { + addBrokenLink( + a, + checked.get(href), + href, + null, + "Link points to the page it's already on", + null, + true + ); + } + } else if ( + href.startsWith("/") && + !href.startsWith("//") && + !/^\/(discord|en-US\/(blog|curriculum|observatory))(\/|$)/.test(href) + ) { + // Got to fake the domain to sensible extract the .search and .hash + const absoluteURL = new URL(href, "http://www.example.com"); + const found = Document.findByURL(hrefNormalized); + if (!found) { + // Before we give up, check if it's an attachment. + if (!FileAttachment.findByURLWithFallback(hrefNormalized)) { + // Even if it's a redirect, it's still a flaw, but it'll be nice to + // know what it *should* be. + const resolved = Redirect.resolve(hrefNormalized); + if (resolved !== hrefNormalized) { + addBrokenLink( + a, + checked.get(href), + href, + resolved + absoluteURL.search + absoluteURL.hash.toLowerCase() + ); + } else { + // Test if the document is a translated document and the link isn't + // to an en-US URL. We know the link is broken (in this locale!) + // but it might be "salvageable" if we link the en-US equivalent. + // This is, by the way, the same trick the `web.smartLink()` utility + // function does in kumascript rendering. + if ( + doc.locale !== DEFAULT_LOCALE && + href.startsWith(`/${doc.locale}/`) + ) { + // What if you swich to the English link; would th link work + // better then? + const enUSHrefNormalized = hrefNormalized.replace( + `/${doc.locale}/`, + `/${DEFAULT_LOCALE}/` + ); + const enUSFound = Document.findByURL(enUSHrefNormalized); + // Note, we still recommend that contributors use localized links, + // even if the target document is still not localized. + if (enUSFound) { + // Found the en-US version of the document. Just link to that. + mutateLink(a, null, enUSFound.url); + } else { + const enUSResolved = Redirect.resolve(enUSHrefNormalized); + let suggestion = null; + let enUSFallbackURL = null; + if (enUSResolved !== enUSHrefNormalized) { + enUSFallbackURL = + enUSResolved + + absoluteURL.search + + absoluteURL.hash.toLowerCase(); + suggestion = enUSFallbackURL.replace( + `/${DEFAULT_LOCALE}/`, + `/${doc.locale}/` + ); + } + addBrokenLink( + a, + checked.get(href), + href, + suggestion, + null, + enUSFallbackURL + ); + } + } else { + // The link is broken and we don't have a suggestion. + addBrokenLink(a, checked.get(href), href); + } + } + } + // But does it have the correct case?! + } else if (found.url !== href.split("#")[0]) { + // Inconsistent case. + addBrokenLink( + a, + checked.get(href), + href, + found.url + absoluteURL.search + absoluteURL.hash.toLowerCase() + ); + } else if (hrefSplit.length > 1) { + const hash = hrefSplit[1]; + checkHash(hash, a, href); + } + } else if (href.startsWith("#")) { + const hash = href.split("#")[1]; + checkHash(hash, a, href); + } + }); + + return flaws; +} diff --git a/vendor/yari/build/flaws/heading-links.ts b/vendor/yari/build/flaws/heading-links.ts new file mode 100644 index 000000000..e6cf99bc2 --- /dev/null +++ b/vendor/yari/build/flaws/heading-links.ts @@ -0,0 +1,67 @@ +import { findMatchesInText } from "../matches.js"; +import * as cheerio from "cheerio"; +import { Doc } from "../../libs/types/document.js"; +import { Flaw } from "./index.js"; + +// You're not allowed to have `` elements inside `

` or `

` elements +// because those will be rendered out as "links to themselves". +// I.e. a source of `

Foo

` renders out as: +// `

Foo

` in the final HTML. That makes +// it easy to (perma)link to specific headings in the document. +export function getHeadingLinksFlaws( + doc: Partial, + $: cheerio.CheerioAPI, + { rawContent } +) { + const flaws: Flaw[] = []; + + $("h2 a, h3 a").each((i, element) => { + const id = `heading_links${flaws.length + 1}`; + const explanation = `${ + $(element).parent().get(0).tagName + } heading contains an tag`; + const before = $(element).parent().html(); + let suggestion = null; + // If the only element within the heading's HTML is 1 single + // then, we can simply replace the whole heading's HTML with the text of it. + if ( + $("a", $(element).parent()).length === 1 && + $("*", $(element).parent()).length === 1 + ) { + suggestion = $(element).parent().text(); + } + let line = null; + let column = null; + // If the heading has an ID we can search for it in the rawContent. + for (const { line: foundLine, column: foundColumn } of findMatchesInText( + before, + rawContent + )) { + line = foundLine; + column = foundColumn; + // This makes sure the column is *after* the ID value (plus quotation mark) + if ($(element).parent().attr("id")) { + column += $(element).parent().attr("id").length + 2; + } + } + // It's never fixable because it's too hard to find in the raw HTML. + const fixable = false; + const html = $.html($(element).parent()); + const flaw = { + explanation, + id, + before, + fixable, + html, + suggestion, + line, + column, + }; + if (suggestion) { + $(element).parent().html(suggestion); + } + flaws.push(flaw); + }); + + return flaws; +} diff --git a/vendor/yari/build/flaws/index.ts b/vendor/yari/build/flaws/index.ts new file mode 100644 index 000000000..66a2ddf31 --- /dev/null +++ b/vendor/yari/build/flaws/index.ts @@ -0,0 +1,316 @@ +import path from "node:path"; +import chalk from "chalk"; + +import { Document } from "../../content/index.js"; +import { + FLAW_LEVELS, + VALID_FLAW_CHECKS, + DEFAULT_LOCALE, +} from "../../libs/constants/index.js"; +import { + replaceMatchesInText, + replaceMatchingLinksInMarkdown, +} from "../matches.js"; +import { forceExternalURL, downloadAndResizeImage } from "../utils.js"; +import { getBadBCDQueriesFlaws } from "./bad-bcd-queries.js"; +import { getBrokenLinksFlaws } from "./broken-links.js"; +import { getHeadingLinksFlaws } from "./heading-links.js"; +import { getPreTagFlaws } from "./pre-tags.js"; +export { injectSectionFlaws } from "./sections.js"; +import { getUnsafeHTMLFlaws } from "./unsafe-html.js"; +import { injectTranslationDifferences } from "./translation-differences.js"; +import * as cheerio from "cheerio"; +import { Doc } from "../../libs/types/document.js"; + +export interface Flaw { + explanation: any; + id: any; + fixable?: any; + html?: any; + suggestion: any; + type?: any; + line?: any; + column?: any; + difference?: any; +} + +type GetFlawsFunction = ( + doc: Partial, + $: cheerio.CheerioAPI, + document: any, + level: any +) => Flaw[]; + +export function injectFlaws( + doc: Partial, + $: cheerio.CheerioAPI, + options, + document +) { + const flawChecks: Array<[string, GetFlawsFunction, boolean]> = [ + ["unsafe_html", getUnsafeHTMLFlaws, false], + ["broken_links", getBrokenLinksFlaws, true], + ["bad_bcd_queries", getBadBCDQueriesFlaws, false], + ["bad_pre_tags", getPreTagFlaws, false], + ["heading_links", getHeadingLinksFlaws, false], + ]; + if (doc.locale !== DEFAULT_LOCALE && doc.isActive) { + flawChecks.push([ + "translation_differences", + injectTranslationDifferences, + false, + ]); + } + + // Note that some flaw checking functions need to always run. Even if we're not + // recording the flaws, the checks that it does are important for regular + // building. + + for (const [flawName, func, alwaysRun] of flawChecks) { + // Sanity check the list of flaw names that they're all recognized. + // Basically a cheap enum check. + if (!VALID_FLAW_CHECKS.has(flawName)) { + throw new Error(`'${flawName}' is not a valid flaw check name`); + } + + const level = options.flawLevels.get(flawName); + if (!alwaysRun && level === FLAW_LEVELS.IGNORE) { + continue; + } + + // The flaw injection function will mutate the `doc.flaws` object. + const flaws = func(doc, $, document, level); + if (flaws.length > 0) { + doc.flaws[flawName] = flaws; + } + + if (level === FLAW_LEVELS.ERROR && flaws.length > 0) { + // To make the stdout output a bit more user-friendly, print one warning + // for each explanation + flaws.forEach((flaw, i) => { + console.warn( + i + 1, + chalk.yellow(`${chalk.bold(flawName)} flaw: ${flaw.explanation}`) + ); + }); + throw new Error(`${doc.flaws[flawName].length} ${flawName} flaws`); + } + } +} + +export async function fixFixableFlaws(doc: Partial, options, document) { + if (!options.fixFlaws) return; + + const { rawBody, isMarkdown } = document; + + // String copy so we can mutate it + let newRawBody = rawBody; + + const phrasing = options.fixFlawsDryRun ? "Would fix" : "Fixed"; + + const loud = options.fixFlawsDryRun || options.fixFlawsVerbose; + + if (options.fixFlawsTypes.has("macros")) { + // Any 'macros' of type "MacroRedirectedLinkError" or "MacroDeprecatedError"... + for (const flaw of doc.flaws.macros || []) { + if (flaw.fixable) { + // Sanity check that our understanding of flaws, filepaths, and sources + // work as expected. + if (!newRawBody.includes(flaw.macroSource)) { + throw new Error( + `rawBody doesn't contain macroSource (${flaw.macroSource})` + ); + } + const newMacroSource = flaw.suggestion; + if (isMarkdown) { + console.log( + chalk.yellow( + "Fixing flaws in Markdown is only partially implemented" + ) + ); + } + // Remember, in JavaScript only the first occurrence will be replaced. + newRawBody = newRawBody.replace(flaw.macroSource, newMacroSource); + if (loud) { + console.log( + chalk.grey( + `${phrasing} (${flaw.id}) macro ${chalk.white.bold( + flaw.macroSource + )} to ${chalk.white.bold(newMacroSource)}` + ) + ); + } + } + } + } + + if (options.fixFlawsTypes.has("broken_links")) { + // Any 'broken_links' with a suggestion... + for (const flaw of doc.flaws.broken_links || []) { + if (!flaw.suggestion) { + continue; + } + // XXX MARKDOWN + // The reason we're not using the parse HTML, as a cheerio object `$` + // is because the raw HTML we're dealing with isn't actually proper + // HTML. It's only proper HTML when the kumascript macros have been + // expanded. + if (isMarkdown) { + console.log( + chalk.yellow("Fixing flaws in Markdown is only partially implemented") + ); + newRawBody = replaceMatchingLinksInMarkdown( + flaw.href, + newRawBody, + flaw.suggestion + ); + } else { + newRawBody = replaceMatchesInText( + flaw.href, + newRawBody, + flaw.suggestion, + { + inAttribute: "href", + } + ); + } + if (loud) { + console.log(document.url); + console.log( + chalk.grey( + `${phrasing} (${flaw.id}) broken_link ${chalk.white.bold( + flaw.href + )} to ${chalk.white.bold(flaw.suggestion)}` + ) + ); + } + } + } + + if (options.fixFlawsTypes.has("bad_pre_tags") && !isMarkdown) { + // Any 'bad_pre_tags' with a suggestion... + for (const flaw of doc.flaws.bad_pre_tags || []) { + if (!flaw.suggestion || !flaw.fixable) { + continue; + } + + if (!newRawBody.includes(flaw.html)) { + throw new Error(`rawBody doesn't contain flaw HTML (${flaw.html})`); + } + // It's not feasible to pin point exactly which `
` tag this
+      // refers to, so do the same query we use when we find the
+      // flaw, but this time actually make the mutation.
+      newRawBody = newRawBody.replace(flaw.html, flaw.suggestion);
+      if (loud) {
+        console.log(chalk.grey(`${phrasing} (${flaw.id}) bad_pre_tags`));
+      }
+    }
+  }
+
+  if (options.fixFlawsTypes.has("images") && !isMarkdown) {
+    // Any 'images' flaws with a suggestion or external image...
+    for (const flaw of doc.flaws.images || []) {
+      if (!(flaw.suggestion || flaw.externalImage)) {
+        continue;
+      }
+      // The reason we're not using the parse HTML, as a cheerio object `$`
+      // is because the raw HTML we're dealing with isn't actually proper
+      // HTML. It's only proper HTML when the kumascript macros have been
+      // expanded.
+      let newSrc;
+      if (flaw.suggestion) {
+        newSrc = flaw.suggestion;
+      } else {
+        // Sanity check that it's an external image
+        const url = new URL(forceExternalURL(flaw.src));
+        if (url.protocol !== "https:") {
+          throw new Error(`Insecure image URL ${flaw.src}`);
+        }
+        try {
+          const decodedPathname = decodeURI(url.pathname).replace(/\s+/g, "_");
+          const basePath = Document.getFolderPath(document.metadata);
+          const destination = await downloadAndResizeImage(
+            flaw.src,
+            decodedPathname,
+            basePath
+          );
+          console.log(`Downloaded ${flaw.src} to ${destination}`);
+          newSrc = path.basename(destination);
+        } catch (error) {
+          console.error(error);
+          throw error;
+        }
+      }
+      newRawBody = replaceMatchesInText(flaw.src, newRawBody, newSrc, {
+        inAttribute: "src",
+      });
+      if (loud) {
+        console.log(
+          chalk.grey(
+            `${phrasing} (${flaw.id}) image ${chalk.white.bold(
+              flaw.src
+            )} to ${chalk.white.bold(newSrc)}`
+          )
+        );
+      }
+    }
+  }
+
+  if (options.fixFlawsTypes.has("image_widths") && !isMarkdown) {
+    // Any 'image_widths' flaws with a suggestion
+    for (const flaw of doc.flaws.image_widths || []) {
+      if (!flaw.fixable) {
+        continue;
+      }
+      newRawBody = replaceMatchesInText(
+        flaw.style,
+        newRawBody,
+        flaw.suggestion,
+        {
+          inAttribute: "style",
+          removeEntireAttribute: flaw.suggestion === "",
+        }
+      );
+      if (loud) {
+        console.log(
+          flaw.suggestion === ""
+            ? chalk.grey(
+                `${phrasing} (${flaw.id}) image_widths ${chalk.white.bold(
+                  "remove entire 'style' attribute"
+                )}`
+              )
+            : chalk.grey(
+                `${phrasing} (${
+                  flaw.id
+                }) image_widths style="${chalk.white.bold(
+                  flaw.style
+                )}" to style="${chalk.white.bold(flaw.suggestion)}"`
+              )
+        );
+      }
+    }
+  }
+
+  // Finally, summarized what happened...
+  if (newRawBody !== rawBody) {
+    // It changed the raw HTML of the source. So deal with this.
+    if (options.fixFlawsDryRun && options.fixFlawsVerbose) {
+      console.log(
+        chalk.yellow(
+          `Would modify "${document.fileInfo.path}" from fixable flaws.`
+        )
+      );
+    } else {
+      await Document.update(document.url, newRawBody, document.metadata);
+      if (options.fixFlawsVerbose) {
+        console.log(
+          chalk.green(
+            `Modified "${chalk.bold(
+              document.fileInfo.path
+            )}" from fixable flaws.`
+          )
+        );
+      }
+    }
+  }
+}
diff --git a/vendor/yari/build/flaws/pre-tags.ts b/vendor/yari/build/flaws/pre-tags.ts
new file mode 100644
index 000000000..ea64396a8
--- /dev/null
+++ b/vendor/yari/build/flaws/pre-tags.ts
@@ -0,0 +1,111 @@
+import { Flaw } from "./index.js";
+
+import { getFirstMatchInText } from "../matches.js";
+import * as cheerio from "cheerio";
+import { Doc } from "../../libs/types/document.js";
+const escapeHTML = (s: string) =>
+  s
+    .replace(/&/g, "&")
+    .replace(/"/g, """)
+    .replace(//g, ">");
+
+export function getPreTagFlaws(
+  doc: Partial,
+  $: cheerio.CheerioAPI,
+  { rawContent }
+) {
+  const flaws: Flaw[] = [];
+
+  // Over the years, we've accumulated a lot of Kuma-HTML where the 
 tags
+  // are actually full of HTML. Almost exclusively we've observed 
 tags whose
+  // content is the HTML produced by Prism in the browser. Instead, in these cases,
+  // we should just have the code that it will syntax highlight.
+  // Note! Having HTML in a 
 tag is nothing weird or wrong. But if you have
+  //
+  //  
+  //    
+  //     foo
+  //   
+  //  
+ // + // It's better just have the text itself inside the
 block:
+  //  
+  //    foo
+  //  
+ // + // This makes it easier to edit the code in raw form. It also makes it less + // heavy because any HTML will be replaced with Prism HTML anyway. + function addCodeTagFlaw($pre: cheerio.Cheerio) { + const id = `bad_pre_tags${flaws.length + 1}`; + const type = "pre_with_html"; + const explanation = `
CODE can be just 
CODE`;
+    const suggestion = escapeHTML($pre.text());
+
+    let fixable = false;
+    let html = $pre.html();
+    if (rawContent.includes(html)) {
+      fixable = true;
+    } else {
+      // Many times, the HTML found in the sources is what Cheerio would
+      // serialize as HTML but with the small difference that some entities
+      // are unnecessarily HTML encoded as entities. So, we try to ignore
+      // that and see if we can match it as serialized.
+      const htmlFixed = html.replace(/'/g, "'");
+      if (rawContent.includes(htmlFixed)) {
+        html = htmlFixed;
+        fixable = true;
+      }
+    }
+
+    const flaw: Flaw = { explanation, id, fixable, html, suggestion, type };
+    if (fixable) {
+      // Only if it's fixable, is the `html` perfectly findable in the raw content.
+      const { line, column } = getFirstMatchInText(html, rawContent);
+      flaw.line = line;
+      flaw.column = column;
+    }
+
+    // Actually mutate the cheerio instance so we benefit from the
+    // flaw detection immediately.
+    // Note that `$pre.text()` might contain unescaped HTML, but Cheerio will
+    // take care of that.
+    $pre.html(suggestion); // strips all other HTML but preserves whitespace
+    $pre.attr("data-flaw", id);
+
+    flaws.push(flaw);
+  }
+
+  // Matches all  that are preceded by
+  // a 
+  // Note, when we (in Node) syntax highlight code, the first thing
+  // we look for is the `$("pre[class*=brush]")` selector.
+  // Note, in jQuery you can do `$("pre + code")` which means it only selects
+  // the `` tags that are *immediately preceeding*. This is not supported
+  // in Cheerio :( but the `>` operator works. And since we're only looking
+  // at a specific classname on the 
 the chances of picking up the wrong
+  // selectors is small.
+  $("pre[class*=brush] > code").each((i, element) => {
+    const $pre = $(element).parent();
+    // Because Cheerio doesn't support selectors like `pre + code` we have to
+    // manually (double) check that the parent really is a `
` tag.
+    if ($pre.length && $pre.get(0).tagName === "pre") {
+      addCodeTagFlaw($pre);
+    }
+  });
+
+  // TODO: Add other 
 tag flaws underneath.
+  // We report only a single kind of fixable flaw at a time, since
+  // flaws are fixed by replacing raw HTML strings (so fixing the first
+  // fixable flaw might prevent fixing the second fixable flaw)
+  // For details see:
+  //   https://github.com/mdn/yari/pull/2144#issuecomment-748346489
+  //
+  // Also, make sure iterate over the document synchroneously,
+  // e.g., with $().each(), or await for all Promises before moving on to the next flaw.
+  if (flaws.some((flaw) => !flaw.fixable)) {
+    // one more flaw check here
+  }
+
+  return flaws;
+}
diff --git a/vendor/yari/build/flaws/safe-to-https-domains.json b/vendor/yari/build/flaws/safe-to-https-domains.json
new file mode 100644
index 000000000..795840f82
--- /dev/null
+++ b/vendor/yari/build/flaws/safe-to-https-domains.json
@@ -0,0 +1,505 @@
+{
+  "www.mozilla.org": true,
+  "groups.google.com": true,
+  "schepers.cc": false,
+  "stackoverflow.com": true,
+  "ecma-international.org": true,
+  "www.sencha.com": true,
+  "schema.org": true,
+  "scrawl.rikweb.org.uk": true,
+  "unicode.org": true,
+  "gpac.wp.mines-telecom.fr": true,
+  "www.csstutorial.net": true,
+  "docs.oracle.com": true,
+  "example.com": true,
+  "asmjs.org": false,
+  "www.iana.org": true,
+  "pouchdb.com": true,
+  "www.youtube.com": true,
+  "hsivonen.iki.fi": true,
+  "webkit.org": true,
+  "easings.net": true,
+  "www.videojs.com": true,
+  "2017.js13kgames.com": true,
+  "www.w3.org": true,
+  "www.double.co.nz": false,
+  "mdn.beonex.com": true,
+  "html5doctor.com": true,
+  "blog.danielfriesen.name": true,
+  "www.quirksmode.org": true,
+  "0xfe.blogspot.com": true,
+  "www-archive.mozilla.org": true,
+  "zimjs.com": true,
+  "bugzilla.mozilla.org": true,
+  "aurelio.audero.it": true,
+  "www.exslt.org": false,
+  "diveintohtml5.info": false,
+  "reference.sitepoint.com": true,
+  "brucelindbloom.com": false,
+  "web.archive.org": true,
+  "hacks.mozilla.org": true,
+  "dlmf.nist.gov": true,
+  "tokenposts.blogspot.com.au": true,
+  "videogamejournaliser.com": false,
+  "meta.wikimedia.org": true,
+  "glmatrix.net": true,
+  "www.inkscape.org": true,
+  "www.inftyreader.org": true,
+  "www.ietf.org": true,
+  "selectivizr.com": false,
+  "en.wikiversity.org": true,
+  "www.bbc.co.uk": true,
+  "cve.mitre.org": true,
+  "searchfox.org": true,
+  "whereswalden.com": true,
+  "updates.html5rocks.com": false,
+  "www.croczilla.com": false,
+  "gridbyexample.com": true,
+  "zenphoton.com": true,
+  "lbsyun.baidu.com": true,
+  "www.khronos.org": true,
+  "jsconsole.com": true,
+  "dev-test.nemikor.com": false,
+  "www.mergevr.com": true,
+  "www.html5rocks.com": true,
+  "www.ecma-international.org": true,
+  "wiki.codetalks.org": false,
+  "dbaron.org": true,
+  "accessfirefox.com": false,
+  "jwatt.org": true,
+  "www.fontsquirrel.com": true,
+  "paulirish.com": true,
+  "pubs.opengroup.org": true,
+  "dmitrysoshnikov.com": false,
+  "www.isg.rhul.ac.uk": true,
+  "www.smartjava.org": true,
+  "fitzgeraldnick.com": true,
+  "www.colorzilla.com": true,
+  "msopentech.com": false,
+  "www.flumotion.net": false,
+  "wiki.csswg.org": true,
+  "ffmpeg.org": true,
+  "nginx-rtmp.blogspot.it": true,
+  "trac.webkit.org": true,
+  "openid.net": true,
+  "www.brendangregg.com": false,
+  "qnimate.com": false,
+  "lists.w3.org": true,
+  "www.chromium.org": true,
+  "greensock.com": true,
+  "datatracker.ietf.org": true,
+  "firefogg.org": false,
+  "wiki.svg.org": false,
+  "houdini.glitch.me": true,
+  "svg-whiz.com": false,
+  "www.mattgreer.org": true,
+  "jointjs.com": true,
+  "www.wirfs-brock.com": false,
+  "tomrothe.de": true,
+  "raphaeljs.com": true,
+  "gva.noekeon.org": false,
+  "www1.chapman.edu": false,
+  "lawrencemandel.com": true,
+  "timepicker.co": true,
+  "razvancaliman.com": false,
+  "css-tricks.com": true,
+  "webvr.directory": true,
+  "sandbox.photonstorm.com": false,
+  "yuiblog.com": false,
+  "floating-point-gui.de": true,
+  "math.etsu.edu": true,
+  "toolbar.netcraft.com": true,
+  "dev.opera.com": true,
+  "www.bebits.com": false,
+  "www.websiteoptimization.com": false,
+  "windows.microsoft.com": true,
+  "mobile.smashingmagazine.com": true,
+  "www.faqs.org": false,
+  "usabilitypost.com": true,
+  "www.go-oo.org": false,
+  "dev.w3.org": true,
+  "www.404notfound.fr": false,
+  "googledevelopers.blogspot.ca": true,
+  "www.useit.com": false,
+  "dsheiko.com": true,
+  "eloquentjavascript.net": true,
+  "paperjs.org": false,
+  "forum.komodoide.com": false,
+  "unicode-table.com": true,
+  "jinja.pocoo.org": false,
+  "www.zvon.org": false,
+  "mdn.github.io": true,
+  "jquery.com": true,
+  "webauthndemo.appspot.com": true,
+  "csrc.nist.gov": true,
+  "httpd.apache.org": true,
+  "tinyurl.com": true,
+  "bikeshed.com": true,
+  "www.xml.com": true,
+  "feature-policy-demos.appspot.com": true,
+  "uxdesign.com": false,
+  "addons.mozilla.org": true,
+  "www.opera.com": true,
+  "jPlayer.org": true,
+  "maps.google.com": true,
+  "www.blender.org": true,
+  "www.samsung.com": true,
+  "es6console.com": true,
+  "www.objectplayground.com": false,
+  "developer.apple.com": true,
+  "www.voiceage.com": false,
+  "www.opensearch.org": true,
+  "rajudasa.blogspot.in": true,
+  "cedato.com": true,
+  "api.jquery.com": true,
+  "www.paulirish.com": true,
+  "golem.ph.utexas.edu": true,
+  "lesscss.org": true,
+  "www.nvda-project.org": false,
+  "www.rfc-editor.org": true,
+  "www.csszengarden.com": false,
+  "lachy.id.au": true,
+  "www.createjs.com": true,
+  "java.sun.com": true,
+  "www.codedread.com": true,
+  "docs.phaser.io": false,
+  "www.stevesouders.com": true,
+  "ogp.me": true,
+  "gyu.que.jp": false,
+  "ckeditor.com": true,
+  "www.alistapart.com": true,
+  "www.aptana.com": false,
+  "ted.mielczarek.org": true,
+  "www.upu.int": true,
+  "blog.mozilla.com": true,
+  "ftp.mozilla.org": true,
+  "blog.agektmr.com": true,
+  "docs.google.com": true,
+  "www.dogtagpki.org": true,
+  "www.pitivi.org": false,
+  "developer.android.com": true,
+  "offlinefirst.org": false,
+  "www.dexie.org": true,
+  "perfectionkills.com": false,
+  "sublimevideo.net": true,
+  "www.the-pope.com": false,
+  "support.mozillamessaging.com": true,
+  "mathworld.wolfram.com": true,
+  "support.mozilla.com": true,
+  "msdn2.microsoft.com": true,
+  "gogogadgetscott.info": false,
+  "wiki.c2.com": true,
+  "wiki.mozilla.org": true,
+  "blog.chromium.org": true,
+  "web.mit.edu": true,
+  "cssgridgarden.com": true,
+  "www.base64-image.de": true,
+  "mediaelementjs.com": false,
+  "webaim.org": true,
+  "bugs.firefox-dev.tools": true,
+  "tracker.com": false,
+  "www.currency-iso.org": true,
+  "www.jwplayer.com": true,
+  "www.ctan.org": true,
+  "gstreamer.freedesktop.org": true,
+  "adrianroselli.com": true,
+  "developer.yahoo.com": true,
+  "www.songho.ca": true,
+  "bugzil.la": true,
+  "threejs.org": true,
+  "jibbering.com": true,
+  "accessibleajax.clcworld.net": false,
+  "support.apple.com": true,
+  "www.lutanho.net": false,
+  "www.typescriptlang.org": true,
+  "fontsgeek.com": true,
+  "accessify.com": true,
+  "developers.whatwg.org": true,
+  "code.google.com": true,
+  "alistapart.com": true,
+  "www.bluegriffon.com": false,
+  "www.sublimevideo.net": true,
+  "babeljs.io": true,
+  "www.cnet.com": true,
+  "plurib.us": true,
+  "svg-wow.org": false,
+  "www.commonjs.org": false,
+  "demo.huihoo.com": true,
+  "www.unicode.org": true,
+  "stuff.mit.edu": true,
+  "ready.to": true,
+  "www.html5accessibility.com": true,
+  "crbug.com": true,
+  "felixniklas.com": true,
+  "www.squarefree.com": true,
+  "simpl.info": true,
+  "www.apple.com": true,
+  "chromium.googlecode.com": true,
+  "www.dyn4j.org": true,
+  "skillsmatter.com": true,
+  "www.glge.org": false,
+  "creativecommons.org": true,
+  "dashif.org": true,
+  "dvcs.w3.org": true,
+  "mathscribe.com": true,
+  "tripleodeon.com": true,
+  "thejit.org": true,
+  "www.adobe.com": true,
+  "peter.sh": true,
+  "www.jenitennison.com": true,
+  "net.tutsplus.com": true,
+  "speak-demo.herokuapp.com": true,
+  "uk.video.yahoo.com": true,
+  "clang.llvm.org": true,
+  "pieisgood.org": true,
+  "requirejs.org": true,
+  "hyperaud.io": true,
+  "www.pixijs.com": true,
+  "openfontlibrary.org": true,
+  "www.peachpit.com": true,
+  "www.cs.tut.fi": true,
+  "codepen.io": true,
+  "lbs.qq.com": true,
+  "www.brettjankord.com": true,
+  "eilv.cie.co.at": false,
+  "nchc.dl.sourceforge.net": true,
+  "audiocogs.org": false,
+  "download.smedley.info": false,
+  "webglfundamentals.org": true,
+  "www.yoctopuce.com": true,
+  "www.bbc.com": true,
+  "www.softwareishard.com": false,
+  "davidwalsh.name": true,
+  "pixelscommander.com": false,
+  "www.seamonkey-project.org": true,
+  "www-106.ibm.com": true,
+  "learningbabylonjs.com": false,
+  "htmldog.com": true,
+  "standardista.com": false,
+  "www.yappy.it": false,
+  "www.cablelabs.com": true,
+  "mathcs.chapman.edu": true,
+  "www.whatwg.org": true,
+  "www.openoffice.org": true,
+  "www.mirovideoconverter.com": false,
+  "www.2ality.com": true,
+  "www.nongnu.org": true,
+  "socketcluster.io": true,
+  "innolitics.com": true,
+  "mp4ra.org": true,
+  "praegnanz.de": true,
+  "mathiasbynens.be": true,
+  "jplayer.org": true,
+  "www.w3clubs.com": true,
+  "jsonbeautifier.org": true,
+  "xmlgraphics.apache.org": true,
+  "www.color.org": true,
+  "www.example.com": true,
+  "blogs.msdn.com": true,
+  "js13kgames.com": true,
+  "jsxgraph.uni-bayreuth.de": true,
+  "www.webglacademy.com": false,
+  "www.redhat.com": true,
+  "joshondesign.com": true,
+  "exploringjs.com": true,
+  "mediapm.edgesuite.net": false,
+  "brew.sh": true,
+  "www.htmlhelp.com": true,
+  "getfirebug.com": true,
+  "nightly.mozilla.org": true,
+  "ImageMagick.org": true,
+  "ie.microsoft.com": false,
+  "teamgiraffe.co.uk": false,
+  "labs.jensimmons.com": true,
+  "hevc.info": false,
+  "nodejs.org": true,
+  "go-oo.org": false,
+  "www.davidflanagan.com": true,
+  "cubic-bezier.com": true,
+  "www.leanbackplayer.com": true,
+  "m.flickr.com": true,
+  "callbackhell.com": false,
+  "www.addyosmani.com": true,
+  "fabricjs.com": false,
+  "getbem.com": false,
+  "bennettfeely.com": true,
+  "a11y-style-guide.com": true,
+  "pki.fedoraproject.org": true,
+  "promisesaplus.com": true,
+  "www.gtalbot.org": true,
+  "de.slideshare.net": true,
+  "libreoffice.org": true,
+  "webglplayground.net": false,
+  "www.microsoft.com": true,
+  "www.svgbasics.com": false,
+  "oos.moxiecode.com": false,
+  "csstriggers.com": true,
+  "www.gwhitworth.com": true,
+  "xregexp.com": true,
+  "www.themaninblue.com": true,
+  "software.hixie.ch": true,
+  "robert.ocallahan.org": true,
+  "www.streamingmedia.com": true,
+  "www.unece.org": true,
+  "www.jitbit.com": true,
+  "www.totaljs.com": true,
+  "www.gnome.org": true,
+  "www.xiph.org": true,
+  "plyr.io": true,
+  "www.codicode.com": true,
+  "www.webkit.org": true,
+  "www.lukew.com": true,
+  "slimjs.com": true,
+  "ondras.zarovi.cz": true,
+  "bucephalus.org": true,
+  "engineering.silk.co": true,
+  "handbrake.fr": true,
+  "tylerfinck.com": true,
+  "www.dotnet247.com": true,
+  "www.codecademy.com": true,
+  "my.opera.com": true,
+  "mozakai.blogspot.com": true,
+  "fedoraproject.org": true,
+  "inria.fr": true,
+  "tools.ietf.org": true,
+  "www.keio.ac.jp": true,
+  "mango.blender.org": true,
+  "www.muazkhan.com": true,
+  "betterexplained.com": true,
+  "www.sitepoint.com": true,
+  "www-xray.ast.cam.ac.uk": true,
+  "www.slideshare.net": true,
+  "www.lg.com": true,
+  "www.nczonline.net": true,
+  "html5demos.com": true,
+  "www.modernizr.com": true,
+  "www.widevine.com": true,
+  "www-itec.uni-klu.ac.at": true,
+  "help.adobe.com": true,
+  "modernizr.com": true,
+  "www.useragentman.com": true,
+  "wayback.archive.org": true,
+  "www.delphiki.com": true,
+  "www.evolt.org": true,
+  "httpwg.org": true,
+  "store.steampowered.com": true,
+  "unstoppablerobotninja.com": true,
+  "w3.org": true,
+  "www.kevinroth.com": true,
+  "curl.haxx.se": true,
+  "m.facebook.com": true,
+  "www.oracle.com": true,
+  "www.kb.cert.org": true,
+  "download.java.net": true,
+  "www.getmiro.com": true,
+  "www.mulberrytech.com": true,
+  "www.streamingmediaglobal.com": true,
+  "www.itu.int": true,
+  "m.youtube.com": true,
+  "soledadpenades.com": true,
+  "people.mozilla.org": true,
+  "dom.spec.whatwg.org": true,
+  "svg.org": true,
+  "encoding.spec.whatwg.org": true,
+  "duriansoftware.com": true,
+  "ev.buaa.edu.cn": true,
+  "html5.org": true,
+  "intercoolerjs.org": true,
+  "videojs.com": true,
+  "www.lyx.org": true,
+  "www.html5canvastutorials.com": true,
+  "www.firemath.info": true,
+  "coffeescript.org": true,
+  "docs.aws.amazon.com": true,
+  "jvectormap.com": true,
+  "www.icecast.org": true,
+  "lea.verou.me": true,
+  "www.earlevel.com": true,
+  "mulberrytech.com": true,
+  "dash-mse-test.appspot.com": true,
+  "www.sintel.org": true,
+  "nerget.com": true,
+  "en.flossmanuals.net": true,
+  "www.meyerweb.com": true,
+  "library.gnome.org": true,
+  "cssmenumaker.com": true,
+  "www.testufo.com": true,
+  "m.vid.ly": true,
+  "wikiversity.org": true,
+  "tink.uk": true,
+  "www.via-corp.com": true,
+  "soundbible.com": true,
+  "www.dspguide.com": true,
+  "carto.net": true,
+  "www.hixie.ch": true,
+  "emberjs.com": true,
+  "signalr.net": true,
+  "www.google.com": true,
+  "dropshado.ws": true,
+  "www.thomasfrank.se": true,
+  "luca.ntop.org": true,
+  "webglsamples.org": true,
+  "carlosrafaelgn.com.br": true,
+  "blog.kylehuey.com": true,
+  "earth-info.nga.mil": true,
+  "www6.software.ibm.com": true,
+  "processingjs.org": true,
+  "cdn.rawgit.com": true,
+  "www.mathjax.org": true,
+  "sass-lang.com": true,
+  "www.ffmpeg.org": true,
+  "v2v.cc": true,
+  "www.peej.co.uk": true,
+  "webglreport.com": true,
+  "jsstore.net": true,
+  "javascriptweblog.wordpress.com": true,
+  "glitch.com": true,
+  "angularjs.org": true,
+  "html.spec.whatwg.org": true,
+  "couchdb.apache.org": true,
+  "www.i18nguy.com": false,
+  "diagramcenter.org": false,
+  "www-cs-students.stanford.edu": false,
+  "www.dria.org": false,
+  "users.skynet.be": false,
+  "browserify.org": false,
+  "brackets.io": false,
+  "velocityjs.org": false,
+  "1997.webhistory.org": false,
+  "www.codelobster.com": false,
+  "smacss.com": false,
+  "csslint.net": false,
+  "www.auraluxgame.com": false,
+  "adaptive-images.com": false,
+  "www.html.net": false,
+  "abisource.org": false,
+  "www.jsondiff.com": false,
+  "daniemon.com": false,
+  "qutoric.com": false,
+  "camendesign.com": false,
+  "info.cern.ch": false,
+  "xml.coverpages.org": false,
+  "www.deafblind.com": false,
+  "www.passani.it": false,
+  "browsershots.org": false,
+  "www.stubbornella.org": false,
+  "eyeasme.com": false,
+  "corber.io": false,
+  "ogldev.atspace.co.uk": false,
+  "www.chromevox.com": false,
+  "disruptive-innovations.com": false,
+  "mkweb.bcgsc.ca": false,
+  "www.vision-and-eye-health.com": false,
+  "getskeleton.com": false,
+  "snapsvg.io": false,
+  "compass-style.org": false,
+  "videogamecaster.com": false,
+  "www.zibbo.com": false,
+  "www.javascriptkit.com": false,
+  "www.7zip.org": false,
+  "flask.pocoo.org": false,
+  "chaijs.com": false,
+  "www.schillmania.com": false,
+  "www.os2bbs.com": false,
+  "es6-features.org": false
+}
diff --git a/vendor/yari/build/flaws/sections.ts b/vendor/yari/build/flaws/sections.ts
new file mode 100644
index 000000000..3458323d3
--- /dev/null
+++ b/vendor/yari/build/flaws/sections.ts
@@ -0,0 +1,17 @@
+import { FLAW_LEVELS } from "../../libs/constants/index.js";
+
+export function injectSectionFlaws(doc, flaws, options) {
+  if (!flaws.length) {
+    return;
+  }
+
+  const level = options.flawLevels.get("sectioning");
+  if (level === FLAW_LEVELS.ERROR) {
+    throw new Error(flaws.join(" "));
+  } else if (level === FLAW_LEVELS.WARN) {
+    doc.flaws.sectioning = flaws.map((explanation, i) => {
+      const id = `sectioning${i + 1}`;
+      return { id, explanation };
+    });
+  }
+}
diff --git a/vendor/yari/build/flaws/translation-differences.ts b/vendor/yari/build/flaws/translation-differences.ts
new file mode 100644
index 000000000..2af5a1b6e
--- /dev/null
+++ b/vendor/yari/build/flaws/translation-differences.ts
@@ -0,0 +1,48 @@
+import { Flaw } from "./index.js";
+
+import { Document, Translation } from "../../content/index.js";
+import { DEFAULT_LOCALE } from "../../libs/constants/index.js";
+import { Doc } from "../../libs/types/document.js";
+import * as cheerio from "cheerio";
+
+export function injectTranslationDifferences(
+  doc: Partial,
+  $: cheerio.CheerioAPI,
+  document
+): Flaw[] {
+  const flaws: Flaw[] = [];
+
+  const englishDocument = Document.read(
+    document.fileInfo.folder.replace(
+      document.metadata.locale.toLowerCase(),
+      DEFAULT_LOCALE.toLowerCase()
+    )
+  );
+  if (!englishDocument) {
+    console.warn(`Can't get English original from ${document.fileInfo.folder}`);
+    return [];
+  }
+
+  function addFlaw(difference) {
+    const id = `translation_differences${flaws.length + 1}`;
+    const { explanation } = difference;
+    const suggestion = null;
+    const fixable = false;
+    const flaw: Flaw = {
+      id,
+      explanation,
+      suggestion,
+      fixable,
+      difference,
+    };
+    flaws.push(flaw);
+  }
+
+  for (const difference of Translation.getTranslationDifferences(
+    englishDocument,
+    document
+  )) {
+    addFlaw(difference);
+  }
+  return flaws;
+}
diff --git a/vendor/yari/build/flaws/unsafe-html.ts b/vendor/yari/build/flaws/unsafe-html.ts
new file mode 100644
index 000000000..41724792d
--- /dev/null
+++ b/vendor/yari/build/flaws/unsafe-html.ts
@@ -0,0 +1,119 @@
+import { Flaw } from "./index.js";
+
+import {
+  INTERACTIVE_EXAMPLES_BASE_URL,
+  LIVE_SAMPLES_BASE_URL,
+} from "../../libs/env/index.js";
+import { findMatchesInText } from "../matches.js";
+import * as cheerio from "cheerio";
+import { Doc } from "../../libs/types/document.js";
+
+const safeIFrameSrcs = [
+  // EmbedGHLiveSample.ejs
+  "https://mdn.github.io",
+  // EmbedYouTube.ejs
+  "https://www.youtube-nocookie.com",
+  // JSFiddleEmbed.ejs
+  "https://jsfiddle.net",
+  // EmbedTest262ReportResultsTable.ejs
+  "https://test262.report",
+];
+if (LIVE_SAMPLES_BASE_URL) {
+  safeIFrameSrcs.push(LIVE_SAMPLES_BASE_URL.toLowerCase());
+}
+if (INTERACTIVE_EXAMPLES_BASE_URL) {
+  safeIFrameSrcs.push(INTERACTIVE_EXAMPLES_BASE_URL.toLowerCase());
+}
+
+function getAndMarkupUnsafeHTMLFlaws(
+  doc: Partial,
+  $: cheerio.CheerioAPI,
+  { rawContent, fileInfo }
+) {
+  const flaws: Flaw[] = [];
+
+  function addFlaw(element: cheerio.Element, explanation: string) {
+    const id = `unsafe_html${flaws.length + 1}`;
+    let html = $.html($(element));
+    $(element).replaceWith($("").addClass("unsafe-html").text(html));
+    // Some nasty tags are so broken they can make the HTML become more or less
+    // the whole page. E.g. ``.
+    if (html.length > 100) {
+      html = html.slice(0, Math.min(html.indexOf("\n"), 100)) + "…";
+    }
+    // Perhaps in the future we can make it possibly fixable to delete it.
+    const fixable = false;
+
+    const flaw: Flaw = {
+      explanation,
+      id,
+      fixable,
+      html,
+      suggestion: null,
+    };
+    for (const { line, column } of findMatchesInText(html, rawContent)) {
+      // This might not find anything because the HTML might have mutated
+      // slightly because of how cheerio parses it. But it doesn't hurt to try.
+      flaw.line = line;
+      flaw.column = column;
+    }
+
+    flaws.push(flaw);
+  }
+
+  $("script, embed, object, iframe, style").each((i, element) => {
+    const { tagName } = element;
+    if (tagName === "iframe") {
+      // For iframes we only check the 'src' value
+      const src = $(element).attr("src");
+      if (!src) {
+        console.warn(
+          `${fileInfo.path} has an iframe without a 'src' attribute`
+        );
+        return;
+      }
+      // Local URLs are always safe.
+      if (!(src.startsWith("//") || src.includes("://"))) {
+        return;
+      }
+      if (!safeIFrameSrcs.find((s) => src.toLowerCase().startsWith(s))) {
+        addFlaw(element, `Unsafe 
+                `
+              : html`
+                  ${this.scrimTitle && !this.img
+                    ? html`
+
+ + + + + +
+

${this.scrimTitle}

+
` + : null} + + `} +
+ ${this._renderSurvey()} +
+ + `; + } + + /** + * @param {MouseEvent} e + */ + #toggle(e) { + if (e.target instanceof HTMLElement) { + e.target.dataset.glean = `${CURRICULUM}: scrim fullscreen -> ${this._fullscreen ? 0 : 1} id:${this._scrimId}`; + } + if (this._fullscreen) { + this.#close(); + } else { + this.#open(); + } + } + + #open() { + const dialog = this.renderRoot.querySelector("dialog"); + if (dialog) { + dialog.showModal(); + this._scrimLoaded = true; + this._fullscreen = true; + } + } + + #close() { + const dialog = this.renderRoot.querySelector("dialog"); + dialog?.close(); + } + + #dialogClosed() { + this._fullscreen = false; + } +} + +customElements.define("scrim-inline", ScrimInline); + +export default createComponent({ + tagName: "scrim-inline", + elementClass: ScrimInline, + react: React, +}); diff --git a/vendor/yari/client/src/lit/curriculum/scrim-inline.scss b/vendor/yari/client/src/lit/curriculum/scrim-inline.scss new file mode 100644 index 000000000..345e0cef9 --- /dev/null +++ b/vendor/yari/client/src/lit/curriculum/scrim-inline.scss @@ -0,0 +1,316 @@ +:host { + display: block; + overflow: hidden; +} + +* { + box-sizing: border-box; +} + +.visually-hidden { + border: 0 !important; + clip: rect(1px, 1px, 1px, 1px) !important; + -webkit-clip-path: inset(50%) !important; + clip-path: inset(50%) !important; + height: 1px !important; + margin: -1px !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + white-space: nowrap !important; + width: 1px !important; +} + +button { + appearance: none; + background: none; + border: none; + padding: 0; +} + +dialog { + display: contents; + + &[open] { + background-color: #0009; + height: 90vh; + width: 90vw; + } +} + +.inner { + background-color: #000; + border: 1px solid var(--border-secondary); + container-type: size; + display: flex; + flex-direction: column; + height: 100%; + width: 100%; +} + +.header { + align-items: center; + background: #000; + display: flex; + gap: 0.25rem; + margin: 0; + min-height: 1.75rem; + padding: 0 0.5rem; + width: 100%; + + span { + color: #fff; + font-size: var(--type-tiny-font-size); + margin-right: auto; + } +} + +.toggle, +.external { + .scrim-fullscreen, + .scrim-link { + background-color: #fff; + cursor: pointer; + height: 1rem; + mask-position: center; + mask-repeat: no-repeat; + mask-size: contain; + width: 1rem; + + &:hover { + background-color: var(--curriculum-color); + } + + &:focus-visible { + outline-color: var(--accent-primary); + outline-offset: 1px; + outline-style: auto; + } + + &.enter { + mask-image: url("../../assets/icons/fullscreen-enter.svg"); + } + + &.exit { + mask-image: url("../../assets/icons/cancel.svg"); + } + + &.scrim-link { + mask-image: url("../../assets/icons/external.svg"); + mask-size: 75%; + } + } +} + +.body { + flex: 1; + font-size: 4cqmin; + position: relative; +} + +.survey { + --button-padding: 0.5rem; + --button-color: var(--text-primary); + + background-color: var(--background-secondary); + + display: grid; + + font: 400 0.8rem /1.8 var(--font-body); + grid-template-columns: 1fr auto; + grid-template-rows: auto 1fr; + min-height: 7.2rem; + padding: var(--button-padding); + + .context-text { + grid-column: 1; + grid-row: 1; + } + + fieldset { + grid-column: 1 / -1; /* span both columns */ + grid-row: 2; + + label { + display: block; + font-size: 1rem; + margin-bottom: 0.5rem; + } + } + + button { + border: 1px solid var(--border-secondary); + border-radius: var(--button-radius); + border-radius: 0.25rem; + color: var(--button-color); + cursor: pointer; + display: inline-block; + font-weight: 600; + padding: var(--button-padding); + text-decoration: none; + + &.yes { + --button-bg-hover: var(--text-primary-green); + } + + &.yes:hover { + --button-color: var(--background-primary); + background-color: var(--button-bg-hover); + } + + &.same { + --button-bg-hover: var(--text-primary-yellow); + } + + &.same:hover { + --button-color: var(--background-primary); + background-color: var(--button-bg-hover); + } + + &.no { + --button-bg-hover: var(--text-primary-red); + } + + &.no:hover { + --button-color: var(--background-primary); + background-color: var(--button-bg-hover); + } + + &.hide-survey { + border: none; + grid-column: 2; + grid-row: 1; + padding: 0; + + &:hover, + &:active { + background-color: var(--button-secondary-hover); + } + + .icon { + --size: var(--icon-size, 1rem); + background-color: var(--text-secondary); + display: inline-block; + height: var(--size); + mask-position: center; + mask-repeat: no-repeat; + vertical-align: middle; + width: var(--size); + + &:hover, + &:active { + background-color: var(--text-primary); + } + + &.icon-close { + mask-image: url("../../assets/icons/cancel.svg"); + } + } + } + } +} + +.voted { + font-size: 1rem; + grid-column: 1 / -1; /* span both columns */ + grid-row: 2; + margin: auto; +} + +dialog[open] .survey { + height: 7rem; + + .voted { + margin: 2rem auto; + } +} + +.feedback { + border: none; + margin: 0; + margin-bottom: 0; + margin-bottom: 0.25rem; + padding: 0; + + .button-container { + display: flex; + gap: 2rem; + } +} + +.background { + background-color: #453c78; + background-image: + url("../../assets/curriculum/scrimba-logo.svg"), + url("../../assets/curriculum/scrim-hexagons.svg"), + url("../../assets/curriculum/scrim-bg.png"); + background-position: + 1.5em 1.5em, + right, + center; + background-repeat: no-repeat; + background-size: + auto 0.6em, + contain, + cover; + inset: 0; + position: absolute; + + h1 { + bottom: 0; + color: #fff; + font-family: "BarlowCondensed-SemiBold", "Inter", sans-serif; + font-size: 3em; + font-weight: 600; + left: 0; + line-height: 1; + margin: 0.5em; + position: absolute; + text-transform: uppercase; + text-wrap: balance; + width: 60%; + } +} + +.background-noise { + filter: url("#noise"); + inset: 0; + mix-blend-mode: soft-light; + position: absolute; +} + +.open, +iframe { + border: none; + height: 100%; + position: absolute; + width: 100%; +} + +.open { + --color: #8cb4ffcc; + background-image: var(--scrim-img); + background-position: center; + background-repeat: no-repeat; + background-size: cover; + cursor: pointer; + font-size: inherit; + + &:hover { + --color: #8cb4ffe5; + } + + svg { + height: 9em; + stroke-width: 2px; + width: auto; + + circle { + fill: var(--color); + } + + path { + fill: #fff; + } + } +} diff --git a/vendor/yari/client/src/lit/glean-mixin.js b/vendor/yari/client/src/lit/glean-mixin.js new file mode 100644 index 000000000..7b1dd78a1 --- /dev/null +++ b/vendor/yari/client/src/lit/glean-mixin.js @@ -0,0 +1,11 @@ +/** + * @template {new (...args: any[]) => {}} TBase + * @param {TBase} Base + */ +export const GleanMixin = (Base) => + class extends Base { + /** @param {string} detail */ + _gleanClick(detail) { + window.dispatchEvent(new CustomEvent("glean-click", { detail })); + } + }; diff --git a/vendor/yari/client/src/lit/globals.d.ts b/vendor/yari/client/src/lit/globals.d.ts new file mode 100644 index 000000000..7d27afa81 --- /dev/null +++ b/vendor/yari/client/src/lit/globals.d.ts @@ -0,0 +1,30 @@ +import { MDNImageHistory, TeamMember } from "./about"; +import { InteractiveExample } from "./interactive-example"; +import { TabPanel, Tab, TabWrapper } from "./interactive-example/tabs"; +import { ContributorList } from "./community/contributor-list"; +import { ScrimInline } from "./curriculum/scrim-inline"; +import { PlayConsole } from "./play/console"; +import { PlayController } from "./play/controller"; +import { PlayEditor } from "./play/editor"; +import { PlayRunner } from "./play/runner"; + +declare global { + interface HTMLElementTagNameMap { + "mdn-image-history": MDNImageHistory; + "team-member": TeamMember; + "interactive-example": InteractiveExample; + "ix-tab": Tab; + "ix-tab-panel": TabPanel; + "ix-tab-wrapper": TabWrapper; + "contributor-list": ContributorList; + "scrim-inline": ScrimInline; + "play-console": PlayConsole; + "play-controller": PlayController; + "play-editor": PlayEditor; + "play-runner": PlayRunner; + } + + interface WindowEventMap { + "glean-click": CustomEvent; + } +} diff --git a/vendor/yari/client/src/lit/interactive-example/global.scss b/vendor/yari/client/src/lit/interactive-example/global.scss new file mode 100644 index 000000000..a53e4043c --- /dev/null +++ b/vendor/yari/client/src/lit/interactive-example/global.scss @@ -0,0 +1,60 @@ +@use "../../ui/vars" as *; + +interactive-example { + display: block; + height: 375px; + margin: 1rem 0; + + &[name^="JavaScript Demo:" i] { + height: 444px; + } + + &[height="shorter"] { + height: 364px; + } + + &[height="taller"] { + height: 654px; + } + + &[height="tabbed-shorter"] { + height: 351px; + margin-top: 1.5rem; + } + + &[height="tabbed-standard"] { + height: 421px; + } + + &[height="tabbed-taller"] { + height: 631px; + } + + @media (max-width: $screen-lg) { + height: 675px; + + &[name^="JavaScript Demo:" i] { + height: 513px; + } + + &[height="shorter"] { + height: 433px; + } + + &[height="taller"] { + height: 725px; + } + + &[height="tabbed-shorter"] { + height: 487px; + } + + &[height="tabbed-standard"] { + height: 548px; + } + + &[height="tabbed-taller"] { + height: 774px; + } + } +} diff --git a/vendor/yari/client/src/lit/interactive-example/index.js b/vendor/yari/client/src/lit/interactive-example/index.js new file mode 100644 index 000000000..03fd2e177 --- /dev/null +++ b/vendor/yari/client/src/lit/interactive-example/index.js @@ -0,0 +1,132 @@ +import { LitElement } from "lit"; +import { createRef } from "lit/directives/ref.js"; + +import { GleanMixin } from "../glean-mixin.js"; +import { InteractiveExampleWithChoices } from "./with-choices.js"; +import { InteractiveExampleWithConsole } from "./with-console.js"; +import { InteractiveExampleWithTabs } from "./with-tabs.js"; + +import styles from "./index.scss?css" with { type: "css" }; + +/** + * @import { Ref } from 'lit/directives/ref.js'; + * @import { PlayController } from "../play/controller.js"; + * @import { PlayRunner } from "../play/runner.js"; + */ + +const LANGUAGE_CLASSES = ["html", "js", "css", "wat"]; +const GLEAN_EVENT_TYPES = ["focus", "copy", "cut", "paste", "click"]; + +export class InteractiveExampleBase extends GleanMixin(LitElement) { + static properties = { name: { type: String } }; + + static styles = styles; + + constructor() { + super(); + this.name = ""; + /** @type {string[]} */ + this._languages = []; + /** @type {Record} */ + this._code = {}; + } + + /** @type {Ref} */ + _controller = createRef(); + /** @type {Ref} */ + _runner = createRef(); + + _run() { + this._controller.value?.run(); + } + + _reset() { + this._controller.value?.reset(); + } + + _initialCode() { + const exampleNodes = this.closest("section")?.querySelectorAll( + ".code-example pre.interactive-example" + ); + const code = Array.from(exampleNodes || []).reduce((acc, pre) => { + const language = Array.from(pre.classList).find((c) => + LANGUAGE_CLASSES.includes(c) + ); + return language && pre.textContent + ? { + ...acc, + [language]: acc[language] + ? `${acc[language]}\n${pre.textContent}` + : pre.textContent, + } + : acc; + }, /** @type {Object} */ ({})); + const choiceNodes = this.closest("section")?.querySelectorAll( + ".code-example pre.interactive-example-choice" + ); + this._choices = Array.from(choiceNodes || []).map((pre) => + pre.textContent?.trim() + ); + this._languages = Object.keys(code); + this._template = this._choices.length + ? "choices" + : (this._languages.length === 1 && this._languages[0] === "js") || + (this._languages.includes("js") && this._languages.includes("wat")) + ? "console" + : "tabbed"; + return code; + } + + /** @param {string} lang */ + _langName(lang) { + switch (lang) { + case "js": + return "JavaScript"; + default: + return lang.toUpperCase(); + } + } + + /** @param {Event} ev */ + _telemetryHandler(ev) { + let action = ev.type; + if ( + ev.type === "click" && + ev.target instanceof HTMLElement && + ev.target.id + ) { + action = `click@${ev.target.id}`; + } + this._gleanClick(`interactive-examples-lit: ${action}`); + } + + connectedCallback() { + super.connectedCallback(); + this._telemetryHandler = this._telemetryHandler.bind(this); + GLEAN_EVENT_TYPES.forEach((type) => { + this.renderRoot.addEventListener(type, this._telemetryHandler); + }); + this._code = this._initialCode(); + } + + firstUpdated() { + if (this._controller.value) { + this._controller.value.code = this._code; + } + } + + disconnectedCallback() { + super.disconnectedCallback(); + GLEAN_EVENT_TYPES.forEach((type) => { + this.renderRoot.removeEventListener(type, this._telemetryHandler); + }); + } +} + +export class InteractiveExample extends InteractiveExampleWithChoices( + InteractiveExampleWithTabs( + InteractiveExampleWithConsole(InteractiveExampleBase) + ) +) {} + +customElements.define("interactive-example", InteractiveExample); diff --git a/vendor/yari/client/src/lit/interactive-example/index.scss b/vendor/yari/client/src/lit/interactive-example/index.scss new file mode 100644 index 000000000..8fea3ca0e --- /dev/null +++ b/vendor/yari/client/src/lit/interactive-example/index.scss @@ -0,0 +1,280 @@ +@use "../../ui/vars" as *; +@use "../../ui/atoms/button/mixins" as button; + +:host { + --border: 1px solid var(--border-secondary); + --tabbed-font-heading: 600 0.625rem/1.2 var(--font-heading); +} + +header { + align-items: center; + border-bottom: var(--border); + border-top-left-radius: var(--elem-radius); + border-top-right-radius: var(--elem-radius); + display: flex; + grid-area: header; + justify-content: space-between; + padding: 0.5rem 1rem; + + h4 { + font-size: 1rem; + font-weight: normal; + line-height: 1.1876; + margin: 0; + } + + #reset { + background-color: transparent; + border: 0; + border-radius: var(--elem-radius); + color: var(--text-primary); + cursor: pointer; + font: var(--tabbed-font-heading); + height: 2rem; + letter-spacing: 1.5px; + margin: 0; + max-width: 100px; + padding: 0.7em 0.9em; + text-transform: uppercase; + + &:hover { + background-color: var(--button-secondary-hover); + } + } +} + +play-editor { + grid-area: editor; + height: 100%; + overflow: auto; +} + +.buttons { + display: flex; + flex-direction: column; + gap: 0.5rem; + grid-area: buttons; + + button { + @include button.secondary; + } +} + +play-console { + border: var(--border); + border-radius: var(--elem-radius); + grid-area: console; +} + +ix-tab-wrapper { + grid-area: tabs; +} + +// ------------------- +// JavaScript/WAT examples +// ------------------- + +.template-console { + align-content: start; + display: grid; + gap: 0.5rem; + grid-template-areas: + "header header" + "editor editor" + "buttons console"; + grid-template-columns: max-content 1fr; + grid-template-rows: max-content 1fr 8rem; + height: 100%; + + header { + border: var(--border); + } + + play-runner { + display: none; + } + + > play-editor, + ix-tab-wrapper { + border: var(--border); + border-bottom-left-radius: var(--elem-radius); + border-bottom-right-radius: var(--elem-radius); + border-top: 0; + grid-area: editor; + margin-top: -0.5rem; + } + + @media (max-width: $screen-sm) { + grid-template-areas: + "header" + "editor" + "buttons" + "console"; + grid-template-columns: 1fr; + grid-template-rows: max-content 1fr max-content 8rem; + + .buttons { + flex-direction: row; + justify-content: space-between; + } + } +} + +// --------------- +// Tabbed examples +// --------------- + +.template-tabbed { + border: var(--border); + border-radius: var(--elem-radius); + display: grid; + grid-template-areas: + "header header" + "tabs runner"; + grid-template-columns: 6fr 4fr; + grid-template-rows: max-content 1fr; + height: 100%; + overflow: hidden; + + .output-wrapper { + border-left: var(--border); + grid-area: runner; + overflow: hidden; + position: relative; + + h4 { + background-color: var(--background-secondary); + border-bottom-left-radius: var(--elem-radius); + color: var(--text-secondary); + font: var(--tabbed-font-heading); + margin: 0; + padding: 0.5rem 1.6rem; + position: absolute; + right: 0; + text-transform: uppercase; + top: 0; + z-index: 2; + } + } + + @media (max-width: $screen-lg) { + grid-template-areas: + "header" + "tabs" + "runner"; + grid-template-columns: 1fr; + grid-template-rows: max-content 1fr 1fr; + + .output-wrapper { + border-left: 0; + border-top: var(--border); + } + } +} + +// --------------- +// Choice examples +// --------------- + +.template-choices { + border: var(--border); + border-radius: var(--elem-radius); + display: grid; + grid-template-areas: + "header header" + "choice runner"; + grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); + grid-template-rows: max-content 1fr; + height: 100%; + + @media (max-width: $screen-lg) { + grid-template-areas: "header" "choice" "runner"; + grid-template-columns: 1fr; + } + + .choice-wrapper { + border-right: var(--border); + display: flex; + flex-direction: column; + grid-area: choice; + overflow-y: auto; + padding: 1rem; + padding-right: 0; + row-gap: 0.4rem; + + @media (max-width: $screen-lg) { + border-bottom: var(--border); + border-right: none; + padding-right: 1em; + } + + .choice { + --field-focus-border: #0085f2; + --focus-01: 0 0 0 3px rgba(0, 144, 237, 0.4); + + align-items: center; + display: flex; + flex-grow: 1; + + &::after { + color: var(--field-focus-border); + content: "▶"; + font-size: 0.5rem; + opacity: 0; + padding: 0; + padding-left: 0.25rem; + padding-right: 1rem; + width: 1rem; + + @media (max-width: $screen-lg) { + display: none; + } + } + + &.selected { + play-editor { + border-color: var(--field-focus-border); + box-shadow: var(--focus-01); + cursor: text; + } + + &::after { + opacity: 1; + padding-left: 0.75rem; + padding-right: 0.5rem; + transition: all 0.2s ease-out; + } + } + + &.unsupported { + play-editor { + border-color: #ffb800; + } + + &::after { + background-image: url("../../assets/icons/warning.svg"); + background-position: center center; + background-repeat: no-repeat; + background-size: 1rem; + content: ""; + height: 1rem; + opacity: 1; + transition: none; + width: 1rem; + } + } + + play-editor { + border: var(--border); + border-radius: var(--elem-radius); + cursor: pointer; + width: 100%; + } + } + } + + .output-wrapper { + height: 300px; + overflow: hidden; + } +} diff --git a/vendor/yari/client/src/lit/interactive-example/tabs.js b/vendor/yari/client/src/lit/interactive-example/tabs.js new file mode 100644 index 000000000..2253a3c4f --- /dev/null +++ b/vendor/yari/client/src/lit/interactive-example/tabs.js @@ -0,0 +1,167 @@ +import { html, LitElement } from "lit"; + +import wrapperStyles from "./tabs.wrapper.scss?css" with { type: "css" }; +import tabStyles from "./tabs.tab.scss?css" with { type: "css" }; +import panelStyles from "./tabs.panel.scss?css" with { type: "css" }; + +/** + * @typedef {"first" | "prev" | "active" | "next" | "last"} Position + */ + +export class TabWrapper extends LitElement { + static styles = wrapperStyles; + + /** @param {Position} position */ + _getTab(position) { + const tabs = Array.from(this.querySelectorAll("ix-tab")); + if (position === "first") { + return tabs[0]; + } + if (position === "last") { + return tabs.at(-1); + } + const active = tabs.findIndex((tab) => tab.isActive); + if (position === "active") { + return tabs[active]; + } + if (position === "prev") { + return tabs.at((active - 1) % tabs.length); + } + if (position === "next") { + return tabs.at((active + 1) % tabs.length); + } + return undefined; + } + + /**@param {Tab | undefined} tab */ + _setTabActive(tab, focus = false) { + if (!tab) { + return; + } + this._getTab("active")?.unsetActive(); + tab.setActive(); + if (focus) { + tab.focus(); + } + } + + /** @param {MouseEvent} event */ + _tablistClick({ target }) { + if (target instanceof HTMLElement) { + const tab = target.closest("ix-tab") || undefined; + this._setTabActive(tab); + } + } + + /** @param {KeyboardEvent} event */ + _tablistKeyDown(event) { + /** @type {Position | undefined} */ + let position; + switch (event.key) { + case "ArrowRight": + case "ArrowDown": + position = "next"; + break; + case "ArrowLeft": + case "ArrowUp": + position = "prev"; + break; + case "Home": + position = "first"; + break; + case "End": + position = "last"; + break; + default: + return; + } + event.preventDefault(); + this._setTabActive(this._getTab(position), true); + } + + render() { + return html` +
+ +
+ + `; + } + + firstUpdated() { + this.querySelector("ix-tab")?.setActive(); + } +} + +customElements.define("ix-tab-wrapper", TabWrapper); + +export class Tab extends LitElement { + static styles = tabStyles; + + connectedCallback() { + super.connectedCallback(); + this.setAttribute("slot", "tablist"); + this.setAttribute("role", "tab"); + this.unsetActive(); + const panel = this.nextElementSibling; + if (panel instanceof TabPanel) { + this.panel = panel; + if (panel.id) { + this.setAttribute("aria-controls", panel.id); + } + if (this.id) { + panel.setAttribute("aria-labelledby", this.id); + } + } + } + + setActive() { + this.setAttribute("tabindex", "0"); + this.setAttribute("aria-selected", "true"); + this.panel?.setActive(); + } + + unsetActive() { + this.setAttribute("tabindex", "-1"); + this.setAttribute("aria-selected", "false"); + this.panel?.unsetActive(); + } + + get isActive() { + return this.getAttribute("aria-selected") === "true"; + } + + render() { + return html``; + } +} + +customElements.define("ix-tab", Tab); + +export class TabPanel extends LitElement { + static styles = panelStyles; + + connectedCallback() { + super.connectedCallback(); + this.setAttribute("tabindex", "0"); + this.setAttribute("role", "tabpanel"); + } + + setActive() { + this.setAttribute("slot", "active-panel"); + } + + unsetActive() { + this.removeAttribute("slot"); + } + + render() { + return html``; + } +} + +customElements.define("ix-tab-panel", TabPanel); diff --git a/vendor/yari/client/src/lit/interactive-example/tabs.panel.scss b/vendor/yari/client/src/lit/interactive-example/tabs.panel.scss new file mode 100644 index 000000000..b873a3917 --- /dev/null +++ b/vendor/yari/client/src/lit/interactive-example/tabs.panel.scss @@ -0,0 +1,4 @@ +:host { + flex: 1; + min-height: 0; +} diff --git a/vendor/yari/client/src/lit/interactive-example/tabs.tab.scss b/vendor/yari/client/src/lit/interactive-example/tabs.tab.scss new file mode 100644 index 000000000..ebdfe1ce6 --- /dev/null +++ b/vendor/yari/client/src/lit/interactive-example/tabs.tab.scss @@ -0,0 +1,25 @@ +:host { + background-color: transparent; + border: 0 none; + border-bottom: 3px solid transparent; + border-top: 3px solid transparent; + color: var(--text-secondary); + cursor: pointer; + font: var(--type-emphasis-m); + padding: 0.5em 30px; + transition: + color 0.2s, + background-color 0.2s; +} + +:host(:hover), +:host(:focus) { + background-color: var(--ix-tab-background-active); + color: var(--text-primary); +} + +:host([aria-selected="true"]) { + background-color: var(--ix-tab-background-active); + border-bottom-color: var(--accent-primary); + color: var(--accent-primary); +} diff --git a/vendor/yari/client/src/lit/interactive-example/tabs.wrapper.scss b/vendor/yari/client/src/lit/interactive-example/tabs.wrapper.scss new file mode 100644 index 000000000..9d6a72cc8 --- /dev/null +++ b/vendor/yari/client/src/lit/interactive-example/tabs.wrapper.scss @@ -0,0 +1,14 @@ +:host { + display: flex; + flex-direction: column; + overflow: hidden; +} + +#tablist { + background: var(--background-secondary); + border-bottom: 1px solid var(--border-secondary); + display: flex; + flex-shrink: 0; + gap: 0.5rem; + overflow-x: auto; +} diff --git a/vendor/yari/client/src/lit/interactive-example/utils.js b/vendor/yari/client/src/lit/interactive-example/utils.js new file mode 100644 index 000000000..2549fb829 --- /dev/null +++ b/vendor/yari/client/src/lit/interactive-example/utils.js @@ -0,0 +1,83 @@ +/** + * Checks if the CSS code is supported by the current browser. + * + * @param {string} code + */ +export function isCSSSupported(code) { + // http://regexr.com/3fvik + const cssCommentsMatch = /(\/\*)[\s\S]+(\*\/)/g; + const element = document.createElement("div"); + + // strip out any CSS comments before applying the code + code = code.replace(cssCommentsMatch, ""); + + const vendorPrefixMatch = /^-(?:webkit|moz|ms|o)-/; + const style = element.style; + // Expecting declarations to be separated by ";" + // Declarations with just white space are ignored + const declarationsArray = code + .split(";") + .map((d) => d.trim()) + .filter((d) => d.length > 0); + + /** + * @param {string} declaration + * @returns {boolean} - true if declaration starts with -webkit-, -moz-, -ms- or -o- + */ + function hasVendorPrefix(declaration) { + return vendorPrefixMatch.test(declaration); + } + + /** + * Looks for property name by cutting off optional vendor prefix at the beginning + * and then cutting off rest of the declaration, starting from any whitespace or ":" in property name. + * @param {string} declaration - single css declaration, with not white space at the beginning + * @returns {string} - property name without vendor prefix. + */ + function getPropertyNameNoPrefix(declaration) { + const prefixMatch = vendorPrefixMatch.exec(declaration); + const prefix = prefixMatch === null ? "" : prefixMatch[0]; + const declarationNoPrefix = + prefix === null ? declaration : declaration.slice(prefix.length); + // Expecting property name to be over, when any whitespace or ":" is found + const propertyNameSeparator = /[\s:]/; + return declarationNoPrefix.split(propertyNameSeparator)[0] ?? ""; + } + + // Clearing previous state + style.cssText = ""; + + // List of found and applied properties with vendor prefix + const appliedPropertiesWithPrefix = new Set(); + // List of not applied properties - because of lack of support for its name or value + const notAppliedProperties = new Set(); + + for (const declaration of declarationsArray) { + const previousCSSText = style.cssText; + // Declarations are added one by one, because browsers sometimes combine multiple declarations into one + // For example Chrome changes "column-count: auto;column-width: 8rem;" into "columns: 8rem auto;" + style.cssText += declaration + ";"; // ";" was previous removed while using split method + // In case property name or value is not supported, browsers skip single declaration, while leaving rest of them intact + const correctlyApplied = style.cssText !== previousCSSText; + + const vendorPrefixFound = hasVendorPrefix(declaration); + const propertyName = getPropertyNameNoPrefix(declaration); + + if (correctlyApplied && vendorPrefixFound) { + // We are saving applied properties with prefix, so equivalent property with no prefix doesn't need to be supported + appliedPropertiesWithPrefix.add(propertyName); + } else if (!correctlyApplied && !vendorPrefixFound) { + notAppliedProperties.add(propertyName); + } + } + + if (notAppliedProperties.size !== 0) { + // If property with vendor prefix is supported, we can ignore the fact that browser doesn't support property with no prefix + for (const substitute of appliedPropertiesWithPrefix) { + notAppliedProperties.delete(substitute); + } + // If any other declaration is not supported, whole block should be marked as invalid + if (notAppliedProperties.size !== 0) return false; + } + return true; +} diff --git a/vendor/yari/client/src/lit/interactive-example/with-choices.js b/vendor/yari/client/src/lit/interactive-example/with-choices.js new file mode 100644 index 000000000..6e5e0ca99 --- /dev/null +++ b/vendor/yari/client/src/lit/interactive-example/with-choices.js @@ -0,0 +1,174 @@ +import { html } from "lit"; +import { ref } from "lit/directives/ref.js"; +import { decode } from "he"; + +import { PlayEditor } from "../play/editor.js"; +import { isCSSSupported } from "./utils.js"; +import "../play/controller.js"; +import "../play/runner.js"; + +/** + * @import { InteractiveExampleBase } from "./index.js"; + */ + +/** + * @template {new (...args: any[]) => InteractiveExampleBase} TBase + * @param {TBase} Base + */ +export const InteractiveExampleWithChoices = (Base) => + class extends Base { + static properties = { + __choiceSelected: { state: true }, + __choiceUnsupported: { state: true }, + }; + + /** @param {any[]} _args */ + constructor(..._args) { + super(); + /** @type {number} */ + this.__choiceSelected = -1; + /** @type {boolean[]} */ + this.__choiceUnsupported = []; + } + + /** @param {MouseEvent} event */ + #choiceFocus({ target }) { + if (target instanceof PlayEditor) { + target.focus(); + } + } + + /** @param {MouseEvent} event */ + #choiceSelect({ target }) { + if (target instanceof PlayEditor) { + this.#updateUnsupported(target); + this.#selectChoice(target); + } + } + + /** @param {Event} event */ + #choiceUpdate({ target }) { + if (target instanceof PlayEditor) { + this.#updateUnsupported(target); + if (this.__choiceSelected === this.#getIndex(target)) { + this.#selectChoice(target); + } + } + } + + #resetChoices() { + this.__choiceSelected = -1; + + const editorNodes = Array.from( + this.shadowRoot?.querySelectorAll("play-editor") || [] + ); + + Array.from(editorNodes).forEach((editorNode, index) => { + const code = this._choices?.at(index) ?? ""; + editorNode.value = code; + }); + + this.__choiceUnsupported = + this._choices?.map((code) => !isCSSSupported(code || "")) || []; + + const first = editorNodes[0]; + if (first) { + this.#selectChoice(first); + } + } + + /** @param {PlayEditor} editor */ + async #selectChoice(editor) { + const index = this.#getIndex(editor); + await this._runner.value?.postMessage({ + typ: "choice", + code: editor.value, + }); + this.__choiceSelected = index; + } + + /** @param {PlayEditor} editor */ + #updateUnsupported(editor) { + const index = this.#getIndex(editor); + this.__choiceUnsupported = this.__choiceUnsupported.map((value, i) => + index === i ? !isCSSSupported(editor.value) : value + ); + } + + /** @param {PlayEditor} editor */ + #getIndex(editor) { + return parseInt(editor.dataset.index ?? "-1", 10); + } + + #render() { + return html` +
+
+

${decode(this.name)}

+ +
+
+ ${this._choices?.map( + (code, index) => html` +
+ +
+ ` + )} +
+
+ + + +
+
+ `; + } + + _reset() { + if (this._template === "choices") { + this.#resetChoices(); + } else { + super._reset(); + } + } + + _initialCode() { + const code = super._initialCode(); + if (this._template === "choices") { + code["js-hidden"] = `setChoice(${JSON.stringify(this._choices?.[0])})`; + } + return code; + } + + render() { + return this._template === "choices" ? this.#render() : super.render(); + } + + firstUpdated() { + super.firstUpdated(); + if (this._template === "choices") { + this.#resetChoices(); + } + } + }; diff --git a/vendor/yari/client/src/lit/interactive-example/with-console.js b/vendor/yari/client/src/lit/interactive-example/with-console.js new file mode 100644 index 000000000..b17c6cd7f --- /dev/null +++ b/vendor/yari/client/src/lit/interactive-example/with-console.js @@ -0,0 +1,62 @@ +import { html } from "lit"; +import { ifDefined } from "lit/directives/if-defined.js"; +import { ref } from "lit/directives/ref.js"; +import { decode } from "he"; + +import "../play/controller.js"; +import "../play/editor.js"; +import "../play/runner.js"; +import "../play/console.js"; +import "./tabs.js"; + +/** + * @import { InteractiveExampleBase } from "."; + */ + +/** + * @template {new (...args: any[]) => InteractiveExampleBase} TBase + * @param {TBase} Base + */ +export const InteractiveExampleWithConsole = (Base) => + class extends Base { + #render() { + return html` + +
+
+

${decode(this.name)}

+
+ ${this._languages.length === 1 + ? html`` + : html` + ${this._languages.map( + (lang) => html` + ${this._langName(lang)} + + + + ` + )} + `} +
+ + +
+ + +
+
+ `; + } + + render() { + return this._template === "console" ? this.#render() : super.render(); + } + }; diff --git a/vendor/yari/client/src/lit/interactive-example/with-tabs.js b/vendor/yari/client/src/lit/interactive-example/with-tabs.js new file mode 100644 index 000000000..fb8189142 --- /dev/null +++ b/vendor/yari/client/src/lit/interactive-example/with-tabs.js @@ -0,0 +1,54 @@ +import { html } from "lit"; +import { ref } from "lit/directives/ref.js"; +import { decode } from "he"; + +import "../play/controller.js"; +import "../play/editor.js"; +import "../play/runner.js"; +import "./tabs.js"; + +/** + * @import { InteractiveExampleBase } from "."; + */ + +/** + * @template {new (...args: any[]) => InteractiveExampleBase} TBase + * @param {TBase} Base + */ +export const InteractiveExampleWithTabs = (Base) => + class extends Base { + #render() { + return html` + +
+
+

${decode(this.name)}

+ +
+ + ${this._languages.map( + (lang) => html` + ${this._langName(lang)} + + + + ` + )} + +
+

Output

+ +
+
+
+ `; + } + + render() { + return this._template === "tabbed" ? this.#render() : super.render(); + } + }; diff --git a/vendor/yari/client/src/lit/modules.d.ts b/vendor/yari/client/src/lit/modules.d.ts new file mode 100644 index 000000000..c5fc9cfff --- /dev/null +++ b/vendor/yari/client/src/lit/modules.d.ts @@ -0,0 +1,12 @@ +// once https://github.com/microsoft/TypeScript/issues/46135 is fixed +// we'll be able to do something like: +// declare module '*' with {type: 'css'} { +declare module "*?css" { + const sheet: CSSStyleSheet; + export default sheet; +} + +declare module "*?raw" { + const src: string; + export default src; +} diff --git a/vendor/yari/client/src/lit/play/console-utils.js b/vendor/yari/client/src/lit/play/console-utils.js new file mode 100644 index 000000000..d2fdf951f --- /dev/null +++ b/vendor/yari/client/src/lit/play/console-utils.js @@ -0,0 +1,161 @@ +// Copied from https://github.com/mdn/bob/blob/9da42cd641d7f2a9796bf3406e74cad411ce9438/editor/js/editor-libs/console-utils.ts +/** + * Formats arrays: + * - quotes around strings in arrays + * - square brackets around arrays + * - adds commas appropriately (with spacing) + * - identifies empty slots + * designed to be used recursively + * @param {any} input - The output to log. + * @returns Formatted output as a string. + */ +export function formatArray(input) { + let output = ""; + for (let i = 0, l = input.length; i < l; i++) { + if (typeof input[i] === "string") { + output += '"' + input[i] + '"'; + } else if (Array.isArray(input[i])) { + output += "Array ["; + output += formatArray(input[i]); + output += "]"; + } else if (!input.hasOwnProperty(i)) { + let emptyCount = 1; + while (i + 1 < l && !input.hasOwnProperty(i + 1)) { + emptyCount++; + i++; + } + if (emptyCount === 1) { + output += "<1 empty slot>"; + } else { + output += `<${emptyCount} empty slots>`; + } + } else { + output += formatOutput(input[i]); + } + + if (i < input.length - 1) { + output += ", "; + } + } + return output; +} + +/** + * Formats objects: + * ArrayBuffer, DataView, SharedArrayBuffer, + * Int8Array, Int16Array, Int32Array, + * Uint8Array, Uint16Array, Uint32Array, + * Uint8ClampedArray, Float32Array, Float64Array + * Symbol + * @param {any} input - The output to log. + * @returns Formatted output as a string. + */ +export function formatObject(input) { + const bufferDataViewRegExp = /^(ArrayBuffer|SharedArrayBuffer|DataView)$/; + const complexArrayRegExp = + /^(Int8Array|Int16Array|Int32Array|Uint8Array|Uint16Array|Uint32Array|Uint8ClampedArray|Float32Array|Float64Array|BigInt64Array|BigUint64Array)$/; + + const objectName = input.constructor ? input.constructor.name : input; + + if (objectName === "String") { + // String object + return `String { "${input.valueOf()}" }`; + } + + if (input === JSON) { + // console.log(JSON) is outputed as "JSON {}" in browser console + return `JSON {}`; + } + + if (objectName.match && objectName.match(bufferDataViewRegExp)) { + return objectName + " {}"; + } + + if (objectName.match && objectName.match(complexArrayRegExp)) { + const arrayLength = input.length; + + if (arrayLength > 0) { + return objectName + " [" + formatArray(input) + "]"; + } else { + return objectName + " []"; + } + } + + if (objectName === "Symbol" && input !== undefined) { + return input.toString(); + } + + if (objectName === "Object") { + if (input?._MDNPlaySerializedObject) { + return input._MDNPlaySerializedObject; + } + let formattedChild = ""; + let start = true; + for (const key in input) { + if (Object.prototype.hasOwnProperty.call(input, key)) { + if (start) { + start = false; + } else { + formattedChild = formattedChild + ", "; + } + formattedChild = formattedChild + key + ": " + formatOutput(input[key]); + } + } + return objectName + " { " + formattedChild + " }"; + } + + // Special object created with `OrdinaryObjectCreate(null)` returned by, for + // example, named capture groups in https://mzl.la/2RERfQL + // @see https://github.com/mdn/bob/issues/574#issuecomment-858213621 + if (!input.constructor && !input.prototype) { + let formattedChild = ""; + let start = true; + for (const key in input) { + if (start) { + start = false; + } else { + formattedChild = formattedChild + ", "; + } + formattedChild = formattedChild + key + ": " + formatOutput(input[key]); + } + return "Object { " + formattedChild + " }"; + } + + return input; +} + +/** + * Formats output to indicate its type: + * - quotes around strings + * - single quotes around strings containing double quotes + * - square brackets around arrays + * (also copes with arrays of arrays) + * does NOT detect Int32Array etc + * @param {any} input - The output to log. + * @returns Formatted output as a string. + */ +export function formatOutput(input) { + if (input === undefined || input === null || typeof input === "boolean") { + return String(input); + } else if (typeof input === "number") { + // Negative zero + if (Object.is(input, -0)) { + return "-0"; + } + return String(input); + } else if (typeof input === "bigint") { + return String(input) + "n"; + } else if (typeof input === "string") { + // string literal + if (input.includes('"')) { + return "'" + input + "'"; + } else { + return '"' + input + '"'; + } + } else if (Array.isArray(input)) { + // check the contents of the array + return "Array [" + formatArray(input) + "]"; + } else { + return formatObject(input); + } +} diff --git a/vendor/yari/client/src/lit/play/console.js b/vendor/yari/client/src/lit/play/console.js new file mode 100644 index 000000000..425678714 --- /dev/null +++ b/vendor/yari/client/src/lit/play/console.js @@ -0,0 +1,138 @@ +import { createComponent } from "@lit/react"; +import { html, LitElement } from "lit"; +import React from "react"; +import { formatOutput } from "./console-utils.js"; + +import styles from "./console.scss?css" with { type: "css" }; + +/** @import { VConsole } from "./types.d.ts" */ + +/** @implements {Partial} */ +class VirtualConsole { + #host; + + /** @param {PlayConsole} host */ + constructor(host) { + this.#host = host; + } + + clear() { + this.#host._messages = []; + } + + /** @param {...any} args */ + debug(...args) { + return this.log(...args); + } + + /** @param {...any} args */ + error(...args) { + return this.log(...args); + } + + /** @param {...any} args */ + info(...args) { + return this.log(...args); + } + + /** @param {...any} args */ + log(...args) { + if (args.length > 1 && typeof args[0] === "string") { + // https://developer.mozilla.org/en-US/docs/Web/API/console#using_string_substitutions + // TODO: add unit testing of this + args[0] = args[0].replace( + /%(?:\.([0-9]+))?(.)/g, + (match, formatArg, format) => { + switch (format) { + case "o": + case "O": + const O = args.splice(1, 1)[0]; + return formatOutput(O); + case "d": + case "i": + const i = args.splice(1, 1)[0]; + return Math.trunc(i).toFixed(0).padStart(formatArg, "0"); + case "s": + const s = args.splice(1, 1)[0]; + return s.toString(); + case "f": + const f = args.splice(1, 1)[0]; + return (typeof f === "number" ? f : parseFloat(f)).toFixed( + formatArg ?? 6 + ); + case "c": + // TODO: Not implemented yet, so just remove the argument + args.splice(1, 1); + return ""; + case "%": + return "%"; + default: + return match; + } + } + ); + } + this.#host._messages = [ + ...this.#host._messages, + args.map((x) => formatOutput(x)).join(" "), + ]; + } + + /** @param {...any} args */ + warn(...args) { + return this.log(...args); + } +} + +export class PlayConsole extends LitElement { + static properties = { + _messages: { state: true }, + }; + + static styles = styles; + + constructor() { + super(); + this.vconsole = new VirtualConsole(this); + /** @type {string[]} */ + this._messages = []; + } + + /** @param {CustomEvent} e */ + onConsole({ detail }) { + if (detail.prop in this.vconsole) { + const prop = /** @type keyof typeof this.vconsole */ (detail.prop); + detail.args ? this.vconsole[prop](...detail.args) : this.vconsole[prop](); + } else { + this.vconsole.warn( + "[Playground] Unsupported console message (see browser console)" + ); + } + } + + render() { + return html` +
    + ${this._messages.map((message) => { + return html` +
  • + ${message} +
  • + `; + })} +
+ `; + } + + updated() { + this.scrollTo({ top: this.scrollHeight }); + } +} + +customElements.define("play-console", PlayConsole); + +export const ReactPlayConsole = createComponent({ + tagName: "play-console", + elementClass: PlayConsole, + react: React, +}); diff --git a/vendor/yari/client/src/lit/play/console.scss b/vendor/yari/client/src/lit/play/console.scss new file mode 100644 index 000000000..914bf5731 --- /dev/null +++ b/vendor/yari/client/src/lit/play/console.scss @@ -0,0 +1,30 @@ +:host { + background-color: var(--code-background-inline); + box-sizing: border-box; + display: flex; + flex-direction: column; + font-size: 0.875rem; + margin: 0; + overflow: auto; + width: 100%; +} + +ul { + list-style: none; + margin: 0; + padding: 0; +} + +li { + padding: 0 0.5em; + + &::before { + content: ">"; + } +} + +code { + font-family: var(--font-code); + tab-size: 4; + white-space: pre-wrap; +} diff --git a/vendor/yari/client/src/lit/play/controller.js b/vendor/yari/client/src/lit/play/controller.js new file mode 100644 index 000000000..3ace9ac5a --- /dev/null +++ b/vendor/yari/client/src/lit/play/controller.js @@ -0,0 +1,136 @@ +import { css, html, LitElement } from "lit"; +import { createComponent } from "@lit/react"; +import React from "react"; + +/** @import { VConsole } from "./types.d.ts" */ + +export class PlayController extends LitElement { + static properties = { + runOnStart: { type: Boolean, attribute: "run-on-start" }, + runOnChange: { type: Boolean, attribute: "run-on-change" }, + srcPrefix: { attribute: false }, + }; + + static styles = css` + :host { + display: contents; + } + `; + + constructor() { + super(); + this.runOnStart = false; + this.runOnChange = false; + this.srcPrefix = ""; + /** @type {Record} */ + this._code = {}; + /** @type {Record} */ + this._hiddenCode = {}; + } + + /** @param {Record} code */ + set code(code) { + this._code = Object.fromEntries( + Object.entries(code).filter(([language]) => !language.endsWith("-hidden")) + ); + this._hiddenCode = Object.fromEntries( + Object.entries(code) + .filter(([language]) => language.endsWith("-hidden")) + .map(([language, value]) => [language.replace(/-hidden$/, ""), value]) + ); + if (!this.initialCode) { + this.initialCode = code; + } + const editors = this.querySelectorAll("play-editor"); + editors.forEach((editor) => { + const language = editor.language; + if (language) { + const value = code[language]; + if (value !== undefined) { + editor.value = value; + } + } + }); + if (this.runOnStart) { + this.run(); + } + } + + get code() { + const code = { ...this._code }; + const editors = this.querySelectorAll("play-editor"); + editors.forEach((editor) => { + const language = editor.language; + if (language) { + code[language] = editor.value; + } + }); + for (const [language, value] of Object.entries(this._hiddenCode)) { + code[language] = code[language] ? `${value}\n${code[language]}` : value; + } + return code; + } + + async format() { + try { + await Promise.all( + Array.from(this.querySelectorAll("play-editor")).map((e) => e.format()) + ); + } catch (e) { + console.error(e); + } + } + + run() { + this.querySelector("play-console")?.vconsole.clear(); + const runner = this.querySelector("play-runner"); + if (runner) { + runner.srcPrefix = this.srcPrefix; + runner.code = this.code; + } + } + + reset() { + if (this.initialCode) { + this.code = this.initialCode; + } + if (this.runOnStart) { + this.run(); + } else { + this.querySelector("play-console")?.vconsole.clear(); + const runner = this.querySelector("play-runner"); + if (runner) { + runner.code = undefined; + } + } + } + + _onEditorUpdate() { + if (this.runOnChange) { + this.run(); + } + } + + /** @param {CustomEvent} ev */ + _onConsole(ev) { + this.querySelector("play-console")?.onConsole(ev); + } + + connectedCallback() { + super.connectedCallback(); + } + + render() { + return html` + + `; + } +} + +customElements.define("play-controller", PlayController); + +export const ReactPlayController = createComponent({ + tagName: "play-controller", + elementClass: PlayController, + react: React, +}); diff --git a/vendor/yari/client/src/lit/play/editor.js b/vendor/yari/client/src/lit/play/editor.js new file mode 100644 index 000000000..fca54c192 --- /dev/null +++ b/vendor/yari/client/src/lit/play/editor.js @@ -0,0 +1,221 @@ +import { keymap, highlightActiveLine, lineNumbers } from "@codemirror/view"; +import { EditorState, StateEffect } from "@codemirror/state"; +import { indentOnInput, bracketMatching } from "@codemirror/language"; +import { defaultKeymap, indentWithTab } from "@codemirror/commands"; +import { + autocompletion, + completionKeymap, + closeBrackets, + closeBracketsKeymap, +} from "@codemirror/autocomplete"; +import { lintKeymap } from "@codemirror/lint"; +import { EditorView, minimalSetup } from "codemirror"; +import { javascript as langJS } from "@codemirror/lang-javascript"; +import { wast as langWat } from "@codemirror/lang-wast"; +import { css as langCSS } from "@codemirror/lang-css"; +import { html as langHTML } from "@codemirror/lang-html"; +import { oneDark } from "@codemirror/theme-one-dark"; + +import { createComponent } from "@lit/react"; +import { html, LitElement } from "lit"; +import React from "react"; +import { ThemeController } from "../theme-controller.js"; + +import styles from "./editor.scss?css" with { type: "css" }; + +/** @import { PropertyValues } from "lit" */ + +export class PlayEditor extends LitElement { + static properties = { + language: { type: String }, + minimal: { type: Boolean }, + value: { attribute: false }, + delay: { type: Number }, + }; + + static styles = styles; + + /** @type {EditorView | undefined} */ + _editor; + + /** @type {number} */ + _updateTimer = -1; + + constructor() { + super(); + this.theme = new ThemeController(this); + this.language = ""; + this.minimal = false; + this._value = ""; + this.delay = 1000; + } + + /** @param {string} value */ + set value(value) { + this._value = value; + if (this._editor) { + let state = EditorState.create({ + doc: value, + extensions: this._extensions(), + }); + this._editor.setState(state); + } + } + + get value() { + return this._editor ? this._editor.state.doc.toString() : this._value; + } + + focus() { + this._editor?.focus(); + } + + /** + * @param {string} type + */ + _dispatch(type) { + this.dispatchEvent(new Event(type, { bubbles: true, composed: true })); + } + _extensions() { + const language = (() => { + switch (this.language) { + case "js": + return [langJS()]; + case "html": + return [langHTML()]; + case "css": + return [langCSS()]; + case "wat": + return [langWat()]; + default: + return []; + } + })(); + + return [ + minimalSetup, + bracketMatching(), + closeBrackets(), + ...(!this.minimal + ? [ + lineNumbers(), + indentOnInput(), + autocompletion(), + highlightActiveLine(), + keymap.of([ + ...closeBracketsKeymap, + ...defaultKeymap, + ...completionKeymap, + ...lintKeymap, + indentWithTab, + ]), + EditorView.lineWrapping, + ] + : []), + ...(this.theme.value === "dark" ? [oneDark] : []), + ...language, + EditorView.focusChangeEffect.of((_, focusing) => { + this._dispatch(focusing ? "focus" : "blur"); + return null; + }), + EditorView.updateListener.of((update) => { + if (update.docChanged) { + if (this._updateTimer !== -1) { + clearTimeout(this._updateTimer); + } + this._updateTimer = window?.setTimeout(() => { + this._updateTimer = -1; + this._dispatch("update"); + }, this.delay); + } + }), + ]; + } + + async format() { + const prettier = await import("prettier/standalone"); + const config = (() => { + switch (this.language) { + case "js": + return { + parser: "babel", + plugins: [ + import("prettier/plugins/babel"), + import("prettier/plugins/estree"), + ], + }; + case "html": + return { + parser: "html", + plugins: [ + import("prettier/plugins/html"), + import("prettier/plugins/postcss"), + import("prettier/plugins/babel"), + import("prettier/plugins/estree"), + ], + }; + case "css": + return { + parser: "css", + plugins: [import("prettier/plugins/postcss")], + }; + default: + return undefined; + } + })(); + if (config) { + const plugins = await Promise.all(config.plugins); + const unformatted = this.value; + const formatted = await prettier.format(unformatted, { + parser: config.parser, + plugins: /** @type {import("prettier").Plugin[]} */ (plugins), + }); + if (this.value === unformatted) { + if (unformatted !== formatted) { + this.value = formatted; + this._dispatch("update"); + } + } + } + } + + /** @param {PropertyValues} changedProperties */ + willUpdate(changedProperties) { + if ( + changedProperties.has("language") || + changedProperties.has("ThemeController.value") + ) { + this._editor?.dispatch({ + effects: StateEffect.reconfigure.of(this._extensions()), + }); + } + } + + render() { + return html`
`; + } + + firstUpdated() { + let startState = EditorState.create({ + doc: this._value, + extensions: this._extensions(), + }); + this._editor = new EditorView({ + state: startState, + parent: this.renderRoot.querySelector("div") || undefined, + }); + } +} + +customElements.define("play-editor", PlayEditor); + +export const ReactPlayEditor = createComponent({ + tagName: "play-editor", + elementClass: PlayEditor, + react: React, + events: { + onUpdate: "update", + }, +}); diff --git a/vendor/yari/client/src/lit/play/editor.scss b/vendor/yari/client/src/lit/play/editor.scss new file mode 100644 index 000000000..a96887a13 --- /dev/null +++ b/vendor/yari/client/src/lit/play/editor.scss @@ -0,0 +1,40 @@ +@use "../../ui/vars" as *; + +:host { + display: block; + font-size: 0.875rem; +} + +.editor { + height: 100%; + + &.minimal { + display: flex; + flex-direction: column; + justify-content: center; + + .cm-content { + align-self: center; + min-height: auto; + } + + .cm-focused { + outline: none; + } + + .cm-line { + padding: 0 12px; + } + } + + .cm-editor { + height: 100%; + width: 100%; + + * { + // codemirror uses `font-family: monospace;` in multiple places + // which causes weird fonts to be used in various locales + font-family: var(--font-code) !important; + } + } +} diff --git a/vendor/yari/client/src/lit/play/runner.js b/vendor/yari/client/src/lit/play/runner.js new file mode 100644 index 000000000..1bc2c2153 --- /dev/null +++ b/vendor/yari/client/src/lit/play/runner.js @@ -0,0 +1,196 @@ +import { html, LitElement } from "lit"; +import { createRef, ref } from "lit/directives/ref.js"; +import { createComponent } from "@lit/react"; +import { Task } from "@lit/task"; +import React from "react"; + +import { compressAndBase64Encode } from "../../playground/utils.ts"; +import { PLAYGROUND_BASE_HOST } from "../../env.ts"; +import { ThemeController } from "../theme-controller.js"; + +import styles from "./runner.scss?css" with { type: "css" }; + +/** + * @import { RunnerDefaults, VConsole } from "./types" + * @import { EventName } from "@lit/react" + * @import { Ref } from "lit/directives/ref.js"; */ + +export class PlayRunner extends LitElement { + static properties = { + code: { type: Object }, + defaults: { type: String }, + srcPrefix: { type: String, attribute: "src-prefix" }, + sandbox: { type: String }, + }; + + static styles = styles; + + constructor() { + super(); + /** @type {ThemeController} */ + this.theme = new ThemeController(this); + /** @type {Record | undefined} */ + this.code = undefined; + /** @type {RunnerDefaults | undefined} */ + this.defaults = undefined; + /** @type {string | undefined} */ + this.srcPrefix = undefined; + this.sandbox = ""; + this._subdomain = crypto.randomUUID(); + /** @type {Promise} */ + this.ready = new Promise((resolve) => { + this._resolveReady = () => resolve(true); + }); + } + + /** @type {Ref} */ + _iframe = createRef(); + + /** @param {MessageEvent} e */ + _onMessage({ data: { typ, prop, args }, origin, source }) { + /** @type {string | undefined} */ + let uuid = new URL(origin, "https://example.com").hostname.split(".")[0]; + if (uuid !== this._subdomain && source && "location" in source) { + // `origin` doesn't contain the uuid on localhost + // so check `source` for the uuid param we set + // this only works on localhost (it errors cross-origin) + try { + uuid = + new URLSearchParams(source.location.search).get("uuid") || undefined; + } catch { + uuid = undefined; + } + } + if (uuid !== this._subdomain) { + return; + } + if (typ === "console") { + /** @type {VConsole} */ + const detail = { prop, args }; + this.dispatchEvent( + new CustomEvent("console", { bubbles: true, composed: true, detail }) + ); + } else if (typ === "ready") { + this._resolveReady(); + } + } + + _constructUrl() { + const url = new URL( + window.location.hostname.endsWith("localhost") + ? window.location.origin + : `${window.location.protocol}//${ + PLAYGROUND_BASE_HOST.startsWith("localhost") + ? "" + : `${this._subdomain}.` + }${PLAYGROUND_BASE_HOST}` + ); + url.pathname = "runner.html"; + return url; + } + + _updateSrc = new Task(this, { + args: () => + /** @type {const} */ ([ + this.code, + this.defaults, + this.theme.value, + this.srcPrefix, + ]), + task: async ([code, defaults, theme, srcPrefix], { signal }) => { + if (code && code.js && code.wat) { + const watUrl = await compileAndEncodeWatToDataUrl(code.wat); + code.js = code.js.replace("{%wasm-url%}", watUrl); + } + const { state } = await compressAndBase64Encode( + JSON.stringify({ + html: code?.html || "", + css: code?.css || "", + js: code?.js || "", + defaults: defaults, + theme: theme, + }) + ); + const prefix = (srcPrefix || "").replace(/\/$/, ""); + signal.throwIfAborted(); + // We're using a random subdomain for origin isolation. + const url = this._constructUrl(); + if (!url.host.startsWith(this._subdomain)) { + // pass the uuid for postMessage isolation on localhost + url.searchParams.set("uuid", this._subdomain); + } + url.searchParams.set("state", state); + url.pathname = `${prefix}/runner.html`; + const src = url.href; + // update iframe src without adding to browser history + this._iframe.value?.contentWindow?.location.replace(src); + }, + }); + + connectedCallback() { + super.connectedCallback(); + this._onMessage = this._onMessage.bind(this); + window.addEventListener("message", this._onMessage); + } + + /** @param {any} message */ + async postMessage(message) { + await this.ready; + this._iframe.value?.contentWindow?.postMessage(message, "*"); + } + + render() { + const url = this._constructUrl(); + url.searchParams.set("blank", ""); + url.searchParams.set("theme", this.theme.initialValue); + return html` + + `; + } + + disconnectedCallback() { + super.disconnectedCallback(); + window.removeEventListener("message", this._onMessage); + } +} + +/** + * Converts a Uint8Array to a base64 encoded string + * @param {Uint8Array} bytes - The array of bytes to convert + * @returns {string} The base64 encoded string representation of the input bytes + */ +function uInt8ArrayToBase64(bytes) { + const binString = Array.from(bytes, (byte) => + String.fromCodePoint(byte) + ).join(""); + return btoa(binString); +} + +/** + * compiles the wat code to wasm + * @param {string} wat + * @returns {Promise} a data-url with the compiled wasm, base64 encoded + */ +async function compileAndEncodeWatToDataUrl(wat) { + const { default: init, watify } = await import("@mdn/watify"); + await init(); + const binary = watify(wat); + const b64 = `data:application/wasm;base64,${uInt8ArrayToBase64(binary)}`; + return b64; +} + +customElements.define("play-runner", PlayRunner); + +export const ReactPlayRunner = createComponent({ + tagName: "play-runner", + elementClass: PlayRunner, + react: React, + events: { + onConsole: /** @type {EventName>} */ ("console"), + }, +}); diff --git a/vendor/yari/client/src/lit/play/runner.scss b/vendor/yari/client/src/lit/play/runner.scss new file mode 100644 index 000000000..31d32859d --- /dev/null +++ b/vendor/yari/client/src/lit/play/runner.scss @@ -0,0 +1,5 @@ +iframe { + border: none; + height: 100%; + width: 100%; +} diff --git a/vendor/yari/client/src/lit/play/types.d.ts b/vendor/yari/client/src/lit/play/types.d.ts new file mode 100644 index 000000000..fe713afbd --- /dev/null +++ b/vendor/yari/client/src/lit/play/types.d.ts @@ -0,0 +1,6 @@ +export interface VConsole { + prop: string; + args: any[]; +} + +export type RunnerDefaults = "ix-tabbed" | "ix-wat" | "ix-choice"; diff --git a/vendor/yari/client/src/lit/theme-controller.js b/vendor/yari/client/src/lit/theme-controller.js new file mode 100644 index 000000000..c685bfd2f --- /dev/null +++ b/vendor/yari/client/src/lit/theme-controller.js @@ -0,0 +1,53 @@ +/** + * @import { LitElement } from "lit"; + * @import { Theme } from "../types/theme"; + */ + +/** + * Requests a Lit update when the theme changes, + * with a "ThemeController.value" changed property in `willUpdate`. + * Current theme can be accessed through `.value`. + */ +export class ThemeController { + #host; + + /** @param {LitElement} host */ + constructor(host) { + this.#host = host; + this.#host.addController(this); + /** @type {Theme} */ + this.value = "os-default"; + this.initialValue = "os-default"; + this._observer = new MutationObserver(() => this._updateTheme()); + this._matchMedia = window.matchMedia("(prefers-color-scheme: dark)"); + } + + _updateTheme() { + /** @type {Theme[]} */ + const themes = ["os-default", "dark", "light"]; + const { classList } = document.documentElement; + let value = themes.find((x) => classList.contains(x)) || "os-default"; + if (value === "os-default") { + value = this._matchMedia.matches ? "dark" : "light"; + } + const oldValue = this.value; + this.value = value; + this.#host.requestUpdate("ThemeController.value", oldValue); + } + + hostConnected() { + this._observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ["class"], + }); + this._updateTheme = this._updateTheme.bind(this); + this._matchMedia.addEventListener("change", this._updateTheme); + this._updateTheme(); + this.initialValue = this.value; + } + + hostDisconnected() { + this._observer.disconnect(); + this._matchMedia.removeEventListener("change", this._updateTheme); + } +} diff --git a/vendor/yari/client/src/lit/tsconfig.json b/vendor/yari/client/src/lit/tsconfig.json new file mode 100644 index 000000000..a3708bfbf --- /dev/null +++ b/vendor/yari/client/src/lit/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "strict": true, + "noUncheckedIndexedAccess": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noEmit": true, + "noFallthroughCasesInSwitch": true, + "allowImportingTsExtensions": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "isolatedModules": true, + "jsx": "react-jsx", + "lib": ["dom", "dom.iterable", "es2021"], + "module": "ESNext", + "moduleResolution": "Node", + "target": "ES2020", + "plugins": [ + { + "name": "ts-lit-plugin", + "strict": true + } + ] + }, + "include": ["**/*"] +} diff --git a/vendor/yari/client/src/lit/viewed-controller.js b/vendor/yari/client/src/lit/viewed-controller.js new file mode 100644 index 000000000..483bccb7e --- /dev/null +++ b/vendor/yari/client/src/lit/viewed-controller.js @@ -0,0 +1,93 @@ +/** + * @import { LitElement } from "lit"; + * @import { Ref } from "lit/directives/ref" + */ + +export class ViewedController { + #host; + + /** + * @param {LitElement} host + * @param {Ref} target + * @param {Function} callback + * @param {IntersectionObserverInit} [intersectionObserverOptions] + */ + constructor( + host, + target, + callback, + intersectionObserverOptions = { + threshold: 0.5, + } + ) { + this.#host = host; + this.#host.addController(this); + + this.target = target; + this.callback = callback; + this.intersectionObserverOptions = intersectionObserverOptions; + + this._visible = !document.hidden; + this._timer = null; + this._hasViewed = false; + this._onVisibilityChange = this.onVisibilityChange.bind(this); + } + + hostConnected() { + document.addEventListener("visibilitychange", this._onVisibilityChange); + } + + hostDisconnected() { + this.disconnectObserver(); + document.removeEventListener("visibilitychange", this._onVisibilityChange); + } + + hostUpdated() { + const target = this.target.value; + if (!target) { + console.error("[ViewedController] Target not found"); + } else { + this._observer = new IntersectionObserver((entries) => { + entries.forEach((entry) => + this._checkAndSetTimer(entry.isIntersecting) + ); + }, this.intersectionObserverOptions); + this._observer.observe(target); + } + } + + disconnectObserver() { + if (this._observer) { + this._observer.disconnect(); + } + } + + onVisibilityChange() { + this._visible = !document.hidden; + this._checkAndSetTimer(); + } + + /** + * If the page is visible and the element is intersecting, start a 1-second timer + * to dispatch the "view" event. + * + * If conditions are not met before the timer fires, clear the timer. + * + * @param {boolean} [isIntersecting=false] + */ + _checkAndSetTimer(isIntersecting = false) { + if (!this._hasViewed && this._visible && isIntersecting) { + if (this._timer === null) { + this._timer = window.setTimeout(() => { + this._hasViewed = true; + this.callback(); + }, 1000); + } + } else { + if (this._timer !== null) { + clearTimeout(this._timer); + this._timer = null; + } + } + } +} diff --git a/vendor/yari/client/src/minimal-prism.scss b/vendor/yari/client/src/minimal-prism.scss new file mode 100644 index 000000000..0534c1a37 --- /dev/null +++ b/vendor/yari/client/src/minimal-prism.scss @@ -0,0 +1,80 @@ +/* +This is based on node_modules/prismjs/themes/prism.css as of Mar 26, 2021. + +The reason we're not importing all of their CSS is because it contains a lot of +selectors that we never use. In particular, it has (lots!) CSS for selectors +like `pre[class*="language-"]` and `code[class*="language-"]` but because we +don't use any of that, we can safely ignore it. +*/ + +@use "./ui/theme/color-palette/index.scss" as palette; + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata, +.token.punctuation { + color: palette.$mdn-neutral600; +} + +.token.namespace { + opacity: 0.7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: var(--icon-critical); +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: palette.$mdn-green700; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: palette.$mdn-color-neutral-90; +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: palette.$mdn-blue700; +} + +.token.function, +.token.class-name { + color: palette.$mdn-red600; +} + +.token.regex, +.token.important, +.token.variable { + color: palette.$mdn-yellow600; +} + +.token.important, +.token.bold { + font-weight: bold; +} + +.token.italic { + font-style: italic; + font-variation-settings: "slnt" -10; +} + +.token.entity { + cursor: help; +} diff --git a/vendor/yari/client/src/newsletter/index.scss b/vendor/yari/client/src/newsletter/index.scss new file mode 100644 index 000000000..78e12cca3 --- /dev/null +++ b/vendor/yari/client/src/newsletter/index.scss @@ -0,0 +1,14 @@ +.section-newsletter { + margin: 0 auto; + max-width: 35rem; + padding: 2rem; + + input[type="email"], + button { + width: 100%; + } + + form { + margin-bottom: 2rem; + } +} diff --git a/vendor/yari/client/src/newsletter/index.tsx b/vendor/yari/client/src/newsletter/index.tsx new file mode 100644 index 000000000..6c6ae6ed4 --- /dev/null +++ b/vendor/yari/client/src/newsletter/index.tsx @@ -0,0 +1,51 @@ +import React, { createElement } from "react"; + +import { useIsServer, useLocale } from "../hooks"; +import { MainContentContainer } from "../ui/atoms/page-content"; +import { useUserData } from "../user-context"; + +import "./index.scss"; + +export function Newsletter() { + return ( + + + + ); +} + +function SignUpForm({ sendUsersToSettings = false, section = false }) { + const isServer = useIsServer(); + const user = useUserData(); + const locale = useLocale(); + + return ( + <> + {createElement(section ? "h2" : "h1", null, "Stay Informed with MDN")} +

We're decommissioning our MDN Plus newsletter.

+

+ + We will automatically unsubscribe you and purge all related data soon. + +

+ {sendUsersToSettings && user?.isAuthenticated && !isServer ? ( +
+ ) : ( + <> + )} + + ); +} + +export function SignUpSection() { + return ( +
+ +
+ ); +} diff --git a/vendor/yari/client/src/observatory/benchmark-chart/index.scss b/vendor/yari/client/src/observatory/benchmark-chart/index.scss new file mode 100644 index 000000000..80d8a30fd --- /dev/null +++ b/vendor/yari/client/src/observatory/benchmark-chart/index.scss @@ -0,0 +1,61 @@ +@use "../../ui/vars" as *; + +.observatory { + svg.chart { + background-color: var(--background-primary); + border-radius: var(--border-radius); + + .tick text { + fill: var(--observatory-color-secondary); + font-family: var(--font-body); + font-size: 1rem; + font-weight: 300; + transform: scale(1); + + &.x-labels { + text-anchor: middle; + + &.current { + fill: var(--grade-border); + } + } + + &.y-labels { + text-anchor: end; + } + } + + .tick line { + color: var(--observatory-color-secondary); + opacity: 0.9; + stroke: var(--observatory-border); + stroke-dasharray: 5, 5; + stroke-width: 1px; + } + + .bar { + fill: var(--grade-bg); + stroke: var(--grade-bg); + stroke-width: 1; + + &.current-grade { + stroke: var(--grade-border); + } + } + + .you-are-here { + polyline { + fill: var(--background-primary); + filter: drop-shadow(0 0 3px rgb(170 170 170)); + z-index: 9; + } + + text { + fill: var(--text-primary); + font-family: var(--font-body); + font-size: 0.85rem; + font-weight: 300; + } + } + } +} diff --git a/vendor/yari/client/src/observatory/benchmark-chart/index.tsx b/vendor/yari/client/src/observatory/benchmark-chart/index.tsx new file mode 100644 index 000000000..1279a8f5b --- /dev/null +++ b/vendor/yari/client/src/observatory/benchmark-chart/index.tsx @@ -0,0 +1,253 @@ +import { GradeDistribution, ObservatoryResult } from "../types"; +import { formatMinus } from "../utils"; +import "./index.scss"; + +export default function GradeSVG({ + gradeDistribution, + result, +}: { + gradeDistribution: GradeDistribution[]; + result: ObservatoryResult; +}) { + const width = 1200; + const height = 380; + const leftSpace = 100; // left edge to left edge of first bar + const rightSpace = 80; // right edge to tight edge of last bar + const bottomSpace = 60; // bottom edge to bottom edge of bars + const topSpace = 60; // top padding + const itemCount = gradeDistribution.length; + const barWidth = 60; + + // The x-axis has the different grades from "A+" to "D-". + const xTickIncr = + (width - leftSpace - rightSpace - barWidth) / (itemCount - 1); + const xTickOffset = leftSpace + xTickIncr / 2; + + // The y-axis has ticks according to the maximum value of all grades. + const yMarks = calculateTicks(gradeDistribution); + const yTickOffset = height - bottomSpace; + const yTickIncr = (height - bottomSpace - topSpace) / (yMarks.length - 1); + const yTickMax = Math.max(...yMarks); + + return ( + <> + + + + + + + + + + {gradeDistribution.map((item, index) => ( + + + + + ))} + +
Number of sites by grade
GradeSites
+ {formatMinus(item.grade)} + {item.grade === result.scan.grade ? " (Current grade)" : ""} + {item.count} sites
+ + Number of sites by grade + + + {gradeDistribution.map((item, index) => ( + + + {formatMinus(item.grade)} + + + ))} + + + {gradeDistribution.map((item, index) => { + // draw the individual grade bars + const barHeight = + (height - bottomSpace - topSpace) * (item.count / yTickMax); + return ( + + ); + })} + + + {yMarks.map((item, index) => ( + + + + {/* format as kilo-sites, which works well for our current and future ranges below 10^6*/} + {item / 1000}k + + + ))} + + + + {gradeDistribution.map((item, index) => { + // Draw the "This website is here" marker. Drawn explicitly last so it is above all other elements in the drawing. + if (item.grade === result.scan.grade) { + const barHeight = + (height - bottomSpace - topSpace) * (item.count / yTickMax); + return ( + + + + Current grade + + + ); + } else { + return []; + } + })} + + + + ); +} + +/** + * Calculate + * @param {GradeDistribution[]} gradeDistribution + * @returns {number[]} + */ +function calculateTicks(gradeDistribution: GradeDistribution[]): number[] { + const maxValue = Math.max(...gradeDistribution.map((item) => item.count)); + const tickTargetCount = 7; // Target number of ticks between 5 and 10 + const range = rangeForValue(maxValue, false); // Get a nice range + const tickInterval = rangeForValue(range / tickTargetCount, true); // Determine a nice tick interval + const niceMaxValue = Math.ceil(maxValue / tickInterval) * tickInterval; // Adjust max value to a nice number + const tickCount = Math.ceil(niceMaxValue / tickInterval) + 1; // Calculate the number of ticks + + const ticks: number[] = []; + for (let i = 0; i < tickCount; i++) { + ticks.push(i * tickInterval); + } + return ticks; +} + +/** + * This returns values to construct proper axis measurements in + * diagrams. The returned value is 1|2|5 * 10^x. + * + * If `round` is `true`, the returned value can be also rounded down, + * useful for calculating ticks on an axis. + * + * Examples: + * + * |range |rounded=false|rounded=true| + * |---------|-------------|------------| + * | 1 | 1 | 1 | + * | 2 | 2 | 2 | + * | 3 | 5 | 5 | + * | 4 | 5 | 5 | + * | 5 | 5 | 5 | + * | 6 | 10 | 5 | + * | 7 | 10 | 10 | + * | 8 | 10 | 10 | + * | 9 | 10 | 10 | + * | 10 | 10 | 10 | + * | 34 | 50 | 50 | + * | 450 | 500 | 500 | + * | 560 | 1000 | 500 | + * | 6780 | 10000 | 5000 | + * | 10 | 10 | 10 | + * | 100 | 100 | 100 | + * | 1000 | 1000 | 1000 | + * | 10000 | 10000 | 10000 | + * + * @param {number} range The input value + * @param {boolean} round If false, the returned value will always be greater than `range`, otherwise it can be rounded off + * @returns {number} a number according to `1|2|5 * 10^x`, where x is derived from `range` to be in the same order of magnitude + */ + +function rangeForValue(range: number, round: boolean): number { + const exponent = Math.floor(Math.log10(range)); + const fraction = range / Math.pow(10, exponent); + + let niceFraction: number; + if (round) { + if (fraction < 1.5) { + niceFraction = 1; + } else if (fraction < 3) { + niceFraction = 2; + } else if (fraction < 7) { + niceFraction = 5; + } else { + niceFraction = 10; + } + } else { + if (fraction <= 1) { + niceFraction = 1; + } else if (fraction <= 2) { + niceFraction = 2; + } else if (fraction <= 5) { + niceFraction = 5; + } else { + niceFraction = 10; + } + } + return niceFraction * Math.pow(10, exponent); +} diff --git a/vendor/yari/client/src/observatory/docs/index.scss b/vendor/yari/client/src/observatory/docs/index.scss new file mode 100644 index 000000000..c272e1276 --- /dev/null +++ b/vendor/yari/client/src/observatory/docs/index.scss @@ -0,0 +1,29 @@ +@use "../../ui/vars" as *; + +.observatory { + --background-toc-active: var(--observatory-border); + --category-color: var(--observatory-accent); + + .article-actions-container { + display: flex; + } + + .sidebar { + @media (min-width: $screen-md) { + padding-top: 3rem; + } + } + + &, + .observatory-wrapper { + .document-toc-heading { + font-size: var(--type-base-font-size-rem); + margin-top: 1.5rem; + + a, + a:hover { + text-decoration: none; + } + } + } +} diff --git a/vendor/yari/client/src/observatory/docs/index.tsx b/vendor/yari/client/src/observatory/docs/index.tsx new file mode 100644 index 000000000..76ff31e4a --- /dev/null +++ b/vendor/yari/client/src/observatory/docs/index.tsx @@ -0,0 +1,217 @@ +import { useParams, useLocation } from "react-router-dom"; +import StaticPage, { StaticPageProps } from "../../homepage/static-page"; +import "./index.scss"; +import { useLocale } from "../../hooks"; +import { ObservatoryLayout } from "../layout"; +import { + OBSERVATORY_TITLE, + OBSERVATORY_TITLE_FULL, +} from "../../../../libs/constants"; +import useSWR from "swr"; +import { OBSERVATORY_API_URL } from "../../env"; +import { Loading } from "../../ui/atoms/loading"; + +export const ITEMS = [ + { + slug: "observatory/docs/tests_and_scoring", + title: "Tests & Scoring", + }, + { + slug: "observatory/docs/faq", + title: "FAQ", + }, +]; + +export function ObservatoryDocsNav() { + return ; +} + +function RelatedTopics({ + items, +}: { + items: { slug: string; title: string }[]; +}) { + const locale = useLocale(); + const { pathname: locationPathname } = useLocation(); + + return ( + + ); +} + +interface ObservatoryMatrixResultEntry { + name: string; + scoreModifier: number; + description: { __html: string }; + recommendation: { __html: string }; +} + +interface ObservatoryMatrixEntry { + name: string; + title: string; + mdnLink: string; + results: ObservatoryMatrixResultEntry[]; +} + +function ObservatoryMatrix({ + data, +}: { + data?: ObservatoryMatrixEntry[] | null; +}) { + return ( + <> + {data && + data?.map((entry) => { + return ( +
+

{entry.title}

+

+ See {entry.title} for guidance. +

+
+ + + + + + + + + + {entry.results.map((result) => { + return ( + + + + + + ); + })} + +
Test resultDescriptionModifier
{result.name}{result.scoreModifier}
+
+
+ ); + })} + + ); +} + +function TestAndScoringPage({ ...props }: StaticPageProps) { + const { "*": slug } = useParams(); + + const { data, isLoading } = useSWR( + `${OBSERVATORY_API_URL}/api/v2/recommendation_matrix`, + async (url) => { + const response = await fetch(url); + if (!response.ok) { + throw new Error(await response.text()); + } + let data = await response.json(); + data.map((entry) => + entry.results.map((result) => { + result.description = { __html: result.description }; + result.recommendation = { __html: result.recommendation }; + return result; + }) + ); + return data; + }, + { + revalidateOnFocus: false, + revalidateIfStale: false, + revalidateOnReconnect: false, + } + ); + + let additionalToc = data?.map((entry) => ({ + text: entry.title, + id: entry.name, + })); + + return isLoading ? ( + + ) : ( + + {slug === "tests_and_scoring" && ( + <> + + + )}{" "} + + ); +} + +function GenericDoc({ ...props }: StaticPageProps) { + return ; +} + +function ObservatoryDocs({ ...props }) { + const { pathname } = useLocation(); + const locale = useLocale(); + const { "*": slug } = useParams(); + + const sidebarHeader = ; + + const fullSlug = `observatory/docs/${slug}`; + + const staticPageProps = { + extraClasses: "plus-docs", + locale, + slug: fullSlug, + title: OBSERVATORY_TITLE_FULL, + sidebarHeader, + fallbackData: props.hyData ? props : undefined, + }; + + return ( + i.slug === fullSlug)?.title ?? "Documentation", + uri: pathname, + }, + ]} + withSidebar={true} + > + {slug === "tests_and_scoring" ? ( + + ) : ( + + )} + + ); +} + +export default ObservatoryDocs; diff --git a/vendor/yari/client/src/observatory/index.scss b/vendor/yari/client/src/observatory/index.scss new file mode 100644 index 000000000..58671727f --- /dev/null +++ b/vendor/yari/client/src/observatory/index.scss @@ -0,0 +1,138 @@ +@use "../ui/vars" as *; + +.observatory { + --border-radius: 0.3rem; + --code-background-block: var(--observatory-bg-code); + --spacing: 2rem; + background-color: var(--observatory-bg); + + h1, + h2 { + font-style: normal; + font-weight: 600; + letter-spacing: var(--heading-letter-spacing); + } + + .obs-none { + color: var(--observatory-color-secondary); + } + + .obs-score-value { + margin-right: 0.5rem; + } + + .obs-pass-icon { + svg.pass { + path { + fill: var(--observatory-pass-icon-bg); + } + + circle { + fill: var(--observatory-pass-icon-color); + } + } + + svg.fail { + path { + fill: var(--observatory-fail-icon-bg); + } + + circle { + fill: var(--observatory-fail-icon-color); + } + } + } + + .accent { + color: var(--observatory-accent); + } + + .observatory-wrapper { + display: grid; + grid-template-areas: "header header header" "main main main" ". sidebar ."; + grid-template-columns: 1rem 1fr 1rem; + max-width: var(--max-width); + padding: 1.5rem 1rem; + + section.header { + grid-area: header; + } + + section.main { + grid-area: main; + } + + a { + color: var(--observatory-color); + text-decoration: underline; + text-decoration-color: var(--observatory-color-secondary); + + &:hover, + &:active { + text-decoration: none; + } + } + + .feedback-link { + --feedback-link-icon: var(--observatory-color-secondary); + --text-link: var(--observatory-color-secondary); + color: var(--observatory-color-secondary); + display: block; + font-size: var(--type-tiny-font-size); + margin-top: 1.5rem; + } + + .feedback-link.faq-link::before { + mask-image: url("../assets/icons/message-question.svg"); + } + + .error { + color: var(--form-invalid-color); + margin-top: 0.5rem; + + &::before { + background-color: var(--form-invalid-color); + content: ""; + display: inline-block; + height: 1.15rem; + margin-bottom: 0.25rem; + margin-right: 0.5rem; + mask-image: url("../assets/icons/alert-circle.svg"); + mask-position: center; + mask-repeat: no-repeat; + vertical-align: middle; + width: 1.5em; + } + + + form input { + outline-color: var(--observatory-border-accent); + } + } + + @media (min-width: $screen-md) { + column-gap: 1rem; + grid-template-areas: "header sidebar" "main sidebar"; + grid-template-columns: minmax(0, 1fr) 12rem; + padding-left: 1rem; + padding-right: 1rem; + + section.header, + section.main { + padding: 0; + } + } + + @media (min-width: $screen-xl) { + column-gap: 3rem; + grid-template-areas: "header sidebar" "main sidebar"; + grid-template-columns: 2fr minmax(0, 200px); + } + } + + .scroll-container { + margin-bottom: 1.5rem; + margin-top: 0.8rem; + overflow-x: auto; + overscroll-behavior-x: none; + } +} diff --git a/vendor/yari/client/src/observatory/index.tsx b/vendor/yari/client/src/observatory/index.tsx new file mode 100644 index 000000000..47e53faa9 --- /dev/null +++ b/vendor/yari/client/src/observatory/index.tsx @@ -0,0 +1,21 @@ +import { Route, Routes } from "react-router-dom"; + +import { PageNotFound } from "../page-not-found"; + +import ObservatoryLanding from "./landing"; +import ObservatoryResults from "./results"; +import ObservatoryDocs from "./docs"; +import "./index.scss"; + +export default function Observatory({ ...props }) { + return ( +
+ + } /> + } /> + } /> + } /> + +
+ ); +} diff --git a/vendor/yari/client/src/observatory/landing.scss b/vendor/yari/client/src/observatory/landing.scss new file mode 100644 index 000000000..c14dcb255 --- /dev/null +++ b/vendor/yari/client/src/observatory/landing.scss @@ -0,0 +1,233 @@ +@use "../ui/vars" as *; + +.observatory { + .observatory-landing.observatory-landing-top { + background: var(--observatory-bg-secondary); + + .observatory-wrapper { + grid-template-areas: "header ."; + + @media (max-width: #{$screen-xl - 1}) { + grid-template-areas: "header"; + grid-template-columns: auto; + } + } + } + + .observatory-landing { + background: var(--observatory-bg); + + .observatory-wrapper { + .feedback-link, + .faq-link { + display: inline-block; + margin-right: 1rem; + margin-top: 2rem; + } + } + + .place { + grid-area: sidebar; + } + + .header { + display: grid; + gap: 0 6.25rem; + grid-template-areas: "form svg"; + grid-template-columns: 2fr 1fr; + + .scan-form { + grid-area: form; + } + + .landing-illustration { + grid-area: svg; + + svg { + height: auto; + max-width: 50vw; + width: 100%; + } + } + + @media (max-width: #{$screen-md - 1}) { + grid-template: + "form" auto + "svg" auto; + + .landing-illustration { + text-align: center; + } + } + } + + h1 { + margin-bottom: unset; + } + + p { + color: var(--observatory-color-secondary); + } + + form { + .input-group { + display: flex; + height: 3rem; + + :focus-visible { + outline: 1px solid var(--observatory-accent); + outline-offset: -1px; + outline-width: 1px; + } + + ::placeholder { + color: var(--observatory-color-secondary); + opacity: 0.8; + } + + input { + background-color: var(--observatory-bg); + border: 1px solid var(--observatory-border); + border-bottom-left-radius: var(--border-radius); + border-top-left-radius: var(--border-radius); + flex-grow: 1; + padding: 0 0.75rem; + width: 100%; + + &::placeholder { + overflow-x: hidden; + text-overflow: ellipsis; + } + } + + button { + background: var(--button-primary-default); + border-bottom-right-radius: var(--border-radius); + border-top-right-radius: var(--border-radius); + color: var(--background-primary); + cursor: pointer; + font: var(--type-emphasis-m); + font-size: 1rem; + padding: 0 2rem; + + &:hover { + background: var(--button-primary-hover); + } + + &:active { + background: var(--button-primary-active); + } + } + } + + label { + align-items: center; + display: flex; + margin: 1.75rem 0; + } + + input[type="checkbox"] { + height: 1.25rem; + margin: 0; + margin-right: 0.5rem; + width: 1.25rem; + } + } + + .main { + background: var(--observatory-bg); + border-radius: var(--border-radius); + margin: 1rem 0; + + h2 { + margin-top: unset; + } + + .about { + display: flex; + flex-direction: column; + + h2 { + margin-bottom: 2rem; + } + + // Make a gradient from the accent color to the background color, + // replacing the light-mode-only colors in the original SVG data. + svg.lines defs#defs3 #gradient { + stop#stop1 { + stop-color: var(--observatory-accent); + } + + stop#stop2 { + stop-color: color-mix( + in srgb, + var(--observatory-accent), + var(--observatory-bg) + ); + } + + stop#stop3 { + stop-color: var(--observatory-bg); + } + } + + figure { + &.assessment, + &.scanning, + &.security, + &.mdn { + svg path { + fill: var(--observatory-accent); + } + } + } + } + + @media (min-width: $screen-md) { + .assessment { + margin-left: 0; + } + + .scanning { + margin-left: 3.125rem; + } + + .security { + margin-left: 6.25rem; + } + + .mdn { + margin-left: 9.75rem; + } + } + @media (max-width: #{$screen-md - 1}) { + figure ~ figure { + margin-top: 1.75rem; + } + + .lines { + display: none; + } + } + @media (min-width: $screen-md) and (max-width: #{$screen-lg - 1}) { + .about-copy { + width: 80%; + } + } + + figure { + align-items: start; + display: grid; + gap: 1.5rem; + grid-template-columns: 2rem 1fr; + + figcaption { + p { + color: var(--observatory-color); + margin: 0; + } + } + } + } + } +} diff --git a/vendor/yari/client/src/observatory/landing.tsx b/vendor/yari/client/src/observatory/landing.tsx new file mode 100644 index 000000000..6ae637f01 --- /dev/null +++ b/vendor/yari/client/src/observatory/landing.tsx @@ -0,0 +1,204 @@ +import { useEffect, useState } from "react"; +import { useNavigate } from "react-router-dom"; + +import { useGleanClick } from "../telemetry/glean-context"; +import { OBSERVATORY } from "../telemetry/constants"; +import Container from "../ui/atoms/container"; +import { SidePlacement } from "../ui/organisms/placement"; +import { + OBSERVATORY_TITLE, + OBSERVATORY_TITLE_FULL, +} from "../../../libs/constants"; + +import { ObservatoryAnalyzeRequest } from "./types"; +import { ObservatoryLayout } from "./layout"; +import { Progress } from "./progress"; +import { ERROR_MAP, FaqLink, FeedbackLink, useUpdateResult } from "./utils"; + +import "./landing.scss"; +import { ReactComponent as LandingSVG } from "../../public/assets/observatory/landing-illustration.svg"; +import { ReactComponent as LinesSVG } from "../../public/assets/observatory/lines.svg"; +import { ReactComponent as AssessmentSVG } from "../../public/assets/observatory/assessment.svg"; +import { ReactComponent as ScanningSVG } from "../../public/assets/observatory/scanning.svg"; +import { ReactComponent as SecuritySVG } from "../../public/assets/observatory/security.svg"; +import { ReactComponent as MdnSVG } from "../../public/assets/observatory/mdn.svg"; + +export default function ObservatoryLanding() { + document.title = `HTTP Header Security Test - ${OBSERVATORY_TITLE_FULL}`; + + const [form, setForm] = useState({ + host: "", + }); + const [cleanHostname, setCleanHostname] = useState(""); + const { + trigger, + isMutating, + data, + error: updateError, + } = useUpdateResult(cleanHostname); + const [error, setError] = useState(); + const navigate = useNavigate(); + + useEffect(() => { + try { + // tolerate url-style host values and pick out the hostname part + const url = new URL(form.host); + setCleanHostname(url.hostname.trim() || form.host); + } catch { + setCleanHostname(form.host); + } + }, [form.host]); + + useEffect(() => { + if (!isMutating && data) { + if (data.scan.error) { + setError(new Error(data.scan.error)); + } else { + navigate(`./analyze?host=${encodeURIComponent(cleanHostname)}`); + } + } + }, [isMutating, data, navigate, cleanHostname]); + + useEffect(() => { + setError(updateError); + }, [updateError]); + + const submit: React.FormEventHandler = async (e) => { + e.preventDefault(); + setError(undefined); + if (form.host.trim().length === 0) { + setError(new Error("Please enter a valid hostname")); + } else { + trigger(); + } + }; + + const gleanClick = useGleanClick(); + + useEffect(() => { + if (error && !isMutating) { + gleanClick( + `${OBSERVATORY}: error -> ${ERROR_MAP[error.name] || error.name || error.message}` + ); + } + }, [error, isMutating, gleanClick]); + + return ( + +
+ +
+
+

+ {OBSERVATORY_TITLE} +

+

+ Launched in 2016, the HTTP Observatory enhances web security by + analyzing compliance with best security practices. It has + provided insights to over 6.9 million websites through 47 + million scans. +

+ {isMutating ? ( + + ) : ( +
+
+ + + setForm({ ...form, host: e.target.value }) + } + /> + +
+
+ )} + {error && !isMutating && ( +
+ Error: {ERROR_MAP[error.name] || error.message} +
+ )} +
+
+ +
+
+
+
+
+ +
+
+

About the HTTP Observatory

+
+
+ +
+

+ Developed by Mozilla, the HTTP Observatory performs an + in-depth assessment of a site’s HTTP headers and other key + security configurations. +

+
+
+ +
+ +
+

+ Its automated scanning process provides developers and + website administrators with detailed, actionable feedback, + focusing on identifying and addressing potential security + vulnerabilities. +

+
+
+ +
+ +
+

+ The tool is instrumental in helping developers and website + administrators strengthen their sites against common + security threats in a constantly advancing digital + environment. +

+
+
+ +
+ +
+

+ The HTTP Observatory provides effective security insights, + guided by Mozilla's expertise and commitment to a safer + and more secure internet and based on well-established + trends and guidelines. +

+
+
+
+
+ + +
+ +
+
+
+ ); +} diff --git a/vendor/yari/client/src/observatory/layout.tsx b/vendor/yari/client/src/observatory/layout.tsx new file mode 100644 index 000000000..e9923ab37 --- /dev/null +++ b/vendor/yari/client/src/observatory/layout.tsx @@ -0,0 +1,35 @@ +import { ReactNode } from "react"; +import { DocParent } from "../../../libs/types/document"; +import { ArticleActionsContainer } from "../ui/organisms/article-actions-container"; +import { TopNavigation } from "../ui/organisms/top-navigation"; +import { DEFAULT_LOCALE } from "../../../libs/constants"; +import { OBSERVATORY_TITLE } from "../../../libs/constants"; + +export function ObservatoryLayout({ + parents = [], + children, + withSidebar = false, +}: { + parents?: DocParent[]; + children: ReactNode; + withSidebar?: boolean; +}) { + return ( + <> +
+ + +
+ {children} + + ); +} diff --git a/vendor/yari/client/src/observatory/progress/index.scss b/vendor/yari/client/src/observatory/progress/index.scss new file mode 100644 index 000000000..91365032e --- /dev/null +++ b/vendor/yari/client/src/observatory/progress/index.scss @@ -0,0 +1,34 @@ +.progress-bar { + background-color: var(--observatory-bg); + height: 4px; + overflow: hidden; + width: 100%; +} + +.progress-bar-value { + animation: indeterminateAnimation 2.5s infinite linear; + background-color: var(--observatory-accent); + height: 100%; + transform-origin: 0% 50%; + width: 100%; +} + +@keyframes indeterminateAnimation { + 0% { + transform: translateX(0) scaleX(0); + } + + 40% { + transform: translateX(0) scaleX(0.4); + } + + 100% { + transform: translateX(100%) scaleX(0.5); + } +} + +@media (prefers-reduced-motion) { + .progress-bar-value { + animation-duration: 60s; + } +} diff --git a/vendor/yari/client/src/observatory/progress/index.tsx b/vendor/yari/client/src/observatory/progress/index.tsx new file mode 100644 index 000000000..a0d01dcd6 --- /dev/null +++ b/vendor/yari/client/src/observatory/progress/index.tsx @@ -0,0 +1,25 @@ +import React from "react"; + +import "./index.scss"; + +export function useTimeout(callback: React.EffectCallback, delay: number) { + React.useEffect(() => { + const timeout = setTimeout(callback, delay); + return () => clearTimeout(timeout); + }, [delay, callback]); +} + +export function Progress({ message = "Scanning…" }: { message?: string }) { + return ( +
+

{message}

+
+
+
+
+ ); +} diff --git a/vendor/yari/client/src/observatory/results.scss b/vendor/yari/client/src/observatory/results.scss new file mode 100644 index 000000000..956f588b5 --- /dev/null +++ b/vendor/yari/client/src/observatory/results.scss @@ -0,0 +1,583 @@ +@use "../ui/vars" as *; + +.observatory-results { + .sidebar { + grid-area: sidebar; + padding-top: 0; + + .place { + display: flex; + } + } + + h2::before { + background-color: var(--observatory-color); + content: ""; + display: inline-block; + mask-position: left; + mask-repeat: no-repeat; + mask-size: contain; + } + + h2.summary::before { + height: 1.4rem; + mask-image: url("../../public/assets/observatory/summary-icon.svg"); + width: 2rem; + } + + h2.result::before { + height: 1.2rem; + mask-image: url("../../public/assets/observatory/results-icon.svg"); + width: 2rem; + } + + h2.summary .host { + font-weight: initial; + } + + .heading-and-actions { + align-items: start; + display: flex; + flex-wrap: wrap; + gap: 1.5rem; + justify-content: space-between; + margin-bottom: 3rem; + + h1 { + align-self: flex-start; + } + + .actions { + align-self: center; + } + } + + h1 { + letter-spacing: var(--heading-letter-spacing); + margin-bottom: unset; + } + + h2 { + font-size: 1.375rem; + font-weight: 600; + letter-spacing: var(--heading-letter-spacing); + margin-bottom: 1rem; + margin-top: 1.5rem; + } + + p { + font-weight: 400; + letter-spacing: -0.03rem; + } + + code { + font-weight: 600; + } + + .arrow-down { + color: var(--observatory-arrow-down-color); + } + + .arrow-up { + color: var(--observatory-arrow-up-color); + } + + .grade-trend { + grid-area: grade; + justify-self: start; + + .trend { + color: var(--observatory-color-secondary); + font-weight: 400; + margin-top: 1rem; + } + } + + .scan-results { + .footnote { + font-size: var(--type-smaller-font-size); + margin-top: 1rem; + } + + .detail-header { + display: flex; + gap: 0.5rem; + padding: 0 1.5rem 0 0; + + .arrow { + color: var(--observatory-color-secondary); + } + + .detail-header-title { + font-weight: 600; + padding-right: 0.2rem; + } + + p { + margin: 1rem 0; + } + } + + .iso-date { + code { + font-weight: initial; + } + } + + .humanized-duration { + font-size: var(--type-smaller-font-size); + } + + table { + background: var(--observatory-table-bg); + border: none; + min-width: calc($screen-lg - 2rem - 12rem); + + th { + background: var(--observatory-table-header-bg); + color: var(--text-secondary); + font-weight: 500; + vertical-align: top; + } + + tr:nth-child(odd) { + background-color: var(--observatory-table-bg-alternate); + } + + td { + overflow-wrap: anywhere; + padding: 0.5rem 1.5rem; + vertical-align: top; + + &.cookie-name:first-child { + max-width: 15rem; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + &.score > span { + display: flex; + flex-direction: row; + justify-content: space-between; + } + } + + a { + color: var(--observatory-color); + text-decoration: underline; + text-decoration-color: var(--observatory-color-secondary); + + &:hover, + &:active { + text-decoration: none; + } + } + + span.not-counted { + color: var(--observatory-color-secondary); + + a { + text-decoration: none; + } + } + + // Some column width hints on the different result table. + &.tests { + th, + td { + &:first-of-type { + width: 25%; + } + } + + td.score { + white-space: nowrap; + } + } + + &.csp { + th, + td { + &:first-of-type { + width: 45%; + } + } + } + + &.headers { + th, + td { + &:first-of-type { + width: 30%; + } + } + } + + &.cookies { + th, + td { + &:nth-of-type(n + 3) { + text-align: center; + } + } + } + + th, + td { + border: none; + padding: 1.5rem; + + :first-child { + margin-top: 0; + } + + :last-child { + margin-bottom: 0; + } + } + + .icon { + height: 1.3rem; + width: 1.3rem; + } + + @media (max-width: #{$screen-sm - 0.02}) { + td { + .iso-date { + code { + font-size: x-small; + } + } + } + } + + @media (max-width: #{$screen-lg - 0.02}) { + // responsive table + min-width: 0; + + thead { + display: none; + } + + tbody { + display: block; + } + + tr { + display: grid; + grid-template-columns: max-content auto; + } + + tr:nth-of-type(odd) { + background: var(--observatory-table-header-bg); + } + + td { + column-gap: 2em; + display: grid; + grid-auto-flow: column; + grid-column: span 2; + grid-template-columns: subgrid; + + .humanized-duration { + display: none; + } + } + + td:before { + content: attr(data-header); + display: inline; + font-weight: 600; + } + + &.tests, + &.csp, + &.headers, + &.cookies { + td:first-of-type { + width: auto; + } + } + + td:not(:last-of-type) { + padding-bottom: 0; + } + + td:nth-of-type(n + 2) { + padding-top: 0.75rem; + } + + &.cookies { + td:nth-of-type(n + 3) { + text-align: left; + } + } + + td.score { + display: grid; + + > span { + display: block; + } + + .obs-pass-icon { + display: inline-block; + height: 1.5em; + vertical-align: top; + } + } + } + } + + input[type="radio"]:not(:checked) ~ .tab-content { + display: none; + } + + ol.tabs-list { + column-gap: 3rem; + display: grid; + grid-template-areas: + "tab-0 tab-1 tab-2 tab-3 tab-4 tab-5 ." + "hr hr hr hr hr hr hr " + "mod mod mod mod mod mod mod"; + grid-template-columns: repeat(6, max-content) 1fr; + margin: 0; + overflow-x: auto; + overscroll-behavior-x: none; + padding: 0; + + @media (max-width: #{$screen-lg - 0.02}) { + column-gap: 1.75rem; + grid-template-columns: repeat(6, max-content) auto; + } + + &::before { + border: none; + border-top: 1px solid var(--observatory-border); + content: ""; + grid-area: hr; + margin: 0; + width: 100%; + } + + li.tabs-list-item { + display: contents; + + > input:checked + label { + border-bottom: 2px solid var(--observatory-accent); + color: var(--text-primary); + } + + > input:not(:checked) + label:hover { + border-bottom: 2px solid var(--observatory-accent-light); + color: var(--text-primary); + } + + > input:checked:focus-visible + label { + outline-color: var(--accent-primary); + outline-offset: 1px; + outline-style: auto; + } + + > input:not(:checked) + label { + color: var(--text-secondary); + opacity: 0.775; + } + + > label { + cursor: pointer; + height: 2.2rem; + width: max-content; + } + + &#tabs-0 { + > label, + > input { + grid-area: tab-0; + } + } + + &#tabs-1 { + > label, + > input { + grid-area: tab-1; + } + } + + &#tabs-2 { + > label, + > input { + grid-area: tab-2; + } + } + + &#tabs-3 { + > label, + > input { + grid-area: tab-3; + } + } + + &#tabs-4 { + > label, + > input { + grid-area: tab-4; + } + } + + &#tabs-5 { + > label, + > input { + grid-area: tab-5; + } + } + + > section.tab-content { + grid-area: mod; + left: 0; + margin: 0; + position: sticky; + + @media (max-width: #{$screen-lg - 0.02}) { + width: calc( + 100vw - 12rem - 3rem + ); // 12rem: placement width; 3rem: padding + } + @media (max-width: #{$screen-md - 0.02}) { + width: calc(100vw - 2rem); // 2rem: padding + } + } + } + } + } + + section.scan-rescan { + background-color: var(--background-primary); + border-radius: var(--border-radius); + justify-content: space-between; + margin-bottom: 3rem; + max-width: var(--max-width); + padding: var(--spacing); + } + + section.scan-result { + background-color: var(--background-primary); + border-radius: var(--border-radius); + column-gap: var(--spacing); + display: grid; + grid-template-areas: "grade data actions"; + grid-template-columns: auto 1fr auto; + justify-content: space-between; + margin-bottom: 3rem; + max-width: var(--max-width); + padding: var(--spacing); + + .progress { + border-radius: 50%; + display: block; + height: 0.8rem; + width: 0.8rem; + } + + a { + color: var(--observatory-color); + text-decoration: none; + } + + a:hover { + text-decoration: underline; + text-decoration-color: var(--observatory-color-secondary); + } + + .scan-another { + font-size: var(--type-smaller-font-size); + font-weight: 400; + margin-top: 1.2rem; + + a { + color: var(--observatory-color-secondary); + + &:hover { + text-decoration: underline; + } + } + } + + .label { + font-weight: 600; + } + + .actions { + grid-area: actions; + + .button-wrap { + width: 9rem; + } + } + + .data { + grid-area: data; + } + + @media (max-width: #{$screen-xl - 1}) { + align-items: flex-start; + grid-template-areas: "grade data actions"; + grid-template-columns: auto 1fr auto; + justify-content: space-between; + row-gap: calc(var(--spacing) / 2); + + .data { + align-self: start; + } + } + + @media (max-width: #{$screen-lg - 1}) { + grid-template-areas: "grade data" ". actions"; + grid-template-columns: min-content 1fr; + } + + @media (max-width: #{$screen-md - 1}) { + padding: calc(var(--spacing) / 2); + } + } + + .grade { + background: var(--grade-bg); + border: 1px solid var(--grade-border); + border-radius: 0.2em; + color: var(--grade-border); + display: inline-block; + font-size: 1.7rem; + font-weight: 600; + height: 5rem; + line-height: 5rem; + text-align: center; + width: 5rem; + } + + .grade-a { + --grade-bg: var(--observatory-grade-a-bg); + --grade-border: var(--observatory-grade-a-border); + } + + .grade-b { + --grade-bg: var(--observatory-grade-b-bg); + --grade-border: var(--observatory-grade-b-border); + } + + .grade-c { + --grade-bg: var(--observatory-grade-c-bg); + --grade-border: var(--observatory-grade-c-border); + } + + .grade-d { + --grade-bg: var(--observatory-grade-d-bg); + --grade-border: var(--observatory-grade-d-border); + } + + .grade-f { + --grade-bg: var(--observatory-grade-f-bg); + --grade-border: var(--observatory-grade-f-border); + } +} diff --git a/vendor/yari/client/src/observatory/results.tsx b/vendor/yari/client/src/observatory/results.tsx new file mode 100644 index 000000000..ab7d7e5a1 --- /dev/null +++ b/vendor/yari/client/src/observatory/results.tsx @@ -0,0 +1,233 @@ +import { useEffect, useMemo, useState } from "react"; +import { Navigate, useLocation } from "react-router"; +import { useSearchParams } from "react-router-dom"; + +import { useGleanClick } from "../telemetry/glean-context"; +import { OBSERVATORY } from "../telemetry/constants"; +import Container from "../ui/atoms/container"; + +import ObservatoryCSP from "./results/csp"; +import { + ERROR_MAP, + FeedbackLink, + useResult, + useUpdateResult as useRescanTrigger, +} from "./utils"; +import { ObservatoryLayout } from "./layout"; +import { Progress } from "./progress"; +import { ObservatoryDocsNav } from "./docs"; +import { ObservatoryCookies } from "./results/cookies"; +import { ObservatoryHeaders } from "./results/headers"; +import { ObservatoryHistory } from "./results/history"; +import { ObservatoryRating } from "./results/rating"; +import { ObservatoryTests } from "./results/tests"; +import ObservatoryBenchmark from "./results/benchmark"; +import "./results.scss"; +import { + OBSERVATORY_TITLE, + OBSERVATORY_TITLE_FULL, +} from "../../../libs/constants"; +import { SidebarContainer } from "../document/organisms/sidebar"; + +export default function ObservatoryResults() { + const { pathname, search } = useLocation(); + const [searchParams] = useSearchParams(); + const host = searchParams.get("host"); + + const { data: result, isLoading, error } = useResult(host!); + + // Used for rescanning the current host + const { + trigger, + isMutating, + error: updateError, + } = useRescanTrigger(host || ""); + + const gleanClick = useGleanClick(); + + document.title = `Scan results for ${host} | ${OBSERVATORY_TITLE_FULL}`; + + const combinedError = error || updateError; + + useEffect(() => { + if (combinedError && !isMutating) { + gleanClick( + `${OBSERVATORY}: error -> ${ERROR_MAP[combinedError.name] || combinedError.message}` + ); + } + }, [combinedError, isMutating, gleanClick]); + + const hasData = host && result && !isLoading && !isMutating; + return host ? ( + +
+ +
+
+

+ {OBSERVATORY_TITLE} Report{" "} +

+ +
+ {hasData && !combinedError ? ( + + ) : isLoading ? ( +
+ +
+ ) : isMutating ? ( +
+ +
+ ) : ( +
+
+ Error:{" "} + {ERROR_MAP[combinedError.name] || combinedError.message} +
+ Observatory Home +
+ )} +
+
+ + + +
+ {hasData && !combinedError && ( +
+ +
+ )} +
+
+
+ ) : ( + + ); +} + +function ObservatoryScanResults({ result, host }) { + const tabs = useMemo(() => { + return [ + { + label: "Scoring", + key: "scoring", + element: , + }, + { + label: "CSP analysis", + key: "csp", + element: , + }, + { + label: "Cookies", + key: "cookies", + element: , + }, + { + label: "Raw server headers", + key: "headers", + element: , + }, + { + label: "Scan history", + key: "history", + element: , + }, + { + label: "Benchmark comparison", + key: "benchmark", + element: , + }, + ]; + }, [result]); + const defaultTabKey = tabs[0].key!; + const initialTabKey = window.location.hash.replace("#", "") || defaultTabKey; + const initialTab = tabs.findIndex((tab) => tab.key === initialTabKey); + const [selectedTab, setSelectedTab] = useState( + initialTab === -1 ? 0 : initialTab + ); + useEffect(() => { + const handleHashChange = () => { + const tabIndex = tabs.findIndex( + (tab) => tab.key === window.location.hash.replace("#", "") + ); + setSelectedTab(tabIndex === -1 ? 0 : tabIndex); + }; + + window.addEventListener("hashchange", handleHashChange); + return () => { + window.removeEventListener("hashchange", handleHashChange); + }; + }); + + const gleanClick = useGleanClick(); + + useEffect(() => { + const hash = tabs[selectedTab]?.key || defaultTabKey; + window.history.replaceState( + "", + "", + window.location.pathname + + window.location.search + + (hash !== defaultTabKey ? "#" + hash : "") + ); + }, [tabs, selectedTab, defaultTabKey]); + + return ( +
+

+ Scan results +

+
    + {tabs.map((t, i) => { + return ( +
  1. + { + gleanClick(`${OBSERVATORY}: tab -> ${t.key}`); + setSelectedTab(i); + }} + /> + +
    +
    {t.element}
    +
    +
  2. + ); + })} +
+
+ ); +} diff --git a/vendor/yari/client/src/observatory/results/benchmark.tsx b/vendor/yari/client/src/observatory/results/benchmark.tsx new file mode 100644 index 000000000..9ae192ef0 --- /dev/null +++ b/vendor/yari/client/src/observatory/results/benchmark.tsx @@ -0,0 +1,71 @@ +import useSWRImmutable from "swr/immutable"; + +import { Loading } from "../../ui/atoms/loading"; +import NoteCard from "../../ui/molecules/notecards"; + +import { GradeDistribution, ObservatoryResult } from "../types"; +import { OBSERVATORY_API_URL } from "../../env"; +import GradeSVG from "../benchmark-chart"; +import { handleJsonResponse } from "../utils"; + +export function useGradeDistribution(grade: string | null | undefined) { + return useSWRImmutable("gradeDistribution", async () => { + const url = new URL(OBSERVATORY_API_URL + "/api/v2/grade_distribution"); + const res = await fetch(url); + return await handleJsonResponse(res); + }); +} + +export async function handleGradeDistributionResponse( + res: Response +): Promise { + if (!res.ok) { + let message = `${res.status}: ${res.statusText}`; + try { + const data = await res.json(); + if (data.error) { + message = data.message; + } + } finally { + throw Error(message); + } + } + return await res.json(); +} + +export default function ObservatoryBenchmark({ + result, +}: { + result: ObservatoryResult; +}) { + const { + data: gradeDistribution, + isLoading, + error, + } = useGradeDistribution(result.scan.grade); + const hasData = !!gradeDistribution; + + return hasData ? ( + <> +

Performance trends from the past year

+ { + + } +

+ Refer to this graph to assess the website's current status. By following + the recommendations provided and rescanning, you can expect an + improvement in the website's grade. +

+ + ) : isLoading ? ( + + ) : ( + +

Error

+

{error ? error.message : "An error occurred."}

+
+ ); +} diff --git a/vendor/yari/client/src/observatory/results/cookies.tsx b/vendor/yari/client/src/observatory/results/cookies.tsx new file mode 100644 index 000000000..dd0deacbe --- /dev/null +++ b/vendor/yari/client/src/observatory/results/cookies.tsx @@ -0,0 +1,139 @@ +import { ObservatoryResult } from "../types"; +import { PassIcon, Timestamp } from "../utils"; + +export function ObservatoryCookies({ result }: { result: ObservatoryResult }) { + const cookies = result.tests["cookies"]?.data; + const pass = result.tests["cookies"]?.pass; + return cookies && Object.keys(cookies).length !== 0 ? ( + <> +
+

+ +

+
None

`, + }} + /> +
+ + + + + + + + + + + + + + {Object.entries(cookies).map(([key, value]) => ( + + + + + + + + + + ))} + +
Name + + Expires + + + + Path + + + + Secure + + + + HttpOnly + + + + SameSite + + + + Prefix + +
+ {key} + + {value.expires ? ( + + ) : ( + "Session" + )} + + {value.path} + + + + + + {value.samesite ? ( + {capitalize(value.samesite)} + ) : ( + "-" + )} + + +
+ + ) : ( + + + + + + +
No cookies detected
+ ); +} + +function capitalize(input: string) { + return input + .split("-") + .map((p) => (p ? p[0].toUpperCase() + p.substring(1) : "")) + .join("-"); +} + +function CookiePrefix({ name }: { name: string }) { + if (name.startsWith("__Host-")) { + return Host; + } else if (name.startsWith("__Secure-")) { + return Secure; + } else { + return <>-; + } +} diff --git a/vendor/yari/client/src/observatory/results/csp.tsx b/vendor/yari/client/src/observatory/results/csp.tsx new file mode 100644 index 000000000..13a187c91 --- /dev/null +++ b/vendor/yari/client/src/observatory/results/csp.tsx @@ -0,0 +1,128 @@ +import { ObservatoryResult } from "../types"; +import { PassIcon } from "../utils"; + +const policyTests = [ + "unsafeInline", + "unsafeEval", + "unsafeObjects", + "unsafeInlineStyle", + "insecureSchemeActive", + "insecureSchemePassive", + "antiClickjacking", + "defaultNone", + "insecureBaseUri", + "insecureFormAction", + "strictDynamic", +]; + +export default function ObservatoryCSP({ + result, +}: { + result: ObservatoryResult; +}) { + const policy = result.tests["content-security-policy"]?.policy; + + // Awkward, but so it has been on python-observatory: + // Negate some of the `pass` flags because sometimes + // a `pass` on the policy is bad, and sometimes not. + const negatedPolicies = [ + "insecureBaseUri", + "insecureFormAction", + "insecureSchemeActive", + "insecureSchemePassive", + "unsafeEval", + "unsafeInline", + "unsafeInlineStyle", + "unsafeObjects", + ]; + + const pass = result.tests["content-security-policy"]?.pass; + + // cookies && Object.keys(cookies).length !== 0 ? + return policy ? ( + <> +
+

+ +

+
None

`, + }} + /> +
+ + + + + + + + + + + {policyTests.map((pt) => { + return policy[pt] ? ( + + + + + ) : ( + [] + ); + })} + +
TestResultInfo
+ + +
+ + ) : result.tests["content-security-policy"]?.result === + "csp-not-implemented-but-reporting-enabled" ? ( + + + + + + +
+

+ Content-Security-Policy-Report-Only header detected. + Implement an enforced policy; see{" "} + + MDN's Content Security Policy (CSP) documentation + + . +

+
+ ) : ( + + + + + + +
+

No CSP headers detected

+
+ ); +} diff --git a/vendor/yari/client/src/observatory/results/headers.tsx b/vendor/yari/client/src/observatory/results/headers.tsx new file mode 100644 index 000000000..ada4274fe --- /dev/null +++ b/vendor/yari/client/src/observatory/results/headers.tsx @@ -0,0 +1,63 @@ +import useSWRImmutable from "swr/immutable"; + +import { ObservatoryResult } from "../types"; + +export function ObservatoryHeaders({ result }: { result: ObservatoryResult }) { + return result.scan.response_headers ? ( + + + + + + + + + {Object.entries(result.scan.response_headers).map(([header, value]) => ( + + + + + ))} + +
HeaderValue
+ + {value}
+ ) : null; +} + +function HeaderLink({ header }: { header: string }) { + // try a HEAD fetch for /en-US/docs/Web/HTTP/Headers//metadata.json + // if successful, link to /en-US/docs/Web/HTTP/Headers/ + const { data } = useHeaderLink(header); + const hasData = !!data; + const displayHeaderName = upperCaseHeaderName(header); + return hasData ? ( + + {displayHeaderName} + + ) : ( + <>{displayHeaderName} + ); +} + +function useHeaderLink(header: string) { + const prettyHeaderName = upperCaseHeaderName(header); + return useSWRImmutable(`headerLink-${header}`, async (key) => { + const url = `/en-US/docs/Web/HTTP/Reference/Headers/${encodeURIComponent(prettyHeaderName)}/metadata.json`; + try { + const res = await fetch(url, { method: "HEAD" }); + return res.ok + ? `/en-US/docs/Web/HTTP/Reference/Headers/${encodeURIComponent(prettyHeaderName)}` + : null; + } catch (e) { + return null; + } + }); +} + +function upperCaseHeaderName(header: string) { + return header + .split("-") + .map((p) => (p ? p[0].toUpperCase() + p.substring(1) : "")) + .join("-"); +} diff --git a/vendor/yari/client/src/observatory/results/history.tsx b/vendor/yari/client/src/observatory/results/history.tsx new file mode 100644 index 000000000..15bb9b973 --- /dev/null +++ b/vendor/yari/client/src/observatory/results/history.tsx @@ -0,0 +1,28 @@ +import { ObservatoryResult } from "../types"; +import { formatDateTime, formatMinus } from "../utils"; + +export function ObservatoryHistory({ result }: { result: ObservatoryResult }) { + return result.history.length ? ( + <> +

Changes in score over time

+ + + + + + + + + + {[...result.history].reverse().map(({ scanned_at, score, grade }) => ( + + + + + + ))} + +
DateScoreGrade
{formatDateTime(new Date(scanned_at))}{score}{formatMinus(grade)}
+ + ) : null; +} diff --git a/vendor/yari/client/src/observatory/results/human-duration.tsx b/vendor/yari/client/src/observatory/results/human-duration.tsx new file mode 100644 index 000000000..fed9748ee --- /dev/null +++ b/vendor/yari/client/src/observatory/results/human-duration.tsx @@ -0,0 +1,50 @@ +import { useEffect, useState } from "react"; +import { formatDateTime } from "../utils"; + +export function HumanDuration({ date }: { date: Date }) { + const [text, setText] = useState(() => displayString(date)); + + useEffect(() => { + const interval = setInterval(() => { + setText(displayString(date)); + }, 10000); + + return () => clearInterval(interval); + }); + + return ( + + ); +} + +// breakpoints for humanized time durations +const MINUTE = 60; +const HOUR = MINUTE * 60; +const DAY = HOUR * 24; +const MONTH = DAY * 30; +const YEAR = DAY * 364; + +function displayString(date: Date) { + const currentTime = new Date().getTime(); + const targetTime = date.getTime(); + const diffSecs = Math.round((targetTime - currentTime) / 1000); + + const rtf = new Intl.RelativeTimeFormat("en", { style: "long" }); + const absSecs = Math.abs(diffSecs); + + if (absSecs < MINUTE) { + return diffSecs < 0 ? "Just now" : "Very soon"; + } else if (absSecs < HOUR) { + return rtf.format(Math.floor(diffSecs / MINUTE), "minute"); + } else if (absSecs < DAY) { + return rtf.format(Math.floor(diffSecs / HOUR), "hour"); + } else if (absSecs < MONTH) { + return rtf.format(Math.floor(diffSecs / DAY), "day"); + } else if (absSecs < YEAR) { + return rtf.format(Math.floor(diffSecs / MONTH), "month"); + } else { + return rtf.format(Math.floor(diffSecs / YEAR), "year"); + } +} diff --git a/vendor/yari/client/src/observatory/results/rating.tsx b/vendor/yari/client/src/observatory/results/rating.tsx new file mode 100644 index 000000000..bbcb1ac6b --- /dev/null +++ b/vendor/yari/client/src/observatory/results/rating.tsx @@ -0,0 +1,171 @@ +import { useMemo } from "react"; + +import { useIsServer } from "../../hooks"; +import { useGleanClick } from "../../telemetry/glean-context"; +import InternalLink from "../../ui/atoms/internal-link"; +import { OBSERVATORY } from "../../telemetry/constants"; +import { ReactComponent as StarsSVG } from "../../../public/assets/observatory/stars.svg"; + +import { ObservatoryResult, SCORING_TABLE } from "../types"; +import { formatMinus, hostAsRedirectChain } from "../utils"; +import { Tooltip } from "../tooltip"; +import { RescanButton } from "./rescan-button"; +import { HumanDuration } from "./human-duration"; + +export function ObservatoryRating({ + result, + host, + rescanTrigger, +}: { + result: ObservatoryResult; + host: string; + rescanTrigger: () => void; +}) { + const gleanClick = useGleanClick(); + const isServer = useIsServer(); + + const arrowState = useMemo(() => { + const [oldScore, oldGrade] = result.history.length + ? [result.history.at(-2)?.score, result.history.at(-2)?.grade] + : [undefined, undefined]; + const newScore = result.scan.score; + const newGrade = result.scan.grade; + if ( + typeof newScore === "number" && + typeof oldScore === "number" && + newGrade !== oldGrade && + newScore !== oldScore + ) { + return oldScore < newScore ? "up" : "down"; + } else { + return "none"; + } + }, [result.history, result.scan.grade, result.scan.score]); + + return ( + <> +

+ Scan summary:{" "} + {hostAsRedirectChain(host, result)} +

+
+
+
+ +
+ {formatMinus(result.scan.grade)} +
+ + + + + + + + + + {SCORING_TABLE.map((st) => { + return ( + + + + + ); + })} + + + +
+
+ +
+
+
+ + Score + + : <>{result.scan.score} / 100 +
+
+ + Scan Time + + :{" "} + {!isServer && ( + + )} +
+ + Tests Passed + + : {result.scan.tests_passed} /  + {result.scan.tests_quantity} +
+
+ {!isServer && ( + + )} +
+ gleanClick(`${OBSERVATORY}: scan-another`)} + > + Scan another website + +
+
+
+ + ); +} + +type ARROW_STATE = "up" | "down" | "none"; + +function Trend({ arrowState }: { arrowState: ARROW_STATE }) { + switch (arrowState) { + case "up": + return ( +
+ {" "} + since last scan +
+ ); + case "down": + return ( +
+ {" "} + since last scan +
+ ); + default: + return []; + } +} diff --git a/vendor/yari/client/src/observatory/results/rescan-button.tsx b/vendor/yari/client/src/observatory/results/rescan-button.tsx new file mode 100644 index 000000000..217bfd585 --- /dev/null +++ b/vendor/yari/client/src/observatory/results/rescan-button.tsx @@ -0,0 +1,57 @@ +import { useEffect, useState } from "react"; + +import { useGleanClick } from "../../telemetry/glean-context"; +import { OBSERVATORY } from "../../telemetry/constants"; +import { Button } from "../../ui/atoms/button"; + +export function RescanButton({ + from, + duration, + onClickHandler, +}: { + from: Date; + duration: number; + onClickHandler: () => void; +}) { + function calculateRemainingTime() { + const endTime = from.getTime() + duration * 1000; + return Math.max(0, endTime - new Date().getTime()); + } + const [remainingTime, setRemainingTime] = useState(() => + calculateRemainingTime() + ); + + useEffect(() => { + const interval = setInterval(() => { + setRemainingTime(calculateRemainingTime()); + }, 1000); + + return () => clearInterval(interval); + }); + + const gleanClick = useGleanClick(); + + function rescan() { + gleanClick(`${OBSERVATORY}: rescan`); + onClickHandler(); + } + + const isExpired = remainingTime <= 0; + const remainingSecs = Math.floor(remainingTime / 1000) + 1; + const progressPercent = (remainingSecs * 100) / 60; + return !isExpired ? ( + + ) : ( + + ); +} diff --git a/vendor/yari/client/src/observatory/results/tests.tsx b/vendor/yari/client/src/observatory/results/tests.tsx new file mode 100644 index 000000000..604f98684 --- /dev/null +++ b/vendor/yari/client/src/observatory/results/tests.tsx @@ -0,0 +1,110 @@ +import { useMemo } from "react"; +import { ObservatoryResult, TEST_NAMES_IN_ORDER } from "../types"; +import { formatMinus, Link, PassIcon } from "../utils"; + +export function ObservatoryTests({ result }: { result: ObservatoryResult }) { + const showFootnote = useMemo(() => { + return ( + (result.scan.score || 0) <= 90 && + Object.entries(result.tests).find(([_n, t]) => t.score_modifier > 0) + ); + }, [result]); + + return Object.keys(result.tests).length !== 0 ? ( + <> + + + + + + + + + + + {TEST_NAMES_IN_ORDER.map((name) => { + const test = result.tests[name]; + return ( + test && ( + + + {test.pass === null ? ( + + ) : ( + + )} + + ) + ); + })} + +
TestScoreReasonRecommendation
+ {test.title} + - + + + + + + + + None

`, + }} + /> +
+ {showFootnote && ( +
+ * Normally awards bonus points, however, in this case they + are not included in the overall score ( + + find out why + + ). +
+ )} + + ) : null; +} + +function ScoreModifier({ + overallScore, + scoreModifier, +}: { + overallScore: number; + scoreModifier: number; +}) { + const [bonusEligible, formattedScoreModifier] = useMemo(() => { + return [ + overallScore >= 90, + formatMinus(`${scoreModifier > 0 ? `+${scoreModifier}` : scoreModifier}`), + ]; + }, [overallScore, scoreModifier]); + return ( + 0 ? "not-counted" : ""}`} + > + {!bonusEligible && scoreModifier > 0 ? ( + <> + 0 + + * + + + ) : ( + <>{formattedScoreModifier} + )} + + ); +} diff --git a/vendor/yari/client/src/observatory/tooltip/index.scss b/vendor/yari/client/src/observatory/tooltip/index.scss new file mode 100644 index 000000000..2c0dcb2b0 --- /dev/null +++ b/vendor/yari/client/src/observatory/tooltip/index.scss @@ -0,0 +1,78 @@ +@use "../../ui/vars" as *; + +.observatory { + .tooltip-popup table { + border: 0; + border-collapse: collapse; + white-space: nowrap; + width: 10rem; + + tr { + color: var(--observatory-inverse-color-secondary); + font-size: 0.875rem; + + &.current { + color: var(--observatory-inverse-color); + } + } + + th, + td { + background-color: unset; + border: 0; + font-weight: var(--font-body); + text-align: left; + width: 50%; + } + + th { + font-size: 1rem; + padding: 0 0 0.75rem; + } + + td { + padding: 0; + + svg { + vertical-align: -0.3rem; + } + } + } + + .info-tooltip { + position: relative; + + .arrow { + fill: var(--button-primary-default); + margin-left: -20px; + margin-top: -2rem; + padding: 0; + position: absolute; + } + + .tooltip-popup { + --tooltip-offset: 0; + background-color: var(--button-primary-default); + border-radius: var(--border-radius); + color: var(--observatory-inverse-color-secondary); + left: 50%; + margin-top: 2rem; + max-width: min(100vw, 20rem); + padding: 1.5rem; + position: absolute; + text-align: center; + top: 100%; + transform: translateX(var(--tooltip-offset)); + visibility: hidden; + width: max-content; + z-index: 1; + } + + &:hover, + &:focus { + .tooltip-popup { + visibility: visible; + } + } + } +} diff --git a/vendor/yari/client/src/observatory/tooltip/index.tsx b/vendor/yari/client/src/observatory/tooltip/index.tsx new file mode 100644 index 000000000..6a4e035f8 --- /dev/null +++ b/vendor/yari/client/src/observatory/tooltip/index.tsx @@ -0,0 +1,55 @@ +import { useEffect, useRef, useState } from "react"; +import "./index.scss"; +import { ReactComponent as ArrowSVG } from "../../../public/assets/observatory/tooltip-arrow.svg"; + +export function Tooltip({ + children, + extraClasses, +}: { + children: React.ReactNode; + extraClasses?: string; +}) { + let ref = useRef(null); + let [style, setStyle] = useState>({}); + useEffect(() => { + const onResize = () => { + const parentRect = ref.current?.parentElement?.getBoundingClientRect(); + const parentWH = (parentRect?.width || 0) / 2; + const x = (parentRect?.x || 0) + parentWH; + const rect = ref.current?.getBoundingClientRect(); + const wH = (rect?.width || 0) / 2; + const iW = window.innerWidth; + const offset = + -1 * + (x <= iW / 2 // if the center of the parent is on the left half of the window + ? x < wH // if the center of the parent is smaller than half of the tooltip + ? x + : wH + : // the center of the parent is on the right half of the window + x > iW - wH // if the inner width of the window is less than half the tooltip + ? 2 * wH - (iW - x) + : wH); + const tooltipOffset = `${offset.toFixed(2)}px`; + setStyle(Object.fromEntries([["--tooltip-offset", tooltipOffset]])); + }; + onResize(); + window.addEventListener("resize", onResize); + + return () => { + window.removeEventListener("resize", onResize); + }; + }, [ref]); + return ( + <> + + + + ); +} diff --git a/vendor/yari/client/src/observatory/types.ts b/vendor/yari/client/src/observatory/types.ts new file mode 100644 index 000000000..7c1bc6047 --- /dev/null +++ b/vendor/yari/client/src/observatory/types.ts @@ -0,0 +1,124 @@ +export interface ObservatoryAnalyzeRequest { + host: string; +} + +export type ObservatoryScanState = + | "ABORTED" + | "FAILED" + | "FINISHED" + | "PENDING" + | "STARTING" + | "RUNNING"; + +export const SCORING_TABLE = [ + { grade: "A+", scoreText: "100+", score: 100, stars: true }, + { grade: "A", scoreText: "90", score: 90, stars: true }, + { grade: "A-", scoreText: "85", score: 85, stars: true }, + { grade: "B+", scoreText: "80", score: 80 }, + { grade: "B", scoreText: "70", score: 70 }, + { grade: "B-", scoreText: "65", score: 65 }, + { grade: "C+", scoreText: "60", score: 60 }, + { grade: "C", scoreText: "50", score: 50 }, + { grade: "C-", scoreText: "45", score: 45 }, + { grade: "D+", scoreText: "40", score: 40 }, + { grade: "D", scoreText: "30", score: 30 }, + { grade: "D-", scoreText: "25", score: 25 }, + { grade: "F", scoreText: "0", score: 0 }, +]; + +// Maintain consistent test order. +export const TEST_NAMES_IN_ORDER = [ + "content-security-policy", + "cookies", + "cross-origin-resource-sharing", + "redirection", + "referrer-policy", + "strict-transport-security", + "subresource-integrity", + "x-content-type-options", + "x-frame-options", + "cross-origin-resource-policy", +]; + +export interface ObservatoryResult { + scan: ObservatoryScanResult; + tests: ObservatoryTestResult; + history: ObservatoryHistoryResult[]; +} + +export interface GradeDistribution { + grade: string; + count: number; +} + +export interface ObservatoryScanResult { + algorithm_version: number; + scanned_at: string; + error?: string | null; + grade?: string | null; + id: number; + response_headers?: Record; + score?: number; + status_code?: number; + tests_failed: number; + tests_passed: number; + tests_quantity: number; +} + +export type ObservatoryTestResult = Record; + +export interface ObservatoryIndividualTest { + data: null | ObservatoryCookiesData; + expectation: string; + name: string; + title: string; + link: string; + pass: boolean; + result: string; + score_description: string; + recommendation: string; + score_modifier: number; + policy?: ObservatoryCSPPolicy; + route?: string[]; +} + +export interface ObservatoryHistoryResult { + scanned_at: string; + grade: string; + id: number; + score: number; +} + +export type ObservatoryCookiesData = Record< + string, + ObservatoryIndividualCookie +>; + +export interface ObservatoryIndividualCookie { + domain: string; + expires: string; + httponly: boolean; + path: string; + samesite: string; + secure: boolean; +} + +export interface ObservatoryPolicyItem { + pass: boolean | null; + description: string; + info: string; +} + +export interface ObservatoryCSPPolicy { + antiClickjacking: ObservatoryPolicyItem; + defaultNone: ObservatoryPolicyItem; + insecureBaseUri: ObservatoryPolicyItem; + insecureFormAction: ObservatoryPolicyItem; + insecureSchemeActive: ObservatoryPolicyItem; + insecureSchemePassive: ObservatoryPolicyItem; + strictDynamic: ObservatoryPolicyItem; + unsafeEval: ObservatoryPolicyItem; + unsafeInline: ObservatoryPolicyItem; + unsafeInlineStyle: ObservatoryPolicyItem; + unsafeObjects: ObservatoryPolicyItem; +} diff --git a/vendor/yari/client/src/observatory/utils.tsx b/vendor/yari/client/src/observatory/utils.tsx new file mode 100644 index 000000000..734b067c4 --- /dev/null +++ b/vendor/yari/client/src/observatory/utils.tsx @@ -0,0 +1,170 @@ +import useSWRMutation from "swr/mutation"; +import useSWRImmutable from "swr/immutable"; + +import { OBSERVATORY_API_URL } from "../env"; + +import { ObservatoryResult } from "./types"; +import { ReactComponent as PassSVG } from "../../public/assets/observatory/pass-icon.svg"; +import { ReactComponent as FailSVG } from "../../public/assets/observatory/fail-icon.svg"; +import { HumanDuration } from "./results/human-duration"; + +export function Link({ href, children }: { href: string; children: any }) { + return ( + + {children} + + ); +} + +export function PassIcon({ pass }: { pass: boolean | null }) { + if (pass === null) { + return <>-; + } + return ( + + {pass ? : } + {pass ? "Passed" : "Failed"} + + ); +} + +export function FeedbackLink() { + return ( + // eslint-disable-next-line react/jsx-no-target-blank + + Report Feedback + + ); +} + +export function FaqLink() { + return ( + // eslint-disable-next-line react/jsx-no-target-blank + + Read our FAQ + + ); +} + +export const ERROR_MAP = { + TypeError: "Observatory is currently down.", // `fetch()` errors catch-all +}; + +export function formatMinus(term: string | null | undefined) { + if (!term) { + return null; + } + // replace dash with unicode minus symbol + // − + // MINUS SIGN + // Unicode: U+2212, UTF-8: E2 88 92 + return `${term}`.replaceAll(/-/g, "−"); +} + +export function useUpdateResult(host: string) { + return useSWRMutation( + host, + async (key: string) => { + const url = new URL(OBSERVATORY_API_URL + "/api/v2/analyze"); + url.searchParams.set("host", key); + const res = await fetch(url, { + method: "POST", + }); + return await handleJsonResponse(res); + }, + { populateCache: true, throwOnError: false } + ); +} + +export function useResult(host?: string) { + return useSWRImmutable(host, async (key) => { + const url = new URL(OBSERVATORY_API_URL + "/api/v2/analyze"); + url.searchParams.set("host", key); + const res = await fetch(url); + return await handleJsonResponse(res); + }); +} + +export async function handleJsonResponse(res: Response): Promise { + if (!res.ok && res.status !== 429) { + // Example error payload we get from the Observatory API: + // { + // "statusCode": 422, + // "error": "invalid-hostname-lookup", + // "message": "unknownhostmcunknownhostface.mozilla.org cannot be resolved" + // } + // We convey the `message` to the user and use the `error` field for glean telemetry. + let message = `${res.status}: ${res.statusText}`; + let errName = "Error"; + try { + const data = await res.json(); + errName = data.error || errName; + message = data.message || message; + } finally { + const err = new Error(message); + err.name = errName; + throw err; + } + } + return await res.json(); +} + +export function Timestamp({ expires }: { expires: string }) { + const d = new Date(expires); + if (d.toString() === "Invalid Date") { + return
{expires}
; + } + const ts = d + .toISOString() + .replace("T", " ") + .replace(/\....Z/, " UTC"); + return ( + <> +
+ {ts} +
+
+ () +
+ + ); +} + +export function formatDateTime(date: Date): string { + return date.toLocaleString([], { + dateStyle: "medium", + timeStyle: "medium", + }); +} + +export function hostAsRedirectChain(host: string, result: ObservatoryResult) { + const chain = result.tests.redirection?.route; + if (!chain || chain.length < 1) { + return host; + } + try { + const firstUrl = new URL(chain[0]); + const lastUrl = new URL(chain[chain.length - 1]); + if (firstUrl.hostname === lastUrl.hostname) { + return host; + } + return `${firstUrl.hostname} → ${lastUrl.hostname}`; + } catch (e) { + return host; + } +} diff --git a/vendor/yari/client/src/page-not-found/fallback-link.tsx b/vendor/yari/client/src/page-not-found/fallback-link.tsx new file mode 100644 index 000000000..ada1741d0 --- /dev/null +++ b/vendor/yari/client/src/page-not-found/fallback-link.tsx @@ -0,0 +1,180 @@ +import React from "react"; +import { useLocation } from "react-router-dom"; +import useSWR from "swr"; + +import { Doc } from "../../../libs/types"; +import NoteCard from "../ui/molecules/notecards"; + +import LANGUAGES_RAW from "../../../libs/languages"; +import { RETIRED_LOCALES } from "../../../libs/constants"; +import { useLocale } from "../hooks"; + +const LANGUAGES = new Map( + Object.entries(LANGUAGES_RAW).map(([locale, data]) => { + return [locale.toLowerCase(), data]; + }) +); + +// TODO IDEA +// Use https://www.npmjs.com/package/string-similarity +// to download the /$locale/search-index.json to get a list of all possible +// URLs and see if we can compare the current URL with one of those +// for making a great suggestion, +// like "Did you mean: $doctitle?" + +export default function FallbackLink({ url }: { url: string }) { + const locale = useLocale(); + const location = useLocation(); + + const [fallbackCheckURL, setFallbackCheckURL] = React.useState( + null + ); + + const { error, data: document } = useSWR( + fallbackCheckURL, + async (url) => { + const response = await fetch(url); + if (response.ok) { + // If the URL is already for the JSON file, use the response + if (response.url.endsWith("/index.json")) { + const { doc } = await response.json(); + return doc; + } + // Otherwise, use the URL that gave the successful page (potentially + // including any redirects) and append index.json to get the data needed + let jsonURL = response.url; + if (!jsonURL.endsWith("/")) { + jsonURL += "/"; + } + jsonURL += "index.json"; + const jsonResponse = await fetch(jsonURL); + if (jsonResponse.ok) { + const { doc } = await jsonResponse.json(); + return doc; + } else if (jsonResponse.status === 404) { + return null; + } + } else if (response.status === 404) { + return null; + } + throw new Error(`${response.status} on ${url}`); + }, + { revalidateOnFocus: false } + ); + + React.useEffect(() => { + if (url && url.includes("/docs/") && locale.toLowerCase() !== "en-us") { + // What if we attempt to see if it would be something there in English? + // We'll use the `index.json` version of the URL + let enUSURL = url.replace(`/${locale}/`, "/en-US/"); + // But of the benefit of local development, devs can use `/404/` + // instead of `/docs/` to simulate getting to the Page not found page. + // So remove that when constructing the English index.json URL. + enUSURL = enUSURL.replace("/en-US/404/", "/en-US/docs/"); + + // The fallback check URL should not force append index.json so it can + // follow any redirects + setFallbackCheckURL(enUSURL); + } + }, [url, locale, location]); + + if (error) { + return ( + +

Oh no!

+

+ Unfortunately, when trying to look to see if there was an English + fallback, that check failed. This is either because of a temporary + network error or because of a bug. +

+

+ The error was: {error.toString()} +

+
+ ); + } else if (document) { + return ( + +

Good news!

+

+ The page you requested doesn't exist in{" "} + {LANGUAGES.get(locale.toLowerCase())?.English} but it exists in{" "} + English +

+

+ + {document.title} +
+ {document.mdn_url} +
+

+
+ ); + } + + const isRetiredLocale = RETIRED_LOCALES.has(locale.toLowerCase()); + + if (isRetiredLocale) { + return ( + +

+ The{" "} + + {LANGUAGES.get(locale.toLowerCase())?.English} ({locale}) + {" "} + locale has been retired, and this page doesn't exist in English. +

+ +

+ You may find an archived version of this page in one of these + repositories: +

+

+
+ ); + } + + const locationParts = location.pathname + .split("/") + .filter((part) => part && ![locale, "docs"].includes(part)); + const normalizedLocationParts = locationParts + .map((part) => part.replace(/_/g, " ")) + .reverse(); + + return ( + +

+ The page you requested doesn't exist, but you could try a site search + for: +

    + {normalizedLocationParts.map((part) => ( +
  • + + {part} + +
  • + ))} +
+

+
+ ); +} diff --git a/vendor/yari/client/src/page-not-found/index.scss b/vendor/yari/client/src/page-not-found/index.scss new file mode 100644 index 000000000..dcd4fcc19 --- /dev/null +++ b/vendor/yari/client/src/page-not-found/index.scss @@ -0,0 +1,9 @@ +@use "sass:math"; + +.page-not-found { + .fallback-document { + .fallback-link { + font-size: 1rem; + } + } +} diff --git a/vendor/yari/client/src/page-not-found/index.tsx b/vendor/yari/client/src/page-not-found/index.tsx new file mode 100644 index 000000000..caf611c52 --- /dev/null +++ b/vendor/yari/client/src/page-not-found/index.tsx @@ -0,0 +1,54 @@ +import React from "react"; +import { useLocation } from "react-router-dom"; + +import { MainContentContainer } from "../ui/atoms/page-content"; +import "./index.scss"; + +const FallbackLink = React.lazy(() => import("./fallback-link")); + +// NOTE! To hack on this component, you have to use a trick to even get to this +// unless you use the Express server on localhost:5042. +// To get here, use http://localhost:3000/en-US/404/Whatever/you/like +// Now hot-reloading works and you can iterate faster. +// Otherwise, you can use http://localhost:5042/en-US/docs/Whatever/you/like +// (note the :5042 port) and that'll test it a bit more realistically. + +export function PageNotFound() { + const location = useLocation(); + const [url, setURL] = React.useState(""); + + React.useEffect(() => { + // If we're in a useEffect, this means we're in a client-side rendering + // and in that case the current window.location is realistic. + // When it's server-side rendered, the URL is "fake" just to generate + // the "empty template" page. + setURL(location.pathname); + }, [location]); + + return ( +
+ +
+ {/* This string should match the `pageTitle` set in ssr/render.js */} +

Page not found

+ + {url && ( +

+ Sorry, the page {url} could not be found. +

+ )} + + {url && ( + + + + )} + +

+ Go back to the home page +

+
+
+
+ ); +} diff --git a/vendor/yari/client/src/placement-context.tsx b/vendor/yari/client/src/placement-context.tsx new file mode 100644 index 000000000..b0677a956 --- /dev/null +++ b/vendor/yari/client/src/placement-context.tsx @@ -0,0 +1,143 @@ +import React, { useEffect, useRef } from "react"; +import { useGleanClick } from "./telemetry/glean-context"; +import useSWR from "swr"; +import { PLACEMENT_ENABLED } from "./env"; +import { useUserData } from "./user-context"; +import { useLocation } from "react-router"; +import { Payload as PlacementData } from "../../libs/pong/types"; + +export enum Status { + success = "success", + geoUnsupported = "geo_unsupported", + capReached = "cap_reached", + loading = "loading", + empty = "empty", +} + +type PlacementType = + | "side" + | "top" + | "hpTop" + | "hpMain" + | "hpFooter" + | "bottom"; +export interface PlacementContextData + extends Partial> { + plusAvailable?: boolean; + status: Status; +} + +const PLACEMENT_MAP: Record = { + side: { + typ: "side", + pattern: + /^\/[^/]+\/(play|docs\/|blog\/|observatory\/?|curriculum\/[^$]|search$)/i, + }, + top: { + typ: "top-banner", + pattern: /^\/[^/]+\/(?!$|_homepage$).*/i, + }, + hpTop: { + typ: "top-banner", + pattern: /^\/[^/]+\/($|_homepage$)/i, + }, + hpMain: { + typ: "hp-main", + pattern: /^\/[^/]+\/($|_homepage$)/i, + }, + hpFooter: { + typ: "hp-footer", + pattern: /^\/[^/]+\/($|_homepage$)/i, + }, + bottom: { + typ: "bottom-banner", + pattern: /^\/[^/]+\/docs\//i, + }, +}; + +function placementTypes(pathname: string): string[] { + return Object.entries(PLACEMENT_MAP) + .map(([k, { pattern: re }]) => re.test(pathname) && k) + .filter(Boolean) as string[]; +} + +export const PlacementContext = React.createContext< + PlacementContextData | null | undefined +>(undefined); + +export function PlacementProvider(props: { children: React.ReactNode }) { + const user = useUserData(); + const location = useLocation(); + const gleanClick = useGleanClick(); + const pathname = useRef(location.pathname); + const { + data: pong, + isLoading, + isValidating, + mutate, + } = useSWR( + !PLACEMENT_ENABLED || + user?.settings?.noAds || + !placementTypes(location.pathname) + ? null + : "/pong/get", + async (url) => { + const response = await fetch(url, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + keywords: [], + pongs: placementTypes(location.pathname), + }), + }); + + gleanClick(`pong: pong->fetched ${response.status}`); + + if (!response.ok) { + throw Error(response.statusText); + } + + try { + const { + plusAvailable = true, // Fall back to true for seamless migration. + ...placementResponse + }: PlacementContextData = await response.json(); + const typs = Object.entries(PLACEMENT_MAP) + .filter(([key]) => key in placementResponse) + .map(([, { typ }]) => typ); + if (typs.length) { + gleanClick(`pong: pong->served ${typs.join()}`); + } + return { plusAvailable, ...placementResponse }; + } catch (e) { + throw Error(response.statusText); + } + }, + { + revalidateIfStale: true, + revalidateOnFocus: false, + revalidateOnReconnect: false, + } + ); + + useEffect(() => { + if (location.pathname !== pathname.current) { + mutate(); + pathname.current = location.pathname; + } + }, [location.pathname, mutate]); + + return ( + + {props.children} + + ); +} + +export function usePlacement() { + return React.useContext(PlacementContext); +} diff --git a/vendor/yari/client/src/playground/forms.tsx b/vendor/yari/client/src/playground/forms.tsx new file mode 100644 index 000000000..c10c3c4a8 --- /dev/null +++ b/vendor/yari/client/src/playground/forms.tsx @@ -0,0 +1,135 @@ +import { useState } from "react"; +import { Button } from "../ui/atoms/button"; +import { EditorContent, codeToMarkdown } from "./utils"; +import { Loading } from "../ui/atoms/loading"; +import { useUserData } from "../user-context"; +import { useGleanClick } from "../telemetry/glean-context"; +import { PLAYGROUND } from "../telemetry/constants"; +import { PlusLoginBanner } from "../plus/common/login-banner"; + +export function FlagForm({ gistId }: { gistId: string | null }) { + return ( +
+ + Report this malicious or inappropriate shared playground. Can you please + share some details on what's wrong with this content: + + +
+ + +
+
+ ); +} + +export function ShareForm({ + url, + share, + code, +}: { + url: URL | null; + share?: () => Promise; + code?: () => EditorContent; + extraClasses?: string; +}) { + let userData = useUserData(); + const gleanClick = useGleanClick(); + let [loading, setLoading] = useState(false); + return ( +
+ +
+ Share Markdown + +
+ +
+ ); +} diff --git a/vendor/yari/client/src/playground/index.scss b/vendor/yari/client/src/playground/index.scss new file mode 100644 index 000000000..c9f2408c8 --- /dev/null +++ b/vendor/yari/client/src/playground/index.scss @@ -0,0 +1,255 @@ +@use "../ui/vars" as *; + +.play-menu { + background-color: var(--background-primary); + border-bottom: 1px solid var(--border-primary); + display: flex; + justify-content: space-between; + padding: 0 1rem; + position: sticky; + top: 0; + z-index: 1; + + .top-navigation-main { + justify-content: flex-end; + } +} + +main.play { + --play-height: calc( + 100vh - var(--top-nav-height) - var(--top-banner-outer-height) + ); + background-color: var(--background-primary); + display: grid; + gap: 1rem; + grid-template-columns: 1fr; + min-height: var(--play-height); + padding: 1rem; + @media (min-width: $screen-md) { + grid-template-columns: 1fr 1fr; + } + + dialog { + border: 1px solid var(--border-primary); + border-radius: var(--elem-radius); + box-shadow: 1px 1px 2px var(--border-primary); + margin: auto; + width: fit-content; + z-index: 1; + + > form { + display: flex; + flex-direction: column; + flex-wrap: wrap; + font-size: var(--type-smaller-font-size); + gap: 2rem; + max-width: 30rem; + overflow-wrap: anywhere; + padding: 0.5rem; + width: min(calc(100vw - 5rem), 25rem); + + a:hover:not(.button) { + text-decoration: underline; + } + + > section { + display: flex; + flex-direction: column; + + &#share-link > a { + align-self: center; + margin-top: 1rem; + } + + > span { + font-size: var(--type-base-font-size-rem); + } + + .button { + margin: 0.5rem auto; + width: min(100%, 15rem); + + .button-wrap { + height: initial; + padding: 0.5rem 1rem; + } + } + + .share-get-plus { + --text-link: var(--plus-accent-color); + background-color: var(--background-secondary); + border: 1px solid var(--border-primary); + border-radius: var(--elem-radius); + padding: 0.5rem; + text-align: center; + + .auth-container { + justify-content: center; + margin-top: 1rem; + } + } + } + + #share-cancel { + position: absolute; + right: 0.5rem; + top: 0.5rem; + width: fit-content; + } + + .buttons { + display: flex; + gap: 0.5rem; + justify-content: center; + } + } + + > form.flag { + > textarea { + height: 6rem; + resize: vertical; + width: 100%; + } + + > .buttons { + justify-content: flex-end; + } + } + } + + section { + &.editors { + display: flex; + flex-direction: column; + gap: 1rem; + max-height: max(calc(var(--play-height) - 2rem), 30rem); + + aside { + border: 1px solid var(--border-primary); + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + padding: 0.5rem; + + h1 { + display: inline-flex; + font-size: 1rem; + margin: auto 0; + text-transform: uppercase; + } + + .switch { + font-size: smaller; + } + + menu { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + justify-content: flex-end; + margin: 0; + margin-left: auto; + + button { + text-transform: capitalize; + + &:disabled { + cursor: not-allowed; + } + + &.red { + --button-color: var(--text-primary-red); + } + } + } + } + + details.editor-container { + --editor-header-height: 2.25rem; + --editor-header-padding: 0.25rem; + --editor-header-border-width: 1px; + + background-color: var(--background-secondary); + border: var(--editor-header-border-width) solid var(--border-primary); + height: 0; + min-height: var(--editor-header-height); + width: 100%; + + /* stylelint-disable-next-line selector-pseudo-element-no-unknown */ + &::details-content { + display: contents; + } + + &[open] { + height: 100%; + } + + &:not(:focus-within) summary { + color: var(--text-inactive); + } + + summary { + cursor: pointer; + padding: var(--editor-header-padding); + } + + play-editor { + height: calc( + 100% - var(--editor-header-height) - 2 * + var(--editor-header-padding) - var(--editor-header-border-width) + ); + margin: 0.5rem 0 0; + } + } + } + + &.preview { + align-items: center; + display: flex; + flex-direction: column; + overflow: auto; + + button.flag-example { + align-self: flex-end; + color: var(--text-link); + cursor: pointer; + font-size: smaller; + margin: 0; + text-decoration: underline; + + &:hover { + text-decoration: none; + } + } + + play-runner { + border: 1px solid var(--border-primary); + height: 100%; + width: 100%; + } + + #play-console { + display: flex; + flex-direction: column; + font-size: smaller; + margin: 0; + width: 100%; + + > span { + background-color: var(--code-background-inline); + font-weight: 600; + text-align: center; + width: 100%; + } + + play-console { + background-color: var(--code-background-inline); + height: 6rem; + max-height: 6rem; + overflow: auto; + width: 100%; + } + } + } + } +} diff --git a/vendor/yari/client/src/playground/index.tsx b/vendor/yari/client/src/playground/index.tsx new file mode 100644 index 000000000..017e067ca --- /dev/null +++ b/vendor/yari/client/src/playground/index.tsx @@ -0,0 +1,347 @@ +import { useCallback, useEffect, useRef, useState } from "react"; +import { useSearchParams } from "react-router-dom"; +import useSWRImmutable from "swr/immutable"; +import { Button } from "../ui/atoms/button"; +import { SidePlacement } from "../ui/organisms/placement"; +import { decompressFromBase64, EditorContent, SESSION_KEY } from "./utils"; + +import "./index.scss"; +import { FlagForm, ShareForm } from "./forms"; +import { PlayController, ReactPlayController } from "../lit/play/controller"; +import { ReactPlayEditor } from "../lit/play/editor"; +import { ReactPlayConsole } from "../lit/play/console"; +import { ReactPlayRunner } from "../lit/play/runner"; +import { useGleanClick } from "../telemetry/glean-context"; +import { PLAYGROUND } from "../telemetry/constants"; + +const HTML_DEFAULT = ""; +const CSS_DEFAULT = ""; +const JS_DEFAULT = ""; + +enum State { + initial, + ready, + remote, +} + +enum DialogState { + none, + share, + flag, +} + +async function save(editorContent: EditorContent) { + const res = await fetch("/api/v1/play/", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(editorContent), + }); + let { id } = await res.json(); + let url = new URL(document.URL); + url.search = new URLSearchParams([["id", id]]).toString(); + return { url, id }; +} + +function store(session: string, editorContent: EditorContent) { + sessionStorage.setItem(session, JSON.stringify(editorContent)); +} + +function load(session: string) { + let code = JSON.parse(sessionStorage.getItem(session) || "{}"); + return { + html: code?.html || HTML_DEFAULT, + css: code?.css || CSS_DEFAULT, + js: code?.js || JS_DEFAULT, + src: code?.src, + }; +} + +export default function Playground() { + const gleanClick = useGleanClick(); + let [searchParams, setSearchParams] = useSearchParams(); + const gistId = searchParams.get("id"); + const stateParam = searchParams.get("state"); + let [dialogState, setDialogState] = useState(DialogState.none); + let [shared, setShared] = useState(false); + let [shareUrl, setShareUrl] = useState(null); + let [state, setState] = useState(State.initial); + const [isShareable, setIsShareable] = useState(true); + const [isClearable, setIsClearable] = useState(true); + const [initialContent, setInitialContent] = useState( + null + ); + let { data: initialCode } = useSWRImmutable( + !stateParam && !shared && gistId + ? `/api/v1/play/${encodeURIComponent(gistId)}` + : null, + async (url) => { + const response = await fetch(url); + + if (!response.ok) { + throw Error(response.statusText); + } + gleanClick(`${PLAYGROUND}: load-shared`); + + const code = await response.json(); + if (code) { + setState(State.remote); + return code; + } + return null; + }, + { + fallbackData: + (!stateParam && + !gistId && + state === State.initial && + load(SESSION_KEY)) || + undefined, + } + ); + const controller = useRef(null); + const diaRef = useRef(null); + + useEffect(() => { + if (initialCode) { + store(SESSION_KEY, initialCode); + if (Object.values(initialCode).some(Boolean)) { + setInitialContent(structuredClone(initialCode)); + } + } + }, [initialCode, setInitialContent]); + + const getEditorContent = useCallback(() => { + return { + html: controller.current?.code.html || HTML_DEFAULT, + css: controller.current?.code.css || CSS_DEFAULT, + js: controller.current?.code.js || JS_DEFAULT, + src: initialCode?.src || initialContent?.src, + }; + }, [initialContent?.src, initialCode?.src]); + + const setIsEmpty = useCallback((content: EditorContent) => { + const { html, css, js } = content; + setIsShareable(!html.trim() && !css.trim() && !js.trim()); + setIsClearable(!html && !css && !js); + }, []); + + const setEditorContent = useCallback( + (content: EditorContent) => { + if (controller.current) { + controller.current.code = { ...content }; + if (content.src) { + controller.current.srcPrefix = content.src; + } + setIsEmpty(content); + store(SESSION_KEY, content); + } + }, + [setIsEmpty] + ); + + useEffect(() => { + (async () => { + if (state === State.initial || state === State.remote) { + if (initialCode && Object.values(initialCode).some(Boolean)) { + setEditorContent(initialCode); + if (!gistId) { + // don't auto run shared code + controller.current?.run(); + } + } else if (stateParam) { + try { + let { state } = await decompressFromBase64(stateParam); + let code = JSON.parse(state || "{}") as EditorContent; + setEditorContent(code); + } catch (e) { + console.error(e); + } + } else { + setEditorContent({ + html: HTML_DEFAULT, + css: CSS_DEFAULT, + js: JS_DEFAULT, + }); + } + setState(State.ready); + } + })(); + }, [initialCode, state, gistId, stateParam, setEditorContent]); + + const clear = async () => { + setSearchParams([], { replace: true }); + setInitialContent(null); + setEditorContent({ + html: HTML_DEFAULT, + css: CSS_DEFAULT, + js: JS_DEFAULT, + src: undefined, + }); + + run(); + }; + + const reset = async () => { + setEditorContent({ + html: initialContent?.html || HTML_DEFAULT, + css: initialContent?.css || CSS_DEFAULT, + js: initialContent?.js || JS_DEFAULT, + }); + + run(); + }; + + const clearConfirm = async () => { + if (window.confirm("Do you really want to clear everything?")) { + gleanClick(`${PLAYGROUND}: reset-click`); + await clear(); + } + }; + + const resetConfirm = async () => { + if (window.confirm("Do you really want to revert your changes?")) { + gleanClick(`${PLAYGROUND}: revert-click`); + await reset(); + } + }; + + const run = () => { + const loading = [ + {}, + { + backgroundColor: "var(--background-mark-green)", + }, + {}, + ]; + const timing = { + duration: 1000, + iterations: 1, + }; + document.getElementById("run")?.firstElementChild?.animate(loading, timing); + controller.current?.run(); + }; + + const format = async () => { + await controller.current?.format(); + }; + + const share = useCallback(async () => { + const { url, id } = await save(getEditorContent()); + setSearchParams([["id", id]], { replace: true }); + setShared(true); + setShareUrl(url); + }, [setSearchParams, setShareUrl, setShared, getEditorContent]); + + const cleanDialog = () => { + if (dialogState === DialogState.share) { + setShareUrl(null); + } + }; + + const onEditorUpdate = () => { + const code = getEditorContent(); + setIsEmpty(code); + store(SESSION_KEY, code); + }; + + return ( + +
+ + {dialogState === DialogState.flag && } + {dialogState === DialogState.share && ( + + )} + +
+ +
+ HTML + +
+
+ CSS + +
+
+ JAVASCRIPT + +
+
+
+ {gistId && ( + + )} + +
+ Console + +
+ +
+
+
+ ); +} diff --git a/vendor/yari/client/src/playground/loader.scss b/vendor/yari/client/src/playground/loader.scss new file mode 100644 index 000000000..f545e741d --- /dev/null +++ b/vendor/yari/client/src/playground/loader.scss @@ -0,0 +1,39 @@ +.play-loader { + align-items: center; + display: flex; + justify-content: center; + margin: auto; + + svg { + animation: rotate 2s linear infinite; + height: 100px; + width: 100px; + } + + .glow { + animation: rotate 2s linear infinite; + border-radius: 50%; + + box-shadow: + inset 0 0 50px #fff, + inset 20px 0 80px #f0f, + inset -20px 0 80px #0ff, + inset 20px 0 300px #f0f, + inset -20px 0 300px #0ff, + 0 0 50px #fff, + -10px 0 80px #f0f, + 10px 0 80px #0ff; + height: 100px; + width: 100px; + } + + @keyframes rotate { + 50% { + transform: scale(0.9); + } + + 100% { + transform: rotate(360deg); + } + } +} diff --git a/vendor/yari/client/src/playground/loader.tsx b/vendor/yari/client/src/playground/loader.tsx new file mode 100644 index 000000000..074642c67 --- /dev/null +++ b/vendor/yari/client/src/playground/loader.tsx @@ -0,0 +1,39 @@ +import "./loader.scss"; + +export function PlayLoader({ fancy = true }: { fancy?: boolean }) { + return ( +
+ {fancy ? ( +
+ ) : ( + + + + + + + + )} +
+ ); +} diff --git a/vendor/yari/client/src/playground/queue/index.scss b/vendor/yari/client/src/playground/queue/index.scss new file mode 100644 index 000000000..18e991153 --- /dev/null +++ b/vendor/yari/client/src/playground/queue/index.scss @@ -0,0 +1,143 @@ +.play-queue-container { + position: fixed; + right: 0; + top: 50vh; + transform: translateY(-50%); + z-index: var(--z-index-modal-content); + + details { + align-items: center; + background: var(--background-secondary); + border: 1px solid var(--border-primary); + border-radius: 1rem 0 0 1rem; + display: flex; + filter: drop-shadow(var(--shadow-02)); + justify-content: center; + padding: 0.5rem 0; + width: fit-content; + + > summary { + align-items: center; + color: var(--category-color); + cursor: pointer; + display: flex; + padding: 0 1rem; + width: 100%; + + &::-webkit-details-marker, + &::marker { + display: none; + } + + > div { + display: inline-block; + font-weight: bold; + width: 100%; + } + + > .button.action { + --button-color: var(--category-color); + } + } + + &[open] { + min-width: 12rem; + + > summary { + border-bottom: 1px solid var(--border-primary); + padding: 0 1.5rem 0.5rem; + + &::after { + content: "▼"; + font-size: 0.75rem; + margin-left: 0.5rem; + } + } + } + + &:not([open]) { + background-color: var(--category-color); + width: min-content; + + > summary { + color: var(--background-primary); + font-size: 0; + width: fit-content; + + &::after { + content: "◀"; + font-size: 0.75rem; + margin-left: 0.5rem; + } + + > div { + width: 1rem; + + &::first-letter { + font-size: 1rem; + } + } + + .button { + display: none; + } + } + } + } + + button { + cursor: pointer; + + &.play-button { + align-self: center; + margin-bottom: 0.5rem; + width: fit-content; + } + } + + .play-queue-inner { + display: flex; + flex-direction: column; + + > ul { + margin: 0 0 0.5rem; + max-height: 50vh; + overflow: auto; + width: 100%; + + > li { + align-items: center; + color: var(--text-primary); + display: flex; + padding: 0.25rem 1rem; + width: 100%; + + &:active, + &:hover { + background-color: var(--background-toc-active); + } + + .queue-ref { + color: var(--text-primary); + font-size: var(--type-smaller-font-size); + padding: 0 0.5rem; + + &:active, + &:hover { + color: var(--text-link); + text-decoration: underline; + } + } + + > code { + background-color: transparent; + justify-self: center; + margin: 0 auto; + min-width: 6rem; + text-align: center; + text-transform: uppercase; + } + } + } + } +} diff --git a/vendor/yari/client/src/playground/queue/index.tsx b/vendor/yari/client/src/playground/queue/index.tsx new file mode 100644 index 000000000..51fdb3049 --- /dev/null +++ b/vendor/yari/client/src/playground/queue/index.tsx @@ -0,0 +1,183 @@ +import { useCallback, useEffect } from "react"; +import "./index.scss"; +import { collectCode } from "../../document/code/playground"; +import { SESSION_KEY } from "../utils"; +import { useIsServer, useLocale } from "../../hooks"; +import { Button } from "../../ui/atoms/button"; +import { useUIStatus } from "../../ui-context"; +import { QueueEntry } from "../../types/playground"; +import { PLAYGROUND } from "../../telemetry/constants"; +import { useGleanClick } from "../../telemetry/glean-context"; + +function PQEntry({ + gleanContext, + item: { id, key, lang }, + unqueue, +}: { + gleanContext: string; + item: QueueEntry; + unqueue: () => void; +}) { + const gleanClick = useGleanClick(); + const { setHighlightedQueueExample } = useUIStatus(); + const getHeader = () => { + const element = document.getElementById(id); + return element?.parentElement?.parentElement; + }; + const setActive = (value: boolean) => { + if (setHighlightedQueueExample) { + if (value) { + setHighlightedQueueExample(id); + } else { + setHighlightedQueueExample(null); + } + } + }; + const intoView = () => { + const header = getHeader(); + const top = + (header?.getBoundingClientRect().top || 0) + window.scrollY - 130; + window.scrollTo({ top, behavior: "smooth" }); + }; + + return ( +
  • setActive(true)} + onMouseLeave={() => setActive(false)} + > + + {lang} +
  • + ); +} + +export function PlayQueue({ + gleanContext = PLAYGROUND, + standalone = false, +}: { + gleanContext?: string; + standalone?: boolean; +}) { + const locale = useLocale(); + const isServer = useIsServer(); + const gleanClick = useGleanClick(); + const { queue, setQueue } = useUIStatus(); + + const cb = useCallback(() => { + // Sync checkboxes to queue state. + const elements = getQueueCheckboxes(); + setQueue( + elements + .filter((e) => e.checked) + .map((e) => createQueueEntry(e, elements)) + ); + }, [setQueue]); + + useEffect(() => { + // Sync queue state to checkboxes. + const ids = queue.map((item) => item.id); + const elements = [ + ...document.querySelectorAll(".playlist > input:checked"), + ] as HTMLInputElement[]; + for (const element of elements) { + element.checked = ids.includes(element.id); + } + }, [queue]); + + useEffect(() => { + if (!isServer) { + window["playQueue"] = cb; + } + }, [cb, isServer]); + + return queue.length ? ( +
    + +
    + ) : null; +} + +function getQueueCheckboxes() { + return [ + ...document.querySelectorAll(".playlist > input"), + ] as HTMLInputElement[]; +} + +const LANG_MAPPING = { + javascript: "js", +}; + +export function createQueueEntry( + elementOrId: HTMLInputElement | string, + elements?: HTMLInputElement[] +) { + const e = + elementOrId instanceof HTMLInputElement + ? elementOrId + : (document.getElementById(elementOrId) as HTMLInputElement); + elements ??= getQueueCheckboxes(); + + const key = elements.indexOf(e); + const id = e.id; + const lang = + e + ?.closest(".example-header") + ?.querySelector(".language-name") + ?.textContent?.toLowerCase() ?? ""; + + return { key, id, lang: LANG_MAPPING[lang] ?? lang }; +} diff --git a/vendor/yari/client/src/playground/utils.ts b/vendor/yari/client/src/playground/utils.ts new file mode 100644 index 000000000..dc053d6d8 --- /dev/null +++ b/vendor/yari/client/src/playground/utils.ts @@ -0,0 +1,115 @@ +import { PLAYGROUND_BASE_HOST } from "../env"; + +export const SESSION_KEY = "playground-session-code"; + +export interface EditorContent { + css: string; + html: string; + js: string; + src?: string; +} + +export function codeToMarkdown(code: EditorContent): string { + const parts: string[] = []; + if (code.html) { + parts.push(["```html", code.html, "```"].join("\n")); + } + if (code.css) { + parts.push(["```css", code.css, "```"].join("\n")); + } + if (code.js) { + parts.push(["```js", code.js, "```"].join("\n")); + } + return parts.join("\n\n"); +} + +export async function initPlayIframe( + iframe: HTMLIFrameElement | null, + editorContent: EditorContent | null, + fullscreen: boolean = false +) { + if (!iframe || !editorContent) { + return; + } + const { state, hash } = await compressAndBase64Encode( + JSON.stringify(editorContent) + ); + const path = iframe.getAttribute("data-live-path"); + const url = new URL( + `${path || ""}${path?.endsWith("/") ? "" : "/"}runner.html`, + window.location.origin + ); + if (!window.location.hostname.endsWith("localhost")) { + const host = PLAYGROUND_BASE_HOST.startsWith("localhost") + ? PLAYGROUND_BASE_HOST + : `${hash}.${PLAYGROUND_BASE_HOST}`; + url.port = ""; + url.host = host; + } + url.search = ""; + url.searchParams.set("state", state); + iframe.src = url.href; + if (fullscreen) { + const urlWithoutHash = new URL(window.location.href); + urlWithoutHash.hash = ""; + window.history.replaceState(null, "", urlWithoutHash); + window.location.href = url.href; + } +} + +function bytesToBase64(bytes: ArrayBuffer) { + const binString = Array.from(new Uint8Array(bytes), (byte: number) => + String.fromCodePoint(byte) + ).join(""); + return btoa(binString); +} + +export async function compressAndBase64Encode(inputString: string) { + const inputArray = new Blob([inputString]); + + const compressionStream = new CompressionStream("deflate-raw"); + + const compressedStream = new Response( + inputArray.stream().pipeThrough(compressionStream) + ).arrayBuffer(); + + const compressed = await compressedStream; + const hashBuffer = await window.crypto.subtle.digest("SHA-256", compressed); + const hashArray = Array.from(new Uint8Array(hashBuffer)).slice(0, 20); + const hash = hashArray.map((b) => b.toString(16).padStart(2, "0")).join(""); + const state = bytesToBase64(compressed); + + return { state, hash }; +} + +function base64ToBytes(base64: string): ArrayBuffer { + const binString = atob(base64); + const len = binString.length; + const bytes = new Uint8Array(len); + for (let i = 0; i < len; i++) { + bytes[i] = binString.charCodeAt(i); + } + return bytes.buffer; +} + +/* + * This is the browser verision of `libs/play/index.js`. Keep in sync! + */ +export async function decompressFromBase64(base64String: string) { + if (!base64String) { + return { state: null, hash: null }; + } + const bytes = base64ToBytes(base64String); + const hashBuffer = await window.crypto.subtle.digest("SHA-256", bytes); + const hashArray = Array.from(new Uint8Array(hashBuffer)).slice(0, 20); + const hash = hashArray.map((b) => b.toString(16).padStart(2, "0")).join(""); + + const decompressionStream = new DecompressionStream("deflate-raw"); + + const decompressedStream = new Response( + new Blob([bytes]).stream().pipeThrough(decompressionStream) + ).arrayBuffer(); + + const state = new TextDecoder().decode(await decompressedStream); + return { state, hash }; +} diff --git a/vendor/yari/client/src/plus/ai-help/banners.tsx b/vendor/yari/client/src/plus/ai-help/banners.tsx new file mode 100644 index 000000000..74dec90ee --- /dev/null +++ b/vendor/yari/client/src/plus/ai-help/banners.tsx @@ -0,0 +1,67 @@ +import { useMemo } from "react"; +import { AI_HELP } from "../../telemetry/constants"; +import { Icon } from "../../ui/atoms/icon"; +import { SignUpLink } from "../../ui/atoms/signup-link"; +import { useUserData } from "../../user-context"; +import { PlusLoginBanner } from "../common/login-banner"; +import { isPlusSubscriber } from "../../utils"; + +export function AiHelpBanner({ + isDisabled = false, +}: { isDisabled?: boolean } = {}) { + const user = useUserData(); + + const isSubscriber = useMemo(() => isPlusSubscriber(user), [user]); + + return ( +
    +

    + + + {isSubscriber + ? "GPT-4o-powered AI Help." + : "Supercharge your AI Help experience with our paid subscriptions."} + +

    +

    + {isSubscriber + ? "Now with chat history, enhanced context, and optimized prompts." + : "Upgrade to MDN Plus 5 or Supporter 10 to unlock the full potential of GPT-4o-powered AI Help."} +

    + {!isSubscriber && ( + + )} +
    + ); +} + +export function AiLoginBanner() { + return ( + + Want to use AI Help? + + ); +} + +export function AiUpsellBanner({ limit }: { limit: number }) { + return ( +
    + + You have reached the limit of {limit} questions per day. +
    + + Want to ask more? Upgrade to MDN Plus 5 or MDN + Supporter 10. + +
    +
      +
    • + +
    • +
    +
    + ); +} diff --git a/vendor/yari/client/src/plus/ai-help/constants.tsx b/vendor/yari/client/src/plus/ai-help/constants.tsx new file mode 100644 index 000000000..d2f7ff8c2 --- /dev/null +++ b/vendor/yari/client/src/plus/ai-help/constants.tsx @@ -0,0 +1,12 @@ +export const OFF_TOPIC_PREFIX = "I'm sorry, but I can't"; +export const OFF_TOPIC_MESSAGE = + "I'm sorry, but I can't answer questions outside web development."; + +export const MESSAGE_SEARCHING = "Searching for MDN content…"; +export const MESSAGE_SEARCHED = "Consulted MDN content:"; +export const MESSAGE_ANSWERING = "Generating your answer…"; +export const MESSAGE_ANSWERED = "Answer:"; +export const MESSAGE_STOPPED = "Answer (stopped):"; +export const MESSAGE_FAILED = "Error generating your answer!"; + +export const EVENT_TIMEOUT = 15000; diff --git a/vendor/yari/client/src/plus/ai-help/history.scss b/vendor/yari/client/src/plus/ai-help/history.scss new file mode 100644 index 000000000..682f864c5 --- /dev/null +++ b/vendor/yari/client/src/plus/ai-help/history.scss @@ -0,0 +1,241 @@ +@use "../../ui/vars" as *; + +.ai-help-history { + // Align first item with AI Help subtitle. + margin-top: 1.75rem; + padding-right: 1rem; + + > input { + height: 0; + margin: 0; + opacity: 0; + position: absolute; + width: 0; + + ~ .ai-help-history-toggle { + --button-action-transform: none; + background-color: var(--background-primary); + display: block; + padding: 0.5rem; + position: sticky; + top: 0; + width: 100%; + z-index: var(--z-index-mid); + + > label { + cursor: pointer; + width: fit-content; + + .icon-sidebar { + mask-image: url("../../assets/icons/sidebar.svg"); + } + } + } + + &:focus-visible ~ .ai-help-history-toggle > label { + opacity: 1; + outline-color: var(--accent-primary); + outline-offset: 1px; + outline-style: auto; + } + + &:checked { + // Means hidden on desktop, show on mobile. + ~ .ai-help-history-toggle > label { + .icon-sidebar { + mask-image: url("../../assets/icons/sidebar-filled.svg"); + } + + .show-history { + display: none; + } + + @media (min-width: $screen-md) { + .hide-history { + display: none; + } + + .show-history { + // Show on desktop. + display: inherit; + } + } + } + + ~ ol { + display: none; + } + } + + &:not(:checked) { + // Means hidden on mobile, show on desktop. + ~ .ai-help-history-toggle { + > label .hide-history { + display: none; + } + + @media (min-width: $screen-md) { + // Hiding doesn't make sense on desktop. + display: none; + } + } + } + } + + ol { + > li { + display: flex; + flex-direction: column; + padding: 1rem 0 0.5rem; + + > ol { + margin-bottom: 0.5rem; + width: 100%; + + > li { + --icon-size: 0.6rem; + align-items: center; + display: flex; + flex-direction: row; + min-height: 3rem; + padding: 0.5rem; + + > a { + color: var(--text-secondary); + mask-image: linear-gradient(to left, transparent, #000 3ch); + overflow: hidden; + white-space: nowrap; + width: 100%; + + &:focus-visible { + mask-image: initial; + text-overflow: ellipsis; + } + } + + &.ai-help-history-active { + background-color: var(--background-secondary); + border-radius: var(--elem-radius); + } + } + } + + > time { + color: var(--text-secondary); + display: block; + font-size: var(--type-smaller-font-size); + padding-left: 0.5rem; + + &::before { + --icon-size: 0.6rem; + background-color: var(--icon-secondary); + content: ""; + display: inline-block; + height: var(--icon-size); + margin-right: 0.5em; + mask-image: url("../../assets/icons/message.svg"); + mask-size: contain; + vertical-align: middle; + width: var(--icon-size); + } + } + } + } + + @media (max-width: $screen-md) { + background-color: var(--background-primary); + grid-column: center; + grid-row: 2/3; + max-height: initial; + padding: 0 0.5rem; + position: initial; + z-index: var(--z-index-mid); + + input { + ~ .ai-help-history-toggle > label .icon-sidebar { + mask-image: url("../../assets/icons/sidebar-filled.svg"); + } + + ~ ol { + display: none; + } + } + + input:checked { + ~ .ai-help-history-toggle > label .icon-sidebar { + mask-image: url("../../assets/icons/sidebar.svg"); + } + + ~ ol { + display: initial; + } + } + } +} + +.ai-help-history-activation { + background-color: var(--background-secondary); + border-radius: 0.25rem; + // Align "Answer History" with "GPT-4o-powered AI Help". + margin-top: 3.5rem; + padding: 0.25rem; + + .icons-highlighted { + .icon { + background-color: var(--ai-help-icon); + } + + .icons-icon-wrapper { + --padding: 0.25rem; + background-color: var(--category-color-background); + border-radius: 1rem; + height: calc(var(--icon-size) + 2 * var(--padding)); + padding: var(--padding); + width: calc(var(--icon-size) + 2 * var(--padding)); + } + } + + p { + margin: 0.25rem auto; + text-align: center; + + .teaser { + font-size: var(--type-smaller-font-size); + } + + a[href] { + font-weight: var(--font-body-strong-weight); + text-decoration: underline; + + &:active, + &:hover { + text-decoration: unset; + } + } + } + + @media (max-width: $screen-md) { + margin: 0.5rem; + padding: 1rem 1.5rem; + + figure { + align-items: center; + display: flex; + flex-direction: row; + gap: 1.5rem; + + .icons-highlighted { + margin-top: -0.75rem; + } + + p { + margin: 0.25rem; + text-align: left; + } + + a[href] { + display: inline-block; + } + } + } +} diff --git a/vendor/yari/client/src/plus/ai-help/history.tsx b/vendor/yari/client/src/plus/ai-help/history.tsx new file mode 100644 index 000000000..a60126b8b --- /dev/null +++ b/vendor/yari/client/src/plus/ai-help/history.tsx @@ -0,0 +1,285 @@ +import useSWR, { KeyedMutator } from "swr"; +import { Button } from "../../ui/atoms/button"; +import { useEffect } from "react"; +import { useSearchParams } from "react-router-dom"; + +import "./history.scss"; +import { useLocale } from "../../hooks"; +import { HighlightedIcon } from "../../ui/atoms/icon"; +import { useAIHelpSettings } from "./utils"; +import { useGleanClick } from "../../telemetry/glean-context"; +import { AI_HELP } from "../../telemetry/constants"; + +const DEFAULT_TOPIC_LABEL = "New Topic"; + +function monthYearLabel(date: Date): string { + const formattedDate = date.toLocaleString(undefined, { + month: "short", + year: "numeric", + }); + return formattedDate; +} + +interface HistoryEntry { + chat_id: string; + label: string; + last: string; +} +interface HistoryEntries { + label: string; + entries: HistoryEntry[]; +} + +function groupHistory(history) { + const now = new Date(); + const today = new Date(now.toDateString()); + const yesterday = new Date( + structuredClone(today).setDate(today.getDate() - 1) + ); + const last7Days = new Date( + structuredClone(today).setDate(today.getDate() - 7) + ); + const last30Days = new Date( + structuredClone(today).setDate(today.getDate() - 30) + ); + const groups = [ + { label: "Last 30 Days", d: last30Days }, + { label: "Last 7 Days", d: last7Days }, + { label: "Yesterday", d: yesterday }, + { label: "Today", d: today }, + ]; + const grouped: HistoryEntries[] = []; + + let { label = "unknown", d } = groups.pop() || {}; + let current: HistoryEntries = { label, entries: [] }; + for (const entry of history) { + let last = new Date(entry.last); + while (!d || last < d) { + if (!d) { + label = monthYearLabel(last); + break; + } else if (last < d) { + ({ label = "unknown", d } = groups.pop() || {}); + continue; + } + break; + } + if (current.label !== label) { + grouped.push(current); + current = { label, entries: [entry] }; + } else { + current.entries.push(entry); + } + } + + if (current.entries.length) { + grouped.push(current); + } + return grouped; +} + +function AIHelpHistorySubList({ + currentChatId, + entries, + mutate, +}: { + currentChatId?: string; + entries: HistoryEntries; + mutate: KeyedMutator; +}) { + const [, setSearchParams] = useSearchParams(); + const gleanClick = useGleanClick(); + + return ( + <> + +
      + {entries.entries.map(({ chat_id, last, label }, index) => { + return ( +
    1. + { + e.preventDefault(); + gleanClick(`${AI_HELP}: history item -> ${chat_id}`); + setSearchParams((old) => { + const params = new URLSearchParams(old); + params.set("c", chat_id); + return params; + }); + }} + > + {label || DEFAULT_TOPIC_LABEL} + + {chat_id === currentChatId && ( +
    2. + ); + })} +
    + + ); +} + +export function AIHelpHistory(props: HistoryProps) { + const { isHistoryEnabled } = useAIHelpSettings(); + + return ( + + ); +} + +interface HistoryProps { + currentChatId?: string; + lastUpdate: Date; + isFinished: boolean; + messageId?: string; +} + +export function AIHelpHistoryInner({ + currentChatId, + lastUpdate, + isFinished, + messageId, +}: HistoryProps) { + const gleanClick = useGleanClick(); + const { data, mutate } = useSWR( + `/api/v1/plus/ai/help/history/list`, + async (url) => { + const res = await (await fetch(url)).json(); + return Array.isArray(res) ? res : []; + }, + { + fallbackData: [], + } + ); + + const { label: currentChatLabel = "" } = + data.find((chat) => chat.chat_id === currentChatId) ?? {}; + + useEffect(() => { + if (isFinished && messageId && currentChatLabel === "") { + const update = async () => { + const res = await fetch( + `/api/v1/plus/ai/help/history/summary/${messageId}`, + { + method: "POST", + } + ); + if (res.ok) { + await res.json(); + mutate(); + } + }; + update(); + } + }, [mutate, isFinished, currentChatId, messageId, currentChatLabel]); + + useEffect(() => { + mutate(); + }, [lastUpdate, mutate]); + + return ( + <> + gleanClick(`${AI_HELP}: history toggle`)} + type="checkbox" + className="ai-help-history-details" + /> +
    + +
    +
      + {groupHistory(data).map((entries, index) => { + return entries?.entries.length ? ( +
    1. + +
    2. + ) : null; + })} +
    + + ); +} + +export function AIHelpHistoryActivation() { + const locale = useLocale(); + const gleanClick = useGleanClick(); + + return ( +
    +
    + +
    +

    + Answer History +

    +

    + + You can now effortlessly revisit and continue past conversations + +

    +

    + +

    +
    +
    +
    + ); +} diff --git a/vendor/yari/client/src/plus/ai-help/index.scss b/vendor/yari/client/src/plus/ai-help/index.scss new file mode 100644 index 000000000..27179fcc1 --- /dev/null +++ b/vendor/yari/client/src/plus/ai-help/index.scss @@ -0,0 +1,617 @@ +@use "../../ui/vars" as *; + +.ai-help { + --background-toc-active: var(--ai-help-accent-background-color); + --category-color: var(--ai-help-icon); + --category-color-background: var(--ai-help-accent-background-color); + --text-link: var(--ai-help-link); + + > header { + --plus-header: var(--ai-help-header); + --plus-mandala: var(--ai-help-mandala); + --plus-icon: var(--ai-help-icon); + --plus-link: var(--ai-help-link); + } + + .button.action.has-icon { + // Reduce button icon contrast to make it less prominent. + --button-color: var(--icon-secondary); + + &:hover { + --button-color: var(--icon-primary); + + .icon-trash { + background-color: var(--text-primary-red); + } + } + } + + > .ai-help-main { + --ai-top: calc(var(--top-nav-height) + 1px + 1rem); + column-gap: 1rem; + display: grid; + grid-template-columns: [left] 1fr [center] min(52rem, 100%) [right] 1fr; + grid-template-rows: auto auto 1fr; + margin: 0 auto; + max-width: var(--max-width); + padding-left: 1rem; + padding-right: 1rem; + + &.with-ai-help-history { + > .ai-help-history { + grid-column: left; + grid-row: 1/4; + height: fit-content; + max-height: calc(100vh - var(--sticky-header-without-actions-height)); + overflow: auto; + position: sticky; + top: var(--sticky-header-without-actions-height); + } + @media (max-width: $screen-xxl) { + grid-template-columns: [left] minmax(0, 15rem) [center] minmax(0, 3fr); + } + @media (max-width: $screen-md) { + grid-template-columns: [center] minmax(0, 3fr); + + > .ai-help-history { + grid-column: center; + grid-row: initial; + } + } + } + + > .container { + grid-column: center; + padding: var(--gutter); + + &.ai-help-header { + column-gap: 1rem; + display: flex; + flex-wrap: wrap; + justify-content: space-between; + + > h1 { + margin-bottom: 0.7rem; + min-width: 100%; + + &::after { + background-color: var(--ai-help-icon); + content: ""; + display: inline-block; + height: 1.1rem; + mask-image: url("../../assets/icons/ai-help.svg"); + mask-position: center center; + mask-repeat: no-repeat; + mask-size: contain; + vertical-align: top; + width: 1.25rem; + } + } + + > p { + color: var(--text-secondary); + margin: 0; + } + + .feedback-link { + --feedback-link-icon: var(--icon-secondary); + --text-link: var(--text-secondary); + font-size: var(--type-tiny-font-size); + } + } + + &:not(:last-of-type) { + padding-bottom: 0; + } + + .notecard { + margin-bottom: 0; + margin-top: 0; + + a:link { + color: var(--text-link); + + &:not(:hover) { + text-decoration: underline; + } + } + } + } + } + + a:hover { + text-decoration: underline; + } + + .ai-help-banner, + .login-banner { + background-color: var(--category-color-background); + border: none; + border-radius: 0.25rem; + padding: 1rem 1.5rem; + + p { + margin: 0; + } + } + + .ai-help-banner { + display: flex; + flex-direction: column; + gap: 0.25rem; + + .icon { + background-color: var(--ai-help-icon); + vertical-align: text-top; + + &:first-of-type { + margin-right: 1rem; + } + } + + .auth-container { + margin-top: 1rem; + } + + &.disabled { + background-color: var(--background-secondary); + + margin-bottom: 2.25rem; + + .button { + display: none; + } + } + } + + .ai-help-inner { + --input-border-width: 1px; + --input-padding-left: 1rem; + --input-padding-right: 3rem; + + .ai-help-body, + .ai-help-footer { + padding: 0.5rem 0; + } + + .ai-help-footer { + background-color: var(--background-primary); + bottom: 0; + mask-image: linear-gradient( + to top, + rgb(0, 0, 0) 0% calc(100% - 0.5rem), + rgba(0, 0, 0, 0) 100% + ); + padding-top: 1rem; + position: sticky; + + .ai-help-footer-actions { + padding-bottom: 0.5rem; + + button:disabled { + visibility: hidden; + } + } + + .ai-help-footer-text { + color: var(--text-secondary); + font-size: var(--type-tiny-font-size); + margin-top: 0.5rem; + } + + .ai-help-refine-button { + border: 1px solid var(--text-primary); + } + + .ai-help-new-question-button { + // Revert effects of .button.action + --button-bg: var(--button-primary-default); + --button-bg-hover: var(--button-primary-hover); + --button-bg-active: var(--button-primary-active); + --button-color: var(--background-primary); + + :hover { + --button-border-color: var(--button-bg-hover); + --button-color: var(--background-primary); + } + } + } + + .ai-help-refine-or-new { + display: flex; + flex-wrap: wrap-reverse; + gap: 1rem; + justify-content: center; + width: 100%; + + .ai-help-new-question-button { + align-self: center; + + .button-wrap { + text-transform: none; + width: max-content; + + .icon { + margin-right: 0.2em; + } + } + } + } + + .ai-help-input-form { + --input-height: 3rem; + background-color: var(--background-primary); + border: var(--input-border-width) solid var(--border-primary); + border-radius: 1rem; + display: flex; + flex-grow: 1; + flex-wrap: wrap; + justify-content: center; + padding: 0.5rem 1rem; + position: relative; + + &:focus-within { + border-color: var(--category-color); + box-shadow: + 0 0 0 3px var(--blend-color), + 0 0 0 3px var(--category-color); + outline: 0 none; + } + + .ai-help-input-actions { + display: flex; + flex-wrap: wrap; + } + + textarea { + background-color: var(--background-primary); + border: none; + color: var(--text-primary); + flex-grow: 1; + height: 2rem; + max-height: calc(30vh - var(--sticky-header-without-actions-height)); + max-width: 100%; + resize: none; + + &:focus-visible { + outline: none; + } + } + + button { + --button-color: var(--icon-secondary); + --button-padding: 0.5rem; + --icon-size: 1.5rem; + align-self: end; + margin-left: auto; + + &:hover { + background: transparent; + } + } + + .button[type="submit"]:enabled { + --button-color: var(--ai-help-icon); + } + } + + .ai-help-examples { + background: var(--background-secondary); + border-radius: 0.25rem; + display: flex; + flex-direction: column; + gap: 1rem; + margin: 1rem 0; + padding: 1rem; + + header { + font-weight: 500; + letter-spacing: var(--header-letter-spacing); + line-height: 175%; + } + } + + .ai-help-example { + --category-color-engage: var(--border-primary); + background: var(--background-primary); + border-radius: 0.25rem; + box-shadow: inset 0.25rem 0 0 var(--category-color-engage); + cursor: pointer; + font-size: var(--type-smaller-font-size); + padding: 0.5rem 1rem; + text-align: left; + + &:hover { + color: var(--ai-help-link); + } + } + + .ai-help-messages { + display: flex; + flex-direction: column; + gap: 1rem; + } + + .ai-help-message { + border-radius: var(--elem-radius); + display: grid; + grid-auto-rows: auto; + grid-template-columns: max-content minmax(0, auto); + padding: 1rem; + row-gap: 1rem; + + > * { + grid-column: 2; + } + + &.role-user { + color: var(--text-secondary); + + .avatar-wrap { + border-radius: unset; + height: 1.5rem; + margin-left: unset; + margin-right: unset; + margin-top: 0.1rem; /* Align with text. */ + position: unset; + width: 1.5rem; + } + } + + &.role-assistant { + .ai-help-message-role { + --icon-size: 1.5rem; + margin-top: -0.1rem; /* Align with text. */ + } + } + + .ai-help-message-role { + flex-shrink: 0; + grid-column: 1; + width: 2.5rem; + } + + .ai-help-feedback { + display: flex; + flex-direction: column; + font-size: var(--type-tiny-font-size); + gap: 0.5rem; + text-align: right; + + .glean-thumbs { + justify-content: flex-end; + } + + > a { + color: var(--text-primary); + padding-right: 0.5rem; + text-decoration: underline; + + &:hover { + text-decoration: none; + } + } + } + + .ai-help-message-progress { + color: var(--text-secondary); + + &::before { + background-color: var(--text-secondary); + content: ""; + display: inline-block; + height: 1em; + margin-bottom: -0.15em; + margin-right: 0.4em; + mask-image: url("../../assets/icons/progress-helper.svg"); + mask-position: center center; + mask-repeat: no-repeat; + mask-size: contain; + vertical-align: baseline; + width: 1em; + + @keyframes pulse { + from { + opacity: 1; + } + + to { + opacity: 0; + } + } + } + + &.active::before { + animation: pulse 1s infinite alternate; + } + + &.complete::before { + background-color: var(--ai-help-icon); + mask-image: url("../../assets/icons/progress-check.svg"); + } + + &.errored { + background-color: var(--background-critical); + border: 0; + border-radius: var(--elem-radius); + color: var(--icon-critical); + padding: 0.5rem 1rem; + + &::before { + background-color: var(--icon-critical); + mask-image: url("../../assets/icons/alert-circle.svg"); + } + } + } + + .ai-help-message-sources { + list-style: circle; + list-style-position: inside; + padding-left: 1.4em; + } + + &.status-pending .ai-help-message-content, + &.status-in-progress .ai-help-message-content { + &.empty::after, + > :not(ol):not(ul):not(pre):not(div.code-example):last-child:after, + > ol:last-child li:last-child:after, + > pre:last-child code:after, + > ul:last-child li:last-child:after, + > div.code-example:last-child pre:last-child code:after { + animation: blink 1s steps(5, start) infinite; + content: "▋"; + margin-left: 0.25rem; + vertical-align: baseline; + + @keyframes blink { + to { + visibility: hidden; + } + } + } + + &.empty::after { + margin-left: unset; + } + } + + .stopped-message { + color: var(--text-muted); + display: block; + margin-top: 1.7rem; + } + } + + .ai-help-message-content { + width: 100%; + + &.role-user { + align-items: center; + align-items: flex-start; + display: flex; + flex-direction: row; + justify-content: space-between; + white-space: pre-wrap; + + .ai-help-message-nav { + display: flex; + justify-content: space-between; + + > span { + text-align: center; + white-space: nowrap; + } + } + + .ai-help-user-message { + width: 100%; + } + } + + h1, + h2, + h3, + h4, + h5 { + font: unset; + font-weight: 500; + } + + p { + margin: 1rem 0; + + &:first-child { + margin-top: 0; + } + + &:last-child { + margin-bottom: 0; + } + + &.example-header { + margin-bottom: 0; + } + } + + ul, + ol { + margin: 1rem 0 2rem; + padding-left: 2rem; + + li { + margin: 0.5rem 0; + } + } + + ul { + list-style: disc; + + ul { + list-style-type: circle; + margin: 0; + padding-left: 1rem; + } + } + + ol { + list-style: decimal; + + ol { + list-style: lower-roman; + margin: 0; + } + } + + dd ol, + dd ul { + margin-bottom: 1rem; + padding-left: 3rem; + } + + td ul, + td ol { + padding-left: 1rem; + } + + dd li { + margin-bottom: 1rem; + } + + td li { + margin-bottom: 0.5rem; + } + + dl { + dt { + margin-bottom: 0.5rem; + margin-top: 2rem; + } + + dd { + margin-bottom: 1rem; + margin-left: 1rem; + + .notecard { + p { + padding-left: 0; + } + } + } + + p { + margin: 0 0 1rem; + } + } + } + + .ai-help-footer-actions { + display: flex; + gap: 1rem; + justify-content: center; + } + + .ai-help-error { + margin: 0.5rem 0; + } + } +} diff --git a/vendor/yari/client/src/plus/ai-help/index.tsx b/vendor/yari/client/src/plus/ai-help/index.tsx new file mode 100644 index 000000000..d0fb7d464 --- /dev/null +++ b/vendor/yari/client/src/plus/ai-help/index.tsx @@ -0,0 +1,1129 @@ +import { + Children, + MutableRefObject, + ReactElement, + useCallback, + useEffect, + useMemo, + useRef, + useState, +} from "react"; +import ReactMarkdown from "react-markdown"; +import remarkGfm from "remark-gfm"; + +import { + Message, + MessageRole, + MessageStatus, + Quota, + useAiChat, +} from "./use-ai"; +import { AiHelpBanner, AiUpsellBanner } from "./banners"; +import { useUserData } from "../../user-context"; +import Container from "../../ui/atoms/container"; +import { FeatureId, MDN_PLUS_TITLE } from "../../constants"; +import { useLocale, useScrollToTop, useViewedState } from "../../hooks"; +import { Icon } from "../../ui/atoms/icon"; + +import { collectCode } from "../../document/code/playground"; +import "./index.scss"; +import { Avatar } from "../../ui/atoms/avatar"; +import { Button } from "../../ui/atoms/button"; +import { GleanThumbs } from "../../ui/atoms/thumbs"; +import NoteCard from "../../ui/molecules/notecards"; +import { Loading } from "../../ui/atoms/loading"; +import { useLocation } from "react-router-dom"; +import { isExternalUrl } from "./utils"; +import { useGleanClick } from "../../telemetry/glean-context"; +import { AI_HELP } from "../../telemetry/constants"; +import MDNModal from "../../ui/atoms/modal"; +import { AI_FEEDBACK_GITHUB_REPO } from "../../env"; +import ExpandingTextarea from "../../ui/atoms/form/expanding-textarea"; +import React from "react"; +import { SESSION_KEY } from "../../playground/utils"; +import { PlayQueue, createQueueEntry } from "../../playground/queue"; +import { AIHelpHistory } from "./history"; +import { useUIStatus } from "../../ui-context"; +import { QueueEntry } from "../../types/playground"; +import { AIHelpLanding } from "./landing"; +import { + MESSAGE_SEARCHING, + MESSAGE_ANSWERING, + MESSAGE_FAILED, + MESSAGE_ANSWERED, + MESSAGE_SEARCHED, + MESSAGE_STOPPED, + OFF_TOPIC_PREFIX, + OFF_TOPIC_MESSAGE, +} from "./constants"; +import InternalLink from "../../ui/atoms/internal-link"; +import { isPlusSubscriber } from "../../utils"; +import { CodeWithSyntaxHighlight } from "../../document/code/syntax-highlight"; + +type Category = "apis" | "css" | "html" | "http" | "js" | "learn"; + +const EXAMPLES: { category: Category; query: string }[] = [ + { + category: "css", + query: "How to center a div with CSS?", + }, + { + category: "html", + query: "How do I create a form in HTML?", + }, + { + category: "js", + query: "How can I sort an Array in JavaScript?", + }, + { + category: "apis", + query: "How can I use the Fetch API to make HTTP requests in JavaScript?", + }, + { + category: "http", + query: "How can I redirect using HTTP?", + }, + { + category: "learn", + query: "What are some accessibility best practices?", + }, +]; + +export default function AiHelp() { + document.title = `AI Help | ${MDN_PLUS_TITLE}`; + useScrollToTop(); + const user = useUserData(); + const { setViewed } = useViewedState(); + useEffect(() => setViewed(FeatureId.PLUS_AI_HELP)); + + return ( +
    + {user?.isAuthenticated ? : } +
    + ); +} + +function AIHelpAuthenticated() { + const gleanClick = useGleanClick(); + + return ( +
    + +

    + AI Help +

    +

    Get answers using generative AI based on MDN content.

    +

    + gleanClick(`${AI_HELP}: report feedback`)} + > + Report Feedback + +

    +
    + +
    + ); +} + +function AIHelpUserQuestion({ + message, + canEdit, + submit, + nextPrev, + siblingCount, +}) { + const gleanClick = useGleanClick(); + const [editing, setEditing] = useState(false); + const [question, setQuestion] = useState(message.content); + const inputRef = useRef(null); + const { pos, total } = siblingCount(message.messageId); + + useEffect(() => { + setQuestion(message.content); + }, [message.content]); + + return editing ? ( +
    { + event.preventDefault(); + if (canEdit && question?.trim()) { + gleanClick(`${AI_HELP}: edit submit`); + setEditing(false); + submit(question, message.chatId, message.parentId, message.messageId); + } + }} + > + { + if (event.key === "Enter" && !event.shiftKey) { + event.preventDefault(); + if (canEdit && question?.trim()) { + gleanClick(`${AI_HELP}: edit submit`); + setEditing(false); + submit( + question, + message.chatId, + message.parentId, + message.messageId + ); + } + } + }} + onChange={(e) => setQuestion(e.target.value)} + value={question} + rows={1} + /> +
    + {canEdit && ( + <> + {question && ( + + )} + + + )} + +
    + + ) : ( +
    + {total > 1 && ( + + )} +
    {message.content}
    + {canEdit && ( +
    + ); +} + +function AIHelpAssistantResponse({ + message, + queuedExamples, + setQueue, + messages, + retryLastQuestion, +}: { + message: Message; + queuedExamples: Set; + setQueue: React.Dispatch>; + messages: Message[]; + retryLastQuestion: () => void; +}) { + const gleanClick = useGleanClick(); + const locale = useLocale(); + const { highlightedQueueExample } = useUIStatus(); + + let sample = 0; + + const isOffTopic = + message.role === MessageRole.Assistant && + (message.content?.startsWith(OFF_TOPIC_PREFIX) || + (message.status === MessageStatus.Complete && + OFF_TOPIC_PREFIX.startsWith(message.content))); + + function messageForStatus(status: MessageStatus) { + switch (status) { + case MessageStatus.Errored: + return ( + <> + {MESSAGE_FAILED} Please{" "} + + . + + ); + + case MessageStatus.Stopped: + return MESSAGE_STOPPED; + + case MessageStatus.InProgress: + return MESSAGE_ANSWERING; + + default: + return MESSAGE_ANSWERED; + } + } + + if (isOffTopic) { + message = { + ...message, + content: OFF_TOPIC_MESSAGE, + sources: [], + }; + } + + return ( + <> + {!isOffTopic && } + {!isOffTopic && + (message.content || + message.status === MessageStatus.InProgress || + message.status === MessageStatus.Errored) && ( +
    + {messageForStatus(message.status)} +
    + )} + {message.content && ( +
    + { + if (props.href?.startsWith("https://developer.mozilla.org/")) { + props.href = props.href.replace( + "https://developer.mozilla.org", + "" + ); + } + + const isExternal = isExternalUrl(props.href ?? ""); + + if (isExternal) { + props.className = "external"; + props.rel = "noopener noreferrer"; + } + + // Measure. + props.onClick = () => + gleanClick( + `${AI_HELP}: link ${ + isExternal ? "external" : "internal" + } -> ${props.href}` + ); + + // Always open in new tab. + props.target = "_blank"; + + // eslint-disable-next-line jsx-a11y/anchor-has-content + return ; + }, + pre: ({ node, className, children, ...props }) => { + const code = Children.toArray(children) + .map( + (child) => + /language-(\w+)/.exec( + (child as ReactElement)?.props?.className || "" + )?.[1] + ) + .find(Boolean); + + if (!code) { + return ( +
    +                      {children}
    +                    
    + ); + } + const key = sample; + const id = `${message.messageId}--${key}`; + const isQueued = queuedExamples.has(id); + sample += 1; + return ( +
    +
    + {code} + {message.status === MessageStatus.Complete && + ["html", "js", "javascript", "css"].includes( + code.toLowerCase() + ) && ( +
    + { + gleanClick( + `${AI_HELP}: example ${ + isQueued ? "dequeue" : "queue" + } -> ${id}` + ); + setQueue((old) => + !old.some((item) => item.id === id) + ? [...old, createQueueEntry(id)].sort( + (a, b) => a.key - b.key + ) + : [...old].filter((item) => item.id !== id) + ); + }} + id={id} + /> + + +
    + )} +
    +
    {children}
    +
    + ); + }, + code: ({ className, children, ...props }) => { + const match = /language-(\w+)/.exec(className || ""); + const lang = match?.[1]; + return ( + + {children} + + ); + }, + }} + > + {message.content} +
    + {message.status === "stopped" && ( +
    + {"■\u00a0Stopped answering"} +
    + )} + {(message.status === "complete" || isOffTopic) && ( + <> +
    + {!isOffTopic && ( + + )} + + Report an issue with this answer on GitHub + +
    + + )} +
    + )} + + ); +} + +function AIHelpAssistantResponseSources({ + message, +}: { + message: Pick; +}) { + const gleanClick = useGleanClick(); + + return ( + <> +
    + {message.status === MessageStatus.Pending + ? MESSAGE_SEARCHING + : MESSAGE_SEARCHED} +
    + {message.sources && message.sources.length > 0 && ( +
      + {message.sources.map(({ url, title }, index) => ( +
    • + gleanClick(`${AI_HELP}: link source -> ${url}`)} + target="_blank" + > + {title} + +
    • + ))} +
    + )} + + ); +} + +export function AIHelpInner() { + const formRef = useRef(null); + const inputRef = useRef(null); + const bodyRef = useRef(null); + const footerRef = useRef(null); + const [query, setQuery] = useState(""); + const [showDisclaimer, setShowDisclaimer] = useState(false); + const { queuedExamples, setQueue, setHighlightedQueueExample } = + useUIStatus(); + const { hash } = useLocation(); + const gleanClick = useGleanClick(); + const user = useUserData(); + + const { + isFinished, + isLoading, + isHistoryLoading, + isResponding, + isInitializing, + hasError, + datas, + messages, + quota, + reset, + unReset, + stop, + submit, + chatId, + previousChatId, + nextPrev, + siblingCount, + lastUpdate, + } = useAiChat(); + + const isQuotaLoading = quota === undefined; + const hasQuota = !isQuotaLoading && quota !== null; + const hasConversation = messages.length > 0; + const gptVersion = isPlusSubscriber(user) ? "GPT-4o" : "GPT-4o mini"; + + function isQuotaExceeded(quota: Quota | null | undefined): quota is Quota { + return quota ? quota.remaining <= 0 : false; + } + + function placeholder(status: string) { + if (!hasQuota) { + return status; + } + + return `${status} (${quota.remaining} ${ + quota.remaining === 1 ? "question" : "questions" + } remaining today)`; + } + + const { autoScroll, setAutoScroll } = useAutoScroll(messages, { + bodyRef, + footerRef, + }); + + useEffect(() => { + // Focus input: + // - When the user loads the page (-> isQuotaLoading). + // - When the user starts a "New chat" (-> hasConversation). + // Do not focus while we figure out wether we're loading history (-> isInitializing). + const input = inputRef.current; + if (input && !isInitializing && !hasConversation) { + window.setTimeout(() => input.focus()); + } + }, [isQuotaLoading, hasConversation, isInitializing]); + + useEffect(() => { + const messageIds = new Set(messages.map((m) => m.messageId)); + setQueue((old) => { + const fresh = [...old].filter(({ id }) => + messageIds.has(id.split("--")[0]) + ); + + return fresh; + }); + }, [messages, setQueue]); + + const submitQuestion = (parentId) => { + if (query.trim()) { + submit(query.trim(), chatId, parentId); + setQuery(""); + setAutoScroll(true); + } + }; + + const lastUserQuestion = useMemo( + () => messages.filter((message) => message.role === "user").at(-1), + [messages] + ); + const retryLastQuestion = useCallback(() => { + if (!lastUserQuestion) { + return; + } + const { content: question, chatId, parentId, messageId } = lastUserQuestion; + submit(question, chatId, parentId, messageId); + }, [lastUserQuestion, submit]); + + return ( + <> + + + + + {isQuotaLoading || isHistoryLoading ? ( + + ) : ( +
    +
    + {hasConversation && ( +
      + {messages.map((message, index) => { + return ( +
    • +
      + +
      + {message.role === "user" ? ( + + ) : ( + + )} +
    • + ); + })} +
    + )} +
    + {hasError && ( + +

    Error

    +

    + An error occurred.{" "} + {lastUserQuestion && ( + <> + Please{" "} + + . + + )} +

    +
    + )} +
    + {(isLoading || isResponding) && ( +
    + + +
    + )} + {isQuotaExceeded(quota) ? ( + + ) : ( + <> +
    + {hasConversation && ( + + )} +
    { + event.preventDefault(); + submitQuestion(messages.at(-1)?.messageId); + }} + > + { + if (event.key === "Enter" && !event.shiftKey) { + event.preventDefault(); + submitQuestion(messages.at(-1)?.messageId); + } + }} + onChange={(event) => setQuery(event.target.value)} + value={query} + rows={1} + placeholder={placeholder( + isLoading + ? MESSAGE_SEARCHING + : isResponding + ? MESSAGE_ANSWERING + : hasConversation + ? "Ask your follow up question" + : "Ask your question" + )} + /> +
    + {!query && !hasConversation ? ( + + ) : query ? ( + + ) : null} + +
    + +
    +
    + + Results based on MDN's most recent documentation and + powered by {gptVersion}, an LLM by{" "} + + OpenAI + + . Please verify information independently as LLM responses + may not be 100% accurate. Read our{" "} + {" "} + for more details. + + setShowDisclaimer(false)} + > +
    +

    + AI Help Usage Guidance +

    +
    +
    +

    + Our AI Help feature integrates GPT-4o mini for MDN + Plus free users and GPT-4o for paying subscribers, + leveraging Large Language Models (LLMs) developed by{" "} + + OpenAI + + . This tool is designed to enhance your experience by + providing relevant insights from MDN's extensive + documentation. However, given the nature of LLMs, it's + crucial to approach the generated information with a + discerning eye, especially for complex or critical + subjects. +

    +

    + We encourage users to verify the AI Help's output. For + convenience and accuracy, links for further reading + and verification are provided at the beginning of + responses, directing you to the relevant MDN + documentation. This ensures immediate access to deeper + insights and broader context. +

    +

    + Remember, while AI Help aims to be a valuable + resource, its responses, influenced by the + complexities of AI, might not always hit the mark with + absolute precision. We invite you to explore this + feature, designed to complement your MDN exploration. + Your feedback is invaluable as we continue to refine + AI Help to better serve your needs. +

    +
    +
    +
    + + )} +
    + {!hasConversation && !query && !isQuotaExceeded(quota) && ( +
    +
    Examples
    + {EXAMPLES.map(({ category, query }, index) => ( + + ))} +
    + )} + {hash === "#debug" && ( +
    {JSON.stringify({ datas, messages, quota }, null, 2)}
    + )} +
    + )} + + + ); +} + +export function RoleIcon({ role }: { role: "user" | "assistant" }) { + const userData = useUserData(); + + switch (role) { + case "user": + return ; + + case "assistant": + return ; + } +} + +function useAutoScroll( + dependency, + { + bodyRef, + footerRef, + }: { + bodyRef: MutableRefObject; + footerRef: MutableRefObject; + } +) { + const [autoScroll, setAutoScroll] = useState(false); + const lastScrollY = useRef(0); + const lastHeight = useRef(0); + + useEffect(() => { + const body = (bodyRef.current ??= + document.querySelector(".ai-help-body")); + const footer = (footerRef.current ??= + document.querySelector(".ai-help-footer")); + + if (!body || !footer) { + return; + } + + window.setTimeout(() => { + const { offsetTop, offsetHeight } = body; + const elementBottom = offsetTop + offsetHeight + footer.offsetHeight; + const targetScrollY = elementBottom - window.innerHeight; + + // Only scroll if our element grew and the target scroll position is further down. + const shouldScroll = + lastHeight.current < offsetHeight && + lastScrollY.current < targetScrollY; + + lastHeight.current = offsetHeight; + lastScrollY.current = window.scrollY; + + if (autoScroll && shouldScroll) { + window.scrollTo(0, targetScrollY); + } + }); + + const scrollListener = () => { + const { offsetTop, offsetHeight } = body; + const { innerHeight, scrollY } = window; + const elementBottom = offsetTop + offsetHeight + footer.offsetHeight; + const windowBottom = scrollY + innerHeight; + const isBottomVisible = + scrollY <= elementBottom && elementBottom <= windowBottom; + + const scrollOffset = scrollY - lastScrollY.current; + if (autoScroll && scrollOffset < 0 && !isBottomVisible) { + // User scrolled up. + setAutoScroll(false); + } else if (!autoScroll && scrollOffset > 0 && isBottomVisible) { + // User scrolled down again. + setAutoScroll(true); + } + lastScrollY.current = scrollY; + }; + window.addEventListener("scroll", scrollListener); + + return () => window.removeEventListener("scroll", scrollListener); + }, [autoScroll, bodyRef, dependency, footerRef]); + + return { + autoScroll, + setAutoScroll, + }; +} + +function ReportIssueOnGitHubLink({ + messages, + currentMessage, + children, +}: { + messages: Message[]; + currentMessage: Message; + children: React.ReactNode; +}) { + const user = useUserData(); + const isSubscriber = useMemo(() => isPlusSubscriber(user), [user]); + + const gleanClick = useGleanClick(); + const currentMessageIndex = messages.indexOf(currentMessage); + const questions = messages + .slice(0, currentMessageIndex) + .filter((message) => message.role === MessageRole.User) + .map(({ content }) => content); + const lastQuestion = questions.at(-1); + + const url = new URL("https://github.com/"); + url.pathname = `/${AI_FEEDBACK_GITHUB_REPO}/issues/new`; + + const sp = new URLSearchParams(); + sp.set("title", `[AI Help] Question: ${lastQuestion}`); + sp.set("questions", questions.map((question) => `1. ${question}`).join("\n")); + sp.set("answer", currentMessage.content); + sp.set( + "sources", + currentMessage.sources + ?.map( + (source) => + `- [${source.title}](https://developer.mozilla.org${source.url})` + ) + .join("\n") || "(None)" + ); + // TODO Persist model in messages and read it from there. + sp.set("model", isSubscriber ? "gpt-4o" : "gpt-4o mini"); + sp.set("template", "ai-help-answer.yml"); + + url.search = sp.toString(); + + return ( + gleanClick(`${AI_HELP}: report issue`)} + > + {children} + + ); +} diff --git a/vendor/yari/client/src/plus/ai-help/landing.scss b/vendor/yari/client/src/plus/ai-help/landing.scss new file mode 100644 index 000000000..5ce22b4f4 --- /dev/null +++ b/vendor/yari/client/src/plus/ai-help/landing.scss @@ -0,0 +1,150 @@ +@use "../../ui/vars" as *; + +.ai-help .ai-help-landing { + margin: 2rem 0; + + h2 { + font-size: var(--type-heading-h3-font-size); + margin: 0.5rem 0; + } + + h3 { + font: unset; + font-size: var(--type-heading-h4-font-size); + font-weight: 500; + letter-spacing: unset; + } + + .auth-container { + justify-content: flex-start; + } + + .ai-help-landing-top { + display: flex; + flex-direction: column; + gap: 2rem; + + @media (min-width: $screen-md) { + flex-direction: row; + gap: 6rem; + justify-content: space-evenly; + } + + @media (min-width: $screen-lg) { + gap: 12rem; + } + + > * { + flex: 1; + } + + h1 { + em { + color: var(--category-color); + font-style: unset; + font-variation-settings: unset; + } + } + + img { + border-radius: 1rem; + box-shadow: 0 3px 22px var(--border-secondary); + } + } + + .ai-help-landing-features { + background-color: var(--background-secondary); + margin: 4rem 0; + padding: 1rem 0; + + .ai-help-new-additions { + display: flex; + flex-direction: column; + gap: 2rem; + margin: 2rem 0; + + @media (min-width: $screen-md) { + flex-direction: row; + gap: 3rem; + justify-content: space-between; + } + + figure { + align-items: center; + display: flex; + + gap: 1.5rem; + margin-top: 1rem; + text-align: center; + + svg { + height: 3rem; + width: 3rem; + } + + figcaption { + p { + margin: 0; + } + } + + @media (min-width: $screen-md) { + // Desktop. + display: block; + + svg { + height: 5rem; + margin: 0 auto; + width: 5rem; + } + + figcaption { + text-align: center; + } + } + + @media (max-width: #{$screen-md - 1}) { + // Mobile. + + figcaption { + text-align: left; + + h3 { + margin: 0; + } + } + } + } + } + } + + .ai-help-landing-bottom { + margin-bottom: 4rem; + + ul.highlights { + margin: 2rem 0; + + li { + &:before { + background-image: url("../../../public/assets/ai-help/lightbulb-question.svg"); + content: ""; + display: inline-block; + height: 1rem; + margin-right: 0.5ch; + vertical-align: text-top; + width: 1rem; + } + + &:not(:last-of-type) { + margin-bottom: 1rem; + } + + em { + font-style: unset; + font-variation-settings: unset; + font-weight: 600; + } + } + } + } +} diff --git a/vendor/yari/client/src/plus/ai-help/landing.tsx b/vendor/yari/client/src/plus/ai-help/landing.tsx new file mode 100644 index 000000000..c804387de --- /dev/null +++ b/vendor/yari/client/src/plus/ai-help/landing.tsx @@ -0,0 +1,95 @@ +import { AI_HELP } from "../../telemetry/constants"; +import Container from "../../ui/atoms/container"; +import ThemedPicture from "../../ui/atoms/themed-picture"; +import { AuthContainer } from "../../ui/molecules/auth-container"; +import { ReactComponent as ContextSVG } from "../../../public/assets/ai-help/context.svg"; +import { ReactComponent as HistorySVG } from "../../../public/assets/ai-help/history.svg"; +import { ReactComponent as GPT4SVG } from "../../../public/assets/ai-help/gpt-4.svg"; +import screenshotDark from "../../../public/assets/ai-help/ai-help_dark.png"; +import screenshotLight from "../../../public/assets/ai-help/ai-help_light.png"; + +import "./landing.scss"; + +export function AIHelpLanding() { + return ( +
    + +
    +

    + Utilize AI Help to boost your productivity +

    +

    Receive MDN-sourced answers complete with consulted links

    + +
    +
    + +
    +
    +
    + +

    New Additions

    +
    +
    + +
    +

    History

    +

    Save your history to revisit your chats at anytime

    +
    +
    +
    + +
    +

    Enhanced Context

    +

    Ask queries about browser compatibility data

    +
    +
    +
    + +
    +

    GPT-4o-Powered

    +

    + Unlock GPT-4o's full potential with our paid subscriptions +

    +
    +
    +
    +
    +
    + +

    Boost Your Productivity with AI-Assisted Help on MDN

    +
      +
    • + Direct Access to Information: We provide the verified links + checked by AI for your answers, enabling you to dive directly into + them at your preferred pace for a comprehensive understanding. +
    • +
    • + Summarized Insights: We provide quick, concise summary of + your questions, making it easy to grasp key points without extensive + reading. +
    • +
    • + Interactive Learning: We've integrated this with our + Playground feature, allowing you to directly experiment with the + code provided, verify solutions, and enhance your understanding + through practical application. +
    • +
    + +
    +
    + ); +} + +function Login({ placement }: { placement: "top" | "bottom" }) { + return ( + + ); +} diff --git a/vendor/yari/client/src/plus/ai-help/rust-types.ts b/vendor/yari/client/src/plus/ai-help/rust-types.ts new file mode 100644 index 000000000..819b2b42c --- /dev/null +++ b/vendor/yari/client/src/plus/ai-help/rust-types.ts @@ -0,0 +1,40 @@ +export interface AIHelpLog { + chat_id: string; + messages: AIHelpLogMessage[]; +} + +export interface AIHelpLogMessage { + metadata: AIHelpMeta; + user: ChatCompletionRequestMessage; + assistant?: ChatCompletionRequestMessage; +} + +export interface AIHelpMeta { + type: MetaType; + chat_id: string; + message_id: string; + parent_id?: string | null; + sources: RefDoc[]; + quota?: AIHelpLimit | null; + created_at: string; +} + +export enum MetaType { + Metadata = "metadata", +} + +export interface RefDoc { + url: string; + title: string; +} + +export interface AIHelpLimit { + count: number; + remaining: number; + limit: number; +} + +export interface ChatCompletionRequestMessage { + role: "user" | "assistant"; + content: string; +} diff --git a/vendor/yari/client/src/plus/ai-help/use-ai.test.ts b/vendor/yari/client/src/plus/ai-help/use-ai.test.ts new file mode 100644 index 000000000..4f1878081 --- /dev/null +++ b/vendor/yari/client/src/plus/ai-help/use-ai.test.ts @@ -0,0 +1,203 @@ +import { MessageRole, apiDataToStorage, stateToMessagePath } from "./use-ai"; +import { AIHelpLog, MetaType } from "./rust-types"; + +const data: AIHelpLog = { + chat_id: "a2befad4-be1e-4b01-8d09-e45bebfee490", + messages: [ + { + metadata: { + type: MetaType.Metadata, + chat_id: "a2befad4-be1e-4b01-8d09-e45bebfee490", + message_id: "5d49b710-20ad-4371-a92f-a283c26e2a7f", + parent_id: null, + sources: [ + { + url: "/en-US/docs/Learn/CSS/Howto/Center_an_item", + title: "How to center an item", + }, + { + url: "/en-US/docs/Web/CSS/Layout_cookbook/Center_an_element", + title: "Center an element", + }, + { url: "/en-US/docs/Learn/CSS/Howto/CSS_FAQ", title: "CSS FAQ" }, + { + url: "/en-US/docs/Learn/CSS/Howto/Create_fancy_boxes", + title: "Create fancy boxes", + }, + { url: "/en-US/docs/Web/CSS/place-content", title: "place-content" }, + ], + quota: null, + created_at: "2024-02-13T17:05:51.171127Z", + }, + user: { role: "user", content: "How to center a div with CSS?" }, + assistant: { + role: "assistant", + content: "To center a `div` element ...", + }, + }, + { + metadata: { + type: MetaType.Metadata, + chat_id: "a2befad4-be1e-4b01-8d09-e45bebfee490", + message_id: "ba70e34a-9fc2-4e57-88f7-f4bb8c5a46ef", + parent_id: "5d49b710-20ad-4371-a92f-a283c26e2a7f", + sources: [ + { + url: "/en-US/docs/Learn/CSS/Howto/Center_an_item", + title: "How to center an item", + }, + { + url: "/en-US/docs/Web/CSS/Layout_cookbook/Center_an_element", + title: "Center an element", + }, + { + url: "/en-US/docs/Web/CSS/vertical-align", + title: "vertical-align", + }, + { + url: "/en-US/docs/Web/CSS/CSS_flexible_box_layout/Aligning_items_in_a_flex_container", + title: "Aligning items in a flex container", + }, + { url: "/en-US/docs/Web/CSS/justify-self", title: "justify-self" }, + ], + quota: null, + created_at: "2024-02-13T17:06:52.596985Z", + }, + user: { role: "user", content: "How to center it vertically only?" }, + assistant: { + role: "assistant", + content: "To center a `div` ...", + }, + }, + { + metadata: { + type: MetaType.Metadata, + chat_id: "a2befad4-be1e-4b01-8d09-e45bebfee490", + message_id: "e853350f-4c83-4cfd-ad7b-a33a13e8f53f", + parent_id: "5d49b710-20ad-4371-a92f-a283c26e2a7f", + sources: [ + { + url: "/en-US/docs/Learn/CSS/Howto/Center_an_item", + title: "How to center an item", + }, + { + url: "/en-US/docs/Web/CSS/Layout_cookbook/Center_an_element", + title: "Center an element", + }, + { + url: "/en-US/docs/Web/CSS/CSS_flexible_box_layout/Aligning_items_in_a_flex_container", + title: "Aligning items in a flex container", + }, + { url: "/en-US/docs/Web/CSS/text-align", title: "text-align" }, + { + url: "/en-US/docs/Learn/CSS/Building_blocks/Writing_Modes_Tasks", + title: "Test your skills: Writing modes and logical properties", + }, + ], + quota: null, + created_at: "2024-02-13T17:07:53.234230Z", + }, + user: { role: "user", content: "How to center it horizontally only?" }, + assistant: { + role: "assistant", + content: "To center a `div` vertically ...", + }, + }, + { + metadata: { + type: MetaType.Metadata, + chat_id: "a2befad4-be1e-4b01-8d09-e45bebfee490", + message_id: "e844b41e-1648-463a-875b-e7bfc2479c77", + parent_id: "5d49b710-20ad-4371-a92f-a283c26e2a7f", + sources: [ + { + url: "/en-US/docs/Learn/Common_questions/Tools_and_setup/How_much_does_it_cost", + title: "How much does it cost to do something on the Web?", + }, + { url: "/en-US/docs/Glossary/FPS", title: "Frame rate (FPS)" }, + { url: "/en-US/docs/Glossary/FTU", title: "FTU" }, + { + url: "/en-US/docs/Games/Tutorials/2D_breakout_game_Phaser/Player_paddle_and_controls", + title: "Player paddle and controls", + }, + { + url: "/en-US/docs/Web/SVG/Namespaces_Crash_Course/Example", + title: "Example", + }, + ], + quota: null, + created_at: "2024-02-14T08:52:42.178701Z", + }, + user: { role: "user", content: "How much is the fish?" }, + assistant: { + role: "assistant", + content: + "I'm sorry, but I can only provide assistance with web development topics...", + }, + }, + { + metadata: { + type: MetaType.Metadata, + chat_id: "a2befad4-be1e-4b01-8d09-e45bebfee490", + message_id: "c863991c-d44b-4c33-9725-06a5f0d9add9", + parent_id: "5d49b710-20ad-4371-a92f-a283c26e2a7f", + sources: [ + { + url: "/en-US/docs/Learn/Common_questions/Tools_and_setup/How_much_does_it_cost", + title: "How much does it cost to do something on the Web?", + }, + { + url: "/en-US/docs/Games/Publishing_games/Game_monetization", + title: "Game monetization", + }, + { url: "/en-US/docs/Web/CSS/actual_value", title: "Actual value" }, + { + url: "/en-US/docs/Web/Performance/Fundamentals", + title: "Performance fundamentals", + }, + { url: "/en-US/docs/Glossary/CSS_pixel", title: "CSS pixel" }, + ], + quota: null, + created_at: "2024-02-14T09:07:26.459750Z", + }, + user: { role: "user", content: "How much really?" }, + assistant: { + role: "assistant", + content: "To center a `div` horizontally and vertically with CSS...", + }, + }, + ], +}; + +const state = apiDataToStorage(data, data.chat_id); + +describe("Testing ai-help utility code", () => { + it("test stateToMessagePath with traverseWithDefault", async () => { + expect(stateToMessagePath(state.treeState!, [])).toEqual([]); + expect(stateToMessagePath(state.treeState!, [], true)).toHaveLength(4); + + expect(stateToMessagePath(state.treeState!, [0, 0])).toHaveLength(4); + expect(stateToMessagePath(state.treeState!, [0, 1])).toHaveLength(4); + expect(stateToMessagePath(state.treeState!, [0, 2], true)).toHaveLength(4); + expect(stateToMessagePath(state.treeState!, [0], true)).toHaveLength(4); + expect(stateToMessagePath(state.treeState!, [0])).toHaveLength(2); + + expect( + stateToMessagePath(state.treeState!, [0, 0]) + .filter((x) => x?.role === MessageRole.User) + .map((x) => x.messageId) + ).toEqual([ + "5d49b710-20ad-4371-a92f-a283c26e2a7f", + "ba70e34a-9fc2-4e57-88f7-f4bb8c5a46ef", + ]); + + expect( + stateToMessagePath(state.treeState!, [0, 2]) + .filter((x) => x?.role === MessageRole.User) + .map((x) => x.messageId) + ).toEqual([ + "5d49b710-20ad-4371-a92f-a283c26e2a7f", + "e844b41e-1648-463a-875b-e7bfc2479c77", + ]); + }); +}); diff --git a/vendor/yari/client/src/plus/ai-help/use-ai.ts b/vendor/yari/client/src/plus/ai-help/use-ai.ts new file mode 100644 index 000000000..e94c8b3e6 --- /dev/null +++ b/vendor/yari/client/src/plus/ai-help/use-ai.ts @@ -0,0 +1,827 @@ +// Source: https://github.com/supabase/supabase/blob/0f1254252f6b066e088a40617f239744e3a1e22b/packages/ui/src/components/Command/AiCommand.tsx +// License: Apache 2.0 - https://github.com/supabase/supabase/blob/0f1254252f6b066e088a40617f239744e3a1e22b/LICENSE +import type { OpenAI } from "openai"; +import { useCallback, useEffect, useReducer, useRef, useState } from "react"; +import { useSearchParams } from "react-router-dom"; + +import { SSE } from "sse.js"; +import useSWR, { mutate } from "swr"; +import { AIHelpLog } from "./rust-types"; +import { useGleanClick } from "../../telemetry/glean-context"; +import { AI_HELP } from "../../telemetry/constants"; +import { useAIHelpSettings } from "./utils"; +import { EVENT_TIMEOUT } from "./constants"; +import { AI_HELP_QUOTA_PATH } from "../common/api"; + +const RETRY_INTERVAL = 10000; +const ERROR_TIMEOUT = 60000; + +export enum MessageRole { + User = "user", + Assistant = "assistant", +} + +export enum MessageStatus { + Pending = "pending", + InProgress = "in-progress", + Complete = "complete", + Stopped = "stopped", + Errored = "errored", +} + +export interface Message { + role: MessageRole; + content: string; + status: MessageStatus; + sources?: PageReference[]; + chatId?: string; + messageId?: string; + parentId?: string | null; +} + +interface NewMessageAction { + type: "new"; + parentId?: string | null; + chatId?: string; + request: Message; + response: Message; +} + +interface UpdateMessageAction { + type: "update"; + messageId?; + message: Partial; +} + +interface AppendContentAction { + type: "append-content"; + messageId?; + content: string; +} + +interface SetMetadataAction { + type: "set-metadata"; + sources: PageReference[]; + messageId: string; + chatId: string; + parentId?: string | null; +} + +interface ResetAction { + type: "reset"; +} + +interface SetStateAction { + type: "set-state"; + treeState: MessageTreeState; +} + +type MessageAction = + | NewMessageAction + | UpdateMessageAction + | AppendContentAction + | ResetAction + | SetMetadataAction + | SetStateAction; + +interface PageReference { + url: string; + title: string; +} + +export interface Quota { + used: number; + remaining: number; + limit: number; +} + +export interface MessageTreeNode { + messageId?: string; + parentId?: string | null; + request: Message; + response: Message; + children: MessageTreeNode[]; +} + +export interface MessageTreeState { + root: MessageTreeNode[]; + nodes: Record; + currentNode?: MessageTreeNode; +} + +export function stateToMessagePath( + state: MessageTreeState, + path: number[], + traverseWithDefault: boolean = false +): Message[] { + const [current = traverseWithDefault ? 0 : null, ...tail] = path || []; + if (!state.root.length || current === null) { + return []; + } + return messagePath(state.root[current], tail, traverseWithDefault); +} + +function messagePath( + node: MessageTreeNode, + path: number[], + traverseWithDefault: boolean = false +): Message[] { + const [current = traverseWithDefault ? 0 : null, ...tail] = path; + if (!node) { + return []; + } + if (!node.children.length || current === null) { + return [node.request, node.response]; + } + return [ + node.request, + node.response, + ...messagePath(node.children[current], tail, traverseWithDefault), + ]; +} + +function addSibling(state: MessageTreeState, messageId?: string) { + if (!messageId || !state.nodes[messageId].parentId) { + return [state.root.length]; + } + const pId: string = state.nodes[messageId].parentId as string; + const index = state.nodes[pId].children.length; + const path = findPath(state, pId); + path.push(index); + return path; +} + +function findPath(state: MessageTreeState, messageId: string) { + let id: string | undefined | null = messageId; + let node = state.nodes[id]; + let pId: string | undefined | null = node.parentId; + const path: number[] = []; + let limit = Object.keys(state.nodes).length; + let iteration = 0; + const sameId = (c: MessageTreeNode): boolean => { + return c.messageId === id; + }; + while (iteration < limit) { + iteration++; + const isRoot = typeof pId !== "string"; + let siblings = isRoot ? state.root : state.nodes[pId as string]?.children; + let index = siblings?.findIndex(sameId) ?? -1; + if (index < 0) { + return []; + } + path.push(index); + if (isRoot) { + break; + } + id = pId; + pId = state.nodes[pId as string].parentId; + } + return path.reverse(); +} + +function messageReducer(state: MessageTreeState, messageAction: MessageAction) { + let newState = structuredClone(state); + const { type } = messageAction; + + switch (type) { + case "new": { + const { response, request, parentId } = messageAction; + const parent = parentId && newState.nodes[parentId]; + const node: MessageTreeNode = { + parentId, + request, + response, + children: [], + }; + if (parent) { + parent.children.push(node); + } else { + newState.root.push(node); + } + newState.currentNode = node; + break; + } + case "update": { + const { message } = messageAction; + const messageId = newState.currentNode?.messageId; + if (messageId) { + newState.nodes[messageId].response = { + ...newState.nodes[messageId].response, + ...message, + }; + } + break; + } + case "append-content": { + const { content } = messageAction; + const messageId = newState.currentNode?.messageId; + if (messageId) { + newState.nodes[messageId].response = { + ...newState.nodes[messageId].response, + content: newState.nodes[messageId].response.content + content, + }; + } + break; + } + case "set-metadata": { + const { sources, messageId, parentId, chatId } = messageAction; + if (newState.currentNode) { + Object.assign(newState.currentNode, { + messageId, + parentId, + response: { + ...newState.currentNode.response, + messageId, + parentId, + chatId, + sources, + }, + request: { + ...newState.currentNode.request, + messageId, + parentId, + chatId, + }, + }); + newState.nodes[messageId] = newState.currentNode; + } + break; + } + case "set-state": { + const { treeState } = messageAction; + newState = treeState; + break; + } + case "reset": { + newState = { + root: [], + nodes: {}, + }; + break; + } + default: { + throw new Error(`Unknown message action '${type}'`); + } + } + + return newState; +} + +interface Storage { + treeState?: MessageTreeState; + chatId?: string; +} + +export function apiDataToStorage(data: AIHelpLog, chatId: string): Storage { + const root: MessageTreeNode[] = []; + const nodes = {}; + for (const message of data.messages || []) { + const node = { + messageId: message.metadata.message_id, + parentId: message.metadata.parent_id, + request: { + role: MessageRole.User, + content: message.user.content, + status: MessageStatus.Complete, + chatId: message.metadata.chat_id, + messageId: message.metadata.message_id, + parentId: message.metadata.parent_id, + }, + response: { + role: MessageRole.Assistant, + content: message.assistant?.content || "", + status: message.assistant + ? MessageStatus.Complete + : Date.now() - Date.parse(message.metadata.created_at) > ERROR_TIMEOUT + ? MessageStatus.Errored + : MessageStatus.InProgress, + sources: message.metadata.sources, + chatId: message.metadata.chat_id, + messageId: message.metadata.message_id, + parentId: message.metadata.parent_id, + }, + children: [], + }; + if (!message.metadata.parent_id) { + root.push(node); + } else { + nodes[message.metadata.parent_id].children.push(node); + } + nodes[node.messageId] = node; + } + const storage = { + chatId, + treeState: { + root, + nodes, + }, + }; + return storage; +} + +class AiHelpHistory { + static async getMessages(chatId): Promise { + const res = await fetch(`/api/v1/plus/ai/help/history/${chatId}`); + if (!res.ok) { + throw new Error(`${res.status}: ${res.statusText}`); + } + const data = (await res.json()) as AIHelpLog; + if (!data.chat_id) { + throw new Error("no chat id"); + } + // messages are ordered ascending. + const storage = apiDataToStorage(data, chatId); + return storage; + } +} + +export interface UseAiChatOptions { + messageTemplate?: (message: string) => string; +} + +export function useAiChat({ + messageTemplate = (message) => message, +}: UseAiChatOptions = {}) { + const gleanClick = useGleanClick(); + const eventSourceRef = useRef(); + + const [searchParams, setSearchParams] = useSearchParams(); + const [loadingState, setLoadingState] = useState< + "idle" | "loading" | "responding" | "finished" | "failed" + >("idle"); + const { isHistoryEnabled } = useAIHelpSettings(); + const isLoading = loadingState === "loading"; + const isResponding = loadingState === "responding"; + const hasError = loadingState === "failed"; + const isFinished = loadingState === "finished"; + + const [isInitializing, setIsInitializing] = useState(true); + const [isHistoryLoading, setIsHistoryLoading] = useState(false); + const [lastEvent, setLastEvent] = useState(); + const [lastUpdate, setLastUpdate] = useState(new Date()); + const [datas, dispatchData] = useReducer( + (state: any[], value: any) => (value === null ? [] : [...state, value]), + [] + ); + + const [chatId, setChatId] = useState(); + const [previousChatId, setPreviousChatId] = useState(); + const [messageId, setMessageId] = useState(); + const [path, setPath] = useState([]); + const [state, dispatchState] = useReducer(messageReducer, undefined, () => { + return { + root: [], + nodes: {}, + }; + }); + const [messages, setMessages] = useState([]); + + const [quota, setQuota] = useState(undefined); + const remoteQuota = useRemoteQuota(); + const flushSources = useRef<() => void>(); + + const handleError = useCallback( + (err: any) => { + gleanClick(`${AI_HELP}: error`); + eventSourceRef.current?.close(); + eventSourceRef.current = undefined; + setLoadingState("failed"); + mutate(AI_HELP_QUOTA_PATH); + console.error(err); + }, + [gleanClick] + ); + + const reset = useCallback(() => { + setPreviousChatId(chatId); + setChatId(undefined); + resetLoadingState(); + setSearchParams((prev) => { + prev.delete("c"); + prev.delete("d"); + return prev; + }); + setPath([]); + setMessages([]); + dispatchState({ + type: "reset", + }); + }, [setSearchParams, chatId]); + + const removeChatIdFromUrl = useCallback(() => { + setSearchParams( + (prev) => { + prev.delete("c"); + return prev; + }, + { replace: true } + ); + }, [setSearchParams]); + + useEffect(() => { + if (!isHistoryEnabled) { + // If we got a chat id passed in without history enabled, clear parameters from URL + removeChatIdFromUrl(); + return; + } + let timeoutID; + const convId = searchParams.get("c"); + if (convId && convId !== chatId) { + setIsHistoryLoading(true); + let updateHistory = () => {}; + updateHistory = async () => { + resetLoadingState(); + const currentConvId = searchParams.get("c"); + if (!currentConvId || currentConvId !== convId) { + return window.clearTimeout(timeoutID); + } + try { + const { treeState } = await AiHelpHistory.getMessages(convId); + if (treeState) { + window.clearTimeout(timeoutID); + if ( + Object.values(treeState.nodes).some( + (node) => node.response.status === MessageStatus.InProgress + ) + ) { + setLoadingState("responding"); + timeoutID = window.setTimeout( + () => updateHistory(), + RETRY_INTERVAL + ); + } else { + setLoadingState("finished"); + } + setPreviousChatId(undefined); + setChatId(convId); + setPath([]); + dispatchState({ + type: "set-state", + treeState, + }); + } else { + throw new Error("no treeState"); + } + } catch (e) { + setPreviousChatId(undefined); + setPath([]); + dispatchState({ + type: "reset", + }); + // If we got a 404 from the API, reset and remove the parameter from the URL, + // do not show an error. + if (e instanceof Error && e.message.startsWith("404")) { + setChatId(undefined); + removeChatIdFromUrl(); + } else { + setChatId(convId); + handleError(e); + } + } + setIsHistoryLoading(false); + }; + updateHistory(); + } + const r = searchParams.get("d") === "1"; + if (r) { + reset(); + } + }, [ + isHistoryEnabled, + removeChatIdFromUrl, + searchParams, + chatId, + reset, + handleError, + ]); + + useEffect(() => { + if (remoteQuota !== undefined) { + setQuota(remoteQuota); + } + }, [remoteQuota]); + + useEffect(() => { + if (loadingState !== "responding") { + return; + } + + // Assume we have a timeout if we receive no event in some time. + const timeoutID = window.setTimeout(() => { + gleanClick(`${AI_HELP}: timeout`); + handleError("AI Help response timed out."); + }, EVENT_TIMEOUT); + + return () => window.clearTimeout(timeoutID); + }, [lastEvent, loadingState, handleError, gleanClick]); + + const handleEventData = useCallback( + (data: any) => { + try { + setLastEvent(new Date()); + dispatchData(data); + + if (data.type === "metadata") { + const { + sources = undefined, + quota = undefined, + chat_id, + message_id, + parent_id, + } = data; + setPreviousChatId(undefined); + setChatId(chat_id); + setMessageId(message_id); + setLastUpdate(new Date()); + // Sources. + if (Array.isArray(sources)) { + function setSources(sources) { + dispatchState({ + type: "set-metadata", + sources: sources, + chatId: chat_id, + messageId: message_id, + parentId: parent_id, + }); + } + + // Add sources one by one. + let delay = 0; + const timeouts: number[] = []; + sources.forEach((_, index) => { + const handler = () => setSources(sources.slice(0, index + 1)); + + if (index === 0) { + // Add first source immediately. + handler(); + } else { + // Delay other sources randomly for 250-1000ms. + delay += 250 + 750 * Math.random(); + + const timeout = window.setTimeout(handler, delay); + timeouts.push(timeout); + } + }); + + flushSources.current = () => { + timeouts.forEach((timer) => window.clearTimeout(timer)); + setSources(sources); + flushSources.current = undefined; + }; + } + // Quota. + if (typeof quota !== "undefined") { + setQuota(quota); + } + return; + } + + setLoadingState("responding"); + + flushSources.current?.(); + + dispatchState({ + type: "update", + messageId, + message: { + status: MessageStatus.InProgress, + }, + }); + + if (!data.id) { + console.warn("Received unsupported message", { data }); + return; + } + + const completionResponse: OpenAI.Chat.ChatCompletionChunk = data; + const [ + { + delta: { content }, + finish_reason, + }, + ] = completionResponse.choices; + + if (content) { + dispatchState({ + type: "append-content", + messageId, + content, + }); + } + + if (finish_reason) { + if (finish_reason !== "stop") { + // See: https://platform.openai.com/docs/guides/gpt/chat-completions-response-format + // - length (most likely) -> token limit exceeded, + // - function_call -> not applicable to our use case, + // - content_filter -> content flagged and omitted + console.warn("Got unexpected finish_reason", { finish_reason }); + } + const status = + finish_reason === "stop" + ? MessageStatus.Complete + : MessageStatus.Stopped; + + setLoadingState("finished"); + setLastUpdate(new Date()); + dispatchState({ + type: "update", + messageId, + message: { + status, + }, + }); + } + } catch (err) { + handleError(err); + } + }, + [handleError, messageId] + ); + + const submit = useCallback( + ( + query: string, + chatId?: string, + parentId?: string | null, + messageId?: string + ) => { + let newPath = messageId + ? addSibling(state, messageId) + : parentId + ? [...findPath(state, parentId), 0] + : [0]; + setPath(newPath); + gleanClick(`${AI_HELP}: submit question ${newPath.length}`); + dispatchState({ + type: "new", + chatId, + parentId, + request: { + status: MessageStatus.Complete, + role: MessageRole.User, + content: query, + chatId, + parentId, + }, + response: { + status: MessageStatus.Pending, + role: MessageRole.Assistant, + content: "", + chatId, + parentId, + }, + }); + setLoadingState("loading"); + + // We send all completed in the conversation + the question the user asked. + // Unless history is false, then we only send the query. + // Note that `dispatchMessage()` above does not change `messages` here yet. + const completeMessagesAndUserQuery = stateToMessagePath( + state, + newPath.slice(0, -1) + ) + .filter(({ status }) => status === MessageStatus.Complete) + .map(({ role, content }) => ({ role, content })) + .concat({ + role: MessageRole.User, + content: messageTemplate(query), + }); + + const eventSource = new SSE(`/api/v1/plus/ai/help`, { + headers: { + "Content-Type": "application/json", + }, + withCredentials: true, + payload: JSON.stringify({ + messages: completeMessagesAndUserQuery, + chat_id: chatId, + parent_id: parentId, + }), + }); + + eventSource.addEventListener("error", handleError); + eventSource.addEventListener("message", (e: any) => { + const data = JSON.parse(e.data); + + handleEventData(data); + }); + + eventSource.stream(); + + eventSourceRef.current = eventSource; + }, + [state, gleanClick, messageTemplate, handleError, handleEventData] + ); + + useEffect(() => { + const messages = stateToMessagePath(state, path, true); + setMessages(messages); + if (messages.length) { + setIsInitializing(false); + } + }, [state, path, setMessages]); + + function useRemoteQuota() { + const { data } = useSWR(AI_HELP_QUOTA_PATH, async (url) => { + const response = await fetch(url); + if (!response.ok) { + const text = await response.text(); + throw new Error(`${response.status} on ${url}: ${text}`); + } + const data = await response.json(); + return data.quota; + }); + + return data; + } + + function resetLoadingState() { + eventSourceRef.current?.close(); + eventSourceRef.current = undefined; + setLoadingState("idle"); + dispatchData(null); + } + + function stop() { + resetLoadingState(); + dispatchState({ + type: "update", + message: { + status: MessageStatus.Stopped, + }, + }); + } + + const unReset = useCallback(() => { + if (previousChatId) { + setSearchParams((old) => { + const params = new URLSearchParams(old); + params.set("c", previousChatId); + return params; + }); + } + }, [setSearchParams, previousChatId]); + + const nextPrev = useCallback( + (messageId: string, dir: "next" | "prev") => { + const node = state.nodes[messageId]; + const siblings = node.parentId + ? state.nodes[node.parentId].children + : state.root; + const index = siblings.findIndex((c) => c.messageId === messageId); + if (dir === "next" && index < siblings.length - 1) { + return setPath( + findPath(state, siblings[index + 1].messageId || messageId) + ); + } + if (dir === "prev" && index > 0) { + return setPath( + findPath(state, siblings[index - 1].messageId || messageId) + ); + } + }, + [state] + ); + + const siblingCount = useCallback( + (messageId: string): { pos: number; total: number } => { + if (!messageId) { + return { pos: 1, total: 1 }; + } + const node = state.nodes[messageId]; + if (!node) { + return { pos: 1, total: 1 }; + } + const siblings = node.parentId + ? state.nodes[node.parentId].children + : state.root; + const index = siblings.findIndex((c) => c.messageId === messageId); + return { pos: index + 1, total: siblings.length }; + }, + [state] + ); + + return { + submit, + datas, + stop, + reset, + unReset, + messages, + state, + path, + isFinished, + isLoading, + isHistoryLoading, + isResponding, + isInitializing, + hasError, + quota, + chatId, + previousChatId, + nextPrev, + siblingCount, + lastUpdate, + }; +} diff --git a/vendor/yari/client/src/plus/ai-help/utils.ts b/vendor/yari/client/src/plus/ai-help/utils.ts new file mode 100644 index 000000000..9aecd30f5 --- /dev/null +++ b/vendor/yari/client/src/plus/ai-help/utils.ts @@ -0,0 +1,14 @@ +import { useUserData } from "../../user-context"; + +export function isExternalUrl(url: string) { + return url.startsWith("//") || !url.startsWith("/"); +} + +export function useAIHelpSettings() { + const user = useUserData(); + const isHistoryEnabled = user?.settings?.aiHelpHistory ?? false; + + return { + isHistoryEnabled, + }; +} diff --git a/vendor/yari/client/src/plus/app.tsx b/vendor/yari/client/src/plus/app.tsx new file mode 100644 index 000000000..93d66c8f4 --- /dev/null +++ b/vendor/yari/client/src/plus/app.tsx @@ -0,0 +1,23 @@ +import { useSearchParams } from "react-router-dom"; +import Notification from "../ui/atoms/notification"; +import { SignUpLink } from "../ui/atoms/signup-link"; + +import "./index.scss"; + +export default function App() { + const [searchParams] = useSearchParams(); + + return ( +
    + {searchParams.get("reason") === "no-active-subscription-found" && ( + +

    You are not a subscriber yet.

    +
    + )} + +

    + +

    +
    + ); +} diff --git a/vendor/yari/client/src/plus/collections/api.ts b/vendor/yari/client/src/plus/collections/api.ts new file mode 100644 index 000000000..56d24e757 --- /dev/null +++ b/vendor/yari/client/src/plus/collections/api.ts @@ -0,0 +1,324 @@ +import { useState } from "react"; +import useSWR, { KeyedMutator, mutate, SWRResponse } from "swr"; +import useSWRInfinite, { SWRInfiniteResponse } from "swr/infinite"; +import { + MultipleCollectionInfo, + MultipleCollectionResponse, + MultipleCollectionCreationRequest, + MultipleCollectionLookupQueryResponse, + CollectionItemCreationRequest, + CollectionItemModificationRequest, +} from "./rust-types"; + +// "swr/infinite" doesn't export InfiniteKeyedMutator directly +type InfiniteKeyedMutator = SWRInfiniteResponse< + T extends (infer I)[] ? I : T +>["mutate"]; + +export interface NewCollection { + name: string; + description?: string; +} + +export interface Collection extends NewCollection { + id: string; + created_at: string; + updated_at: string; + article_count: number; +} + +export interface NewItem { + collection_id: string; + url: string; + title: string; + notes?: string; +} + +export interface Item extends NewItem { + id: string; + created_at: string; + updated_at: string; + parents: ItemParent[]; +} + +export interface FrequentlyViewedItem { + notes?: string; + parents: ItemParent[]; + title: string; + url: string; + id: number; +} + +export interface ItemParent { + uri: string; + title: string; +} + +const PAGE_SIZE = 12; // 12 is a nice composite number for our grids +const COLLECTIONS_ENDPOINT = "/api/v2/collections/"; + +function getCollectionKey( + id: string | undefined, + params?: URLSearchParams | Record +) { + if (!id) return; + params = new URLSearchParams(params); + if (!params.has("limit")) params.set("limit", "0"); + if (!params.has("offset")) params.set("offset", "0"); + params.sort(); + return `${COLLECTIONS_ENDPOINT}${id}/?${params}`; +} + +function getCollectionPageKey(id: string | undefined, page: number) { + if (!id || page < 0) return; + return getCollectionKey(id, { + limit: `${PAGE_SIZE}`, + offset: `${PAGE_SIZE * page}`, + }); +} + +function getItemsKey(collection_id: string | undefined) { + return collection_id && `${COLLECTIONS_ENDPOINT}${collection_id}/items/`; +} + +function getBookmarkKey(url: string | undefined) { + return url && `${COLLECTIONS_ENDPOINT}lookup/?url=${encodeURIComponent(url)}`; +} + +function getItemKey( + collection_id: string | undefined, + item_id: string | undefined +) { + return ( + collection_id && + item_id && + `${COLLECTIONS_ENDPOINT}${collection_id}/items/${item_id}/` + ); +} + +function useLoading(res: SWRResponse) { + return { + ...res, + isLoading: res.isValidating && !res.data && !res.error, + }; +} + +async function fetcher(key: string | undefined): Promise { + if (!key) throw Error("Invalid key"); + const response = await fetch(key); + let data: any; + try { + data = await response.json(); + } catch {} + if (!response.ok) + throw Error(data?.message || `${response.status}: ${response.statusText}`); + return data; +} + +async function poster(key: string | undefined, body: B): Promise; +async function poster(key: string | undefined, body: B): Promise; +async function poster(key: string | undefined, body: any): Promise { + if (!key) throw Error("Invalid key"); + const response = await fetch(key, { + body: JSON.stringify(body), + method: "POST", + headers: { + "content-type": "application/json", + }, + }); + let data: any; + try { + data = await response.json(); + } catch {} + if (!response.ok) + throw Error(data?.error || `${response.status}: ${response.statusText}`); + return data || response; +} + +async function deleter(key: string | undefined): Promise { + if (!key) throw Error("Invalid key"); + const response = await fetch(key, { + method: "DELETE", + }); + if (!response.ok) throw Error(`${response.status}: ${response.statusText}`); + return response; +} + +function useMutation( + mutator: (body: B) => Promise, + success: (body: B) => void +) { + const [error, setError] = useState(); + const [isPending, setIsPending] = useState(false); + + return { + mutator: async (body: B) => { + setIsPending(true); + setError(undefined); + try { + const response = await mutator(body); + success(body); + return response; + } catch (err: any) { + setError(err); + throw err; + } finally { + setIsPending(false); + } + }, + resetError: () => setError(undefined), + error, + isPending, + }; +} + +export function combineMutationStatus( + ...data: Omit, "mutator">[] +) { + return { + resetErrors: () => { + data.forEach((x) => x.resetError()); + }, + errors: data.map((x) => x.error).filter((x) => x !== undefined), + isPending: data + .map((x) => x.isPending) + .reduce((previous, current) => previous || current, false), + }; +} + +export function useCollections() { + return useLoading( + useSWR( + COLLECTIONS_ENDPOINT, + async (key: string) => await fetcher(key) + ) + ); +} + +export function useCollection(id: string | undefined) { + return useSWR( + getCollectionKey(id), + async (key: string) => await fetcher(key) + ); +} + +export function useCollectionCreate() { + return useMutation( + (collection) => + poster( + COLLECTIONS_ENDPOINT, + collection + ), + () => mutate(COLLECTIONS_ENDPOINT) + ); +} + +export function useCollectionEdit() { + return useMutation( + (collection) => + poster( + getCollectionKey(collection.id), + collection + ), + ({ id }) => { + mutate(COLLECTIONS_ENDPOINT); + mutate(getCollectionKey(id)); + } + ); +} + +export function useCollectionDelete() { + return useMutation( + ({ id }) => deleter(getCollectionKey(id)), + ({ id }) => { + mutate(COLLECTIONS_ENDPOINT); + mutate(getCollectionKey(id)); + } + ); +} + +export function useItems(id: string | undefined, initialSize = 1) { + function key(page: number, previousPage: Item[]) { + if ((previousPage && !previousPage.length) || !id) return null; + return getCollectionPageKey(id, page); + } + + const useData = useSWRInfinite( + key, + async (key: string) => { + const data = await fetcher(key); + return data.items.map((api_item) => ({ + ...api_item, + collection_id: id as string, + })); + }, + { + initialSize, + } + ); + const pages = useData.data; + const lastPageLength = (pages && pages[pages.length - 1]?.length) || 0; + + return { + ...useData, + atEnd: lastPageLength < PAGE_SIZE, + isLoading: + useData.isValidating && + !useData.error && + (!pages || pages.length !== useData.size), + }; +} + +export function useBookmark(url: string) { + return useSWR( + getBookmarkKey(url), + async (key: string) => { + const data = await fetcher(key); + const entries = data?.results; + return ( + entries && + entries.map((entry) => { + return { ...entry.item, collection_id: entry.collection_id }; + }) + ); + } + ); +} + +export function useItemAdd() { + return useMutation( + ({ collection_id, ...body }) => + poster(getItemsKey(collection_id), body), + ({ url }) => mutate(getBookmarkKey(url)) + ); +} + +export function useItemEdit( + scopedMutator?: KeyedMutator | InfiniteKeyedMutator +) { + return useMutation( + ({ collection_id, id, ...body }) => + poster( + getItemKey(collection_id, id), + body + ), + ({ collection_id, url }) => { + mutate(getCollectionKey(collection_id)); + mutate(getBookmarkKey(url)); + if (scopedMutator) scopedMutator(); + } + ); +} + +export function useItemDelete( + scopedMutator?: KeyedMutator | InfiniteKeyedMutator +) { + return useMutation( + ({ collection_id, id }) => deleter(getItemKey(collection_id, id)), + ({ collection_id, url }) => { + mutate(getCollectionKey(collection_id)); + mutate(getBookmarkKey(url)); + if (scopedMutator) scopedMutator(); + } + ); +} diff --git a/vendor/yari/client/src/plus/collections/collection.scss b/vendor/yari/client/src/plus/collections/collection.scss new file mode 100644 index 000000000..8c91f736e --- /dev/null +++ b/vendor/yari/client/src/plus/collections/collection.scss @@ -0,0 +1,138 @@ +@use "../../ui/vars" as *; + +.collections-collection { + h1, + h2 { + font-size: 1.5rem; + margin-top: 0.5rem; + } + + > header { + padding: 2rem 0; + + p { + margin: 0; + white-space: pre-wrap; + } + } + + article { + border-left: var(--category-color-engage, var(--border-primary)) 0.25rem + solid; + + display: flex; + flex-direction: column; + gap: 0.5rem; + margin-bottom: 3em; + padding-left: 1rem; + position: relative; + + &:nth-last-of-type(n + 2)::after { + background: var(--border-primary); + bottom: -1.5rem; + content: ""; + display: block; + height: 0.0625rem; + left: -0.25rem; + position: absolute; + right: 0; + } + + header { + display: flex; + + h2 { + font-size: 1.25rem; + margin: 0; + overflow-wrap: anywhere; + } + + .article-actions { + margin-top: -0.125rem; + + .article-actions-toggle { + margin-top: -0.125rem; + } + + @media (min-width: $screen-md) { + li > div > button { + .button-wrap { + --button-color: var(--text-secondary); + font-size: 0.875rem; + text-transform: none; + } + } + } + } + } + + .breadcrumbs { + font-size: 0.6875rem; + font-style: italic; + font-variation-settings: "slnt" -10; + margin-top: -0.5rem; + } + + > p { + color: var(--text-primary); + margin: 0; + } + + aside { + font-size: 0.875rem; + + b { + font-weight: unset; + } + + a { + text-decoration: underline; + } + } + + .note { + background: var(--background-secondary); + border-radius: 0.25rem; + + display: flex; + flex-direction: row-reverse; + font-size: 0.875rem; + + font-style: italic; + font-variation-settings: "slnt" -10; + gap: 1rem; + padding: 1rem; + + .text { + margin-right: auto; + min-width: 0; + } + + button.link .button-wrap { + text-decoration: underline; + } + + p { + display: inline; + overflow-wrap: anywhere; + white-space: pre-wrap; + + &.code { + font-family: var(--font-code); + font-style: normal; + font-variation-settings: normal; + } + } + } + + .add-note { + --button-color: var(--text-link); + align-self: flex-start; + + .button-wrap { + font-size: 0.875rem; + text-transform: none; + } + } + } +} diff --git a/vendor/yari/client/src/plus/collections/collection.tsx b/vendor/yari/client/src/plus/collections/collection.tsx new file mode 100644 index 000000000..8cf264cef --- /dev/null +++ b/vendor/yari/client/src/plus/collections/collection.tsx @@ -0,0 +1,319 @@ +import { useEffect, useState } from "react"; +import { useParams } from "react-router"; +import { Link } from "react-router-dom"; +import useSWR, { KeyedMutator } from "swr"; +import { SWRInfiniteResponse } from "swr/infinite"; +import { useScrollToTop, useLocale } from "../../hooks"; +import { Button } from "../../ui/atoms/button"; +import Container from "../../ui/atoms/container"; +import { Loading } from "../../ui/atoms/loading"; +import { camelWrap, charSlice, getCategoryByPathname } from "../../utils"; +import { FrequentlyViewedItem, Item, useCollection, useItems } from "./api"; +import NoteCard from "../../ui/molecules/notecards"; +import { DocMetadata } from "../../../../libs/types/document"; +import { Authors, LastModified } from "../../document/organisms/article-footer"; +import { ArticleActions } from "../../ui/organisms/article-actions"; +import { MDN_PLUS_TITLE } from "../../constants"; + +import "./collection.scss"; + +import dayjs from "dayjs"; +import relativeTime from "dayjs/plugin/relativeTime"; +import { + FrequentlyViewedCollection, + useFrequentlyViewed, +} from "./frequently-viewed"; +import { useGleanClick } from "../../telemetry/glean-context"; +import { PLUS_COLLECTIONS } from "../../telemetry/constants"; +dayjs.extend(relativeTime); + +// "swr/infinite" doesn't export InfiniteKeyedMutator directly +type InfiniteKeyedMutator = SWRInfiniteResponse< + T extends (infer I)[] ? I : T +>["mutate"]; + +export function CollectionComponent() { + const { collectionId } = useParams(); + const { data: collection, error: collectionError } = + useCollection(collectionId); + const { + data: itemPages, + error: itemError, + isLoading: itemLoading, + size, + setSize, + atEnd, + mutate, + } = useItems(collectionId); + + useScrollToTop(); + const name = + collection?.name === "Default" ? "Saved Articles" : collection?.name; + document.title = `${name || "Collections"} | ${MDN_PLUS_TITLE}`; + const description = + collection?.name === "Default" + ? "The default collection." + : collection?.description; + + return collection ? ( +
    +
    + + + ← Back + +

    {name}

    + + {collection.article_count}{" "} + {collection.article_count === 1 ? "article" : "articles"} + + {description &&

    {description}

    } +
    +
    + + {itemPages + ?.flat(1) + .map((item) => ( + + )) || + (itemLoading && )} + {!atEnd && ( +
    + +
    + )} +
    +
    + ) : ( +
    +
    + + + ← Back + + +
    + + {collectionError ? ( + +

    Error

    +

    {collectionError.message}

    + +
    + ) : ( + + )} +
    +
    + ); +} + +export function FrequentlyViewedCollectionComponent() { + let [size, setSize] = useState(0); + let [atEnd, setAtEnd] = useState(false); + let frequentlyViewed: FrequentlyViewedCollection = useFrequentlyViewed( + 10, + size, + setAtEnd + ); + + useScrollToTop(); + + return ( +
    +
    + + + ← Back + +

    {frequentlyViewed.name}

    + + {frequentlyViewed.article_count}{" "} + {frequentlyViewed.article_count === 1 ? "article" : "articles"} + +

    {frequentlyViewed.description}

    +
    +
    + + {frequentlyViewed.items.map((item) => ( + + ))} + {!atEnd && ( +
    + +
    + )} +
    +
    + ); +} + +function ItemComponent({ + addNoteEnabled = true, + item, + mutate, +}: { + addNoteEnabled?: boolean; + item: Item | FrequentlyViewedItem; + mutate?: KeyedMutator | InfiniteKeyedMutator; +}) { + const [slicedNote, setSlicedNote] = useState(); + const [note, setNote] = useState(); + + const locale = useLocale(); + const gleanClick = useGleanClick(); + + useEffect(() => { + const slicedNote = item.notes && charSlice(item.notes, 0, 180); + setSlicedNote(slicedNote); + setNote(slicedNote); + }, [item.notes]); + + const breadcrumbs = item.parents + .slice(0, -1) + .map((parent) => camelWrap(parent.title)) + .filter( + // remove duplicated titles + (title, index, titles) => title !== titles[index + 1] + ); + + const openBookmarkMenu: React.MouseEventHandler = (e) => { + const article = e.currentTarget.closest("article"); + [ + article?.querySelector(".article-actions-toggle"), + article?.querySelector(".bookmark-button"), + ].forEach((button) => { + if (button instanceof HTMLElement) { + if (getComputedStyle(button).display === "none") return; + button.click(); + } + }); + }; + + const { data: doc } = useSWR( + `${item.url}/metadata.json`, + async (url) => { + const response = await fetch(url); + + if (!response.ok) { + throw Error(response.statusText); + } + + return (await response.json()) as DocMetadata; + }, + { + revalidateIfStale: false, + revalidateOnFocus: false, + revalidateOnReconnect: false, + } + ); + + const category = getCategoryByPathname(item.url); + + return ( +
    +
    +

    + {camelWrap(item.title)} +

    + +
    +
    {breadcrumbs.join(" > ")}
    + {doc && ( + <> +

    {doc.summary}

    + + + )} + {note ? ( +
    +
    + {doc && ( + + )} +
    +
    +

    + {note.trimEnd()} +

    + {slicedNote !== item.notes && + (note !== item.notes ? ( + <> + {"… "} + + + ) : ( + <> + {" "} + + + ))} +
    +
    + ) : doc && addNoteEnabled ? ( + + ) : null} +
    + ); +} diff --git a/vendor/yari/client/src/plus/collections/frequently-viewed.tsx b/vendor/yari/client/src/plus/collections/frequently-viewed.tsx new file mode 100644 index 000000000..6d329e351 --- /dev/null +++ b/vendor/yari/client/src/plus/collections/frequently-viewed.tsx @@ -0,0 +1,257 @@ +import { useEffect, useState } from "react"; +import { Doc } from "../../../../libs/types/document"; +import { useUserData } from "../../user-context"; +import { FrequentlyViewedItem, ItemParent } from "./api"; + +export interface FrequentlyViewedCollection { + name: string; + article_count: number; + updated_at: string; + description: string; + items: FrequentlyViewedItem[]; +} + +export type FrequentlyViewedEntry = { + parents?: ItemParent[]; + serial: number; + timestamps: number[]; + title: string; + url: string; +}; + +export type OldFrequentlyViewedEntry = { + parents?: ItemParent[]; + serial: number; + timestamp: number; + title: string; + url: string; + visitCount: number; +}; + +export const FREQUENTLY_VIEWED_STORAGE_KEY = "frequently-viewed-documents-v2"; +export const FREQUENTLY_VIEWED_STORAGE_KEY_OLD = "frequently-viewed-documents"; + +const ThirtyDaysMilliseconds = 30 * 24 * 60 * 60 * 1000; +const isWithinLastThirtyDays = (date: Date): boolean => { + const currentDate = Date.now(); + return date.getTime() >= currentDate - ThirtyDaysMilliseconds; +}; + +function getFrequentlyViewed(): FrequentlyViewedEntry[] { + migrateOld(); + let frequentlyViewed: string | null = null; + try { + frequentlyViewed = localStorage.getItem(FREQUENTLY_VIEWED_STORAGE_KEY); + } catch (err) { + console.warn( + "Unable to read frequently viewed documents from localStorage", + err + ); + } + + const entries = JSON.parse( + frequentlyViewed || "[]" + ) as FrequentlyViewedEntry[]; + + //Remove all timestamps older than 30 days and any pages with no more hits. + return filterFrequentlyViewed(entries); +} + +function setFrequentlyViewed(frequentlyViewed: FrequentlyViewedEntry[]) { + try { + localStorage.setItem( + FREQUENTLY_VIEWED_STORAGE_KEY, + JSON.stringify(frequentlyViewed) + ); + } catch (err) { + console.warn( + "Failed to write frequently viewed documents to localStorage", + err + ); + } +} + +const sortByVisitsThenTimestampsDesc = ( + first: FrequentlyViewedEntry, + second: FrequentlyViewedEntry +) => { + //'Each timestamp represents one visit. The first is the most recent visit. + if (first.timestamps.length > second.timestamps.length) return -1; + if (first.timestamps.length < second.timestamps.length) return 1; + if ( + typeof first.timestamps[0] !== "undefined" && + typeof second.timestamps[0] !== "undefined" + ) { + if (first.timestamps[0] < second.timestamps[0]) return 1; + if (first.timestamps[0] > second.timestamps[0]) return -1; + } + return 0; +}; + +function getNextFrequentlyViewedSerial( + entries: OldFrequentlyViewedEntry[] | FrequentlyViewedEntry[] +): number { + return ( + 1 + + Math.max( + 0, + ...entries.map((entry) => entry.serial).filter((serial) => !isNaN(serial)) + ) + ); +} + +export function useFrequentlyViewed( + limit: number = 0, + offset: number = 10, + setEnd?: (bool: boolean) => void +): FrequentlyViewedCollection { + const [collection, setCollection] = useState({ + article_count: 0, + description: "Articles you viewed more than 2 times in the past 30 days.", + items: [], + name: "Frequently Viewed Articles", + updated_at: new Date().toISOString(), + }); + + useEffect(() => { + let freqViewed = getFrequentlyViewed(); + freqViewed = freqViewed.filter((val) => val.timestamps.length >= 2); + if (limit + offset > freqViewed.length) { + setEnd && setEnd(true); + } + let paged: FrequentlyViewedItem[] = freqViewed + .slice(0, limit + offset) + .map((val) => { + return { + parents: val.parents || [], + title: val.title, + url: val.url, + id: val.serial, + }; + }); + + setCollection((c) => { + return { + ...c, + article_count: freqViewed.length, + items: paged, + updated_at: freqViewed[0]?.timestamps[0] + ? new Date(freqViewed[0].timestamps[0]).toISOString() + : new Date().toISOString(), + }; + }); + }, [limit, setEnd, offset]); + + return collection; +} + +function migrateOld() { + let frequentlyViewed: string | null = null; + try { + frequentlyViewed = localStorage.getItem(FREQUENTLY_VIEWED_STORAGE_KEY_OLD); + } catch (err) { + console.warn( + "Unable to read frequently viewed documents from localStorage", + err + ); + return; + } + + const entries = JSON.parse( + frequentlyViewed || "[]" + ) as OldFrequentlyViewedEntry[]; + + if (entries.length === 0) { + return; + } + + const newEntries: FrequentlyViewedEntry[] = []; + + // Migrate old entries. Log their most recent timestamp 'visitCount' times. (If within last 30 days) + entries.forEach((val) => { + if (isWithinLastThirtyDays(new Date(val.timestamp))) { + let timestamps: number[] = []; + for (let i = 0; i < val.visitCount; i++) { + timestamps.push(val.timestamp); + } + + let newEntry: FrequentlyViewedEntry = { + serial: + val.serial === undefined + ? getNextFrequentlyViewedSerial(entries) + : val.serial, + timestamps, + title: val.title, + url: val.url, + parents: val.parents, + }; + newEntries.push(newEntry); + } + }); + newEntries.sort(sortByVisitsThenTimestampsDesc); + setFrequentlyViewed(newEntries); + try { + localStorage.removeItem(FREQUENTLY_VIEWED_STORAGE_KEY_OLD); + } catch (e) { + console.warn("Unable to remove old frequently viewed from localStorage"); + return; + } +} + +/** + * @param {Doc|undefined} doc + * Persists frequently viewed docs to localstorage as part of MDN Plus MVP. + * + */ +export function useIncrementFrequentlyViewed(doc: Doc | undefined) { + const user = useUserData(); + + useEffect(() => { + if (!doc || !user?.isAuthenticated) { + return; + } + + let frequentlyViewed = getFrequentlyViewed(); + + const foundEntry = frequentlyViewed.find( + (entry) => entry.url === doc.mdn_url + ); + + if (foundEntry) { + foundEntry.timestamps.unshift(Date.now()); + } else { + const newEntry: FrequentlyViewedEntry = { + serial: getNextFrequentlyViewedSerial(frequentlyViewed), + url: doc.mdn_url, + title: doc.title, + parents: doc.parents, + timestamps: [Date.now()], + }; + + if (frequentlyViewed.length === 0) { + setFrequentlyViewed([newEntry]); + return; + } else { + frequentlyViewed.unshift(newEntry); + } + } + //Sort descending so most frequently viewed appears on top. + frequentlyViewed = frequentlyViewed.sort(sortByVisitsThenTimestampsDesc); + setFrequentlyViewed(frequentlyViewed); + }, [user?.isAuthenticated, doc]); +} + +const filterFrequentlyViewed = (frequentlyViewed: FrequentlyViewedEntry[]) => { + //1. Remove timestamps older than 30 days. + //2. Filter all values with no remaining timestamps + return frequentlyViewed + .map((fv) => { + return { + ...fv, + timestamps: fv.timestamps.filter((ts) => + isWithinLastThirtyDays(new Date(ts)) + ), + }; + }) + .filter((fv) => fv.timestamps.length > 0); +}; diff --git a/vendor/yari/client/src/plus/collections/index.scss b/vendor/yari/client/src/plus/collections/index.scss new file mode 100644 index 000000000..f51f5fba1 --- /dev/null +++ b/vendor/yari/client/src/plus/collections/index.scss @@ -0,0 +1,113 @@ +@use "../../ui/vars" as *; +@use "../../ui/mixins" as *; + +.collections { + color: var(--text-secondary); + font-weight: 500; + letter-spacing: var(--heading-letter-spacing); + + h1, + h2 { + color: var(--text-primary); + font-size: 1.5rem; + font-weight: 700; + + a { + color: inherit; + } + } +} + +.collections-overview { + > .container { + display: grid; + gap: 1rem; + padding: 1rem; + + @media (min-width: $screen-md) { + grid-template-columns: repeat(auto-fill, minmax(20rem, 1fr)); + } + } + + .notecard, + .generic-loading { + grid-column: 1/-1; + } + + article { + background-color: var(--background-primary); + border: 1px solid var(--background-secondary); + border-radius: var(--elem-radius); + box-shadow: var(--shadow-02); + color: var(--text-secondary); + display: flex; + flex-direction: column; + padding: 1rem; + + .dropdown-list { + color: var(--text-primary); + font-weight: 400; + letter-spacing: 0; + } + + &.default { + background-color: var(--background-secondary); + } + + header { + align-items: start; + display: grid; + grid-template-columns: auto min-content; + } + + h2 { + align-self: center; + font-size: 1.25rem; + font-weight: 700; + // vertically centre first line of title, without increasing line height: + margin: 0.25rem 0; + margin-right: 1rem; + overflow-wrap: anywhere; + + a { + color: var(--text-primary); + } + } + + p { + margin: 0; + overflow-wrap: anywhere; + white-space: pre-wrap; + @include line-clamp( + 4, + var(--font-content-line-height), + var(--background-primary) + ); + } + + footer { + align-items: baseline; + color: var(--text-secondary); + display: flex; + flex-wrap: wrap; + justify-content: space-between; + margin-top: auto; + overflow-wrap: anywhere; + padding-top: 1rem; + + a { + color: var(--collections-link); + } + } + + time { + font-size: 0.875rem; + } + + @media (max-width: $screen-md) { + .count { + display: none; + } + } + } +} diff --git a/vendor/yari/client/src/plus/collections/index.tsx b/vendor/yari/client/src/plus/collections/index.tsx new file mode 100644 index 000000000..3bc2297c4 --- /dev/null +++ b/vendor/yari/client/src/plus/collections/index.tsx @@ -0,0 +1,307 @@ +import React, { useState } from "react"; + +import Container from "../../ui/atoms/container"; +import { Button } from "../../ui/atoms/button"; +import NewEditCollectionModal from "./new-edit-collection-modal"; +import { Route, Routes } from "react-router"; +import { Collection, useCollectionDelete, useCollections } from "./api"; +import { Link } from "react-router-dom"; +import { + CollectionComponent, + FrequentlyViewedCollectionComponent, +} from "./collection"; +import { DropdownMenuWrapper, DropdownMenu } from "../../ui/molecules/dropdown"; +import MDNModal from "../../ui/atoms/modal"; +import { Loading } from "../../ui/atoms/loading"; +import NoteCard from "../../ui/molecules/notecards"; + +import "./index.scss"; + +import dayjs from "dayjs"; +import relativeTime from "dayjs/plugin/relativeTime"; +import Mandala from "../../ui/molecules/mandala"; +import { useGleanClick } from "../../telemetry/glean-context"; +import { PLUS_COLLECTIONS } from "../../telemetry/constants"; +import { camelWrap } from "../../utils"; +import { useFrequentlyViewed } from "./frequently-viewed"; +import { Icon } from "../../ui/atoms/icon"; +import { MDN_PLUS_TITLE } from "../../constants"; +import { SWRConfig } from "swr"; +dayjs.extend(relativeTime); + +const swrConfig = { revalidateOnFocus: false, revalidateIfStale: false }; +export default function Collections() { + return ( + + + } /> + } + /> + } /> + + + ); +} + +function Overview() { + document.title = `Collections | ${MDN_PLUS_TITLE}`; + const { data, isLoading, error } = useCollections(); + const [showCreate, setShowCreate] = useState(false); + const gleanClick = useGleanClick(); + + let collectionCards = data?.map((collection) => ( + + )); + const frequentlyViewedCard = ( + + ); + if (collectionCards && frequentlyViewedCard) { + collectionCards.splice(1, 0, frequentlyViewedCard); + } + + return ( +
    +
    + +

    +
    + + +
    + Collections +

    +

    + Save and group your favorite MDN articles to easily find them later + on. +
    + + We'd love to hear your feedback! + +

    + + +
    +
    + + {isLoading ? ( + + ) : data ? ( + collectionCards + ) : error ? ( + +

    Error

    +

    {error.message}

    +
    + ) : ( + "Create a new collection..." + )} +
    +
    + ); +} + +function CollectionCard({ collection }: { collection: Collection }) { + const [showDropdown, setShowDropdown] = useState(false); + const [showEdit, setShowEdit] = useState(false); + const [showDelete, setShowDelete] = useState(false); + const { + mutator: deleter, + error, + resetError, + isPending, + } = useCollectionDelete(); + + const deleteHandler = async (e: React.MouseEvent) => { + e.preventDefault(); + if (isPending) return; + await deleter(collection); + setShowDelete(false); + }; + + const deleteCancelHandler = async (e: React.MouseEvent) => { + e.preventDefault(); + if (isPending) return; + resetError(); + setShowDelete(false); + }; + + return collection.name === "Default" ? ( + + ) : ( +
    +
    +

    + {camelWrap(collection.name)} +

    + {collection.name !== "Default" ? ( + + + +
  • + +
  • + + +
    + ) : null} + + +
    +

    Delete collection

    +
    +
    + {error && ( + +

    Error: {error.message}

    +
    + )} +

    + Are you sure you want to delete your collection "{collection.name} + "? +

    +
    + + +
    +
    +
    +
    + {collection.description &&

    {camelWrap(collection.description)}

    } +
    + + {collection.article_count}{" "} + {collection.article_count === 1 ? "article" : "articles"} + + +
    +
    + ); +} + +function DefaultCollectionCard({ collection }: { collection: Collection }) { + return ( +
    +
    +

    + Saved Articles +

    +
    +

    The default collection.

    +
    + + {collection.article_count}{" "} + {collection.article_count === 1 ? "article" : "articles"} + + +
    +
    + ); +} + +function FrequentlyViewedCollectionCard() { + const collection = useFrequentlyViewed(); + if (!collection.items.length) { + return null; + } + return ( +
    +
    +

    + {collection.name} +

    +
    +

    {collection.description}

    +
    + + {collection.article_count}{" "} + {collection.article_count === 1 ? "article" : "articles"} + + +
    +
    + ); +} diff --git a/vendor/yari/client/src/plus/collections/new-edit-collection-modal.tsx b/vendor/yari/client/src/plus/collections/new-edit-collection-modal.tsx new file mode 100644 index 000000000..ce4422bcd --- /dev/null +++ b/vendor/yari/client/src/plus/collections/new-edit-collection-modal.tsx @@ -0,0 +1,184 @@ +import React, { useState } from "react"; +import { useGleanClick } from "../../telemetry/glean-context"; +import { Button } from "../../ui/atoms/button"; +import MDNModal from "../../ui/atoms/modal"; +import NoteCard from "../../ui/molecules/notecards"; +import { SubscriptionType, useUserData } from "../../user-context"; +import { SignUpLink } from "../../ui/atoms/signup-link"; +import { + Collection, + NewCollection, + useCollectionCreate, + useCollectionEdit, + useCollections, +} from "./api"; +import { PLUS_COLLECTIONS } from "../../telemetry/constants"; +import LimitedInput from "../../ui/atoms/form/limited-input"; +import ExpandingTextarea from "../../ui/atoms/form/expanding-textarea"; + +export default function NewEditCollectionModal({ + show, + setShow, + onClose, + editingCollection, + source, +}: { + show: boolean; + setShow: React.Dispatch>; + onClose?: (collection_id?: string) => void; + editingCollection?: Collection; + source: string; +}) { + const user = useUserData(); + const { data: collections } = useCollections(); + const freeLimitReached = + user?.subscriptionType === SubscriptionType["MDN_CORE"] && + (collections?.length || 0) > 2; + + const defaultCollection: Collection | NewCollection = editingCollection || { + name: "", + description: "", + }; + const [collection, setCollection] = useState(defaultCollection); + const gleanClick = useGleanClick(); + const { mutator: edit, ...editHook } = useCollectionEdit(); + const { mutator: create, ...createHook } = useCollectionCreate(); + const { isPending, resetError, error } = + "id" in collection ? editHook : createHook; + + const changeHandler: React.ChangeEventHandler< + HTMLInputElement | HTMLTextAreaElement + > = (e) => { + const { name, value } = e.target; + setCollection({ ...collection, [name]: value }); + }; + + const cancelHandler = (e: React.MouseEvent | React.KeyboardEvent) => { + e.preventDefault(); + if (isPending) return; + if (onClose) onClose(); + setCollection(defaultCollection); + resetError(); + setShow(false); + }; + + const saveHandler = async (e: React.BaseSyntheticEvent) => { + e.preventDefault(); + let savedCollection; + if ("id" in collection) { + savedCollection = await edit(collection); + } else { + gleanClick(source); + savedCollection = await create(collection); + } + if (onClose) onClose(savedCollection.id); + setCollection(editingCollection ? savedCollection : defaultCollection); + setShow(false); + }; + + return ( + + {!editingCollection && freeLimitReached ? ( + <> +
    +

    Want more?

    +
    +
    +

    + You've reached the maximum number of collections you can have as a + "Core" user. +

    +

    + Upgrade now to receive unlimited access to collections, and more: +

    +
    + +
    +
    + + ) : ( + <> +
    +

    + {editingCollection ? "Edit Collection" : "Create Collection"} +

    +
    +
    + {error && ( + +

    Error: {error.message}

    +
    + )} +
    +
    + + + {({ value, changeWrapper }) => ( + + )} + +
    +
    + + + {({ value, changeWrapper }) => ( + + )} + +
    +
    + + +
    +
    +
    + + )} +
    + ); +} diff --git a/vendor/yari/client/src/plus/collections/rust-types.ts b/vendor/yari/client/src/plus/collections/rust-types.ts new file mode 100644 index 000000000..1c479c207 --- /dev/null +++ b/vendor/yari/client/src/plus/collections/rust-types.ts @@ -0,0 +1,55 @@ +// currently this is manually kept in sync with the types used in rumba +// eventually it would be nice to automatically export those types for use here + +export interface MultipleCollectionInfo { + id: string; + name: string; + description?: string; + created_at: string; + updated_at: string; + article_count: number; +} + +export interface MultipleCollectionCreationRequest { + name: string; + description?: string; +} + +export interface MultipleCollectionResponse extends MultipleCollectionInfo { + items: CollectionItem[]; +} + +export interface CollectionItem { + id: string; + url: string; + title: string; + notes?: string; + parents: CollectionParent[]; + created_at: string; + updated_at: string; +} + +export interface CollectionParent { + uri: string; + title: string; +} + +export interface CollectionItemCreationRequest { + title: string; + url: string; + notes?: string; +} + +export interface LookupEntry { + collection_id: string; + item: CollectionItem; +} + +export interface MultipleCollectionLookupQueryResponse { + results: LookupEntry[]; +} + +export interface CollectionItemModificationRequest { + title: string; + notes?: string; +} diff --git a/vendor/yari/client/src/plus/common/api.tsx b/vendor/yari/client/src/plus/common/api.tsx new file mode 100644 index 000000000..70310b117 --- /dev/null +++ b/vendor/yari/client/src/plus/common/api.tsx @@ -0,0 +1,61 @@ +export const STRIPE_PLANS_PATH = "/api/v1/stripe/plans"; +export const SETTINGS_BASE_PATH = "/api/v1/plus/settings/"; +export const NEWSLETTER_BASE_PATH = "/api/v1/plus/newsletter/"; +export const AI_HELP_QUOTA_PATH = "/api/v1/plus/ai/help/quota"; + +export type PLUS_SETTINGS = { + col_in_search: boolean; +}; + +export async function toggleNewsletterSubscription( + subscribed: boolean +): Promise { + try { + const res = await fetch(NEWSLETTER_BASE_PATH, { + method: subscribed ? "POST" : "DELETE", + headers: { + "content-type": "application/json", + }, + }); + const { subscribed: subscribedUpdated } = await res.json(); + return subscribedUpdated; + } catch { + return null; + } +} + +export async function toggleNoAds(enabled: boolean) { + return await fetch(SETTINGS_BASE_PATH, { + body: JSON.stringify({ no_ads: enabled }), + method: "POST", + headers: { + "content-type": "application/json", + }, + }); +} + +export async function toggleAIHelpHistory(enabled: boolean) { + return await fetch(SETTINGS_BASE_PATH, { + body: JSON.stringify({ ai_help_history: enabled }), + method: "POST", + headers: { + "content-type": "application/json", + }, + }); +} + +export async function getNewsletterSubscription(): Promise { + try { + const res = await fetch(NEWSLETTER_BASE_PATH); + const { subscribed } = await res.json(); + return subscribed; + } catch { + return null; + } +} + +export async function getStripePlans() { + const res = await fetch(STRIPE_PLANS_PATH); + + return await res.json(); +} diff --git a/vendor/yari/client/src/plus/common/index.tsx b/vendor/yari/client/src/plus/common/index.tsx new file mode 100644 index 000000000..364a8852a --- /dev/null +++ b/vendor/yari/client/src/plus/common/index.tsx @@ -0,0 +1,52 @@ +import LogInLink from "../../ui/atoms/login-link"; +import NoteCard from "../../ui/molecules/notecards"; +import { getCategoryByPathname } from "../../utils"; + +export function NotSignedIn() { + return ( +
    +

    You have not signed in

    + +
    + ); +} + +export function NotSubscriber() { + return ( + <> +

    You are signed in but not an active subscriber

    + + + ); +} + +export function DataError({ error }: { error: Error }) { + return ( + +

    Server error

    +

    A server error occurred trying to get your collections.

    +

    + {error.toString()} +

    + Reload this page and try again. +
    + ); +} + +export function _getIconLabel(url: string) { + const category = getCategoryByPathname(url); + + if (!category) { + return "docs"; + } + + if (category === "javascript") { + return "js"; + } + + if (category === "accessibility") { + return "acc"; + } + + return category; +} diff --git a/vendor/yari/client/src/plus/common/login-banner.scss b/vendor/yari/client/src/plus/common/login-banner.scss new file mode 100644 index 000000000..53416b439 --- /dev/null +++ b/vendor/yari/client/src/plus/common/login-banner.scss @@ -0,0 +1,28 @@ +@use "../../ui/vars" as *; + +.login-banner { + align-items: center; + background-color: var(--background-success); + border: 2px solid var(--background-success); + display: flex; + flex-wrap: wrap; + gap: 1rem; + padding: 1rem; + + .plus-link { + color: var(--text-primary); + font-style: normal; + font-variation-settings: normal; + text-decoration: underline; + text-decoration-thickness: 0.15rem; + text-underline-offset: 0.1em; + } + + .auth-container { + flex-direction: row; + flex-wrap: wrap; + gap: 1rem; + margin-bottom: 0; + margin-left: auto; + } +} diff --git a/vendor/yari/client/src/plus/common/login-banner.tsx b/vendor/yari/client/src/plus/common/login-banner.tsx new file mode 100644 index 000000000..9ae2fe481 --- /dev/null +++ b/vendor/yari/client/src/plus/common/login-banner.tsx @@ -0,0 +1,40 @@ +import { useGleanClick } from "../../telemetry/glean-context"; +import { AuthContainer } from "../../ui/molecules/auth-container"; +import { usePlusUrl } from "../utils"; +import "./login-banner.scss"; + +export function PlusLoginBanner({ + children, + className = "login-banner", + gleanPrefix, +}: { + children: React.ReactNode; + className?: string; + gleanPrefix: string; +}) { + const href = usePlusUrl(); + const gleanClick = useGleanClick(); + + return ( +
    + + {children}{" "} + + Upgrade to{" "} + gleanClick(`${gleanPrefix}: banner-link`)} + > + MDN Plus + {" "} + for free. + + + +
    + ); +} diff --git a/vendor/yari/client/src/plus/common/plus-tabs.tsx b/vendor/yari/client/src/plus/common/plus-tabs.tsx new file mode 100644 index 000000000..e575d526c --- /dev/null +++ b/vendor/yari/client/src/plus/common/plus-tabs.tsx @@ -0,0 +1,17 @@ +import { Button } from "../../ui/atoms/button"; + +export function showMoreButton(setSelectAllChecked, setOffset, list: any[]) { + return ( +
    + +
    + ); +} diff --git a/vendor/yari/client/src/plus/common/tabs.tsx b/vendor/yari/client/src/plus/common/tabs.tsx new file mode 100644 index 000000000..9c1780ae8 --- /dev/null +++ b/vendor/yari/client/src/plus/common/tabs.tsx @@ -0,0 +1,85 @@ +import { useState, useEffect } from "react"; +import { useLocation } from "react-router-dom"; +import { MDN_PLUS_TITLE } from "../../constants"; +import { AnyFilter } from "../search-filter"; + +export enum TabVariant { + COLLECTIONS, + FREQUENTLY_VIEWED, +} + +const COLLECTIONS_URL = "/plus/collections"; +const FREQUENTLY_VIEWED_URL = "/plus/collections/frequently_viewed"; + +export const FILTERS: AnyFilter[] = [ + { + type: "select", + key: "filterType", + label: "Filters", + options: [ + { + label: "Content updates", + value: "content", + }, + { + label: "Browser compatibility", + value: "compat", + }, + ], + }, +]; + +export const SORTS = [ + { + label: "Date", + param: "sort=date", + }, + { + label: "Title", + param: "sort=title", + }, +]; + +interface TabDefinition { + pageTitle: string; + label: string; + path: string; +} + +export const TAB_INFO: Record = { + [TabVariant.COLLECTIONS]: { + label: "Collection", + pageTitle: `Collections | ${MDN_PLUS_TITLE}`, + path: COLLECTIONS_URL, + }, + + [TabVariant.FREQUENTLY_VIEWED]: { + label: "Frequently viewed articles", + pageTitle: `Frequently viewed articles | ${MDN_PLUS_TITLE}`, + path: FREQUENTLY_VIEWED_URL, + }, +}; + +export function useCurrentTab(locale): TabVariant { + const { pathname } = useLocation(); + const initialTab = getInitialTab(); + + const [currentTab, setTab] = useState(initialTab); + + useEffect(() => { + if (pathname === `/${locale}${FREQUENTLY_VIEWED_URL}`) { + setTab(TabVariant.FREQUENTLY_VIEWED); + } else { + setTab(TabVariant.COLLECTIONS); + } + }, [pathname, currentTab, locale]); + + return currentTab; +} + +function getInitialTab() { + if (window.location.pathname.endsWith(FREQUENTLY_VIEWED_URL)) { + return TabVariant.FREQUENTLY_VIEWED; + } + return TabVariant.COLLECTIONS; +} diff --git a/vendor/yari/client/src/plus/icon-card/index.scss b/vendor/yari/client/src/plus/icon-card/index.scss new file mode 100644 index 000000000..89058131f --- /dev/null +++ b/vendor/yari/client/src/plus/icon-card/index.scss @@ -0,0 +1,158 @@ +@use "../../ui/vars" as *; +@use "../../ui/mixins" as *; + +.icon-card-list { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.icon-card { + animation: fade-in 0.2s; + background-color: var(--background-primary); + border: 1px solid var(--border-secondary); + border-radius: var(--elem-radius); + padding: 1rem; + padding-left: 0.5rem; + transition: 0.3s ease-out; // this removes a flash from .doomed animations + + a { + &:link, + &:visited { + color: var(--text-primary); + } + } + + &:first-child { + margin-top: 1rem; + } + + > *:last-child { + margin-bottom: 0; + } + + &:last-child { + margin-bottom: 1rem; + } + + &-icon { + align-items: center; + background-color: var(--http-accent-color); + border-radius: 0.125rem; + color: var(--background-primary); + display: flex; + font-size: 0.75rem; + font-style: italic; + font-variation-settings: "slnt" -10; + height: 3rem; + justify-content: center; + padding: 0.5rem; + width: 3rem; + + span { + overflow: hidden; + text-overflow: ellipsis; + } + + &.html { + background-color: var(--html-accent-color); + } + + &.css { + background-color: var(--css-accent-color); + } + + &.javascript { + background-color: var(--js-accent-color); + } + + &.http { + background-color: var(--http-accent-color); + } + + &.apis { + background-color: var(--apis-accent-color); + } + } + + &-title-wrap { + display: flex; + gap: 1rem; + + .dropdown { + align-self: center; + } + + .breadcrumbs a:link, + .breadcrumbs a:visited { + color: var(--text-secondary); + } + } + + &-title { + font-size: var(--type-base-font-size-rem); + font-weight: var(--font-body-strong-weight); + margin: 0; + overflow: hidden; + text-overflow: ellipsis; + word-wrap: break-word; + } + + &-description { + color: var(--text-secondary); + font-size: var(--type-smaller-font-size); + } + + &-actions { + display: flex; + gap: 0.5rem; + } + + .icon-card-content { + flex: 1 1 80%; + overflow: hidden; + + @media (max-width: $screen-sm) { + flex-basis: 95%; + } + + h4 { + overflow: hidden; + text-overflow: ellipsis; + } + } + + .icon-card-actions { + align-self: center; + margin-left: auto; + } + + .breadcrumbs { + color: var(--text-secondary); + font-size: var(--type-smaller-font-size); + list-style: none; + margin-bottom: 0; + margin-bottom: 0.5rem; + + li { + display: inline-block; + margin: 0; + + &::after { + background-color: var(--text-secondary); + content: ""; + display: inline-block; + height: 8px; + margin: 0 4px; + mask-image: url("~@mdn/dinocons/arrows/chevron.svg"); + transform: rotate(-90deg); + vertical-align: middle; + width: 8px; + } + + &:last-child:after { + content: unset; + } + } + } +} diff --git a/vendor/yari/client/src/plus/icon-card/index.tsx b/vendor/yari/client/src/plus/icon-card/index.tsx new file mode 100644 index 000000000..e6f5baec4 --- /dev/null +++ b/vendor/yari/client/src/plus/icon-card/index.tsx @@ -0,0 +1,78 @@ +import React from "react"; +import { useOnlineStatus } from "../../hooks"; +import { Button } from "../../ui/atoms/button"; +import { DropdownMenu, DropdownMenuWrapper } from "../../ui/molecules/dropdown"; +import { Checkbox } from "../../ui/atoms/checkbox"; +import { getCategoryByPathname } from "../../utils"; +import { _getIconLabel } from "../common"; +import "./index.scss"; + +export default function WatchedCardListItem({ + item, + onUnwatched, + toggleSelected, +}) { + const [show, setShow] = React.useState(false); + const { isOnline } = useOnlineStatus(); + + const iconClass = getCategoryByPathname(item.url); + const iconLabel = _getIconLabel(item.url); + + return ( +
  • +
    + {isOnline && ( + toggleSelected(item, e.target.value)} + /> + )} +
    + {iconLabel} +
    +
    +
      +
    1. + References +
    2. +
    +

    + {item.title} +

    +
    + {isOnline && ( + + +
  • + + + + )} +
    + {/*

    This is a note, lets keep it.

    */} + + ); +} diff --git a/vendor/yari/client/src/plus/index.scss b/vendor/yari/client/src/plus/index.scss new file mode 100644 index 000000000..f045d7e6b --- /dev/null +++ b/vendor/yari/client/src/plus/index.scss @@ -0,0 +1,102 @@ +@use "../ui/vars" as *; + +.plus-header-mandala { + --plus-header: var(--collections-header); + --plus-mandala: var(--collections-mandala); + --plus-icon: var(--collections-icon); + --plus-link: var(--collections-link); + + background: var(--plus-header); + overflow: hidden; + padding: 1.25rem 0; + + .container { + position: relative; + + > * { + position: relative; + } + + .mandala-icon-wrapper { + display: inline-block; + margin-right: 0.5rem; + position: relative; + top: -0.2rem; + + @media (min-width: $screen-lg) { + position: absolute; + right: 10rem; + top: 50%; + transform: translate(0, -50%); + } + + .mandala-container { + --mandala-primary: var(--plus-mandala); + left: 50%; + position: absolute; + top: 50%; + transform: translate(-50%, -49.4%); + } + + .icon { + background: var(--plus-icon); + height: 2rem; + width: 2rem; + } + } + + h1 { + font-size: 2rem; + margin: 0; + position: static; + + span { + position: relative; + } + } + + p { + margin: 1rem 0; + + &:last-child { + margin-bottom: 0; + } + } + + h1 span, + p { + // improve text contrast against mandala + text-shadow: + 2px 2px 3px var(--plus-header), + 2px -2px 3px var(--plus-header), + -2px -2px 3px var(--plus-header), + -2px 2px 3px var(--plus-header); + } + + a { + color: var(--plus-link); + text-decoration: underline; + } + + .button-wrap { + font-size: 0.875rem; + font-weight: 700; + } + } +} + +.ai-help, +.collections, +.updates { + @media (min-width: $screen-md) { + .container { + max-width: 43rem; + } + } + + @media (min-width: $screen-lg) { + .container { + max-width: 52rem; + } + } +} diff --git a/vendor/yari/client/src/plus/index.tsx b/vendor/yari/client/src/plus/index.tsx new file mode 100644 index 000000000..57b9dfcbf --- /dev/null +++ b/vendor/yari/client/src/plus/index.tsx @@ -0,0 +1,124 @@ +import React from "react"; +import { Routes, Route } from "react-router-dom"; + +import { useIsServer } from "../hooks"; +import { Loading } from "../ui/atoms/loading"; +import { MainContentContainer } from "../ui/atoms/page-content"; +import { PageNotFound } from "../page-not-found"; +import { MDN_PLUS_TITLE } from "../constants"; +import { Settings } from "../settings"; +import PlusDocs from "./plus-docs"; +import { ArticleActionsContainer } from "../ui/organisms/article-actions-container"; +import { DocParent } from "../../../libs/types/document"; + +import "./index.scss"; +import OfferOverview from "./offer-overview"; + +const AiHelp = React.lazy(() => import("./ai-help")); +const Collections = React.lazy(() => import("./collections")); +const Updates = React.lazy(() => import("./updates")); + +interface LayoutProps { + withoutContainer?: boolean; + withSSR?: boolean; + parents?: DocParent[]; + children: React.ReactNode; +} + +function Layout({ + withoutContainer = false, + withSSR = false, + parents = undefined, + children, +}: LayoutProps) { + const loading = ; + const isServer = useIsServer(); + const inner = ( + <> + {isServer ? ( + withSSR ? ( + children + ) : ( + loading + ) + ) : ( + {children} + )} + + ); + + return withoutContainer ? ( + inner + ) : ( + <> + {parents && } + {inner} + + ); +} +export function Plus({ pageTitle, ...props }: { pageTitle?: string }) { + React.useEffect(() => { + document.title = pageTitle || MDN_PLUS_TITLE; + }, [pageTitle]); + + return ( + + + + + } + /> + + + + } + /> + + + + } + /> + + + + } + /> + + + + } + /> + + + + } + /> + + + + } + /> + + ); +} diff --git a/vendor/yari/client/src/plus/offer-overview/index.tsx b/vendor/yari/client/src/plus/offer-overview/index.tsx new file mode 100644 index 000000000..d8b742d70 --- /dev/null +++ b/vendor/yari/client/src/plus/offer-overview/index.tsx @@ -0,0 +1,17 @@ +import { useScrollToAnchor } from "../../hooks"; +import OfferHero from "./offer-hero"; +import OfferOverviewFeatures from "./offer-overview-feature"; +import OfferOverviewSubscribe from "./offer-overview-subscribe"; + +function OfferOverview() { + useScrollToAnchor(); + return ( +
    + + + +
    + ); +} + +export default OfferOverview; diff --git a/vendor/yari/client/src/plus/offer-overview/offer-hero/index.scss b/vendor/yari/client/src/plus/offer-overview/offer-hero/index.scss new file mode 100644 index 000000000..b3de49994 --- /dev/null +++ b/vendor/yari/client/src/plus/offer-overview/offer-hero/index.scss @@ -0,0 +1,110 @@ +@use "../../../ui/vars" as *; + +$text-stroke-width: 2px; + +.offer-hero { + background-color: var(--background-primary); + color: var(--text-primary); + display: grid; + grid-template-rows: fit-content(24rem); + width: 100%; + + .offer-hero-header { + align-items: center; + + color: var(--text-secondary); + display: flex; + flex-direction: row; + grid-column: 1; + grid-row: 1; + margin: 0 auto; + max-width: 52rem; + padding: 1rem; + -moz-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; + width: initial; + + .offer-hero-wrapper { + align-self: start; + z-index: 1; + + h1 { + font-size: 3rem; + margin-top: 1rem; + + span { + display: block; + } + + span:first-child { + margin-bottom: 0.5rem; + } + } + + h2 { + font: var(--type-heading-h3); + width: 100%; + } + + .button-wrapper { + display: flex; + gap: 1rem; + width: 100%; + + a { + border-radius: var(--elem-radius); + font-size: 14px; + font-weight: 600; + line-height: 175%; + padding: 0.5rem; + position: relative; + text-align: center; + -moz-transition: all 0.2s ease; + transition: all 0.2s ease; + width: 140px; + width: 100%; + z-index: 1; + } + + .button-primary { + background-color: var(--text-primary); + border: 2px solid var(--text-primary); + color: var(--text-invert); + + &:hover { + background-color: var(--text-secondary); + border-color: var(--text-secondary); + } + } + + .button-secondary { + background: #15141a1a; + border: 2px solid var(--button-secondary-border-red); + color: #fff; + } + + .button-secondary:hover { + border: 2px solid var(--button-secondary-border-red-focus); + } + } + } + } + + .mandala-wrapper { + --mandala-primary: var(--border-primary); + grid-column: 1; + grid-row: 1; + overflow: hidden; + top: 0; + -moz-transition: all 1s ease-in-out; + transition: all 1s ease-in-out; + width: 100%; + + .mandala-translate { + transform: translate(10rem, -8rem) scale(1.2); + @media (min-width: $screen-sm) { + transform: translate(12rem, -8rem); + } + } + } +} diff --git a/vendor/yari/client/src/plus/offer-overview/offer-hero/index.tsx b/vendor/yari/client/src/plus/offer-overview/offer-hero/index.tsx new file mode 100644 index 000000000..5834ae323 --- /dev/null +++ b/vendor/yari/client/src/plus/offer-overview/offer-hero/index.tsx @@ -0,0 +1,34 @@ +import Mandala from "../../../ui/molecules/mandala"; +import "./index.scss"; + +function OfferHero() { + return ( +
    +
    +
    +

    + More MDN. Your MDN. +

    + <> +

    + Support MDN and make it your own. +

    + + +
    +
    +
    + +
    +
    + ); +} + +export default OfferHero; diff --git a/vendor/yari/client/src/plus/offer-overview/offer-overview-feature/index.scss b/vendor/yari/client/src/plus/offer-overview/offer-overview-feature/index.scss new file mode 100644 index 000000000..3d34eb5a6 --- /dev/null +++ b/vendor/yari/client/src/plus/offer-overview/offer-overview-feature/index.scss @@ -0,0 +1,96 @@ +@use "../../../ui/vars" as *; + +.offer-overview-feature { + background-color: var(--background-primary); + color: var(--text-primary); + min-height: 25rem; + width: 100%; + + .wrapper { + align-items: center; + display: flex; + flex-direction: column-reverse; + gap: 4rem; + height: 100%; + justify-content: space-between; + margin: 0 auto; + max-width: 64rem; + padding: 4rem 1rem; + width: 100%; + + @media (min-width: $screen-xl) { + flex-direction: row; + } + + .copy-container, + .img-container { + display: flex; + flex-direction: column; + width: 100%; + } + + .img-container { + align-items: center; + border-radius: 1rem; + box-shadow: 0 3px 22px #2b2a331a; + height: 100%; + max-width: 25rem; + @media (min-width: $screen-xl) { + max-width: min(50%, 20rem); + } + } + + .copy-container { + align-items: center; + max-width: 40rem; + + text-align: center; + + a { + justify-content: start; + } + + h2 { + color: var(--plus-accent-color); + font: 700 12px/120% Inter; + letter-spacing: 1.5px; + margin-bottom: 1rem; + margin-top: 0; + text-transform: uppercase; + } + + h3 { + font-size: 1.75rem; + font-weight: 400; + margin-top: 0; + } + + @media (min-width: $screen-xl) { + align-items: initial; + height: 100%; + max-width: 50%; + text-align: initial; + } + } + } +} + +.offer-overview-feature:nth-child(even) { + .wrapper { + flex-direction: column; + @media (min-width: $screen-xl) { + flex-direction: row; + } + } +} + +.offer-overview-feature:nth-child(odd) { + background: var(--background-secondary); + + .wrapper { + flex-direction: column; + @media (min-width: $screen-xl) { + flex-direction: row-reverse; + } + } +} diff --git a/vendor/yari/client/src/plus/offer-overview/offer-overview-feature/index.tsx b/vendor/yari/client/src/plus/offer-overview/offer-overview-feature/index.tsx new file mode 100644 index 000000000..abf94dec2 --- /dev/null +++ b/vendor/yari/client/src/plus/offer-overview/offer-overview-feature/index.tsx @@ -0,0 +1,118 @@ +import { Button } from "../../../ui/atoms/button"; +import "./index.scss"; +import screenshotAiHelp from "../../../../public/assets/ai-help/ai-help_light.png"; +import screenshotAdFree from "../../../../public/assets/afree.png"; +import screenshotUpdates from "../../../../public/assets/updates.png"; +import screenshotCollections from "../../../../public/assets/collections.png"; +import screenshotPlayground from "../../../../public/assets/playground.png"; + +function OfferOverviewFeature({ id, img, imgAlt, children }) { + return ( +
    +
    +
    + {imgAlt} +
    {children}
    +
    +
    +
    + ); +} + +export default function OfferOverviewFeatures() { + return ( +
    + +
    +

    Go ads free

    +

    Enjoy MDN ads-free with an MDN Plus subscription.

    +

    + Support MDN and enjoy a focused, ad-free experience alongside other + features such as curated collections, custom web platform updates, + and more. Subscribers to paid tiers of MDN Plus have the option to + browse MDN without ads. +

    + +
    +
    + +
    +

    AI Help

    +

    Get real-time assistance and support.

    +

    + No need to scroll through page after page to find your answers. + Introducing an AI assistant that can answer all your web development + questions in real time. Powered by OpenAI GPT-4o and GPT-4o mini. +

    + +
    +
    + +
    +

    Playground

    +

    Write, Test, and Share your code.

    +

    + Your playground to learn and share your amazing work with the world. + By simply logging in, you can now spread your creativity far and + wide. +

    + +
    +
    + +
    +

    Updates

    +

    + Compatibility changes at a glance. +
    + Filter and sort updates that matter most to build your project +

    +

    + The Web doesn't have a changelog, but MDN can help. You can + personalize and filter compatibility changes based on browsers or + the tech category you are interested in whether that is JavaScript, + CSS, etc. +

    + +
    +
    + +
    +

    Collections

    +

    + Build your perfect library.
    + Or let us build it for you. +

    +

    + No more haphazard hunting through the vast virtual library: unleash + your inner curator and collect your favorite articles in one place + for convenient consultation. +

    + +
    +
    +
    + ); +} diff --git a/vendor/yari/client/src/plus/offer-overview/offer-overview-subscribe/index.scss b/vendor/yari/client/src/plus/offer-overview/offer-overview-subscribe/index.scss new file mode 100644 index 000000000..851ef1f11 --- /dev/null +++ b/vendor/yari/client/src/plus/offer-overview/offer-overview-subscribe/index.scss @@ -0,0 +1,226 @@ +@use "../../../ui/vars" as *; + +.plus-subscribe-wrapper { + background: var(--background-primary); + + .subscribe { + margin: 0 auto; + padding: 2rem 1rem; + text-align: center; + + @media (min-width: $screen-md) { + padding: 2rem 4rem; + } + + h2 { + color: var(--text-primary); + font-size: 24px; + font-style: normal; + font-variation-settings: normal; + font-weight: 650; + line-height: 120%; + margin-bottom: 2rem; + } + + .switch { + color: var(--text-primary); + margin-bottom: 2rem; + } + + .wrapper, + .wrapper-offline { + align-items: center; + display: flex; + flex-direction: column; + gap: 1rem; + justify-content: center; + margin: 0 auto; + + .wrapper-offline { + display: none; + } + + @media (min-width: 66rem) { + align-items: stretch; + flex-direction: row; + } + + .subscribe-detail { + align-items: center; + background-color: var(--text-secondary); + border-radius: 1rem; + color: var(--text-invert); + display: flex; + flex-direction: column; + gap: 1rem; + max-width: 20rem; + + min-width: 16rem; + width: 100%; + + &#plus5 { + background-color: var(--text-primary-blue); + } + + &#plus10 { + background-color: var(--text-primary-red); + } + + &#core { + background-color: var(--text-primary-green); + } + + h3 { + background: rgba(0, 0, 0, 0.5); + border-radius: 1rem 1rem 0 0; + color: var(--text-primary); + font-size: 1em; + margin: 0; + padding: 0.5rem; + width: 100%; + } + + .sub-info { + display: flex; + flex-direction: column; + gap: 1.5rem; + height: 100%; + margin-top: 1rem; + padding: 0 2rem 2rem; + width: 100%; + + h3, + p { + margin: 0; + } + + .price { + align-content: center; + column-gap: 0.5rem; + display: grid; + grid-template-columns: 1fr 1fr; + height: 3rem; + + .sub-price { + font-size: 36px; + font-style: normal; + font-variation-settings: normal; + font-weight: 650; + grid-column: 1/2; + justify-self: right; + line-height: 120%; + } + + .free { + grid-column: 1/3; + justify-self: center; + } + + .sub-length { + font-size: 0.8rem; + font-style: normal; + font-variation-settings: normal; + grid-column: 2/3; + justify-self: left; + line-height: 120%; + margin: auto 0; + text-align: left; + } + } + + .includes { + align-self: flex-start; + } + + ul { + align-self: flex-start; + list-style-type: "✔ "; + margin-left: 1rem; + width: 100%; + + li { + line-height: 1.75; + padding-left: 0.5rem; + text-align: left; + width: 100%; + + a { + color: var(--text-invert); + text-decoration: underline; + width: fit-content; + + &:hover { + text-decoration: none; + } + } + + sup.new { + --new-background: var(--mdn-color-background-highlight); + --new-color: inherit; + margin-left: 0.25rem; + } + } + } + + .sub-link { + align-items: center; + align-self: center; + background: $mdn-color-neutral-90; + border-radius: 1rem; + color: var(--text-primary); + display: flex; + font-weight: 620; + height: 2rem; + justify-content: center; + min-width: fit-content; + padding: 0.25rem 0.5rem; + width: calc(100% - 1rem); + } + + .terms { + color: var(--text-invert); + font-size: 14px; + font-style: italic; + font-variation-settings: "slnt" -10; + margin-top: auto; + text-decoration: underline; + + &.external::after { + background-color: var(--text-invert); + } + } + + .current { + background-color: initial; + border: 1px solid var(--mdn-color-black); + color: var(--mdn-color-black); + } + + .na { + background-color: var(--mdn-background-light-grey); + border: 1px solid var(--mdn-background-light-grey); + color: var(--mdn-color-dark-grey); + + &::after { + background-color: var(--mdn-color-dark-grey); + content: ""; + display: inline-block; + height: 16px; + margin-left: 0.3rem; + mask-image: url("../../../assets/icons/question-mark.svg"); + width: 16px; + } + } + } + } + } + } +} + +.plus-for-companies { + color: var(--text-primary); + margin: 0; + padding: 1rem; + padding-bottom: 2rem; + text-align: center; +} diff --git a/vendor/yari/client/src/plus/offer-overview/offer-overview-subscribe/index.tsx b/vendor/yari/client/src/plus/offer-overview/offer-overview-subscribe/index.tsx new file mode 100644 index 000000000..01a4c04fb --- /dev/null +++ b/vendor/yari/client/src/plus/offer-overview/offer-overview-subscribe/index.tsx @@ -0,0 +1,429 @@ +import "./index.scss"; +import { + FXA_SIGNIN_URL, + MDN_PLUS_SUBSCRIBE_10M_URL, + MDN_PLUS_SUBSCRIBE_10M_URL_SP3, + MDN_PLUS_SUBSCRIBE_10Y_URL, + MDN_PLUS_SUBSCRIBE_10Y_URL_SP3, + MDN_PLUS_SUBSCRIBE_5M_URL, + MDN_PLUS_SUBSCRIBE_5M_URL_SP3, + MDN_PLUS_SUBSCRIBE_5Y_URL, + MDN_PLUS_SUBSCRIBE_5Y_URL_SP3, + MDN_PLUS_SUBSCRIBE_BASE, + MDN_PLUS_USE_SP3, +} from "../../../env"; +import { SubscriptionType, UserData, useUserData } from "../../../user-context"; +import { Switch } from "../../../ui/atoms/switch"; +import { useEffect, useState } from "react"; +import { getStripePlans } from "../../common/api"; +import { useOnlineStatus } from "../../../hooks"; +import { useGleanClick } from "../../../telemetry/glean-context"; +import { OFFER_OVERVIEW_CLICK } from "../../../telemetry/constants"; +import LogInLink from "../../../ui/atoms/login-link"; +import React from "react"; + +const Stripe = React.lazy(() => import("./stripe")); + +export enum Period { + Month, + Year, +} + +const SUBSCRIPTIONS = { + [SubscriptionType.MDN_CORE]: { order: 0, period: Period.Month }, + [SubscriptionType.MDN_PLUS_5M]: { + order: 1, + period: Period.Month, + }, + [SubscriptionType.MDN_PLUS_5Y]: { + order: 2, + period: Period.Year, + }, + [SubscriptionType.MDN_PLUS_10M]: { + order: 3, + period: Period.Month, + }, + [SubscriptionType.MDN_PLUS_10Y]: { + order: 4, + period: Period.Year, + }, +}; + +export type OfferDetailsPlanProps = { + subscriptionType: SubscriptionType; + monthlyPrice?: number; + ctaLink: string; +}; + +export type PlanInfo = { + id: string; + monthlyPriceInCents: number; +}; + +export type StripePlans = { + currency: string; + plans: { [key: string]: PlanInfo }; +}; + +export type OfferDetailsProps = { + id: string; + name: string; + price?: number; + currency?: string; + features: (string | null)[][]; + includes: string; + cta: string; + upgradeCta?: string; + discounted: OfferDetailsPlanProps; + regular: OfferDetailsPlanProps; +}; + +const PLUS_FEATURES = [ + ["afree", "Ads free"], + ["updates", "Filter and sort updates"], + ["collections", "Collections of articles"], + ["ai-help", "AI Help"], +]; + +const CORE: OfferDetailsProps = { + id: "core", + name: "Core", + features: [ + ["updates", "Filter and sort updates"], + ["collections", "Up to 3 collections"], + ["playground", "Share playgrounds"], + ["ai-help", "AI Help: 5 questions per day"], + ], + includes: "Includes:", + cta: "Start with Core", + regular: { + subscriptionType: SubscriptionType.MDN_CORE, + ctaLink: `${FXA_SIGNIN_URL}?next=/en-US/plus`, + }, + discounted: { + subscriptionType: SubscriptionType.MDN_CORE, + ctaLink: `${FXA_SIGNIN_URL}?next=/en-US/plus`, + }, +}; + +const PLUS_5: OfferDetailsProps = { + id: "plus5", + name: "MDN Plus 5", + currency: "USD", + features: PLUS_FEATURES, + includes: "Includes unlimited access to:", + cta: "Start with Plus 5", + upgradeCta: "Upgrade to Plus 5", + regular: { + subscriptionType: SubscriptionType.MDN_PLUS_5M, + ctaLink: MDN_PLUS_USE_SP3 + ? MDN_PLUS_SUBSCRIBE_5M_URL_SP3 + : MDN_PLUS_SUBSCRIBE_5M_URL, + monthlyPrice: 500, + }, + discounted: { + subscriptionType: SubscriptionType.MDN_PLUS_5Y, + ctaLink: MDN_PLUS_USE_SP3 + ? MDN_PLUS_SUBSCRIBE_5Y_URL_SP3 + : MDN_PLUS_SUBSCRIBE_5Y_URL, + monthlyPrice: 417, + }, +}; + +const PLUS_10: OfferDetailsProps = { + id: "plus10", + name: "MDN Supporter 10", + currency: "USD", + features: [ + ...PLUS_FEATURES, + [null, "Early access to new features"], + [null, "Pride and joy"], + ], + includes: "Includes unlimited access to:", + cta: "Start with Supporter 10", + upgradeCta: "Upgrade to Supporter 10", + regular: { + subscriptionType: SubscriptionType.MDN_PLUS_10M, + ctaLink: MDN_PLUS_USE_SP3 + ? MDN_PLUS_SUBSCRIBE_10M_URL_SP3 + : MDN_PLUS_SUBSCRIBE_10M_URL, + monthlyPrice: 1000, + }, + discounted: { + subscriptionType: SubscriptionType.MDN_PLUS_10Y, + ctaLink: MDN_PLUS_USE_SP3 + ? MDN_PLUS_SUBSCRIBE_10Y_URL_SP3 + : MDN_PLUS_SUBSCRIBE_10Y_URL, + monthlyPrice: 833, + }, +}; + +function OfferDetails({ + offerDetails, + period, +}: { + offerDetails: OfferDetailsProps; + period: Period; +}) { + const discounted = period === Period.Year; + const { subscriptionType, ctaLink, monthlyPrice } = + period === Period.Year && offerDetails.id !== "core" + ? offerDetails.discounted + : offerDetails.regular; + const userData = useUserData(); + const current = isCurrent(userData, subscriptionType); + const upgrade = canUpgrade(userData, subscriptionType); + const gleanClick = useGleanClick(); + const displayMonthlyPrice = + monthlyPrice && + new Intl.NumberFormat(undefined, { + style: "currency", + currency: offerDetails.currency, + }).format(monthlyPrice / 100); + return ( +
    + +

    {offerDetails.name}

    +
    + {(displayMonthlyPrice && ( +

    + {displayMonthlyPrice} + + /month +
    + + {`Billed ${discounted ? "annually" : "monthly"}`} + +
    +

    + )) || ( +

    + Free +

    + )} + {(current && Current plan) || + (upgrade === null && ( + + gleanClick(`${OFFER_OVERVIEW_CLICK}: ${offerDetails.id}`) + } + > + {offerDetails.cta} + + )) || + (upgrade && ( + + {offerDetails.upgradeCta} + + )) || ( + + Not available + + )} +

    {offerDetails.includes}

    +
      + {offerDetails.features.map(([href, text, sup], index) => ( +
    • + {(href && ( + <> + {" "} + {text} + {sup && {sup}} + + )) || ( + <> + {text} + {sup && {sup}} + + )} +
    • + ))} +
    + + See terms and conditions + +
    +
    + ); +} + +function isCurrent(user: UserData, subscriptionType: SubscriptionType) { + if (!user?.isAuthenticated) { + return false; + } + return user.subscriptionType === subscriptionType; +} + +function canUpgrade(user: UserData, subscriptionType: SubscriptionType) { + if (!user?.isAuthenticated) { + return null; + } + if (!user.isSubscriber || !user.subscriptionType) { + return true; + } + return ( + SUBSCRIPTIONS[user.subscriptionType]?.order < + SUBSCRIPTIONS[subscriptionType]?.order + ); +} + +function getLocalizedPlans(countrySpecific: StripePlans): { + CORE: OfferDetailsProps; + PLUS_5: OfferDetailsProps; + PLUS_10: OfferDetailsProps; +} { + return { + CORE: CORE, + PLUS_5: { + ...PLUS_5, + currency: countrySpecific.currency, + regular: { + ...PLUS_5.regular, + ctaLink: MDN_PLUS_USE_SP3 + ? MDN_PLUS_SUBSCRIBE_5M_URL_SP3 + : `${MDN_PLUS_SUBSCRIBE_BASE}?plan=${countrySpecific.plans["mdn_plus_5m"].id}`, + monthlyPrice: countrySpecific.plans["mdn_plus_5m"].monthlyPriceInCents, + }, + discounted: { + ...PLUS_5.discounted, + ctaLink: MDN_PLUS_USE_SP3 + ? MDN_PLUS_SUBSCRIBE_5Y_URL_SP3 + : `${MDN_PLUS_SUBSCRIBE_BASE}?plan=${countrySpecific.plans["mdn_plus_5y"].id}`, + monthlyPrice: countrySpecific.plans["mdn_plus_5y"].monthlyPriceInCents, + }, + }, + PLUS_10: { + ...PLUS_10, + currency: countrySpecific.currency, + regular: { + ...PLUS_10.regular, + ctaLink: MDN_PLUS_USE_SP3 + ? MDN_PLUS_SUBSCRIBE_10M_URL_SP3 + : `${MDN_PLUS_SUBSCRIBE_BASE}?plan=${countrySpecific.plans["mdn_plus_10m"].id}`, + monthlyPrice: countrySpecific.plans["mdn_plus_10m"].monthlyPriceInCents, + }, + discounted: { + ...PLUS_10.discounted, + ctaLink: MDN_PLUS_USE_SP3 + ? MDN_PLUS_SUBSCRIBE_10Y_URL_SP3 + : `${MDN_PLUS_SUBSCRIBE_BASE}?plan=${countrySpecific.plans["mdn_plus_10y"].id}`, + monthlyPrice: countrySpecific.plans["mdn_plus_10y"].monthlyPriceInCents, + }, + }, + }; +} + +function OfferOverviewSubscribe() { + const userData = useUserData(); + const [offerDetails, setOfferDetails] = useState(null); + const { isOnline } = useOnlineStatus(); + + useEffect(() => { + (async () => { + if (isOnline) { + try { + const plans: StripePlans = await getStripePlans(); + setOfferDetails(getLocalizedPlans(plans)); + } catch (error) { + //Paid subs Not supported by region just display Free subscription + setOfferDetails({ CORE: CORE, PLUS_5: null, PLUS_10: null }); + } + } + })(); + }, [isOnline]); + + const activeSubscription = userData?.subscriptionType; + const activeSubscriptionPeriod = + (activeSubscription && SUBSCRIPTIONS[activeSubscription]?.period) || + Period.Month; + + let [period, setPeriod] = useState(activeSubscriptionPeriod); + const wrapperClass = !isOnline ? "wrapper-offline" : "wrapper"; + + return ( +
    +
    + {!isOnline && ( +

    + You are currently offline. Please go online to view the plans for + MDN Plus +

    + )} + {isOnline && ( + <> + {(offerDetails && ( +

    + Choose a plan + {!activeSubscription && ( + <> + {" "} + or + + )} +

    + )) ||

    Loading available plans…

    } + {offerDetails && + /** Only display discount switch if paid plans available */ + offerDetails.PLUS_5 && ( + { + const period = e.target.checked + ? Period.Year + : Period.Month; + setPeriod(period); + }} + > + Pay yearly and get 2 months for free + + )} + + )} + {offerDetails && ( +
    + + {offerDetails.PLUS_5 && ( + + )} + {offerDetails.PLUS_10 && ( + + )} +
    + )} +
    +

    + * Do you need MDN Plus for your company?{" "} + + Let us know + {" "} + and we’ll get back to you when it becomes available. +

    +
    + ); +} + +export default OfferOverviewSubscribe; diff --git a/vendor/yari/client/src/plus/offer-overview/offer-overview-subscribe/stripe.tsx b/vendor/yari/client/src/plus/offer-overview/offer-overview-subscribe/stripe.tsx new file mode 100644 index 000000000..77c0574f6 --- /dev/null +++ b/vendor/yari/client/src/plus/offer-overview/offer-overview-subscribe/stripe.tsx @@ -0,0 +1,4 @@ +import "@stripe/stripe-js"; +export default function Stripe() { + return <>; +} diff --git a/vendor/yari/client/src/plus/plus-docs/index.scss b/vendor/yari/client/src/plus/plus-docs/index.scss new file mode 100644 index 000000000..b0821ab3b --- /dev/null +++ b/vendor/yari/client/src/plus/plus-docs/index.scss @@ -0,0 +1,52 @@ +@use "../../ui/vars" as *; + +.plus { + .article-actions-container { + display: flex; + } + + .main-page-content { + em { + font-style: normal; + font-variation-settings: normal; + text-decoration: underline; + text-decoration-color: var(--text-link); + text-decoration-thickness: 0.15rem; + text-underline-offset: 0.1em; + } + + h1 { + color: var(--plus-accent-color); + /* MDN/Plus/Type/Overline/S */ + font: 700 12px/120% Inter; + letter-spacing: 1.5px; + text-transform: uppercase; + } + + h1 + blockquote { + border: revert; + border-radius: var(--elem-radius); + color: var(--text-primary); + margin: 1rem 0 2rem; + padding: revert; + + p:first-child { + font: var(--type-heading-h1-mobile); + margin-bottom: 2rem; + + @media (min-width: $screen-md) { + font: var(--type-heading-h1); + } + } + + p { + font-style: italic; + font-variation-settings: "slnt" -10; + } + } + + img { + margin: 2rem 0; + } + } +} diff --git a/vendor/yari/client/src/plus/plus-docs/index.tsx b/vendor/yari/client/src/plus/plus-docs/index.tsx new file mode 100644 index 000000000..76851fe71 --- /dev/null +++ b/vendor/yari/client/src/plus/plus-docs/index.tsx @@ -0,0 +1,108 @@ +import { useParams, useLocation } from "react-router-dom"; +import { MDN_PLUS_TITLE } from "../../constants"; +import StaticPage from "../../homepage/static-page"; +import { useUserData } from "../../user-context"; +import "./index.scss"; +import { useLocale } from "../../hooks"; + +function PlusDocsNav() { + const userData = useUserData(); + return ( + + ); +} + +function RelatedTopics({ + heading = "Related Topics", + items, +}: { + heading: string; + items: { slug: string; title: string }[]; +}) { + const locale = useLocale(); + const { pathname: locationPathname } = useLocation(); + + return ( + + ); +} + +function PlusDocs({ ...props }) { + const locale = useLocale(); + const { "*": slug } = useParams(); + + const sidebarHeader = ; + + return ( + + ); +} + +export default PlusDocs; diff --git a/vendor/yari/client/src/plus/search-filter/index.scss b/vendor/yari/client/src/plus/search-filter/index.scss new file mode 100644 index 000000000..d13125521 --- /dev/null +++ b/vendor/yari/client/src/plus/search-filter/index.scss @@ -0,0 +1,67 @@ +@use "../../ui/vars" as *; + +.search-filter { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + padding: 1rem 0; + + &.inline-on-mobile { + flex-wrap: nowrap; + + .search-filter-category { + width: auto; + } + } + + [type="search"] { + flex: 1; + } +} + +.search-filter-category { + position: relative; + width: calc(50% - 0.25rem); + + > .button, + .dropdown-list { + width: 100%; + } + + .button-wrap { + font-size: var(--type-smaller-font-size); + white-space: nowrap; + } + + .action { + > span:before { + content: "✓"; + } + + &:not(.active-menu-item) > span:before { + visibility: hidden; + } + } +} + +@media (min-width: $screen-md) { + .search-filter { + flex-wrap: nowrap; + } + + .search-filter .submenu { + max-width: max-content; + right: 0; + } + + .search-filter-category, + .search-filter-category .dropdown-list { + width: auto; + } + + .search-filter-category .dropdown-list.filters-menu { + left: auto; + right: 0; + white-space: nowrap; + } +} diff --git a/vendor/yari/client/src/plus/search-filter/index.tsx b/vendor/yari/client/src/plus/search-filter/index.tsx new file mode 100644 index 000000000..19fe7c7e9 --- /dev/null +++ b/vendor/yari/client/src/plus/search-filter/index.tsx @@ -0,0 +1,285 @@ +import React, { useEffect, useState } from "react"; + +import { Button } from "../../ui/atoms/button"; +import { Search } from "../../ui/atoms/search"; +import { Submenu } from "../../ui/molecules/submenu"; + +import "./index.scss"; +import { DropdownMenu, DropdownMenuWrapper } from "../../ui/molecules/dropdown"; +import { useSearchParams } from "react-router-dom"; +import { camelUnwrap } from "../../utils"; + +export type AnyFilter = SelectFilter; + +type SelectFilter = { + type: "select"; + key: string; + label: string; + multiple?: { + encode: (...values: string[]) => string; + decode: (value: string) => string[]; + }; + options: { + label: string; + value: string; + isDefault?: true; + }[]; +}; + +export type AnySort = { label: string; param: string; isDefault?: true }; + +enum Params { + PAGE = "page", + QUERY = "q", +} + +export default function SearchFilter({ + isDisabled = false, + filters = [], + sorts = [], + onChange = (key, newValue, oldValue) => {}, +}: { + isDisabled?: boolean; + filters?: AnyFilter[]; + sorts?: AnySort[]; + onChange?: ( + key: string, + newValue: string | null, + oldValue: string | null + ) => unknown; +}) { + const [searchParams, setSearchParams] = useSearchParams(); + + const [openFilter, setOpenFilter] = useState(null); + const [isSortingOpen, setIsSortingOpen] = useState(false); + const [terms, setTerms] = useState(""); + + useEffect( + () => setTerms(searchParams.get(Params.QUERY) ?? ""), + [searchParams] + ); + + const sortedParams = (params: URLSearchParams): URLSearchParams => + new URLSearchParams( + [...params.entries()].sort(([a], [b]) => a.localeCompare(b)) + ); + + const replaceSearchParam = (key: string, value: string | null) => { + setSearchParams((params) => { + const oldValue = params.get(key); + if (value) { + params.set(key, value); + } else { + params.delete(key); + } + onChange(key, value, oldValue); + params.delete(Params.PAGE); + return sortedParams(params); + }); + }; + + const isDefaultFilter = (key: string, value: string) => { + const filter = filters.find((filter) => filter.key === key) as AnyFilter; + const option = filter.options.find((option) => option.value === value); + return option?.isDefault ?? false; + }; + + const isCurrentFilter = (key: string, value: string) => { + const currentValue = searchParams.get(key) ?? null; + const filter = filters.find((filter) => filter.key === key) as AnyFilter; + + if (filter.multiple) { + const values = + typeof currentValue === "string" + ? filter.multiple.decode(currentValue) + : []; + return values.includes(value); + } else { + return currentValue + ? currentValue === value + : isDefaultFilter(key, value); + } + }; + + const isDefaultSort = (param: string) => { + const sort = sorts.find((sort) => sort.param === param); + return sort?.isDefault ?? false; + }; + + const isCurrentSort = (param: string) => { + const [key, value] = param.split("=", 2); + const currentValue = searchParams.get(key) ?? null; + return currentValue ? currentValue === value : isDefaultSort(param); + }; + + const toggleSelectedFilter = (key: string, value: string) => { + const currentValue = searchParams.get(key) ?? null; + const filter = filters.find((filter) => filter.key === key) as AnyFilter; + let newValue: string | null; + + if (filter.multiple) { + let values = + typeof currentValue === "string" + ? filter.multiple.decode(currentValue) + : []; + if (values.includes(value)) { + values = values.filter((v) => v !== value); + } else { + values = [...values, value].sort(); + } + if (values.length) { + newValue = filter.multiple.encode(...values); + } else { + newValue = null; + } + } else if (isDefaultFilter(key, value)) { + newValue = null; + } else { + newValue = currentValue !== value ? value : null; + } + + replaceSearchParam(key, newValue); + }; + + const toggleSelectedSort = (param: string) => { + const [key, value] = param.split("=", 2); + const newValue = isDefaultSort(param) ? "" : value; + + replaceSearchParam(key, newValue); + }; + + const setSelectedTerms = (newValue: string) => { + replaceSearchParam("q", newValue); + }; + + const filterMenus = filters.map((filter) => ({ + key: filter.key, + label: filter.label, + id: `filters-menu-${filter.key}`, + items: filter.options.map((option) => ({ + component: () => ( + + ), + })), + })); + + const sortMenu = { + label: "Sort", + id: "sort-menu", + items: sorts.map((sort) => ({ + component: () => ( + + ), + })), + }; + + return ( +
    { + event.preventDefault(); + setSelectedTerms(terms); + }} + > + {filterMenus.map((filterMenu) => ( + + setOpenFilter(isOpen ? filterMenu.key : null) + } + > + + + + + + ))} + + + // The updates event list uses `camelWrap()` to insert + // zero-width spaces, so we `camelUnwrap()` them here. + // Otherwise we would not find a copy-pasted feature. + setSelectedTerms(camelUnwrap(terms)) + } + onChangeHandler={(e) => setTerms(e.target.value)} + onResetHandler={() => { + setTerms(""); + setSelectedTerms(""); + }} + /> + + {sorts.length ? ( + + + + + + + ) : null} + + ); +} diff --git a/vendor/yari/client/src/plus/updates/api.ts b/vendor/yari/client/src/plus/updates/api.ts new file mode 100644 index 000000000..2004b40a0 --- /dev/null +++ b/vendor/yari/client/src/plus/updates/api.ts @@ -0,0 +1,128 @@ +import useSWR from "swr"; +import { useSearchParams } from "react-router-dom"; +import { useUserData } from "../../user-context"; +import { BCD_BASE_URL } from "../../env"; + +export interface Event { + path: string; + compat: { + mdn_url?: string; + source_file: string; + spec_url?: string[]; + status: { + deprecated: boolean; + experimental: boolean; + standard_track: boolean; + }; + engines: string[]; + }; +} + +export interface Group { + browser: string; + version: string; + release_date: string; + engine: string; + engine_version: string; + release_notes: string[]; + status: string; + name: string; + events: { + added: Event[]; + removed: Event[]; + }; +} + +interface Page { + data: Group[]; + last: number; +} + +function composeUrl({ + isAuthenticated, + searchParams, +}: { + isAuthenticated: boolean; + searchParams: URLSearchParams; +}): string { + let url = "/api/v2/updates/"; + let params = new URLSearchParams(); + + for (const [key, value] of searchParams.entries()) { + switch (key) { + case "page": + params.set(key, value); + break; + + case "collections": + if (isAuthenticated) { + // Different endpoint for uncached personalized data. + url += "collections/"; + params.set(key, value); + } + break; + + default: + if (isAuthenticated) { + params.set(key, value); + } + break; + } + } + + if ([...params.keys()].length) { + url += `?${params.toString()}`; + } + + return url; +} + +export function useUpdates() { + const user = useUserData(); + const [searchParams] = useSearchParams(); + + const url = composeUrl({ + isAuthenticated: user?.isAuthenticated || false, + searchParams, + }); + + return useSWR( + url, + async (key) => { + const res = await fetch(key); + if (res.ok) { + return (await res.json()) as Page; + } + if (res.status === 404) { + return; + } + throw new Error(`${res.status}: ${res.statusText}`); + }, + { + revalidateOnFocus: false, + revalidateIfStale: false, + revalidateOnReconnect: false, + } + ); +} + +export function useBCD(path: string) { + return useSWR( + `${BCD_BASE_URL}/bcd/api/v0/current/${path}.json`, + async (key) => { + const res = await fetch(key); + if (res.ok) { + return await res.json(); + } + if (res.status === 404) { + return; + } + throw new Error(`${res.status}: ${res.statusText}`); + }, + { + revalidateOnFocus: false, + revalidateIfStale: false, + revalidateOnReconnect: false, + } + ); +} diff --git a/vendor/yari/client/src/plus/updates/index.scss b/vendor/yari/client/src/plus/updates/index.scss new file mode 100644 index 000000000..d5c614bdf --- /dev/null +++ b/vendor/yari/client/src/plus/updates/index.scss @@ -0,0 +1,200 @@ +@use "../../ui/vars" as *; + +.updates { + > header { + --plus-header: var(--updates-header); + --plus-mandala: var(--updates-mandala); + --plus-icon: var(--updates-icon); + --plus-link: var(--updates-link); + } + + .reset-filters { + --button-action-transform: none; + + .button-wrap { + font-size: var(--type-smaller-font-size); + font-weight: 400; + } + + .button-wrap:before { + content: "✖️"; + } + } + + .group { + background: var(--background-secondary); + border-radius: 0.25rem; + display: flex; + flex-direction: column; + gap: 1rem; + margin: 1rem 0; + padding: 1rem; + + header { + align-items: center; + color: var(--text-primary); + display: flex; + flex-wrap: wrap; + font-weight: 500; + gap: 0.5rem; + letter-spacing: var(--header-letter-spacing); + line-height: 175%; + + .icon { + background: var(--text-secondary); + height: 1.25rem; + width: 1.25rem; + } + + .number-badge { + background: #{$mdn-color-light-theme-blue-10}; + border-radius: 0.25rem; + color: #{$mdn-color-light-theme-blue-70}; + font-size: 0.75rem; + font-weight: 700; + letter-spacing: 0.0938rem; + line-height: 120%; + padding: 0.25rem 0.5rem; + text-transform: uppercase; + } + + time { + color: var(--text-secondary); + font-size: var(--type-tiny-font-size); + margin-left: auto; + } + } + } + + details { + background: var(--background-primary); + border-radius: 0.25rem; + box-shadow: inset 0.25rem 0 0 var(--category-color-engage); + + &[open] { + summary .icon-chevron { + transform: rotate(180deg); + } + } + + summary { + align-items: center; + color: var(--text-secondary); + cursor: pointer; + display: flex; + flex-wrap: wrap; + font-size: 0.875rem; + font-weight: 500; + letter-spacing: var(--header-letter-spacing); + line-height: 175%; + list-style: none; + padding: 0.5rem 1rem; + padding-right: 3rem; + position: relative; + + &::-webkit-details-marker { + // remove arrow from older versions of safari + display: none; + } + + code { + border-radius: 0.25rem; + color: var(--text-primary); + font-size: 0.875rem; + font-weight: 400; + letter-spacing: 0; + line-height: 150%; + margin-right: 0.5rem; + overflow-wrap: anywhere; + padding: 0.25rem 0.25rem 0.125rem; + } + + i { + font-size: var(--type-tiny-font-size); + margin-right: 1rem; + } + + .status-added { + background-color: var(--background-success); + + &:before { + content: "✓"; + padding-right: 0.25rem; + } + } + + .status-removed { + background-color: var(--background-critical); + + &:before { + content: "✗"; + padding-right: 0.25rem; + } + } + + .status { + margin-left: auto; + + svg { + margin-right: 0.75rem; + + circle { + fill: #{$mdn-color-neutral-20}; + + &.active { + fill: #{$mdn-color-light-theme-green-40}; + } + } + } + } + + .icon-chevron { + position: absolute; + right: 1rem; + } + } + + > div { + display: flex; + flex-direction: column; + gap: 1rem; + padding: 0.5rem 1rem; + + > nav { + --button-action-transform: none; + --article-actions-position-left: 0; + align-items: baseline; + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + + > div { + position: relative; + } + } + + .table-container { + margin: 0; + width: auto; + + &-inner { + padding: 0; + } + } + + .bc-github-link, + .bc-legend { + display: none; + } + + .bc-table { + margin: 0; + } + } + } + + .pagination { + flex-wrap: wrap; + padding-top: 0; + } +} diff --git a/vendor/yari/client/src/plus/updates/index.tsx b/vendor/yari/client/src/plus/updates/index.tsx new file mode 100644 index 000000000..ebb664a5a --- /dev/null +++ b/vendor/yari/client/src/plus/updates/index.tsx @@ -0,0 +1,417 @@ +import Container from "../../ui/atoms/container"; + +import useSWR from "swr"; +import { DocMetadata } from "../../../../libs/types/document"; +import { FeatureId, MDN_PLUS_TITLE } from "../../constants"; +import { useLocale, useScrollToTop, useViewedState } from "../../hooks"; +import { Button } from "../../ui/atoms/button"; +import { Icon } from "../../ui/atoms/icon"; +import { Loading } from "../../ui/atoms/loading"; +import Mandala from "../../ui/molecules/mandala"; +import { Paginator } from "../../ui/molecules/paginator"; +import BookmarkMenu from "../../ui/organisms/article-actions/bookmark-menu"; +import { useUserData } from "../../user-context"; +import { camelWrap, range } from "../../utils"; +import { Event, Group, useUpdates } from "./api"; +import "./index.scss"; +import { useGleanClick } from "../../telemetry/glean-context"; +import { PLUS_UPDATES } from "../../telemetry/constants"; +import SearchFilter, { AnyFilter, AnySort } from "../search-filter"; +import { useEffect, useState } from "react"; +import { useSearchParams } from "react-router-dom"; +import { DataError } from "../common"; +import { useCollections } from "../collections/api"; +import React from "react"; + +const LazyCompatTable = React.lazy( + () => import("../../lit/compat/lazy-compat-table.js") +); + +type EventWithStatus = Event & { status: Status }; +type Status = "added" | "removed"; + +const CATEGORY_TO_NAME = { + api: "Web APIs", + css: "CSS", + html: "HTML", + http: "HTTP", + javascript: "JavaScript", + mathml: "MathML", + svg: "SVG", + webdriver: "WebDriver", + webextensions: "Web Extensions", +}; + +// At some point, these should come from the API +// or from @mdn/browser-compat-data directly. +const BROWSERS = { + chrome: "Chrome", + chrome_android: "Chrome Android", + deno: "Deno", + edge: "Edge", + firefox: "Firefox", + firefox_android: "Firefox for Android", + ie: "Internet Explorer", + nodejs: "Node.js", + opera: "Opera", + opera_android: "Opera Android", + safari: "Safari", + safari_ios: "Safari on iOS", + samsunginternet_android: "Samsung Internet", + webview_android: "WebView Android", +}; + +const FILTERS: AnyFilter[] = [ + { + type: "select", + multiple: { + encode: (...values: string[]) => values.join(","), + decode: (value: string) => value.split(","), + }, + label: "Browser", + key: "browsers", + options: Object.entries(BROWSERS).map(([value, label]) => ({ + label, + value, + })), + }, + { + type: "select", + multiple: { + encode: (...values: string[]) => values.join(","), + decode: (value: string) => value.split(","), + }, + label: "Category", + key: "category", + options: Object.entries(CATEGORY_TO_NAME) + .sort(([, a], [, b]) => a.localeCompare(b)) + .map(([value, label]) => ({ + label, + value, + })), + }, + { + type: "select", + label: "Collections", + key: "collections", + multiple: { + encode: (...values: string[]) => values.join(","), + decode: (value: string) => value.split(","), + }, + options: [], + }, +]; + +const SORTS: AnySort[] = [ + { + label: "Newest", + param: "sort=desc", + isDefault: true, + }, + { + label: "Oldest", + param: "sort=asc", + }, +]; + +export default function Updates() { + return ; +} + +const useFilters = (canFilter: boolean) => { + const [filters, setFilters] = useState(FILTERS); + const { data, isLoading, error } = useCollections(); + useEffect(() => { + if (!isLoading && data?.length && !error) { + setFilters((old) => + old.map((val) => { + if (val.key === "collections") { + return { + ...val, + options: data + ?.filter((collection) => collection.article_count > 0) + .map((info) => { + const label = + info.name === "Default" ? "Saved Articles" : info.name; + return { + label, + value: info.id, + }; + }), + }; + } else { + return val; + } + }) + ); + } + }, [isLoading, canFilter, data, error]); + return filters; +}; + +function UpdatesLayout() { + document.title = `Updates | ${MDN_PLUS_TITLE}`; + useScrollToTop(); + const user = useUserData(); + const { data, error } = useUpdates(); + const gleanClick = useGleanClick(); + const [searchParams, setSearchParams] = useSearchParams(); + const { setViewed } = useViewedState(); + useEffect(() => setViewed(FeatureId.PLUS_UPDATES_V2)); + + const hasFilters = [...searchParams.keys()].some((key) => key !== "page"); + + const canFilter = user?.isAuthenticated === true; + const filters = useFilters(canFilter); + + return ( +
    +
    + +

    +
    + + +
    + Updates +

    +

    + Stay up-to-date with the latest browser features. +
    + + We'd love to hear your feedback! + +

    +
    +
    + + {canFilter && ( + + gleanClick( + `${PLUS_UPDATES.FILTER_CHANGE}_${key}: ${ + oldValue ?? "(default)" + } -> ${newValue ?? "(default)"}` + ) + } + /> + )} + + {canFilter && hasFilters && ( + + )} + + {error && } + + {data ? ( + <> + {data.data.length ? ( + data.data.map((group) => ( + + )) + ) : ( +
    + {hasFilters + ? "No updates match your filters." + : "No updates found."} +
    + )} + + gleanClick(`${PLUS_UPDATES.PAGE_CHANGE}: ${oldPage} -> ${page}`) + } + /> + + ) : ( + + )} +
    +
    + ); +} + +function GroupComponent({ group }: { group: Group }) { + const { release_date, events, browser, version, name } = group; + const length = events.added.length + events.removed.length; + const metadata = { + icon: browserToIconName(browser), + title: `${name} ${version}`, + }; + + const allEvents = [ + ...events.added.map((e) => ({ status: "added", ...e })), + ...events.removed.map((e) => ({ status: "removed", ...e })), + ].sort((a, b) => a.path.localeCompare(b.path)) as EventWithStatus[]; + + return metadata ? ( +
    +
    + + {metadata.title} + + {length} {length === 1 ? "update" : "updates"} + + +
    + {collapseEvents(allEvents).map((event) => ( + + ))} +
    + ) : null; +} + +function collapseEvents(events: T[]): T[] { + return events.filter( + (event) => + events.findIndex( + (e) => e.path === event.path.split(".").slice(0, -1).join(".") + ) === -1 + ); +} + +function EventComponent({ event, status }: { event: Event; status: Status }) { + const [isOpen, setIsOpen] = useState(false); + const [category, ...displayPath] = event.path.split("."); + const engines = event.compat.engines; + const gleanClick = useGleanClick(); + + return ( +
    { + if (target instanceof HTMLDetailsElement) { + setIsOpen(target.open); + const source = target.open + ? PLUS_UPDATES.EVENT_EXPAND + : PLUS_UPDATES.EVENT_COLLAPSE; + gleanClick(source); + } + }} + > + + {camelWrap(displayPath.join("."))} + {CATEGORY_TO_NAME[category]} + + {Boolean(engines.length) && ( + + + {range(0, 3).map((n) => ( + n ? "active" : undefined} + /> + ))} + + + )} + + + {isOpen && } +
    + ); +} + +function EventStatus({ status }: { status: Status }) { + return {status}; +} + +function EventInnerComponent({ + event: { + path, + compat: { mdn_url }, + }, +}: { + event: Event; +}) { + const locale = useLocale(); + return ( +
    + + +
    + ); +} + +function ArticleActions({ path, mdn_url }: { path: string; mdn_url?: string }) { + const userData = useUserData(); + const locale = useLocale(); + const url = mdn_url?.replace("https://developer.mozilla.org", `/${locale}`); + const searchUrl = `/${locale}/search?sort=relevance&locale=en-US${ + locale !== "en-US" ? `&locale=${locale}` : "" + }&q=${encodeURIComponent(path)}`; + const { data: doc } = useSWR( + () => userData?.isAuthenticated && url && `${url}/metadata.json`, + async (url) => { + const response = await fetch(url); + + if (!response.ok) { + throw Error(response.statusText); + } + + return (await response.json()) as DocMetadata; + }, + { + revalidateIfStale: false, + revalidateOnFocus: false, + revalidateOnReconnect: false, + } + ); + + return ( + + ); +} + +function browserToIconName(browser: string) { + if (browser.startsWith("firefox")) { + return "simple-firefox"; + } else if (browser === "webview_android") { + return "webview"; + } else if (browser === "webview_ios") { + return "safari"; + } else { + const browserStart = browser.split("_")[0]; + return browserStart; + } +} diff --git a/vendor/yari/client/src/plus/utils.ts b/vendor/yari/client/src/plus/utils.ts new file mode 100644 index 000000000..3682e07f4 --- /dev/null +++ b/vendor/yari/client/src/plus/utils.ts @@ -0,0 +1,23 @@ +import { useLocation } from "react-router-dom"; +import { useLocale } from "../hooks"; + +/** + * Returns the URL of the Plus product page, or, if we're + * already there, the hash of the "Choose a plan" section. + */ +export function usePlusUrl(): string { + const { pathname } = useLocation(); + const locale = useLocale(); + + function normalizedUrl(url: string): string { + return url.replace(/\/$/, "").toLowerCase(); + } + + let target = `/${locale}/plus`; + + if (normalizedUrl(target) === normalizedUrl(pathname)) { + target += "#subscribe"; + } + + return target; +} diff --git a/vendor/yari/client/src/react-app.d.ts b/vendor/yari/client/src/react-app.d.ts new file mode 100644 index 000000000..20002b3e2 --- /dev/null +++ b/vendor/yari/client/src/react-app.d.ts @@ -0,0 +1,80 @@ +/// +/// +/// + +declare namespace NodeJS { + interface ProcessEnv { + readonly NODE_ENV: "development" | "production" | "test"; + } +} + +declare module "*.avif" { + const src: string; + export default src; +} + +declare module "*.bmp" { + const src: string; + export default src; +} + +declare module "*.gif" { + const src: string; + export default src; +} + +declare module "*.jpg" { + const src: string; + export default src; +} + +declare module "*.jpeg" { + const src: string; + export default src; +} + +declare module "*.mp3" { + const src: string; + export default src; +} + +declare module "*.mp4" { + const src: string; + export default src; +} + +declare module "*.ogg" { + const src: string; + export default src; +} + +declare module "*.png" { + const src: string; + export default src; +} + +declare module "*.webm" { + const src: string; + export default src; +} + +declare module "*.webp" { + const src: string; + export default src; +} + +declare module "*.woff2" { + const src: string; + export default src; +} + +declare module "*.svg" { + import * as React from "react"; + + export const ReactComponent: React.FunctionComponent< + React.SVGProps & { title?: string } + >; + + const src: string; + export default src; +} diff --git a/vendor/yari/client/src/search-utils.ts b/vendor/yari/client/src/search-utils.ts new file mode 100644 index 000000000..5b2e0bcce --- /dev/null +++ b/vendor/yari/client/src/search-utils.ts @@ -0,0 +1,40 @@ +import React, { useEffect } from "react"; + +export type SearchProps = { + id: string; + inputValue: string; + onChangeInputValue: (value: string) => void; + isFocused: boolean; + onChangeIsFocused: (isFocused: boolean) => void; + placeholder?: string; +}; + +export function useFocusViaKeyboard( + inputRef: React.RefObject +) { + useEffect(() => { + function focusOnSearchMaybe(event: KeyboardEvent) { + const input = inputRef.current; + const target = event.composedPath()?.[0] || event.target; + const keyPressed = event.key; + const ctrlOrMetaPressed = event.ctrlKey || event.metaKey; + const isSlash = keyPressed === "/" && !ctrlOrMetaPressed; + const isCtrlK = + keyPressed === "k" && ctrlOrMetaPressed && !event.shiftKey; + const isTextField = + target instanceof HTMLElement && + (["TEXTAREA", "INPUT"].includes(target.tagName) || + target.isContentEditable); + if ((isSlash || isCtrlK) && !isTextField) { + if (input && document.activeElement !== input) { + event.preventDefault(); + input.focus(); + } + } + } + document.addEventListener("keydown", focusOnSearchMaybe); + return () => { + document.removeEventListener("keydown", focusOnSearchMaybe); + }; + }, [inputRef]); +} diff --git a/vendor/yari/client/src/search.tsx b/vendor/yari/client/src/search.tsx new file mode 100644 index 000000000..c89894e78 --- /dev/null +++ b/vendor/yari/client/src/search.tsx @@ -0,0 +1,562 @@ +import React, { useEffect, useMemo, useRef, useState } from "react"; +import { useCombobox } from "downshift"; +import useSWR from "swr"; + +import { preload, preloadSupported } from "./document/preloading"; + +import { Button } from "./ui/atoms/button"; + +import { useLocale } from "./hooks"; +import { SearchProps, useFocusViaKeyboard } from "./search-utils"; +import { useGleanClick } from "./telemetry/glean-context"; +import { splitQuery } from "./utils"; + +const PRELOAD_WAIT_MS = 500; +const SHOW_INDEXING_AFTER_MS = 500; + +type Item = { + url: string; + title: string; +}; + +type FlexItem = [index: number, title: string, slugTail: string]; + +type SearchIndex = { + flex: FlexItem[]; + items: null | Item[]; +}; + +type ResultItem = { + title: string; + url: string; + positions: Set; +}; + +function quicksearchPing(input: string) { + return `quick-search: ${input}`; +} + +function useSearchIndex(): readonly [ + null | SearchIndex, + null | Error, + () => void, +] { + const [shouldInitialize, setShouldInitialize] = useState(false); + const [searchIndex, setSearchIndex] = useState(null); + // Default to 'en-US' if you're on the home page without the locale prefix. + const locale = useLocale(); + + const url = `/${locale}/search-index.json`; + + const { error, data } = useSWR( + shouldInitialize ? url : null, + async (url: string) => { + const response = await fetch(url); + if (!response.ok) { + throw new Error(await response.text()); + } + return await response.json(); + }, + { revalidateOnFocus: false } + ); + + useEffect(() => { + if (!data) { + return; + } + const gather = async () => { + const flex = data.map( + ({ title, url }, i): FlexItem => [ + i, + title.toLowerCase(), + (url.split("/").pop() as string).toLowerCase(), + ] + ); + + setSearchIndex({ + flex, + items: data, + }); + }; + gather(); + }, [shouldInitialize, data]); + + return useMemo( + () => [searchIndex, error || null, () => setShouldInitialize(true)], + [searchIndex, error, setShouldInitialize] + ); +} + +function HighlightMatch({ title, q }: { title: string; q: string }) { + // Split on highlight term and include term into parts, ignore case. + const words = splitQuery(q); + // $& means the whole matched string + const regexWords = words.map((s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")); + const regex = regexWords.map((word) => `(${word})`).join("|"); + const parts = title.split(new RegExp(regex, "gi")); + return ( + + {parts.filter(Boolean).map((part, i) => { + const key = `${part}:${i}`; + if (words.includes(part.toLowerCase())) { + return {part}; + } else { + return {part}; + } + })} + + ); +} + +function BreadcrumbURI({ + uri, + positions, +}: { + uri: string; + positions?: Set; +}) { + if (positions && positions.size) { + const chars = uri.split(""); + return ( + + {chars.map((char, i) => { + if (positions.has(i)) { + return {char}; + } else { + return {char}; + } + })} + + ); + } + const keep = uri + .split("/") + .slice(1) + .filter((p) => p !== "docs"); + return {keep.join(" / ")}; +} + +type InnerSearchNavigateWidgetProps = SearchProps & { + defaultSelection: [number, number]; +}; + +function useHasNotChangedFor(value: string, ms: number) { + const [hasNotChanged, setHasNotChanged] = useState(false); + const previousValue = useRef(value); + + useEffect(() => { + if (previousValue.current === value) { + return; + } + previousValue.current = value; + setHasNotChanged(false); + // while timeouts are not accurate for counting time there error is only + // upwards, meaning they might trigger after more time than specified, + // which is fine in this case + const timeout = setTimeout(() => { + setHasNotChanged(true); + }, ms); + return () => { + clearTimeout(timeout); + }; + }, [value, ms]); + + return hasNotChanged; +} + +function InnerSearchNavigateWidget(props: InnerSearchNavigateWidgetProps) { + const { + id, + inputValue, + placeholder, + onChangeInputValue, + isFocused, + onChangeIsFocused, + defaultSelection, + } = props; + + const formId = `${id}-form`; + const locale = useLocale(); + const gleanClick = useGleanClick(); + + const [searchIndex, searchIndexError, initializeSearchIndex] = + useSearchIndex(); + + const inputRef = useRef(null); + const formRef = useRef(null); + const isSelectionInitialized = useRef(false); + + const showIndexing = useHasNotChangedFor(inputValue, SHOW_INDEXING_AFTER_MS); + + useEffect(() => { + if (!inputRef.current || isSelectionInitialized.current) { + return; + } + if (isFocused) { + inputRef.current.selectionStart = defaultSelection[0]; + inputRef.current.selectionEnd = defaultSelection[1]; + } + isSelectionInitialized.current = true; + }, [isFocused, defaultSelection]); + + const resultItems: ResultItem[] = useMemo(() => { + if (!searchIndex || !inputValue || searchIndexError) { + // This can happen if the initialization hasn't completed yet or + // completed un-successfully. + return []; + } + + // The iPhone X series is 812px high. + // If the window isn't very high, show fewer matches so that the + // overlaying search results don't trigger a scroll. + const limit = window.innerHeight < 850 ? 5 : 10; + + const inputValueLC = inputValue.toLowerCase().trim(); + const q = splitQuery(inputValue); + const indexResults = searchIndex.flex + .filter(([_, title]) => q.every((q) => title.includes(q))) + .map(([index, title, slugTail]) => { + const exact = Number([title, slugTail].includes(inputValueLC)); + return [exact, index]; + }) + .sort(([aExact], [bExact]) => bExact - aExact) // Boost exact matches. + .map(([_, i]) => i) + .slice(0, limit); + + return indexResults.map( + (index: number) => (searchIndex.items || [])[index] as ResultItem + ); + }, [inputValue, searchIndex, searchIndexError]); + + const formAction = `/${locale}/search`; + const searchPath = useMemo(() => { + const sp = new URLSearchParams(); + sp.set("q", inputValue.trim()); + return `${formAction}?${sp.toString()}`; + }, [formAction, inputValue]); + + const nothingFoundItem = useMemo( + () => ({ url: searchPath, title: "", positions: new Set() }), + [searchPath] + ); + + const onlineSearch = useMemo( + () => ({ url: searchPath, title: "", positions: new Set() }), + [searchPath] + ); + + const resultClick: React.MouseEventHandler = () => { + gleanClick(quicksearchPing(`${id} -> ${inputValue}`)); + }; + + const { + getInputProps, + getItemProps, + getMenuProps, + + highlightedIndex, + isOpen, + + reset, + toggleMenu, + } = useCombobox({ + id: id, + items: + resultItems.length === 0 + ? [nothingFoundItem] + : [...resultItems, onlineSearch], + inputValue, + isOpen: isFocused, + defaultIsOpen: isFocused, + defaultHighlightedIndex: 0, + stateReducer: (state, { type, changes }) => { + // https://github.com/downshift-js/downshift/tree/v7.6.0/src/hooks/useCombobox#statereducer + // this prevents the menu from being closed when the user selects an item with 'Enter' or mouse + switch (type) { + case useCombobox.stateChangeTypes.InputKeyDownEnter: + case useCombobox.stateChangeTypes.ItemClick: + return { + ...changes, // default Downshift new state changes on item selection. + isOpen: state.isOpen, // but keep menu open. + highlightedIndex: state.highlightedIndex, // with the item highlighted. + }; + default: + return changes; // otherwise business as usual. + } + }, + }); + + useFocusViaKeyboard(inputRef); + + useEffect(() => { + if (isFocused) { + initializeSearchIndex(); + onChangeIsFocused(true); + inputRef.current?.focus(); + } + }, [initializeSearchIndex, isFocused, onChangeIsFocused]); + + const [resultsWithHighlighting, setResultsWithHighlighting] = useState( + [] + ); + + useEffect(() => { + const item = resultItems[highlightedIndex]; + if (item && preloadSupported()) { + const timeout = setTimeout(() => { + preload(`${item.url}`); + }, PRELOAD_WAIT_MS); + return () => { + clearTimeout(timeout); + }; + } + }, [highlightedIndex, resultItems]); + + useEffect(() => { + setResultsWithHighlighting( + resultItems.map((item) => { + return ( + <> + +
    + + + ); + }) + ); + }, [resultItems, inputValue]); + + const [hasChanged, setHasChanged] = useState(false); + + const searchResults = (() => { + if (!isOpen || !inputValue.trim()) { + return null; + } + + if (searchIndexError) { + return ( +
    + Failed to load search index! +
    + ); + } + + if (!searchIndex) { + return showIndexing ? ( +
    + Loading search index... +
    + ) : null; + } + return ( + <> + {resultItems.length === 0 && inputValue !== "/" ? ( + + ) : ( + [ + ...resultItems.map((item, i) => ( + + )), + , + ] + )} + + ); + })(); + + return ( +
    { + // This comes into effect if the input is completely empty and the + // user hits Enter, which triggers the native form submission. + // When something *is* entered, the onKeyDown event is triggered + // on the and within that handler you can + // access `event.key === 'Enter'` as a signal to submit the form. + if (!inputValue.trim()) { + e.preventDefault(); + } + }} + onFocus={() => onChangeIsFocused(true)} + onBlur={(e) => { + if (!e.currentTarget.contains(e.relatedTarget)) { + // focus has moved outside of container + onChangeIsFocused(false); + } + }} + > + + + ( + `#${id}-item-${highlightedIndex} a` + ) + ?.dispatchEvent( + new MouseEvent("click", { + // so react receives the event: + bubbles: true, + // we attempt to pass modifier keys through + // but browser support is incredibly varied: + ctrlKey, + shiftKey, + altKey, + metaKey, + }) + ); + } + } + }, + onChange(event) { + if (event.target instanceof HTMLInputElement) { + onChangeInputValue(event.target.value); + if (!hasChanged) { + gleanClick(`quick-search-change: ${id}`); + setHasChanged(true); + } + } + }, + ref: (input) => { + inputRef.current = input; + }, + placeholder: placeholder ?? "   ", + required: true, + })} + /> + + + + + +
    + {searchResults &&
    {searchResults}
    } +
    +
    + ); +} + +class SearchErrorBoundary extends React.Component<{ + children?: React.ReactNode; +}> { + state = { hasError: false }; + + static getDerivedStateFromError(error: Error) { + console.error("There was an error while trying to render search", error); + return { hasError: true }; + } + render() { + return this.state.hasError ? ( +
    Error while rendering search. Check console for details.
    + ) : ( + this.props.children + ); + } +} + +export default function SearchNavigateWidget(props) { + return ( + + + + ); +} diff --git a/vendor/yari/client/src/settings/ai-help.tsx b/vendor/yari/client/src/settings/ai-help.tsx new file mode 100644 index 000000000..9774181a2 --- /dev/null +++ b/vendor/yari/client/src/settings/ai-help.tsx @@ -0,0 +1,100 @@ +import { useState } from "react"; +import { toggleAIHelpHistory } from "../plus/common/api"; +import { SETTINGS } from "../telemetry/constants"; +import { useGleanClick } from "../telemetry/glean-context"; +import { Spinner } from "../ui/atoms/spinner"; +import { Switch } from "../ui/atoms/switch"; +import { useUserData } from "../user-context"; +import { useAIHelpSettings } from "../plus/ai-help/utils"; + +export function ManageAIHelp() { + const [saving, setSaving] = useState(false); + const user = useUserData(); + const { isHistoryEnabled } = useAIHelpSettings(); + const gleanClick = useGleanClick(); + + return ( +
    +

    AI Help

    +
      +
    • +
      +

      Enable History

      +
      + +

      + By Enabling History you allow us to securely store all your + chat conversations for a period of up to six months. Please + note that after six months, your chat history will be + automatically deleted to maintain your privacy and data + security. +

      +

      + Disabling History will conceal your current history and + prevent any new items from being saved, without deleting what + exists. +

      +
      + {saving ? ( + + ) : ( + { + setSaving(true); + const { checked } = e.target; + const source = `${SETTINGS}: ai_help history toggle -> ${Number( + checked + )}`; + gleanClick(source); + await toggleAIHelpHistory(checked); + if (user?.settings) { + user.settings.aiHelpHistory = checked; + } + user?.mutate?.(); + setSaving(false); + }} + > + )} +
      +
      +
    • +
    • +
      +

      Delete History

      +
      + + Clicking on Delete History will permanently erase all of your AI + Help saved history. + + +
      +
      +
    • +
    +
    + ); +} diff --git a/vendor/yari/client/src/settings/clear.tsx b/vendor/yari/client/src/settings/clear.tsx new file mode 100644 index 000000000..d1248c903 --- /dev/null +++ b/vendor/yari/client/src/settings/clear.tsx @@ -0,0 +1,30 @@ +import { ContentStatus, ContentStatusPhase } from "./db"; + +export default function ClearButton({ + updateStatus, + clear, + disabled = false, +}: { + updateStatus: ContentStatus | null; + clear: () => void; + disabled?: boolean; +}) { + let button; + if (updateStatus?.phase === ContentStatusPhase.IDLE && updateStatus?.local) { + button = ( + + ); + } else if (updateStatus?.phase === ContentStatusPhase.CLEAR) { + button = ; + } else { + button = ( + + ); + } + + return <>{button}; +} diff --git a/vendor/yari/client/src/settings/db.ts b/vendor/yari/client/src/settings/db.ts new file mode 100644 index 000000000..3a2696c9f --- /dev/null +++ b/vendor/yari/client/src/settings/db.ts @@ -0,0 +1,131 @@ +// WARNING - This file is duplicated at two locations: +// - client/pwa/src/db.ts +// - client/src/settings/db.ts +// Until we find a solution, keep both files in sync. + +import Dexie from "dexie"; + +export enum SwType { + PreferOnline = "PreferOnline", + PreferOffline = "PreferOffline", +} + +export interface PlusSettings { + col_in_search: boolean; +} + +export interface Whoami { + id?: number; + username: string; + is_authenticated: boolean; + email: string; + avatar_url: string; + is_subscriber: boolean; + settings: PlusSettings | null; +} + +export enum ContentStatusPhase { + INITIAL = "initial", + IDLE = "idle", + DOWNLOAD = "download", + UNPACK = "unpack", + CLEAR = "clear", +} + +export interface LocalContentStatus { + version: string; + date: string; +} + +export interface RemoteContentStatus { + date: string; + latest: string; + updates: [string]; +} + +export interface ContentStatus { + id?: number; + phase: ContentStatusPhase; + local: LocalContentStatus | null; + remote: RemoteContentStatus | null; + progress: number | null; + timestamp: Date; +} + +export class MDNOfflineDB extends Dexie { + // Declare implicit table properties. + // (just to inform Typescript. Instantiated by Dexie in stores() method) + whoami!: Dexie.Table; // number = type of the primkey + contentStatusHistory!: Dexie.Table; + + constructor() { + super("MDNOfflineDB"); + this.version(1).stores({ + whoami: + "++, username, is_authenticated, email, avatar_url, is_subscriber", + collections: "url, title, created", + watched: "url, title, path", + notifications: "id, title, text, url, created, read, starred", + }); + this.version(2).stores({ + contentStatusHistory: "++id", + }); + this.version(3).stores({ + whoami: + "++, username, is_authenticated, email, avatar_url, is_subscriber, settings", + }); + // We can drop the tables only after we stop using thing in the sw + /* + this.version(4).stores({ + collections: null, + watched: null, + notifications: null, + }); + */ + } +} + +export const offlineDb = new MDNOfflineDB(); + +export async function getContentStatus(): Promise { + const current = await offlineDb.contentStatusHistory.toCollection().last(); + + return ( + current || { + phase: ContentStatusPhase.INITIAL, + local: null, + remote: null, + progress: null, + timestamp: new Date(), + } + ); +} + +export async function patchContentStatus( + changes: Omit, "id" | "timestamp"> +) { + const db = offlineDb; + const table = db.contentStatusHistory; + + await db.transaction("rw", table, async () => { + const oldStatus = await getContentStatus(); + const newStatus = { + ...oldStatus, + ...changes, + id: undefined, + timestamp: new Date(), + }; + + if (oldStatus.phase === ContentStatusPhase.INITIAL && !changes.phase) { + newStatus.phase = ContentStatusPhase.IDLE; + } + + if (oldStatus.id && oldStatus.phase === newStatus.phase) { + await table.update(oldStatus.id, newStatus); + } else { + await table.add(newStatus); + // Keep latest entries for debugging. + await table.reverse().offset(100).delete(); + } + }); +} diff --git a/vendor/yari/client/src/settings/index.scss b/vendor/yari/client/src/settings/index.scss new file mode 100644 index 000000000..761e6f04f --- /dev/null +++ b/vendor/yari/client/src/settings/index.scss @@ -0,0 +1,106 @@ +@use "../ui/vars" as *; + +article.settings { + display: block; + margin: auto; + max-width: 60em; + padding: 1rem; + width: min(90vw, 40em); + + h3 { + margin-top: 0; + } + + section { + padding: 1rem; + + &.field-group, + &.setting-row { + padding: 0; + } + } + + .field-group { + ul { + padding: 0; + + li { + display: grid; + gap: 0 1rem; + grid-template-columns: 1fr 5em; + + section { + margin: 0.125rem 0; + + &:hover, + &:target { + background-color: var(--background-information); + border-radius: 0.25rem; + } + } + + .setting-row { + align-items: center; + display: flex; + gap: 1rem; + justify-content: space-between; + } + + p { + margin: 0 0 1rem; + + &:first-child { + margin-top: 0; + } + + &:last-child { + margin-bottom: 0; + } + } + + span { + font-size: 0.8rem; + grid-column: 1/2; + line-height: 1.2em; + padding-top: 0.3em; + } + + .loading, + .switch { + align-self: center; + grid-column: 2/3; + grid-row: 1/3; + justify-self: end; + } + + button, + .manage { + align-self: center; + background-color: var(--background-primary); + border: 1px solid var(--text-primary); + border-radius: var(--elem-radius); + color: var(--text-link); + font-size: 0.8rem; + grid-column: 2/3; + grid-row: 1/3; + height: max-content; + justify-self: end; + min-width: 10rem; + padding: 0.5rem 1rem; + text-align: center; + width: max-content; + + &:hover { + background-color: var(--background-secondary); + } + } + + button[disabled] { + background-color: var(--background-secondary); + border: 1px solid var(--text-secondary); + color: var(--text-secondary); + } + } + } + } +} diff --git a/vendor/yari/client/src/settings/index.tsx b/vendor/yari/client/src/settings/index.tsx new file mode 100644 index 000000000..dfe55eb52 --- /dev/null +++ b/vendor/yari/client/src/settings/index.tsx @@ -0,0 +1,29 @@ +import React from "react"; +import { NEWSLETTER_ENABLED } from "../env"; + +import { OfflineStatusBar } from "../ui/molecules/offline-status-bar"; + +import "./index.scss"; +import { Manage } from "./manage"; +import Newsletter from "./newsletter"; +import { ManageAIHelp } from "./ai-help"; +import { useScrollToAnchor } from "../hooks"; + +const OfflineSettings = React.lazy(() => import("./offline-settings")); + +export function Settings() { + const pageTitle = "Settings"; + useScrollToAnchor(); + return ( + <> + +
    +

    {pageTitle}

    + + + {NEWSLETTER_ENABLED && } + +
    + + ); +} diff --git a/vendor/yari/client/src/settings/manage.tsx b/vendor/yari/client/src/settings/manage.tsx new file mode 100644 index 000000000..54ad7344f --- /dev/null +++ b/vendor/yari/client/src/settings/manage.tsx @@ -0,0 +1,113 @@ +import { useState } from "react"; +import { + FXA_MANAGE_SUBSCRIPTIONS_URL, + FXA_SETTINGS_URL, + PLACEMENT_ENABLED, +} from "../env"; +import { toggleNoAds } from "../plus/common/api"; +import { + TOGGLE_PLUS_ADS_FREE_DISABLED, + TOGGLE_PLUS_ADS_FREE_ENABLED, +} from "../telemetry/constants"; +import { useGleanClick } from "../telemetry/glean-context"; +import { Spinner } from "../ui/atoms/spinner"; +import { Switch } from "../ui/atoms/switch"; +import { useUserData } from "../user-context"; +import { isPlusSubscriber } from "../utils"; + +export function Manage() { + const [saving, setSaving] = useState(false); + const user = useUserData(); + const gleanClick = useGleanClick(); + + return ( +
    +

    Manage Account

    +
      + {PLACEMENT_ENABLED && ( +
    • +
      +

      Ad-Free Experience

      +
      + {isPlusSubscriber(user) ? ( + <> + + Opt out of ads on MDN.{" "} + Learn more about MDN ads. + + {saving ? ( + + ) : ( + { + setSaving(true); + const checked = Boolean(e.target.checked); + const source = checked + ? TOGGLE_PLUS_ADS_FREE_ENABLED + : TOGGLE_PLUS_ADS_FREE_DISABLED; + gleanClick(source); + await toggleNoAds(checked); + if (user?.settings) { + user.settings.noAds = checked; + } + user?.mutate(); + setSaving(false); + }} + > + )} + + ) : ( +

      + The ads free feature is only available to MDN Plus + subscribers.{" "} + + Learn more + {" "} + about our plans. +

      + )} +
      +
      +
    • + )} + +
    • +
      +

      Account

      +
      + Manage preferences for your account + + Account + +
      +
      +
    • + {user?.isSubscriber && ( +
    • +
      +

      MDN Plus Subscription

      +
      + Manage your payment details for MDN Plus. + + Subscriptions + +
      +
      +
    • + )} +
    +
    + ); +} diff --git a/vendor/yari/client/src/settings/mdn-worker.tsx b/vendor/yari/client/src/settings/mdn-worker.tsx new file mode 100644 index 000000000..602b845f4 --- /dev/null +++ b/vendor/yari/client/src/settings/mdn-worker.tsx @@ -0,0 +1,174 @@ +import { OfflineSettingsData } from "../user-context"; +import { getContentStatus, SwType, offlineDb } from "./db"; + +export class MDNWorker { + settings: OfflineSettingsData; + registered: boolean; + timeout?: ReturnType | null; + keepAlive: ReturnType | null; + + constructor() { + this.settings = this.offlineSettings(); + this.registered = false; + this.timeout = null; + this.keepAlive = null; + + if (this.settings.autoUpdates) { + this.autoUpdate(); + } + if (this.settings.offline) { + this.enableServiceWorker( + this.settings.preferOnline ? SwType.PreferOnline : SwType.PreferOffline + ); + } else { + this.disableServiceWorker(); + } + } + + autoUpdate() { + console.log("running auto update"); + if (this.timeout) { + clearTimeout(this.timeout); + this.timeout = null; + } + this.update(); + this.timeout = setTimeout(() => this.autoUpdate(), 60 * 60 * 1000); + } + + messageHandler(event: MessageEvent) { + switch (event.data.type) { + case "pong": + console.log("pong"); + break; + default: + console.log("unknown message"); + } + } + + controller(): ServiceWorker | null { + return navigator.serviceWorker.controller; + } + + checkForUpdate(): void { + this.controller()?.postMessage({ type: "checkForUpdate" }); + } + + update() { + this.controller()?.postMessage({ type: "update" }); + } + + swName(type: SwType | null | undefined = null) { + return `/service-worker.js?type=${type ?? SwType.PreferOnline}`; + } + + registerMessageHandler() { + navigator.serviceWorker.addEventListener("message", (e) => + this.messageHandler(e) + ); + } + + async enableServiceWorker(type: SwType) { + if ("serviceWorker" in navigator && !this.registered) { + await navigator.serviceWorker.register(this.swName(type), { + scope: "/", + }); + this.registered = true; + } + this.registerMessageHandler(); + } + + cleanDb() { + offlineDb.delete(); + } + + async disableServiceWorker() { + if ("serviceWorker" in navigator) { + const registration = await navigator.serviceWorker.getRegistration(); + await registration?.unregister(); + this.registered = false; + } + } + + toggleKeepAlive(keepAlive: boolean) { + if (this.keepAlive && !keepAlive) { + console.log("[worker] keepalive -> enabling"); + clearInterval(this.keepAlive); + this.keepAlive = null; + } else if (keepAlive && !this.keepAlive) { + console.log("[worker] keepalive -> disabling"); + this.keepAlive = setInterval( + () => this.controller()?.postMessage({ type: "keepalive" }), + 10000 + ); + } + } + + async status() { + return await getContentStatus(); + } + + offlineSettings(): OfflineSettingsData { + return OfflineSettingsData.read(); + } + + async setOfflineSettings( + settingsData: Partial + ): Promise { + const current = this.offlineSettings(); + + if (!current.offline && settingsData.offline) { + await this.disableServiceWorker(); + await this.enableServiceWorker( + settingsData.preferOnline || current.preferOnline + ? SwType.PreferOnline + : SwType.PreferOffline + ); + } else if ( + "preferOnline" in settingsData && + current.preferOnline !== settingsData.preferOnline + ) { + await this.disableServiceWorker(); + await this.enableServiceWorker( + settingsData.preferOnline ? SwType.PreferOnline : SwType.PreferOffline + ); + } + if (current.offline && settingsData.offline === false) { + await this.disableServiceWorker(); + } + + if (settingsData.autoUpdates === false && this.timeout) { + clearTimeout(this.timeout); + this.timeout = null; + } else if ( + settingsData.autoUpdates === true && + current.autoUpdates === false + ) { + this.autoUpdate(); + } + + this.settings = new OfflineSettingsData({ ...current, ...settingsData }); + this.settings.write(); + return this.settings; + } + + async clearOfflineSettings() { + await this.setOfflineSettings(new OfflineSettingsData()); + } + + async clear() { + this.controller()?.postMessage({ type: "clear" }); + } +} + +declare global { + interface Window { + mdnWorker: MDNWorker; + } +} + +export function getMDNWorker(): MDNWorker { + if (!window.mdnWorker) { + window.mdnWorker = new MDNWorker(); + } + return window.mdnWorker; +} diff --git a/vendor/yari/client/src/settings/newsletter.tsx b/vendor/yari/client/src/settings/newsletter.tsx new file mode 100644 index 000000000..87d5593c6 --- /dev/null +++ b/vendor/yari/client/src/settings/newsletter.tsx @@ -0,0 +1,75 @@ +import { useEffect, useState } from "react"; +import { FeatureId } from "../constants"; +import { useViewedState } from "../hooks"; +import { + getNewsletterSubscription, + toggleNewsletterSubscription, +} from "../plus/common/api"; +import { Spinner } from "../ui/atoms/spinner"; +import { Switch } from "../ui/atoms/switch"; + +export default function Newsletter() { + const [loading, setLoading] = useState(true); + const [enabled, setEnabled] = useState(null); + useEffect(() => { + (async () => { + setEnabled(await getNewsletterSubscription()); + setLoading(false); + })(); + }, []); + const { isViewed, setViewed } = useViewedState(); + if (!isViewed(FeatureId.PLUS_NEWSLETTER)) { + setViewed(FeatureId.PLUS_NEWSLETTER); + } + + return ( +
    +

    Stay updated

    +
      +
    • +
      +

      + MDN Plus Newsletter (Deprecated) +

      +
      + + We're decommissioning our MDN Plus newsletter. + {enabled ? ( + <> + {" "} + If you unsubscribe, you cannot subscribe again.
      + + We will automatically unsubscribe you and purge all + related data soon. + + + ) : ( + <> + )} +
      + {loading ? ( + + ) : enabled ? ( + { + setLoading(true); + setEnabled( + await toggleNewsletterSubscription( + Boolean(e.target.checked) + ) + ); + setLoading(false); + }} + > + ) : ( + <> + )} +
      +
      +
    • +
    +
    + ); +} diff --git a/vendor/yari/client/src/settings/offline-settings.tsx b/vendor/yari/client/src/settings/offline-settings.tsx new file mode 100644 index 000000000..ad4ede2c1 --- /dev/null +++ b/vendor/yari/client/src/settings/offline-settings.tsx @@ -0,0 +1,251 @@ +import { Switch } from "../ui/atoms/switch"; +import { getMDNWorker } from "./mdn-worker"; +import useInterval from "@use-it/interval"; + +import { useEffect, useRef, useState } from "react"; +import UpdateButton from "./update"; +import ClearButton from "./clear"; +import { Spinner } from "../ui/atoms/spinner"; +import { MDN_PLUS_TITLE } from "../constants"; +import { ContentStatus, ContentStatusPhase } from "./db"; +import { OfflineSettingsData, useUserData } from "../user-context"; +import { useLocale } from "../hooks"; +import { + TOGGLE_PLUS_OFFLINE_DISABLED, + TOGGLE_PLUS_OFFLINE_ENABLED, +} from "../telemetry/constants"; +import { useGleanClick } from "../telemetry/glean-context"; + +function displayEstimate({ usage = 0, quota = Infinity }: StorageEstimate) { + const usageInMib = Math.round(usage / (1024 * 1024)); + + return `${usageInMib} MiB`; +} + +export default function OfflineSettings({ ...appProps }) { + const serviceWorkerAvailable = window?.navigator?.serviceWorker; + const user = useUserData(); + const locale = useLocale(); + + return ( +
    +

    Offline Access

    + {user?.isSubscriber ? ( + serviceWorkerAvailable ? ( + + ) : ( + <> +

    Offline mode is unavailable

    {" "} +

    + Please make sure that you are not using a private or incognito + window. +

    + + ) + ) : ( + <> + MDN Offline is only available to MDN Plus subscribers.{" "} + Learn more about our plans. + + )} +
    + ); +} + +function Settings() { + document.title = `Settings | ${MDN_PLUS_TITLE}`; + const [status, setStatus] = useState(); + const [saving, setSaving] = useState(true); + + const [estimate, setEstimate] = useState(null); + const [settings, setSettings] = useState(); + // Workaround to avoid "Error: Too many re-renders." (https://github.com/mdn/yari/pull/5744). + const updateTriggered = useRef(false); + const gleanClick = useGleanClick(); + + useEffect(() => { + const init = async () => { + const mdnWorker = getMDNWorker(); + setSettings(await mdnWorker.offlineSettings()); + setEstimate(await navigator?.storage?.estimate?.()); + mdnWorker.checkForUpdate(); + }; + init().then(() => {}); + }, []); + useEffect(() => { + const init = async () => { + setSaving(false); + }; + init(); + }, [settings]); + + useEffect(() => { + const mdnWorker = getMDNWorker(); + const isWorkerBusy = status?.phase + ? ![ContentStatusPhase.INITIAL, ContentStatusPhase.IDLE].includes( + status?.phase + ) + : false; + mdnWorker.toggleKeepAlive(isWorkerBusy); + + if (isWorkerBusy) { + // Warn when leaving page. + const listener = (e) => { + e.preventDefault(); + e.returnValue = ""; + }; + window.addEventListener("beforeunload", listener); + + return () => window.removeEventListener("beforeunload", listener); + } + }, [status?.phase]); + + const updateSettings = async (change: Partial) => { + setSaving(true); + const mdnWorker = getMDNWorker(); + let newSettings = await mdnWorker.setOfflineSettings(change); + setSettings(newSettings); + }; + + useInterval(async () => { + const mdnWorker = getMDNWorker(); + const next = await mdnWorker.status(); + setStatus({ ...next }); + }, 500); + + const update = () => { + const mdnWorker = getMDNWorker(); + mdnWorker.update(); + setStatus(status); + }; + + const clear = async () => { + if ( + window.confirm("All downloaded content will be removed from your device") + ) { + const mdnWorker = getMDNWorker(); + mdnWorker.clear(); + setStatus(status); + } + }; + + if ( + settings?.autoUpdates && + status?.remote?.latest !== status?.local?.version && + !updateTriggered.current + ) { + update(); + updateTriggered.current = true; + } + + const usage = estimate && displayEstimate(estimate); + return ( +
      +
    • +
      +

      MDN Offline Storage

      +
      + + Enable storage to allow MDN content download for offline reading. + + {(saving === true && ) || ( + { + const source = e.target.checked + ? TOGGLE_PLUS_OFFLINE_ENABLED + : TOGGLE_PLUS_OFFLINE_DISABLED; + gleanClick(source); + updateSettings({ + offline: e.target.checked, + }); + }} + > + )} +
      +
      +
    • + {settings?.offline && ( + <> +
    • +
      +

      Prefer online content

      +
      + + Do not use offline content while connected to the internet + + {(saving === true && ) || ( + + updateSettings({ + preferOnline: e.target.checked, + }) + } + > + )} +
      +
      +
    • +
    • + +
    • +
    • +
      +

      Enable auto-update

      +
      + + Automatically download updates to content enabled for download + + {(saving === true && ) || ( + + updateSettings({ + autoUpdates: e.target.checked, + }) + } + > + )} +
      +
      +
    • + {window?.location.hash === "#debug" && ( +
    • +
      +

      Debug

      + + {JSON.stringify(status, null, 2)} + +
      +
    • + )} + {usage && ( +
    • +
      +

      Storage used

      + + MDN Offline currently uses {usage} + +
      +
    • + )} +
    • + +
    • + + )} +
    + ); +} diff --git a/vendor/yari/client/src/settings/update.tsx b/vendor/yari/client/src/settings/update.tsx new file mode 100644 index 000000000..c89eb9432 --- /dev/null +++ b/vendor/yari/client/src/settings/update.tsx @@ -0,0 +1,96 @@ +import { ContentStatus, ContentStatusPhase } from "./db"; + +export default function UpdateButton({ + updateStatus, + update, + disabled = false, +}: { + updateStatus: ContentStatus | null; + update: () => void; + disabled?: boolean; +}) { + const current = + updateStatus?.local?.date && + `Last updated: ${Intl.DateTimeFormat([], { dateStyle: "medium" }).format( + Date.parse(updateStatus?.local?.date) + )}`; + let button: JSX.Element | null = null; + let info: string | undefined; + + switch (updateStatus?.phase) { + case ContentStatusPhase.INITIAL: + info = "Checking for updates"; + break; + + case ContentStatusPhase.IDLE: + if (updateStatus?.local?.version === updateStatus?.remote?.latest) { + info = "Your content is up to date"; + button = ; + } else { + if (updateStatus?.local) { + info = "Update available"; + button = ( + + ); + } else { + info = + "Start using MDN Offline by downloading the latest version of MDN Web Docs"; + button = ( + + ); + } + } + break; + + case ContentStatusPhase.DOWNLOAD: + if (updateStatus?.local) { + info = "Update in progress…"; + } else { + info = "Download in progress…"; + } + button = ; + break; + + case ContentStatusPhase.UNPACK: + if (updateStatus?.local) { + info = "Update in progress…"; + } else { + info = "Download in progress…"; + } + const progress = (updateStatus?.progress || 0) * 100; + button = ( + + ); + break; + + case ContentStatusPhase.CLEAR: + info = "Clearing…"; + break; + } + + return ( +
    +

    Update status

    +
    + + {current} + {current &&
    } + {info} +
    + {button} +
    +
    + ); +} diff --git a/vendor/yari/client/src/setupProxy.js b/vendor/yari/client/src/setupProxy.js new file mode 100644 index 000000000..acc8617b2 --- /dev/null +++ b/vendor/yari/client/src/setupProxy.js @@ -0,0 +1,37 @@ +import { createProxyMiddleware } from "http-proxy-middleware"; + +const SERVER_PORT = process.env.SERVER_PORT || 5042; + +console.log(`Setting up a Proxy to localhost:${SERVER_PORT}`); + +function config(app) { + const proxy = createProxyMiddleware(["!**/*.hot-update.json"], { + target: `http://localhost:${SERVER_PORT}`, + changeOrigin: true, + }); + app.use("/api", proxy); + app.use("/users", proxy); + app.use("/pong", proxy); + app.use("/pimg", proxy); + app.use("/_+(flaws|translations|open|document)", proxy); + // E.g. search-index.json or index.json + app.use("**/*.json", proxy); + // Always update libs/constant/index.js when adding/removing extensions! + app.use(`**/*.(gif|jpeg|jpg|mp3|mp4|ogg|png|svg|webm|webp|woff2)`, proxy); + // All those root-level images like /favicon-48x48.png + app.use("/*.(png|webp|gif|jpe?g|svg)", proxy); + + const runnerProxy = createProxyMiddleware(["!**/*.hot-update.json"], { + target: `http://localhost:${SERVER_PORT}`, + changeOrigin: true, + onProxyRes: (proxyRes) => { + delete proxyRes.headers["clear-site-data"]; + }, + }); + // Proxy play runner + app.use("**/runner.html", runnerProxy); + // Proxy shared assets + app.use("/shared-assets", proxy); +} + +export default config; diff --git a/vendor/yari/client/src/site-search/form.tsx b/vendor/yari/client/src/site-search/form.tsx new file mode 100644 index 000000000..48cad17ef --- /dev/null +++ b/vendor/yari/client/src/site-search/form.tsx @@ -0,0 +1,100 @@ +import React from "react"; +import { Link, useSearchParams } from "react-router-dom"; + +import { useLocale } from "../hooks"; +import { appendURL } from "./utils"; + +import LANGUAGES_RAW from "../../../libs/languages"; + +const LANGUAGES = new Map( + Object.entries(LANGUAGES_RAW).map(([locale, data]) => { + return [locale.toLowerCase(), data]; + }) +); + +export default function SiteSearchForm() { + const locale = useLocale(); + const [searchParams] = useSearchParams(); + const queryLocales = searchParams.getAll("locale"); + + const showLanguageOptions = locale.toLowerCase() !== "en-us"; + const showAdvancedOptions = showLanguageOptions; + + if (!showAdvancedOptions) { + return null; + } + + return ( +
    + {/* Language only applies if you're browsing in, say, French + and want to search in English too. */} + {showLanguageOptions && ( +
    +

    Language:

    +
      +
    • + {!queryLocales.length || + (queryLocales.length === 1 && + equalLocales(queryLocales, [locale])) ? ( + + {LANGUAGES.get(locale.toLowerCase())?.native} ( + {LANGUAGES.get(locale.toLowerCase())?.English}) + + ) : ( + + {LANGUAGES.get(locale.toLowerCase())?.native} ( + {LANGUAGES.get(locale.toLowerCase())?.English}) + + )} +
    • +
    • + {queryLocales.length && equalLocales(queryLocales, ["en-us"]) ? ( + {LANGUAGES.get("en-us")?.native} + ) : ( + + {LANGUAGES.get("en-us")?.native} + + )} +
    • +
    • + {queryLocales.length === 2 && + equalLocales(queryLocales, [locale, "en-us"]) ? ( + Both + ) : ( + + Both + + )} +
    • +
    +
    + )} +
    + ); +} + +// Return true if two arrays, independent of case and order are equal. +// E.g. `['foo', 'Bar']` is equal to `['bar', 'FoO']` +function equalLocales(list1: string[], list2: string[]) { + if (list1.length !== list2.length) { + return false; + } + const list1LC = list1.map((x) => x.toLowerCase()); + const list2LC = list2.map((x) => x.toLowerCase()); + return list1LC.every((x) => list2LC.includes(x)); +} diff --git a/vendor/yari/client/src/site-search/index.scss b/vendor/yari/client/src/site-search/index.scss new file mode 100644 index 000000000..d86421f29 --- /dev/null +++ b/vendor/yari/client/src/site-search/index.scss @@ -0,0 +1,32 @@ +@use "../ui/vars" as *; + +.query-string { + font-style: italic; + font-variation-settings: "slnt" -10; +} + +.site-search { + display: block; + + .main-content { + @media (max-width: $screen-md) { + display: flex; + flex-direction: column; + padding: 3rem 3rem 0; + } + + article { + display: contents; + } + + .place { + float: right; + padding: 1rem; + @media (max-width: $screen-md) { + align-self: center; + float: none; + order: 4; + } + } + } +} diff --git a/vendor/yari/client/src/site-search/index.tsx b/vendor/yari/client/src/site-search/index.tsx new file mode 100644 index 000000000..c406324e6 --- /dev/null +++ b/vendor/yari/client/src/site-search/index.tsx @@ -0,0 +1,73 @@ +import React from "react"; +import { useSearchParams } from "react-router-dom"; +import { useIsServer } from "../hooks"; +import { Loading } from "../ui/atoms/loading"; +import { MainContentContainer } from "../ui/atoms/page-content"; +import { useGleanClick } from "../telemetry/glean-context"; +import "./index.scss"; +import { SidePlacement } from "../ui/organisms/placement"; +import { CLIENT_SIDE_NAVIGATION } from "../telemetry/constants"; + +const SiteSearchForm = React.lazy(() => import("./form")); +const SearchResults = React.lazy(() => import("./search-results")); + +export function SiteSearch() { + const isServer = useIsServer(); + const gleanClick = useGleanClick(); + const [searchParams] = useSearchParams(); + + const query = searchParams.get("q"); + const page = searchParams.get("page"); + React.useEffect(() => { + if (query) { + let title = `Search: "${query}"`; + if (page && page !== "1") { + title += ` (page ${page})`; + } + document.title = title; + } else { + document.title = "No query, no results."; + } + }, [query, page]); + + const mountCounter = React.useRef(0); + React.useEffect(() => { + if (mountCounter.current > 0) { + const location = window.location.toString(); + gleanClick(`${CLIENT_SIDE_NAVIGATION}: ${location}`); + } + // By counting every time a document is mounted, we can use this to know if + // a client-side navigation happened. + mountCounter.current++; + }, [query, page, gleanClick]); + + return ( +
    + + +
    + {query ? ( +

    + Search results for: {query}{" "} + {page && page !== "1" && `(page ${page})`} +

    + ) : ( + !isServer &&

    No query, no results.

    + )} + + {!isServer && ( + }> + + + )} + + {!isServer && query && ( + }> + + + )} +
    +
    +
    + ); +} diff --git a/vendor/yari/client/src/site-search/search-results.scss b/vendor/yari/client/src/site-search/search-results.scss new file mode 100644 index 000000000..101ac0698 --- /dev/null +++ b/vendor/yari/client/src/site-search/search-results.scss @@ -0,0 +1,144 @@ +@use "sass:color"; +@use "sass:math"; +@use "../ui/vars" as *; + +.search-results { + .highlight, + .summary { + color: var(--text-primary); + display: block; + } + + .highlight { + font-style: italic; + font-variation-settings: "slnt" -10; + } + + .nerd-data { + font-size: 0.8125rem; + margin-left: 1rem; + } +} + +.pagination { + @media (min-width: $screen-md) { + display: flex; + justify-content: space-between; + } + + li { + display: inline; + } + + a { + display: inline-block; + } +} + +.search-results-list { + margin-bottom: 1rem; + + .title { + background-color: inherit; + color: var(--text-primary); + display: inline-block; + margin: 0; + margin-bottom: 0.25rem; + padding: 0; + word-break: break-word; + + a { + &:link, + &:visited { + color: var(--text-primary); + } + } + } + + .search-result-url { + margin-bottom: 0.25rem; + } + + // Used to indicate that a search result link is in a different locale + .locale-indicator { + background-color: var(--background-secondary); + cursor: help; + display: block; + font-size: 0.8125rem; + margin-top: 1rem; + max-width: max-content; + padding: 0.5rem 1rem; + position: relative; + top: -3px; + + @media (max-width: $screen-sm) { + display: inline-block; + margin: 0; + margin-left: 0.25rem; + padding: 1rem; + } + } + + mark { + background: var(--background-mark-yellow); + border-radius: var(--elem-radius); + color: var(--text-primary); + font-style: italic; + font-variation-settings: "slnt" -10; + } +} + +.search-result-entry { + margin: 4rem 0; + word-wrap: break-word; + + @media (max-width: $screen-sm) { + margin-bottom: 2.5rem; + } +} + +.language-options, +.sort-options { + margin-top: 0.5rem; + + h2 { + font-size: 1rem; + margin: 0; + + @media (max-width: $screen-sm) { + display: inline; + } + } + + .language-option-list, + .sort-option-list { + display: inline-block; + + @media (max-width: $screen-sm) { + margin-left: 1rem; + } + + li { + display: inline-block; + padding: 0; + padding-right: 0.25rem; + + &::after { + content: " | "; + display: inline; + } + + &:last-child::after { + display: none; + } + } + } +} + +.search-suggestions { + margin-bottom: 1rem; + + p { + margin-bottom: 0.5rem; + } +} diff --git a/vendor/yari/client/src/site-search/search-results.tsx b/vendor/yari/client/src/site-search/search-results.tsx new file mode 100644 index 000000000..a17e7cea7 --- /dev/null +++ b/vendor/yari/client/src/site-search/search-results.tsx @@ -0,0 +1,462 @@ +import React from "react"; +import { createSearchParams, Link, useSearchParams } from "react-router-dom"; +import useSWR from "swr"; + +import { Loading } from "../ui/atoms/loading"; +import { WRITER_MODE, KUMA_HOST } from "../env"; +import { useLocale } from "../hooks"; +import { appendURL } from "./utils"; +import { Button } from "../ui/atoms/button"; + +import "./search-results.scss"; +import NoteCard from "../ui/molecules/notecards"; + +import LANGUAGES_RAW from "../../../libs/languages"; + +const LANGUAGES = new Map( + Object.entries(LANGUAGES_RAW).map(([locale, data]) => { + return [locale.toLowerCase(), data]; + }) +); + +const SORT_OPTIONS = [ + ["best", "Best"], + ["relevance", "Relevance"], + ["popularity", "Popularity"], +]; + +type Highlight = { + body?: string[]; + title?: string[]; +}; + +interface Document { + mdn_url: string; + locale: string; + title: string; + highlight: Highlight; + summary: string; + score: number; + popularity: number; +} + +type Total = { + value: number; + relation: "eq" | "gt"; +}; + +interface Metadata { + // The time it took Elasticsearch query + took_ms: number; + // The time it took Kuma's API to wrap the Elasticsearch query + api_took_ms: number; + total: Total; +} + +interface Suggestion { + text: string; + total: Total; +} + +interface FormErrorMessage { + message: string; + code: string; +} + +type FormErrors = [{ key: string }, FormErrorMessage[]]; + +class BadRequestError extends Error { + public formErrors: FormErrors; + + constructor(formErrors: FormErrors) { + super(`BadRequestError ${JSON.stringify(formErrors)}`); + this.formErrors = formErrors; + } +} + +class ServerOperationalError extends Error { + public statusCode: number; + + constructor(statusCode: number) { + super(`ServerOperationalError ${statusCode}`); + this.statusCode = statusCode; + } +} + +export default function SearchResults() { + const [searchParams] = useSearchParams(); + const locale = useLocale(); + // A call to `/api/v1/search` will default to mean the same thing as + // a call to `/api/v1/search?locale=en-us`. But if they page you're currently + // on, (e.g. `/ja/search`) we should supply a more explicit default. + const sp = createSearchParams(searchParams); + if (!searchParams.getAll("locale").length) { + // In other words, if it's not explicitly set by the current query string, + // force in the locale based on the current URL (path). + sp.set("locale", locale); + } + const fetchURL = `/api/v1/search?${sp.toString()}`; + + const { data, error } = useSWR( + fetchURL, + async (url) => { + const response = await fetch(url); + if (response.status === 400) { + const badRequest = await response.json(); + throw new BadRequestError(badRequest.errors); + } else if (response.status >= 500) { + throw new ServerOperationalError(response.status); + } else if (!response.ok) { + throw new Error(`${response.status} on ${url}`); + } + + return await response.json(); + }, + { + revalidateOnFocus: process.env.NODE_ENV === "development", + } + ); + + const page = searchParams.get("page"); + const [initialPage, setInitialPage] = React.useState(page); + React.useEffect(() => { + if (page !== initialPage) { + setInitialPage(page); + const resultsElement = document.querySelector("div.site-search"); + if (resultsElement) { + resultsElement.scrollIntoView({ behavior: "smooth" }); + } + } + }, [page, initialPage]); + + if (error) { + if (error instanceof BadRequestError) { + return ( + + + + ); + } + + if (error instanceof ServerOperationalError) { + return ( + + + + ); + } + + return ( + +

    Something else went horribly wrong with the search

    +

    + {error.toString()} +

    +
    + ); + } + + if (data) { + const currentPage = data.metadata.page; + const pageSize = data.metadata.size; + const hitCount = data.metadata.total.value; + + return ( + <> + {/* It only makes sense to display the sorting options if anything was found */} + {hitCount > 1 && } + + + + + + + + ); + } + // else... + return ; +} + +function RemoteSearchWarning() { + if (WRITER_MODE) { + // If you're in WRITER_MODE, the search results will be proxied from a remote + // Kuma and it might be confusing if a writer is wondering why their + // actively worked-on content isn't showing up in searches. + // The default value in the server is not accessible from the react app, + // so it's hardcoded here in the client. + const kumaHost = KUMA_HOST; + return ( + +

    Note!

    +

    + Site-search is proxied to {kumaHost} which means that + some content found doesn't reflect what's in your current branch. +

    +
    + ); + } + return null; +} + +function SortOptions() { + const [searchParams] = useSearchParams(); + const querySort = searchParams.get("sort") || SORT_OPTIONS[0][0]; + return ( +
    +

    Sort by:

    +
      + {SORT_OPTIONS.map(([key, label], i) => { + return ( +
    • + {key === querySort ? ( + label + ) : ( + + {label} + + )} +
    • + ); + })} +
    +
    + ); +} + +function SearchErrorContainer({ children }: { children: React.ReactNode }) { + return ( +
    +

    Search error

    + {children} +
    + ); +} + +function ExplainBadRequestError({ errors }: { errors: FormErrors }) { + return ( + +

    The search didn't work because there were problems with the input.

    +
      + {Object.keys(errors).map((key) => { + const messages: FormErrorMessage[] = errors[key]; + return ( +
    • + {key}{" "} + {messages.map((message) => { + return {message.message}; + })} +
    • + ); + })} +
    +
    + ); +} + +function ExplainServerOperationalError({ statusCode }: { statusCode: number }) { + return ( + +

    The search failed because the server failed to respond.

    +

    + If you're curious, it was a {statusCode} error. +

    +

    + +

    +
    + ); +} + +function Results({ + documents, + metadata, + suggestions, +}: { + documents: Document[]; + metadata: Metadata; + suggestions: Suggestion[]; +}) { + const locale = useLocale(); + const [searchParams] = useSearchParams(); + + return ( +
    +

    + Found in {metadata.took_ms}{" "} + milliseconds. +

    + + {!!suggestions.length && ( +
    +

    Did you mean...

    +
      + {suggestions.map((suggestion) => { + return ( +
    • + + {suggestion.text} + {" "} + +
    • + ); + })} +
    +
    + )} + + +
    + ); +} + +function ShowTotal({ total }: { total: Total }) { + return ( + <> + {total.relation === "gt" && "more than"} {total.value.toLocaleString()}{" "} + {total.value === 1 ? "match" : "matches"} + + ); +} + +function Pagination({ + currentPage, + maxPage, + hitCount, + pageSize, +}: { + currentPage: number; + maxPage: number; + hitCount: number; + pageSize: number; +}) { + const [searchParams] = useSearchParams(); + + if (!hitCount) { + return null; + } + if (hitCount <= pageSize) { + return null; + } + let previousPage: number | null = null; + let nextPage: number | null = null; + if (hitCount > currentPage * pageSize && currentPage < maxPage) { + nextPage = currentPage + 1; + } + if (currentPage > 1) { + previousPage = currentPage - 1; + } + + if (nextPage || previousPage !== null) { + let previousURL = ""; + if (previousPage) { + if (previousPage === 1) { + previousURL = `?${appendURL(searchParams, { + page: undefined, + })}`; + } else { + previousURL = `?${appendURL(searchParams, { + page: `${previousPage}`, + })}`; + } + } + return ( +
      + {previousURL ? ( +
    • + + Previous + +
    • + ) : null}{" "} + {nextPage ? ( +
    • + + Next + +
    • + ) : null} +
    + ); + } + return null; +} diff --git a/vendor/yari/client/src/site-search/utils.tsx b/vendor/yari/client/src/site-search/utils.tsx new file mode 100644 index 000000000..7be8bea00 --- /dev/null +++ b/vendor/yari/client/src/site-search/utils.tsx @@ -0,0 +1,19 @@ +import { createSearchParams, URLSearchParamsInit } from "react-router-dom"; + +export function appendURL( + searchParams: URLSearchParamsInit, + overrides: Record +) { + const sp = createSearchParams(searchParams); + Object.entries(overrides).forEach(([key, value]) => { + if (Array.isArray(value)) { + sp.delete(key); + value.forEach((v) => sp.append(key, v)); + } else if (value === undefined) { + sp.delete(key); + } else { + sp.set(key, value); + } + }); + return sp; +} diff --git a/vendor/yari/client/src/sitemap/index.scss b/vendor/yari/client/src/sitemap/index.scss new file mode 100644 index 000000000..9e9466269 --- /dev/null +++ b/vendor/yari/client/src/sitemap/index.scss @@ -0,0 +1,39 @@ +#sitemap { + min-height: 800px; + + div.opening-in-your-editor { + float: right; + font-size: 0.8125rem; + } + + ul.breadcrumb { + li { + display: inline-block; + list-style-type: none; + margin-right: 5px; + + &::after { + content: " /"; + } + } + + li.last, + li.this-doc { + &::after { + content: ""; + } + } + + li.this-doc { + margin-left: 20px; + } + } + + .tree li.highlight { + background-color: #efefef; + } + + .footer-note { + margin-top: 100px; + } +} diff --git a/vendor/yari/client/src/sitemap/index.tsx b/vendor/yari/client/src/sitemap/index.tsx new file mode 100644 index 000000000..ed938a513 --- /dev/null +++ b/vendor/yari/client/src/sitemap/index.tsx @@ -0,0 +1,519 @@ +import React from "react"; +import { Link, useNavigate, useLocation } from "react-router-dom"; +import useSWR from "swr"; + +import { WRITER_MODE, WRITER_MODE_HOSTNAMES } from "../env"; +import { useLocale } from "../hooks"; +import { Loading } from "../ui/atoms/loading"; +import { MainContentContainer } from "../ui/atoms/page-content"; + +import "./index.scss"; +import NoteCard from "../ui/molecules/notecards"; + +interface SearchIndexDoc { + url: string; + title: string; +} + +export default function Sitemap() { + const location = useLocation(); + const navigate = useNavigate(); + const locale = useLocale(); + + // Because you can load this app with something like `/en-us/_sitemap/Web/` + // we have to pretend that didn't happen and force it to be `/en-US/_sitemap/Web` + const pathname = location.pathname.endsWith("/") + ? location.pathname.slice(0, -1) + : location.pathname; + + // `pathname` is going to be something like `/en-US/_sitemap/Web/Foo`. + // Transform that to be just `en-us/docs/web/foo`. + const searchPathname = pathname + .replace(`/${locale}/_sitemap`, `/${locale}/docs`) + .toLowerCase(); + + React.useEffect(() => { + document.title = "Sitemap"; + }, []); + + const { data, error } = useSWR( + `/${locale}/search-index.json`, + async (url) => { + const response = await fetch(url); + if (!response.ok) { + throw new Error(`${response.status} on ${response.url}`); + } + return (await response.json()) as SearchIndexDoc[]; + }, + { + revalidateOnFocus: false, + } + ); + + const [docs, setDocs] = React.useState(null); + React.useEffect(() => { + if (data) { + const theseDocs = [...data].sort((a, b) => a.url.localeCompare(b.url)); + setDocs(theseDocs); + } + }, [data]); + + const [childCounts, setChildCounts] = React.useState>( + new Map() + ); + React.useEffect(() => { + const counts = new Map(); + if (docs) { + for (const { url } of docs) { + const split = url.split("/"); + const root = split.slice(0, 3); + split.slice(3).forEach((portion, i) => { + root.push(portion); + const key = root.join("/"); + counts.set(key, (counts.get(key) || 0) + 1); + }); + } + setChildCounts(counts); + } + }, [docs]); + + const [thisDoc, setThisDoc] = React.useState(null); + React.useEffect(() => { + if (docs) { + const newThisDoc = docs.find((doc) => { + return doc.url.toLowerCase() === searchPathname; + }); + setThisDoc(newThisDoc || null); + } + }, [searchPathname, docs]); + + const [searchFilter, setSearchFilter] = React.useState(""); + React.useEffect(() => { + setSearchFilter(""); + }, [pathname]); + const [searchSubmitted, setSearchSubmitted] = React.useState(false); + + const [filtered, setFiltered] = React.useState(null); + React.useEffect(() => { + if (docs) { + const depth = searchPathname.split("/").length; + const newFiltered = docs.filter((doc) => { + if ( + doc.url.toLowerCase().startsWith(searchPathname) && + depth + 1 === doc.url.split("/").length + ) { + const baseName = doc.url.split("/").slice(-1)[0].toLowerCase(); + if (!baseName.startsWith(searchFilter.toLowerCase())) { + return false; + } + return true; + } + return false; + }); + setFiltered(newFiltered); + } + }, [searchPathname, docs, searchFilter]); + + const [highlightIndex, setHighlightIndex] = React.useState(0); + React.useEffect(() => { + setHighlightIndex(0); + }, [searchFilter]); + + React.useEffect(() => { + if (searchSubmitted) { + if (filtered && filtered.length >= 1) { + const slug = filtered[highlightIndex].url.split("/").slice(3); + setSearchFilter(""); + setSearchSubmitted(false); + navigate(`/${locale}/_sitemap/${slug.join("/")}`); + } + } + }, [locale, filtered, searchSubmitted, navigate, highlightIndex]); + + function changeHighlight(direction: "up" | "down") { + if (direction === "up") { + let nextNumber = highlightIndex - 1; + if (filtered) { + nextNumber = + ((nextNumber % filtered.length) + filtered.length) % filtered.length; + } + setHighlightIndex(nextNumber); + } else { + let nextNumber = highlightIndex + 1; + if (filtered) { + nextNumber = nextNumber % filtered.length; + } + setHighlightIndex(nextNumber); + } + } + + const [opening, setOpening] = React.useState(null); + const [editorOpeningError, setEditorOpeningError] = + React.useState(null); + React.useEffect(() => { + let unsetOpeningTimer: ReturnType; + if (opening) { + unsetOpeningTimer = setTimeout(() => { + setOpening(null); + }, 3000); + } + return () => { + if (unsetOpeningTimer) { + clearTimeout(unsetOpeningTimer); + } + }; + }, [opening]); + + async function openInYourEditor(url: string) { + console.log(`Going to try to open ${url} in your editor`); + setOpening(url); + const sp = new URLSearchParams(); + sp.set("url", url); + try { + const response = await fetch(`/_open?${sp.toString()}`); + if (!response.ok) { + if (response.status >= 500) { + setEditorOpeningError( + new Error(`${response.status}: ${response.statusText}`) + ); + } else { + const body = await response.text(); + setEditorOpeningError(new Error(`${response.status}: ${body}`)); + } + } + } catch (err: any) { + setEditorOpeningError(err); + } + } + + return ( + +
    + {error && ( + +

    Error

    +

    + {error.toString()} +

    +
    + )} + + {editorOpeningError && ( + +

    Error opening in your editor

    +

    + {editorOpeningError.toString()} +

    +
    + )} + + {!data && !error && } +
    + {opening && ( + <> + Opening{" "} + {opening.slice(opening.length - 50, opening.length)}{" "} + in your editor... + + )} +
    + {filtered && ( + + )} + {filtered && ( + { + setSearchFilter(text); + setSearchSubmitted(submitted); + }} + onGoUp={() => { + // Navigate to the parent! ...if possible + const split = pathname.split("/"); + if (split.length >= 4) { + const parentPathname = split.slice(0, -1); + navigate(parentPathname.join("/")); + } + }} + onChangeHighlight={changeHighlight} + /> + )} + {filtered && + filtered.length === 0 && + (searchFilter ? ( + nothing found + ) : ( + has no further sub-documents + ))} + {filtered && !searchFilter && } + {filtered && filtered.length > 0 && ( + + )} +

    + Note, this sitemap only shows documents. Not any other applications. +

    +
    +
    + ); +} + +function GoBackUp({ pathname }: { pathname: string }) { + const parentPath = pathname.split("/").slice(0, -1); + if (parentPath.length <= 2) { + return null; + } + const parentBasename = parentPath[parentPath.length - 1]; + + return ( +

    + + ↖️ Back up to{" "} + {parentPath.length <= 3 ? root : {parentBasename}} + +

    + ); +} + +function FilterForm({ + pathname, + searchFilter, + onUpdate, + onGoUp, + onChangeHighlight, +}: { + pathname: string; + searchFilter: string; + onUpdate: (text: string, submitted: boolean) => void; + onGoUp: () => void; + onChangeHighlight: (s: "up" | "down") => void; +}) { + const [hideTip, setHideTip] = React.useState(false); + + const [countBackspaces, setCountBackspaces] = React.useState(0); + React.useEffect(() => { + if (countBackspaces >= 2) { + setCountBackspaces(0); + onGoUp(); + } + }, [countBackspaces, onGoUp]); + + const inputRef = React.useRef(null); + + const focusSearch = React.useCallback( + (event: KeyboardEvent) => { + if (inputRef.current && event.target) { + const target = event.target as HTMLElement; + + if (target === inputRef.current) { + if (event.key === "ArrowDown") { + onChangeHighlight("down"); + } else if (event.key === "ArrowUp") { + onChangeHighlight("up"); + } + } + + if (target.tagName === "INPUT" || target.tagName === "TEXTAREA") { + if (event.key === "Backspace" && event.target === inputRef.current) { + if (!searchFilter.trim()) { + setCountBackspaces((s) => s + 1); + } + } else { + setCountBackspaces(0); + } + + if (event.key === "Escape") { + inputRef.current.blur(); + } + } else { + if (event.key === "T" || event.key === "t") { + inputRef.current.focus(); + setCountBackspaces(0); + } + } + } + }, + [onChangeHighlight, searchFilter] + ); + + React.useEffect(() => { + window.document.addEventListener("keyup", focusSearch); + return () => { + window.document.removeEventListener("keyup", focusSearch); + }; + }, [focusSearch]); + const prefixPathname = pathname.replace(`/_sitemap`, "/docs"); + + return ( +
    { + event.preventDefault(); + onUpdate(searchFilter.trim(), true); + }} + > + {prefixPathname}/ + { + onUpdate(event.target.value, false); + }} + onFocus={() => { + setHideTip(true); + }} + onBlur={() => { + setHideTip(false); + }} + />{" "} + {!hideTip && ( + + Tip! press t on your keyboard to focus on search filter + + )} +
    + ); +} + +function Breadcrumb({ + pathname, + thisDoc, + openInYourEditor, +}: { + pathname: string; + thisDoc: SearchIndexDoc | null; + openInYourEditor: (url: string) => void; +}) { + const locale = useLocale(); + const split = pathname.split("/").slice(3); + const root = pathname.split("/").slice(0, 2); + root.push("_sitemap"); + + const isReadOnly = !WRITER_MODE_HOSTNAMES.includes(window.location.hostname); + + return ( + <> + + + ); +} + +function ShowTree({ + filtered, + childCounts, + highlightIndex, + openInYourEditor, +}: { + filtered: SearchIndexDoc[]; + childCounts: Map; + highlightIndex: number; + openInYourEditor: (url: string) => void; +}) { + const locale = useLocale(); + const isReadOnly = !WRITER_MODE_HOSTNAMES.includes(window.location.hostname); + return ( +
    +
      + {filtered.map((doc, i) => { + const countChild = childCounts.get(doc.url) || 0; + return ( +
    • + + {doc.url.replace(`/${locale}/docs`, "")} + {" "} + + ( + {countChild === 1 + ? "1 document" + : `${countChild.toLocaleString()} documents`} + {" | "} + + View + + {!isReadOnly && " | "} + {!isReadOnly && ( + { + event.preventDefault(); + openInYourEditor(doc.url); + }} + > + Edit + + )} + ) + +
    • + ); + })} +
    +
    + ); +} diff --git a/vendor/yari/client/src/telemetry/constants.ts b/vendor/yari/client/src/telemetry/constants.ts new file mode 100644 index 000000000..2fa6f40f6 --- /dev/null +++ b/vendor/yari/client/src/telemetry/constants.ts @@ -0,0 +1,90 @@ +export const OFFER_OVERVIEW_CLICK = "offer_overview_click"; +export const SIDEBAR_CLICK = "sidebar_click"; +export const SIDEBAR_CLICK_WITH_FILTER = "sidebar_click_with_filter"; +export const SIDEBAR_FILTER_FOCUS = "sidebar_filter_focus"; +export const SIDEBAR_FILTER_TYPED = "sidebar_filter_typed"; +export const TOC_CLICK = "toc_click"; +/** Replaced "top_nav_already_subscriber" in July 2023. */ +export const TOP_NAV_LOGIN = "top_nav: login"; +/** Replaced "top_nav_get_mdn_plus" in July 2023. */ +export const TOP_NAV_SIGNUP = "top_nav: signup"; +export const TOGGLE_PLUS_OFFLINE_DISABLED = "toggle_plus_offline_disabled"; +export const TOGGLE_PLUS_OFFLINE_ENABLED = "toggle_plus_offline_enabled"; +export const TOGGLE_PLUS_ADS_FREE_DISABLED = "toggle_plus_ads_free_disabled"; +export const TOGGLE_PLUS_ADS_FREE_ENABLED = "toggle_plus_ads_free_enabled"; +export const TOGGLE_PLUS_AI_HELP_HISTORY_DISABLED = + "toggle_plus_ai_help_history_disabled"; +export const TOGGLE_PLUS_AI_HELP_HISTORY_ENABLED = + "toggle_plus_ai_help_history_enabled"; +export const BANNER_BLOG_LAUNCH_CLICK = "banner_blog_launch_click"; +export const AI_HELP = "ai_help"; +export const BANNER_AI_HELP_CLICK = "banner_ai_help_click"; +export const BANNER_SCRIMBA_CLICK = "banner_scrimba_click"; +export const BANNER_SCRIMBA_VIEW = "banner_scrimba_view"; +export const PLAYGROUND = "play_action"; +export const AI_EXPLAIN = "ai_explain"; +export const SETTINGS = "settings"; +export const OBSERVATORY = "observatory"; +export const CURRICULUM = "curriculum"; +export const BCD_TABLE = "bcd"; +export const ABOUT = "about"; + +export const A11Y_MENU = "a11y_menu"; + +export const MENU = Object.freeze({ + CLICK_LINK: "menu_click_link", + CLICK_MENU: "menu_click_menu", + CLICK_SUBMENU: "menu_click_submenu", +}); + +export const PLUS_COLLECTIONS = Object.freeze({ + ACTIONS_NOTE_ADD: "collections_actions_note_add", + ACTIONS_NOTE_EDIT: "collections_actions_note_edit", + ARTICLE_ACTIONS_SELECT_OPENED: "article_actions_collection_select_opened", + ARTICLE_ACTIONS_NEW: "article_actions_new_collection", + ARTICLE_ACTIONS_OPENED: "article_actions_collections_opened", + BANNER_NEW: "collections_banner_new_collection", + NEW_MODAL_SUBMIT_ARTICLE_ACTIONS: + "new_collection_modal_submit_article_actions", + NEW_MODAL_SUBMIT_COLLECTIONS_PAGE: + "new_collection_modal_submit_collections_page", + NEW_MODAL_UPGRADE_LINK: "new_collection_modal_upgrade_link", +}); + +export const PLUS_UPDATES = Object.freeze({ + EVENT_COLLAPSE: "plus_updates_event_collapse", + EVENT_EXPAND: "plus_updates_event_expand", + FILTER_CHANGE: "plus_updates_filter_change", + MDN_PLUS: "plus_updates_mdn_plus", + PAGE_CHANGE: "plus_updates_page_change", +}); + +export const BREADCRUMB_CLICK = "breadcrumb_click"; + +export const ARTICLE_FOOTER = "article_footer"; +export const THUMBS = "thumbs"; + +export const BASELINE = Object.freeze({ + TOGGLE_OPEN: "baseline_toggle_open", + LINK_LEARN_MORE: "baseline_link_learn_more", + LINK_BCD_TABLE: "baseline_link_bcd_table", + LINK_FEEDBACK: "baseline_link_feedback", +}); + +export const CLIENT_SIDE_NAVIGATION = "client_side_nav"; +export const LANGUAGE = "language"; +export const LANGUAGE_REMEMBER = "language_remember"; +export const THEME_SWITCHER = "theme_switcher"; +export const SURVEY = "survey"; +export const HOMEPAGE_HERO = "homepage_hero"; +export const HOMEPAGE = "homepage"; +export const HOMEPAGE_ITEMS = Object.freeze({ + ARTICLE: "article", + ARTICLE_TAG: "article_tag", + NEWS: "news", + NEWS_SOURCE: "news_source", + CONTRIBUTION: "contribution", + CONTRIBUTION_REPO: "contribution_repo", +}); + +export const EXTERNAL_LINK = "external-link"; diff --git a/vendor/yari/client/src/telemetry/generated/.gitkeep b/vendor/yari/client/src/telemetry/generated/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/vendor/yari/client/src/telemetry/generated/element.ts b/vendor/yari/client/src/telemetry/generated/element.ts new file mode 100644 index 000000000..861461081 --- /dev/null +++ b/vendor/yari/client/src/telemetry/generated/element.ts @@ -0,0 +1,26 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// AUTOGENERATED BY glean_parser v14.5.2. DO NOT EDIT. DO NOT COMMIT. + +import EventMetricType from "@mozilla/glean/private/metrics/event"; + +/** + * MDN Page element clicks. + * + * Generated from `element.clicked`. + */ +export const clicked = new EventMetricType<{ + source?: string; + subscription_type?: string; +}>( + { + category: "element", + name: "clicked", + sendInPings: ["action"], + lifetime: "ping", + disabled: false, + }, + ["source", "subscription_type"] +); diff --git a/vendor/yari/client/src/telemetry/generated/navigator.ts b/vendor/yari/client/src/telemetry/generated/navigator.ts new file mode 100644 index 000000000..db9c4477a --- /dev/null +++ b/vendor/yari/client/src/telemetry/generated/navigator.ts @@ -0,0 +1,47 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// AUTOGENERATED BY glean_parser v14.5.2. DO NOT EDIT. DO NOT COMMIT. + +import StringMetricType from "@mozilla/glean/private/metrics/string"; + +/** + * The navigators ISO 3166 country name (not code) based on geo ip. + * + * Generated from `navigator.geo`. + */ +export const geo = new StringMetricType({ + category: "navigator", + name: "geo", + sendInPings: ["action", "page"], + lifetime: "application", + disabled: false, +}); + +/** + * The navigator's two-letter ISO 3166 country code based on geo ip. + * + * Generated from `navigator.geo_iso`. + */ +export const geoIso = new StringMetricType({ + category: "navigator", + name: "geo_iso", + sendInPings: ["action", "page"], + lifetime: "application", + disabled: false, +}); + +/** + * The subscription type of the user. can be one of + * 'core','mdn_plus_5m','mdn_plus_5y','mdn_plus_10m','mdn_plus_10y' + * + * Generated from `navigator.subscription_type`. + */ +export const subscriptionType = new StringMetricType({ + category: "navigator", + name: "subscription_type", + sendInPings: ["action", "page"], + lifetime: "application", + disabled: false, +}); diff --git a/vendor/yari/client/src/telemetry/generated/page.ts b/vendor/yari/client/src/telemetry/generated/page.ts new file mode 100644 index 000000000..5255ef804 --- /dev/null +++ b/vendor/yari/client/src/telemetry/generated/page.ts @@ -0,0 +1,57 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// AUTOGENERATED BY glean_parser v14.5.2. DO NOT EDIT. DO NOT COMMIT. + +import LabeledMetricType from "@mozilla/glean/private/metrics/labeled"; +import StringMetricType from "@mozilla/glean/private/metrics/string"; +import UrlMetricType from "@mozilla/glean/private/metrics/url"; + +/** + * The URL path of the page that was viewed. + * + * Generated from `page.path`. + */ +export const path = new UrlMetricType({ + category: "page", + name: "path", + sendInPings: ["action", "page"], + lifetime: "application", + disabled: false, +}); + +/** + * The referring URL that linked to the page that was viewed. + * + * Generated from `page.referrer`. + */ +export const referrer = new UrlMetricType({ + category: "page", + name: "referrer", + sendInPings: ["action", "page"], + lifetime: "application", + disabled: false, +}); + +/** + * The UTM parameters of the page, used to attribute the source of traffic: + * "source": which site sent the traffic + * "medium": what type of link was used + * "campaign": what specific campaign or experiment does this relate to + * "term": here for completeness, the search term that was purchased/bid on + * "content": what specifically was clicked to bring the user to the site + * + * Generated from `page.utm`. + */ +export const utm = new LabeledMetricType( + { + category: "page", + name: "utm", + sendInPings: ["action", "page"], + lifetime: "application", + disabled: false, + }, + StringMetricType, + ["campaign", "content", "medium", "source", "term"] +); diff --git a/vendor/yari/client/src/telemetry/generated/pings.ts b/vendor/yari/client/src/telemetry/generated/pings.ts new file mode 100644 index 000000000..75cf3e243 --- /dev/null +++ b/vendor/yari/client/src/telemetry/generated/pings.ts @@ -0,0 +1,39 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// AUTOGENERATED BY glean_parser v14.5.2. DO NOT EDIT. DO NOT COMMIT. + +import PingType from "@mozilla/glean/private/ping"; + +/** + * A ping that will be sent everytime a page event happens (user interaction). + * + * Generated from `action`. + */ +export const action = new PingType({ + name: "action", + includeClientId: true, + sendIfEmpty: false, + preciseTimestamps: true, + includeInfoSections: true, + enabled: true, + schedulesPings: [], + reasonCodes: [], +}); + +/** + * A ping that will be sent everytime a new page is visited. + * + * Generated from `page`. + */ +export const page = new PingType({ + name: "page", + includeClientId: true, + sendIfEmpty: false, + preciseTimestamps: true, + includeInfoSections: true, + enabled: true, + schedulesPings: [], + reasonCodes: [], +}); diff --git a/vendor/yari/client/src/telemetry/glean-context.tsx b/vendor/yari/client/src/telemetry/glean-context.tsx new file mode 100644 index 000000000..c69440b4c --- /dev/null +++ b/vendor/yari/client/src/telemetry/glean-context.tsx @@ -0,0 +1,238 @@ +import * as React from "react"; +import * as pageMetric from "./generated/page"; +import * as navigatorMetric from "./generated/navigator"; +import * as elementMetric from "./generated/element"; +import * as pings from "./generated/pings"; +import Glean from "@mozilla/glean/web"; +import { + DEV_MODE, + GLEAN_CHANNEL, + GLEAN_DEBUG, + GLEAN_LOG_CLICK, + GLEAN_ENABLED, +} from "../env"; +import { useEffect, useRef } from "react"; +import { useLocation } from "react-router"; +import { useUserData } from "../user-context"; +import { handleSidebarClick } from "./sidebar-click"; +import { EXTERNAL_LINK } from "./constants"; +import { Doc } from "../../../libs/types/document"; + +export type HTTPStatus = "200" | "404"; + +const UTM_PARAMETER_NAMES = [ + "source", + "medium", + "campaign", + "term", + "content", +] as const; +type UTMParameters = Partial< + Record<(typeof UTM_PARAMETER_NAMES)[number], string> +>; + +export type PageProps = { + referrer: string | undefined; + path: string | undefined; + subscriptionType: string; + geo: string | undefined; + geo_iso: string | undefined; + utm: UTMParameters; +}; + +export type PageEventProps = { + referrer: string | undefined; + path: string | undefined; +}; + +export type ElementClickedProps = { + source: string; + subscriptionType: string; +}; + +export type GleanAnalytics = { + page: (arg: PageProps) => () => void; + click: (arg: ElementClickedProps) => void; +}; + +const FIRST_PARTY_DATA_OPT_OUT_COOKIE_NAME = "moz-1st-party-data-opt-out"; +const GLEAN_APP_ID = "mdn-yari"; + +function urlOrNull(url?: string, base?: string | URL) { + if (!url) { + return null; + } + try { + return new URL(url, base); + } catch (_) { + return null; + } +} + +function glean(): GleanAnalytics { + if (typeof window === "undefined" || !GLEAN_ENABLED) { + //SSR return noop. + return { + page: () => () => {}, + click: () => {}, + }; + } + const userIsOptedOut = document.cookie + .split("; ") + .includes(`${FIRST_PARTY_DATA_OPT_OUT_COOKIE_NAME}=true`); + + const uploadEnabled = !userIsOptedOut && GLEAN_ENABLED; + + Glean.initialize(GLEAN_APP_ID, uploadEnabled, { + enableAutoPageLoadEvents: true, + channel: GLEAN_CHANNEL, + serverEndpoint: DEV_MODE + ? "https://developer.allizom.org" + : document.location.origin, + }); + + if (DEV_MODE) { + Glean.setDebugViewTag("mdn-dev"); + Glean.setLogPings(GLEAN_DEBUG); + } + + const gleanContext = { + page: (page: PageProps) => { + const path = urlOrNull(page.path); + if (path) { + pageMetric.path.setUrl(path); + } + const referrer = urlOrNull(page.referrer, window?.location.href); + if (referrer) { + pageMetric.referrer.setUrl(referrer); + } + for (const param of Object.keys(page.utm) as Array< + keyof typeof page.utm + >) { + const value = page.utm[param]; + if (value) { + pageMetric.utm[param]?.set(value); + } + } + if (page.geo) { + navigatorMetric.geo.set(page.geo); + } + if (page.geo_iso) { + navigatorMetric.geoIso.set(page.geo_iso); + } + navigatorMetric.subscriptionType.set(page.subscriptionType); + return () => pings.page.submit(); + }, + click: (event: ElementClickedProps) => { + const { source, subscriptionType: subscription_type } = event; + elementMetric.clicked.record({ + source, + subscription_type, + }); + pings.action.submit(); + }, + }; + const gleanClick = (source: string) => { + gleanContext.click({ + source, + subscriptionType: "", + }); + }; + window?.addEventListener("click", (ev) => { + handleLinkClick(ev, gleanClick); + handleButtonClick(ev, gleanClick); + handleSidebarClick(ev, gleanClick); + }); + window?.addEventListener("glean-click", (ev: CustomEvent) => { + gleanClick(ev.detail); + }); + + return gleanContext; +} + +const gleanAnalytics = glean(); +const GleanContext = React.createContext(gleanAnalytics); + +function handleButtonClick(ev: MouseEvent, click: (source: string) => void) { + const target = ev.composedPath()?.[0] || ev.target; + const button = (target as HTMLElement | null)?.closest("button"); + if (button instanceof HTMLButtonElement && button.dataset.glean) { + click(button.dataset.glean); + } +} + +function handleLinkClick(ev: MouseEvent, click: (source: string) => void) { + const target = ev.composedPath()?.[0] || ev.target; + const anchor = (target as HTMLElement | null)?.closest("a"); + if (anchor instanceof HTMLAnchorElement) { + if (anchor.dataset.glean) { + click(anchor.dataset.glean); + } + if ( + anchor.href && + anchor.origin && + anchor.origin !== document.location.origin + ) { + click(`${EXTERNAL_LINK}: ${anchor.href}`); + } + } +} + +export function GleanProvider(props: { children: React.ReactNode }) { + return ( + + {props.children} + + ); +} + +export function useGlean() { + return React.useContext(GleanContext); +} + +export function useGleanPage(pageNotFound: boolean, doc?: Doc) { + const loc = useLocation(); + const userData = useUserData(); + const path = useRef(null); + + return useEffect(() => { + const submit = gleanAnalytics.page({ + path: window?.location.toString(), + referrer: document?.referrer, + geo: userData?.geo?.country, + geo_iso: userData?.geo?.country_iso, + subscriptionType: userData?.subscriptionType || "anonymous", + utm: getUTMParameters(), + }); + if (typeof userData !== "undefined" && path.current !== loc.pathname) { + path.current = loc.pathname; + submit(); + } + }, [loc.pathname, userData, pageNotFound, doc?.baseline?.baseline]); +} + +export function useGleanClick() { + const userData = useUserData(); + const glean = useGlean(); + return React.useCallback( + (source: string) => { + if (GLEAN_LOG_CLICK && !source.includes("pong")) { + console.log({ gleanClick: source }); + } + + glean.click({ + source, + subscriptionType: userData?.subscriptionType || "none", + }); + }, + [glean, userData?.subscriptionType] + ); +} + +function getUTMParameters(): UTMParameters { + const searchParams = new URLSearchParams(document.location.search); + return UTM_PARAMETER_NAMES.reduce((acc, name): UTMParameters => { + const param = searchParams.get(`utm_${name}`); + return param ? { ...acc, [name]: param } : acc; + }, {}); +} diff --git a/vendor/yari/client/src/telemetry/interactive-examples.ts b/vendor/yari/client/src/telemetry/interactive-examples.ts new file mode 100644 index 000000000..bb86b4d49 --- /dev/null +++ b/vendor/yari/client/src/telemetry/interactive-examples.ts @@ -0,0 +1,26 @@ +import { useEffect } from "react"; +import { useGleanClick } from "./glean-context"; +import { IEX_DOMAIN } from "../env"; + +/** + * Forwards user interactions with interactive-examples to Glean. + */ +export function useInteractiveExamplesActionHandler() { + const gleanClick = useGleanClick(); + + useEffect(() => { + const listener = (event: MessageEvent) => { + if ( + event.origin === IEX_DOMAIN && + typeof event.data === "object" && + event.data.type === "action" + ) { + gleanClick(`interactive-examples: ${event.data.source}`); + } + }; + + window.addEventListener("message", listener); + + return () => window.removeEventListener("message", listener); + }, [gleanClick]); +} diff --git a/vendor/yari/client/src/telemetry/metrics.yaml b/vendor/yari/client/src/telemetry/metrics.yaml new file mode 100644 index 000000000..48e321d7e --- /dev/null +++ b/vendor/yari/client/src/telemetry/metrics.yaml @@ -0,0 +1,149 @@ +--- +# Schema +$schema: moz://mozilla.org/schemas/glean/metrics/2-0-0 + +page: + path: + type: url + lifetime: application + send_in_pings: + - page + - action + description: | + The URL path of the page that was viewed. + data_sensitivity: + - web_activity + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1782509 + data_reviews: + - https://github.com/mdn/yari/pull/6813#issuecomment-1203705308 + notification_emails: + - mdn-team@mozilla.com + expires: 2026-09-05 + referrer: + type: url + lifetime: application + send_in_pings: + - page + - action + description: | + The referring URL that linked to the page that was viewed. + data_sensitivity: + - web_activity + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1782509 + data_reviews: + - https://github.com/mdn/yari/pull/6813#issuecomment-1203705308 + notification_emails: + - mdn-team@mozilla.com + expires: 2026-09-05 + utm: + type: labeled_string + lifetime: application + send_in_pings: + - page + - action + description: | + The UTM parameters of the page, used to attribute the source of traffic: + "source": which site sent the traffic + "medium": what type of link was used + "campaign": what specific campaign or experiment does this relate to + "term": here for completeness, the search term that was purchased/bid on + "content": what specifically was clicked to bring the user to the site + data_sensitivity: + - web_activity + bugs: + - "https://mozilla-hub.atlassian.net/browse/MP-545" + data_reviews: + - "https://bugzilla.mozilla.org/show_bug.cgi?id=1851150" + notification_emails: + - mdn-team@mozilla.com + expires: 2026-09-05 + labels: + - source + - medium + - campaign + - term + - content + +navigator: + geo: + type: string + lifetime: application + send_in_pings: + - page + - action + description: | + The navigators ISO 3166 country name (not code) based on geo ip. + data_sensitivity: + - web_activity + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1798296 + data_reviews: + - https://github.com/mdn/yari/pull/7457#issuecomment-1296934544 + notification_emails: + - mdn-team@mozilla.com + expires: 2026-09-05 + geo_iso: + type: string + lifetime: application + send_in_pings: + - page + - action + description: | + The navigator's two-letter ISO 3166 country code based on geo ip. + data_sensitivity: + - web_activity + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1798296 + data_reviews: + - https://github.com/mdn/yari/pull/7457#issuecomment-1296934544 + notification_emails: + - mdn-team@mozilla.com + expires: 2026-09-05 + subscription_type: + type: string + lifetime: application + send_in_pings: + - page + - action + description: | + The subscription type of the user. can be one of + 'core','mdn_plus_5m','mdn_plus_5y','mdn_plus_10m','mdn_plus_10y' + data_sensitivity: + - web_activity + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1798296 + data_reviews: + - https://github.com/mdn/yari/pull/7457#issuecomment-1296934544 + notification_emails: + - mdn-team@mozilla.com + expires: 2026-09-05 + +element: + clicked: + type: event + lifetime: ping + send_in_pings: + - action + description: | + MDN Page element clicks. + data_sensitivity: + - web_activity + bugs: + - https://bugzilla.mozilla.org/show_bug.cgi?id=1782509 + data_reviews: + - https://github.com/mdn/yari/pull/6813#issuecomment-1203705308 + notification_emails: + - mdn-team@mozilla.com + expires: 2026-09-05 + extra_keys: + source: + description: | + The click source/target + type: string + subscription_type: + description: | + The subscription type of the user. can be one of + 'core','mdn_plus_5m','mdn_plus_5y','mdn_plus_10m','mdn_plus_10y' + type: string diff --git a/vendor/yari/client/src/telemetry/pings.yaml b/vendor/yari/client/src/telemetry/pings.yaml new file mode 100644 index 000000000..51ab0ba2a --- /dev/null +++ b/vendor/yari/client/src/telemetry/pings.yaml @@ -0,0 +1,27 @@ +--- +# Schema +$schema: moz://mozilla.org/schemas/glean/pings/2-0-0 + +page: + description: | + A ping that will be sent everytime a new page is visited. + include_client_id: true + send_if_empty: false + notification_emails: + - mdn-team@mozilla.com + bugs: + - "https://bugzilla.mozilla.org/show_bug.cgi?id=1782509" + data_reviews: + - "https://github.com/mdn/yari/pull/6813#issuecomment-1203705308" + +action: + description: | + A ping that will be sent everytime a page event happens (user interaction). + include_client_id: true + send_if_empty: false + notification_emails: + - mdn-team@mozilla.com + bugs: + - "https://bugzilla.mozilla.org/show_bug.cgi?id=1782509" + data_reviews: + - "https://github.com/mdn/yari/pull/6813#issuecomment-1203705308" diff --git a/vendor/yari/client/src/telemetry/sidebar-click.ts b/vendor/yari/client/src/telemetry/sidebar-click.ts new file mode 100644 index 000000000..74c7b6ebe --- /dev/null +++ b/vendor/yari/client/src/telemetry/sidebar-click.ts @@ -0,0 +1,52 @@ +import { SIDEBAR_CLICK, SIDEBAR_CLICK_WITH_FILTER } from "./constants"; + +export function handleSidebarClick( + event: MouseEvent, + record: (source: string) => void +) { + const payload = getClickPayload(event); + if (payload) { + record(`${SIDEBAR_CLICK}: ${payload.macro} ${payload.href}`); + + const filter = getSidebarFilterValue(); + if (filter) { + // Records user input only if it is a subset of the sidebar content. + record(`${SIDEBAR_CLICK_WITH_FILTER}: ${payload.macro} ${filter}`); + } + } +} + +function getClickPayload(event: MouseEvent) { + const { target = null } = event; + const anchor = (target as HTMLElement)?.closest("a"); + + if (!anchor) { + return null; + } + + const sidebar = document.getElementById("sidebar-quicklinks"); + + if (!sidebar || !sidebar.contains(anchor)) { + return null; + } + + if (anchor.closest(".in-nav-toc")) { + // Click in the mobile TOC, not the actual sidebar. + return null; + } + + const macro = sidebar.getAttribute("data-macro") ?? "?"; + const href = anchor.getAttribute("href") ?? "?"; + + return { + macro, + href, + }; +} + +export function getSidebarFilterValue() { + const input = document.querySelector( + "#sidebar-filter-input" + ); + return input?.value; +} diff --git a/vendor/yari/client/src/translations/dashboard/index.tsx b/vendor/yari/client/src/translations/dashboard/index.tsx new file mode 100644 index 000000000..781412785 --- /dev/null +++ b/vendor/yari/client/src/translations/dashboard/index.tsx @@ -0,0 +1,589 @@ +import React from "react"; +import { + createSearchParams, + Link, + useSearchParams, + useNavigate, +} from "react-router-dom"; +import useSWR from "swr"; + +import { MainContentContainer } from "../../ui/atoms/page-content"; +import { Icon } from "../../ui/atoms/icon"; +import { useLocale } from "../../hooks"; + +interface Data { + l10nKPIs: L10nKPIs; + sections: Section[]; + detailDocuments: DetailDocument[]; +} + +interface Section { + l10nKPIs: L10nKPIs; + name: string; +} + +interface L10nKPIs { + missing: number; + outOfDate: number; + upToDate: number; + total: number; +} + +interface DetailDocument { + url: string; + info: InfoDocument; +} + +interface InfoDocument { + popularity: DocumentPopularity; + localePopularity: DocumentPopularity; + defaultLocaleInfo: LocaleInfo; + localeInfo?: LocaleInfo; + dateDiff?: number; +} + +interface DocumentPopularity { + value: number; + ranking: number; + parentValue: number; + parentRanking: number; +} + +interface LocaleInfo { + modified: string; + commitURL: string; +} + +interface LocaleStorageData { + defaultSort?: string; + defaultSortReverse?: string; +} + +interface StorageData { + [locale: string]: LocaleStorageData; +} + +const LOCALSTORAGE_KEY = "translations-dashboard-sections"; + +function saveStorage(locale: string, data: LocaleStorageData) { + try { + const stored = JSON.parse( + localStorage.getItem(LOCALSTORAGE_KEY) || "{}" + ) as StorageData; + stored[locale] = Object.assign({}, stored[locale] || {}, data); + localStorage.setItem(LOCALSTORAGE_KEY, JSON.stringify(stored)); + } catch (err) { + console.warn("Unable to save to localStorage", err); + } +} + +function getStorage(locale: string): LocaleStorageData | null { + try { + const stored = JSON.parse(localStorage.getItem(LOCALSTORAGE_KEY) || "{}"); + if (stored) { + return stored[locale] as LocaleStorageData; + } + } catch (err) { + console.warn("Unable to retrieve from localStorage", err); + } + return null; +} + +export function TranslationDashboard() { + const locale = useLocale(); + const [searchParams] = useSearchParams(); + const navigate = useNavigate(); + + const [lastData, setLastData] = React.useState(null); + + const currentSection = searchParams.get("section") || ""; + React.useEffect(() => { + if (locale.toLowerCase() === "en-us") { + navigate(`/${locale}/_translations`); + } + }, [locale, navigate]); + + React.useEffect(() => { + let title = "Translation dashboard "; + if (locale.toLowerCase() !== "en-us") { + title += ` for ${locale}`; + } + if (currentSection !== "") { + title += ` - section ${currentSection}`; + } + document.title = title; + }, [lastData, locale, currentSection]); + + let { data, error, isValidating } = useSWR( + locale.toLowerCase() !== "en-us" + ? `/_translations/dashboard/?locale=${locale}§ion=${currentSection}` + : null, + async (url) => { + const response = await fetch(url); + if (!response.ok) { + throw new Error(`${response.status} (${await response.text()})`); + } + if ( + !(response.headers.get("content-type") || "").includes( + "application/json" + ) + ) { + throw new Error( + `Response is not JSON (${response.headers.get("content-type")})` + ); + } + return response.json(); + }, + { + revalidateOnFocus: false, + } + ); + + React.useEffect(() => { + if (data) { + setLastData(data); + } + }, [data]); + + const lastStorageData = getStorage(locale); + const defaultSort = lastStorageData?.defaultSort || "url"; + const defaultSortReverse = lastStorageData?.defaultSortReverse || "false"; + const sort = searchParams.get("sort") || defaultSort; + const sortReverse = JSON.parse( + searchParams.get("sortReverse") || defaultSortReverse + ); + + React.useEffect(() => { + saveStorage( + locale, + Object.assign({}, lastStorageData, { + defaultSort: sort, + defaultSortReverse: sortReverse, + }) + ); + }, [locale, sort, sortReverse, lastStorageData]); + + if (locale.toLowerCase() === "en-us") { + return null; + } + + let parentSection = "/"; + if (currentSection.split("/").length > 2) { + const arrPathSection = currentSection.split("/"); + arrPathSection.pop(); + parentSection = arrPathSection.join("/"); + } + + return ( + + {lastData && !error && isValidating && ( +

    Reloading...

    + )} + {!data && !error && !lastData && } + {lastData && ( +

    + Go to{" "} + + Translation differences for {locale} + + {" / "} + + Missing translations for {locale} + +

    + )} + {error && } + {lastData && ( +
    + + + +
    + )} +
    + ); + /* + ); + } + */ +} + +function Container({ children }: { children: React.ReactNode }) { + return ( +
    + {children} +
    + ); +} + +function ShowError({ error }) { + return ( +
    +

    Error

    +
    {error.toString()}
    +
    + ); +} + +function Loading() { + return ( +
    + + +
    + ); +} + +function SectionHeader({ + l10nKPIs, + section, + parentSection, +}: { + l10nKPIs: L10nKPIs; + section: string; + parentSection: string; +}) { + const completenessExact = + (100 * (l10nKPIs.total - l10nKPIs.missing)) / l10nKPIs.total; + const completenessStr = completenessExact.toFixed(1) + "%"; + const freshnessExact = (100 * l10nKPIs.upToDate) / l10nKPIs.total; + const freshnessStr = freshnessExact.toFixed(1) + "%"; + return ( +
    +

    Localization dashboard for: {section || "/"}

    +

    + Parent section:{" "} + {parentSection} +

    +

    Summary

    +
    +
    Total number of pages
    +
    {l10nKPIs.total}
    +
    Number of untranslated pages
    +
    {l10nKPIs.missing}
    +
    Number of outdated pages (older than English in Git)
    +
    {l10nKPIs.outOfDate}
    +
    Number of up-to-date pages
    +
    {l10nKPIs.upToDate}
    +
    + +
    +
    + + {completenessStr} + {" "} + {completenessStr} +
    +
    + +
    +
    + + {freshnessStr} + {" "} + {freshnessStr} +
    +
    +
    + ); +} + +function SubsectionTable({ + sections, + currentSection, +}: { + sections: Section[]; + currentSection: string; +}) { + if (sections.length > 0) { + return ( +
    +

    Subsections

    + + + + + + + + + + + {sections + .sort( + (sectionA, sectionB) => + sectionB.l10nKPIs.total - sectionA.l10nKPIs.total + ) + .map((section) => { + const completenessExact = + (100 * (section.l10nKPIs.total - section.l10nKPIs.missing)) / + section.l10nKPIs.total; + const completenessStr = completenessExact.toFixed(1) + "%"; + const freshnessExact = + (100 * section.l10nKPIs.upToDate) / section.l10nKPIs.total; + const freshnessStr = freshnessExact.toFixed(1) + "%"; + const sectionHref = + "dashboard?section=%2F" + encodeURIComponent(section.name); + return ( + + + + + + + ); + })} + +
    SectionTotal / Untranslated / Out of dateCompletenessFreshness
    + + {section.name + .replace(currentSection.slice(1), "") + .replace("/", "")} + + + {section.l10nKPIs.total} / {section.l10nKPIs.missing} /{" "} + {section.l10nKPIs.outOfDate} + + + {completenessStr} + {" "} + {completenessStr} + + + {freshnessStr} + {" "} + {freshnessStr} +
    +
    + ); + } else { + return null; + } +} + +function DocumentsTable({ + documents, + sort, + sortReverse, + locale, +}: { + documents: DetailDocument[]; + sort: string; + sortReverse: boolean; + locale: string; +}) { + const [searchParams, setSearchParams] = useSearchParams(); + const currentSection = searchParams.get("section") || ""; + documents.map((documentDetail) => { + if (documentDetail.info.localeInfo) { + const dateLocale = new Date(documentDetail.info.localeInfo.modified); + const dateDefaultLocale = new Date( + documentDetail.info.defaultLocaleInfo.modified + ); + const dateDiff = dateLocale.getTime() - dateDefaultLocale.getTime(); + documentDetail.info.dateDiff = dateDiff; + } else { + documentDetail.info.dateDiff = Number.POSITIVE_INFINITY; + } + return documentDetail; + }); + + function TableHead({ + id, + title, + sortable, + }: { + id: string; + title: string; + sortable?: boolean; + }) { + function getClassName() { + const className = ["sortable"]; + + if (sort === id) { + className.push("active"); + } + + if (sortReverse) { + className.push("reverse"); + } + + return className.join(" "); + } + + function onClick() { + if (sort === id) { + setSearchParams( + createSearchParams({ + sort: id, + sortReverse: JSON.stringify(!sortReverse), + section: currentSection, + }) + ); + } else { + setSearchParams( + createSearchParams({ sort: id, section: currentSection }) + ); + } + } + + return sortable ? ( + + {title} + + ) : ( + {title} + ); + } + + return ( +
    +

    List of direct subpages

    + + + + + + + + + + + + + + + + + + {documents + .sort((A, B) => { + let reverse = sortReverse ? -1 : 1; + if (sort === "dateDiff") { + const a = A.info.dateDiff || Number.POSITIVE_INFINITY; + const b = B.info.dateDiff || Number.POSITIVE_INFINITY; + return reverse * (b - a); + } else if (sort === "popularityLocale") { + const a = + A.info.localePopularity?.ranking || Number.POSITIVE_INFINITY; + const b = + B.info.localePopularity?.ranking || Number.POSITIVE_INFINITY; + return reverse * (a - b); + } else if (sort === "popularityEn") { + const a = A.info.popularity.ranking || Number.POSITIVE_INFINITY; + const b = B.info.popularity.ranking || Number.POSITIVE_INFINITY; + return reverse * (a - b); + } else if (sort === "url") { + const a = A.url; + const b = B.url; + return reverse * a.localeCompare(b); + } else { + throw new Error(`Unrecognized sort '${sort}'`); + } + }) + .map((documentDetail) => { + const url = "https://developer.mozilla.org" + documentDetail.url; + const englishCommitHash = + documentDetail.info.defaultLocaleInfo.commitURL + .split("commit/")[1] + .substring(0, 7); + const localeCommitHash = documentDetail.info.localeInfo?.commitURL + .split("commit/")[1] + .substring(0, 7); + let status = "Untranslated"; + if (documentDetail.info.localeInfo) { + let dateDiff = + documentDetail.info.dateDiff ?? Number.POSITIVE_INFINITY; + status = "Out of date"; + + if (dateDiff > 0) { + status = "Fresher than English"; + } else if (dateDiff > -2678400000) { + const nbDays = Math.round(-dateDiff / (3600 * 24 * 1000)); + status = nbDays + " day" + (nbDays > 1 ? "s" : ""); + } else { + const nbMonths = Math.round( + -dateDiff / (3600 * 24 * 1000 * 30) + ); + status = nbMonths + " month" + (nbMonths > 1 ? "s" : ""); + } + } + return ( + + + + + + + + + + + + ); + })} + +
    + {documentDetail.url} + + English current MDN page + + + GitHub link for {englishCommitHash} + + + {documentDetail.info.localeInfo && ( + + Local {locale} page + + )} + + {documentDetail.info.localeInfo && ( + + Locale current MDN page + + )} + + {documentDetail.info.localeInfo && ( + + GitHub link for {localeCommitHash} + + )} + {documentDetail.info.popularity.ranking} + {documentDetail.info.localePopularity && + documentDetail.info.localePopularity.ranking} + {status}
    +
    + ); +} diff --git a/vendor/yari/client/src/translations/differences/index.scss b/vendor/yari/client/src/translations/differences/index.scss new file mode 100644 index 000000000..7ca3dbcc5 --- /dev/null +++ b/vendor/yari/client/src/translations/differences/index.scss @@ -0,0 +1,119 @@ +.all-translations { + .error-message { + background-color: rgb(252, 159, 159); + margin: 25px 0; + padding: 10px; + + h4 { + margin-top: 0; + } + + p { + margin-bottom: 3px; + } + } + + h3 span.page { + color: var(--text-inactive); + } + + h4.subheader { + margin-top: 2px; + } + + .loading { + margin: 200px; + text-align: center; + + progress { + border-radius: 2px; + height: 30px; + width: 600px; + } + } + + table { + width: 100%; + + th.sortable { + cursor: pointer; + } + + th.sortable.active { + background-color: var(--background-secondary); + color: var(--text-primary); + } + + th.sortable.active.reverse { + .icon { + transform: rotate(-180deg); + } + } + + td a .url-prefix { + color: rgb(159, 159, 159); + font-size: 80%; + margin-right: 2px; + } + + td .document-title-preview { + /* color: rgb(118, 118, 118); */ + } + + td .last_modified.ahead a { + color: #008000; + } + + td .last_modified.behind a { + color: #ffa500; + } + } + + .document-warnings { + background-color: rgb(255, 215, 154); + } + + .search-times { + margin-top: 60px; + + p { + font-size: 70%; + } + } + + .pagination { + margin: 20px; + text-align: center; + + a.disabled { + color: rgb(159, 159, 159); + } + + a, + .current-page { + padding: 10px; + } + } + + div.filter-documents { + display: grid; + gap: 20px; + grid-template-columns: 300px 1fr; + margin: auto; + + .filters { + h4 { + border-bottom: 1px solid #efefef; + margin-bottom: 10px; + } + + ul.search-flaws-rows { + padding-left: 0; + + li { + list-style: none; + } + } + } + } +} diff --git a/vendor/yari/client/src/translations/differences/index.tsx b/vendor/yari/client/src/translations/differences/index.tsx new file mode 100644 index 000000000..d528b694a --- /dev/null +++ b/vendor/yari/client/src/translations/differences/index.tsx @@ -0,0 +1,797 @@ +import React from "react"; +import { + createSearchParams, + Link, + useSearchParams, + useNavigate, +} from "react-router-dom"; +import useSWR from "swr"; +import dayjs from "dayjs"; +import relativeTime from "dayjs/plugin/relativeTime"; + +import "./index.scss"; + +import { MainContentContainer } from "../../ui/atoms/page-content"; +import { Paginator } from "../../ui/molecules/paginator"; +import { useLocale } from "../../hooks"; + +dayjs.extend(relativeTime); + +interface DocumentPopularity { + value: number; + ranking: number; + parentValue: number; + parentRanking: number; +} + +type CountByType = { [key: string]: number }; + +interface DocumentDifferences { + countByType: CountByType; + total: number; +} + +interface DocumentEdits { + modified: string; + parentModified: string; + commitURL: string; + parentCommitURL: string; + sourceCommitsBehindCount?: number; + sourceCommitURL?: string; +} + +interface Document { + mdn_url: string; + edits: DocumentEdits; + title: string; + popularity: DocumentPopularity; + differences: DocumentDifferences; +} + +interface Counts { + found: number; + total: number; + pages: number; + noParents: number; + cacheMisses: number; +} + +interface Times { + took: number; +} + +interface FlawLevel { + name: string; + level: string; + ignored: boolean; +} + +interface Data { + counts: Counts; + documents: Document[]; + times: Times; + flawLevels: FlawLevel[]; +} + +interface LocaleStorageData { + lastLoadTime?: number; + defaultSort?: string; + defaultSortReverse?: string; +} + +interface StorageData { + [locale: string]: LocaleStorageData; +} + +const LOCALSTORAGE_KEY = "translations-dashboard-differences"; + +function saveStorage(locale: string, data: LocaleStorageData) { + try { + const stored = JSON.parse( + localStorage.getItem(LOCALSTORAGE_KEY) || "{}" + ) as StorageData; + stored[locale] = Object.assign({}, stored[locale] || {}, data); + localStorage.setItem(LOCALSTORAGE_KEY, JSON.stringify(stored)); + } catch (err) { + console.warn("Unable to save to localStorage", err); + } +} + +function getStorage(locale: string): LocaleStorageData | null { + try { + const stored = JSON.parse(localStorage.getItem(LOCALSTORAGE_KEY) || "{}"); + if (stored) { + return stored[locale] as LocaleStorageData; + } + } catch (err) { + console.warn("Unable to retrieve from localStorage", err); + } + return null; +} + +export function TranslationDifferences() { + const locale = useLocale(); + const [searchParams] = useSearchParams(); + const navigate = useNavigate(); + + const [lastData, setLastData] = React.useState(null); + + React.useEffect(() => { + if (locale.toLowerCase() === "en-us") { + navigate(`/${locale}/_translations`); + } + }, [locale, navigate]); + + React.useEffect(() => { + let title = "All translations"; + if (locale.toLowerCase() !== "en-us") { + title += ` for ${locale}`; + } + if (lastData) { + title = `(${lastData.counts.found.toLocaleString()} found) ${title}`; + } + document.title = title; + }, [lastData, locale]); + + const { data, error, isValidating } = useSWR( + locale.toLowerCase() !== "en-us" + ? `/_translations/differences/?locale=${locale}` + : null, + async (url) => { + const response = await fetch(url); + if (!response.ok) { + throw new Error(`${response.status} (${await response.text()})`); + } + if ( + !(response.headers.get("content-type") || "").includes( + "application/json" + ) + ) { + throw new Error( + `Response is not JSON (${response.headers.get("content-type")})` + ); + } + return response.json(); + }, + { + revalidateOnFocus: false, + } + ); + + // Use this to be able to figure out how long the XHR takes when there's no cache + const startTime = React.useRef(); + React.useEffect(() => { + if (locale) { + if (!data) { + startTime.current = new Date(); + } else { + if ( + data.counts.cacheMisses > 0 && + data.counts.cacheMisses === data.counts.total && + startTime.current + ) { + const lastLoadTime = + new Date().getTime() - startTime.current.getTime(); + saveStorage(locale, { lastLoadTime }); + } + } + } + }, [locale, data]); + + React.useEffect(() => { + if (data) { + setLastData(data); + } + }, [data]); + + const lastStorageData = getStorage(locale); + const defaultSort = lastStorageData?.defaultSort || "modified"; + const defaultSortReverse = lastStorageData?.defaultSortReverse || "false"; + const sort = searchParams.get("sort") || defaultSort; + const sortReverse = JSON.parse( + searchParams.get("sortReverse") || defaultSortReverse + ); + + React.useEffect(() => { + saveStorage( + locale, + Object.assign({}, lastStorageData, { + defaultSort: sort, + defaultSortReverse: sortReverse, + }) + ); + }, [locale, sort, sortReverse, lastStorageData]); + + if (locale.toLowerCase() === "en-us") { + return null; + } + + return ( + + {lastData && !error && isValidating && ( +

    Reloading...

    + )} + {!data && !error && !lastData && ( + + )} + {lastData && ( +

    + Go to{" "} + + Missing translations for {locale} + +

    + )} + {error && } + {lastData && ( +
    + + +
    + )} + {data && } +
    + ); +} + +function Container({ children }: { children: React.ReactNode }) { + return ( + + {children} + + ); +} + +function ShowSearchError({ error }) { + return ( +
    +

    Search error

    +
    {error.toString()}
    +
    + ); +} + +function BuildTimes({ times }: { times: Times }) { + function format(ms: number) { + if (ms > 1000) { + const s = ms / 1000; + return `${s.toFixed(1)} seconds`; + } else { + return `${Math.trunc(ms)} milliseconds`; + } + } + return ( +
    +

    Time to find all documents {format(times.took)}

    +
    + ); +} + +function Loading({ estimate }: { estimate: number }) { + const startLoadingTime = new Date(); + const [estimateEndTime] = React.useState( + new Date(startLoadingTime.getTime() + estimate) + ); + + const [, setIncrements] = React.useState(0); + React.useEffect(() => { + const interval = setInterval(() => { + setIncrements((state) => state + 1); + }, 1000); + return () => clearInterval(interval); + }, []); + + const distance = estimateEndTime.getTime() - startLoadingTime.getTime(); + const elapsed = new Date().getTime() - startLoadingTime.getTime(); + const percent = (100 * elapsed) / distance; + return ( +
    + + {percent}% + +
    + + Estimated time to finish: {((distance - elapsed) / 1000).toFixed(0)}s{" "} + {elapsed > distance ? ( + + 🙃 + + ) : null} + +
    + ); +} + +function FilterControls() { + const [searchParams, setSearchParams] = useSearchParams(); + const [title, setTitle] = React.useState(searchParams.get("title") || ""); + const [url, setURL] = React.useState(searchParams.get("url") || ""); + const [differences, setDifferences] = React.useState( + searchParams.get("differences") || "" + ); + + function refreshFilters(reset = false) { + const filterParams = createSearchParams(searchParams); + for (const [key, value] of [ + ["url", url], + ["title", title], + ["differences", differences], + ]) { + if (!reset && value) { + filterParams.set(key, value); + } else { + filterParams.delete(key); + } + } + filterParams.delete("page"); + setSearchParams(filterParams); + } + + function resetFilters() { + setURL(""); + setTitle(""); + setDifferences(""); + refreshFilters(true); + } + + return ( +
    +

    Filters

    +
    { + event.preventDefault(); + refreshFilters(); + }} + > +
    +

    Document

    + { + setURL(event.target.value); + }} + onBlur={() => refreshFilters()} + /> + { + setTitle(event.target.value); + }} + onBlur={() => refreshFilters()} + /> +
    +
    +

    Differences

    + { + setDifferences(event.target.value); + }} + onBlur={() => refreshFilters()} + /> +
    + +
    +

     

    + {" "} + {(url || title) && ( + + )} +
    +
    +
    + ); +} +type NumericOperation = { + operation: "eq" | "gt" | "gte" | "lt" | "lte"; + value: number; +}; + +function getNumericOperation(expression: string): NumericOperation | null { + function parseIntOrThrow(v: string) { + if (!v) { + throw new Error("Can't be empty"); + } + + const parsed = parseInt(v, 10); + if (isNaN(parsed)) { + throw new Error(`'${v}' not a valid number`); + } + return parsed; + } + try { + if (expression.startsWith(">=")) { + return { + operation: "gte", + value: parseIntOrThrow(expression.replace(">=", "")), + }; + } else if (expression.startsWith(">")) { + return { + operation: "gt", + value: parseIntOrThrow(expression.replace(">", "")), + }; + } else if (expression.startsWith("<=")) { + return { + operation: "lte", + value: parseIntOrThrow(expression.replace("<=", "")), + }; + } else if (expression.startsWith("<")) { + return { + operation: "lt", + value: parseIntOrThrow(expression.replace("<", "")), + }; + } else if (expression.startsWith("==") || expression.startsWith("=")) { + return { + operation: "eq", + value: parseIntOrThrow(expression.replace(/=/g, "")), + }; + } else if (expression) { + return { + operation: "eq", + value: parseIntOrThrow(expression), + }; + } else { + return null; + } + } catch (error) { + console.warn(error); + return null; + } +} + +function matchNumericOperation(value: number, op: NumericOperation): boolean { + if (op.operation === "eq") { + if (value !== op.value) { + return false; + } + } else if (op.operation === "gt") { + if (!(value > op.value)) { + return false; + } + } else if (op.operation === "gte") { + if (!(value >= op.value)) { + return false; + } + } else if (op.operation === "lt") { + if (!(value < op.value)) { + return false; + } + } else if (op.operation === "lte") { + if (!(value <= op.value)) { + return false; + } + } else { + throw new Error(`Not implemented operation '${op.operation}'`); + } + return true; +} + +function DocumentsTable({ + locale, + counts, + documents, + sort, + sortReverse, +}: { + locale: string; + counts: Counts; + documents: Document[]; + sort: string; + sortReverse: boolean; +}) { + const [searchParams, setSearchParams] = useSearchParams(); + + const page = parseInt(searchParams.get("page") || "1", 10); + const pageSize = parseInt(searchParams.get("pageSize") || "20", 10); + const filterTitle = searchParams.get("title") || ""; + const filterURL = searchParams.get("url") || ""; + const filterDifferences = searchParams.get("differences") || ""; + const filterDifferencesOperation = getNumericOperation(filterDifferences); + + function TableHead({ id, title }: { id: string; title: string }) { + return ( + { + if (sort === id) { + setSearchParams( + createSearchParams({ + sort: id, + sortReverse: JSON.stringify(!sortReverse), + }) + ); + } else { + setSearchParams(createSearchParams({ sort: id })); + } + }} + className="sortable" + > + {title} {sort === id ? (sortReverse ? "↓" : "↑") : null} + + ); + } + + const filteredDocuments = documents + .filter((document) => { + if ( + filterTitle && + !document.title.toLowerCase().includes(filterTitle.toLowerCase()) + ) { + return false; + } + + if ( + filterURL && + !document.mdn_url.toLowerCase().includes(filterURL.toLowerCase()) + ) { + return false; + } + + if ( + filterDifferencesOperation && + !matchNumericOperation( + document.differences.total, + filterDifferencesOperation + ) + ) { + return false; + } + + return true; + }) + .sort((A, B) => { + let reverse = sortReverse ? -1 : 1; + if (sort === "modified") { + const a = new Date(A.edits.modified); + const b = new Date(B.edits.modified); + return reverse * (b.getTime() - a.getTime()); + } else if (sort === "popularity") { + const a = A.popularity.value; + const b = B.popularity.value; + return reverse * (b - a); + } else if (sort === "differences") { + const a = A.differences.total; + const b = B.differences.total; + return reverse * (b - a); + } else if (sort === "title") { + const a = A.title; + const b = B.title; + return reverse * a.localeCompare(b); + } else if (sort === "mdn_url") { + const a = A.mdn_url; + const b = B.mdn_url; + return reverse * a.localeCompare(b); + } else if (sort === "sourceCommit") { + const a = A.edits.sourceCommitsBehindCount ?? -1; + const b = B.edits.sourceCommitsBehindCount ?? -1; + return reverse * (b - a); + } else { + throw new Error(`Unrecognized sort '${sort}'`); + } + }); + const pageCount = Math.ceil(counts.found / pageSize); + + return ( +
    +

    + Documents with differences found ( + {filteredDocuments.length.toLocaleString()}){" "} + {pageCount > 1 && ( + + page {page}/{pageCount} + + )} +

    +

    + {counts.total.toLocaleString()} total documents found ({locale}) +

    + + {filterDifferences && !filterDifferencesOperation && ( +
    +

    Invalid differences filter

    +

    + The differences filter can't be parsed. +
    + {filterDifferences} +

    +
    + )} + + + + + + + + + + + + + {filteredDocuments + .slice((page - 1) * pageSize, page * pageSize) + .map((doc: Document) => { + return ( + + + + + + + + ); + })} + +
    + + {filterTitle ? ( + + ) : ( + doc.title + )} + +
    + + + +
    + {!doc.popularity.ranking + ? "n/a" + : `${getGetOrdinal(doc.popularity.ranking)}`}{" "} + + ( + {!doc.popularity.parentRanking + ? "n/a" + : `${getGetOrdinal(doc.popularity.parentRanking)}`} + ) + + + + {doc.differences.total.toLocaleString()} + +
    + + +
    + ); +} + +function L10nSourceCommitModified({ + sourceCommitsBehindCount, + sourceCommitURL, +}: Pick) { + if ( + !sourceCommitURL || + (!sourceCommitsBehindCount && sourceCommitsBehindCount !== 0) + ) { + return <>Metadata does not exist.; + } + + const getImportanceColor = () => { + if (sourceCommitsBehindCount === 0) return "🟢"; + return sourceCommitsBehindCount < 10 ? "🟠" : "🔴"; + }; + + return ( + {`${getImportanceColor()} ${sourceCommitsBehindCount} commits behind`} + ); +} + +function LastModified({ edits }: { edits: DocumentEdits }) { + const modified = dayjs(edits.modified); + const parentModified = dayjs(edits.parentModified); + return ( + + + + +
    + + + + + +
    + ); +} + +function HighlightedText({ + text, + highlight, +}: { + text: string; + highlight: string; +}) { + // Split on highlight term and include term into parts, ignore case + const parts = text.split(new RegExp(`(${highlight})`, "gi")); + return ( + + {" "} + {parts.map((part, i) => ( + + {part} + + ))}{" "} + + ); +} + +function BriefURL({ uri, filterURL }: { uri: string; filterURL: string }) { + const [left, right] = uri.split(/\/docs\//, 2); + return ( + <> + {left}/docs/ + + {filterURL ? ( + + ) : ( + right + )} + + + ); +} + +// https://gist.github.com/jlbruno/1535691/db35b4f3af3dcbb42babc01541410f291a8e8fac +function getGetOrdinal(n: number) { + const s = ["th", "st", "nd", "rd"]; + const v = n % 100; + return n.toLocaleString() + (s[(v - 20) % 10] || s[v] || s[0]); +} diff --git a/vendor/yari/client/src/translations/index.scss b/vendor/yari/client/src/translations/index.scss new file mode 100644 index 000000000..b462f6213 --- /dev/null +++ b/vendor/yari/client/src/translations/index.scss @@ -0,0 +1,8 @@ +.translation-choices { + padding: 100px; + text-align: center; + + a.button { + display: inline; + } +} diff --git a/vendor/yari/client/src/translations/index.tsx b/vendor/yari/client/src/translations/index.tsx new file mode 100644 index 000000000..9e81019f7 --- /dev/null +++ b/vendor/yari/client/src/translations/index.tsx @@ -0,0 +1,139 @@ +import React from "react"; +import { Link, Routes, Route } from "react-router-dom"; +import useSWR from "swr"; + +import "./index.scss"; + +import { Loading } from "../ui/atoms/loading"; +import { MainContentContainer } from "../ui/atoms/page-content"; + +import { TranslationDifferences } from "./differences"; +import { MissingTranslations } from "./missing"; +import { TranslationDashboard } from "./dashboard"; +import { useLocale } from "../hooks"; + +interface Locale { + locale: string; + language: { + English: string; + native: string; + }; + isActive: boolean; + count: number; +} + +interface LocalesData { + locales: Locale[]; +} + +export default function Translations() { + return ( + + + } /> + } /> + } /> + } /> + + + ); +} + +function PickLocale() { + const locale = useLocale(); + React.useEffect(() => { + let title = "All translations"; + if (locale.toLowerCase() !== "en-us") { + title += ` for ${locale}`; + } + document.title = title; + }, [locale]); + + const { data: dataLocales, error: errorLocales } = useSWR( + locale.toLowerCase() === "en-us" ? "/_translations/" : null, + async (url) => { + const response = await fetch(url); + if (!response.ok) { + throw new Error(`${response.status} (${await response.text()})`); + } + return response.json(); + } + ); + + if (locale.toLowerCase() === "en-us") { + return ( + <> + {!dataLocales && !errorLocales && } + {errorLocales && ( +
    +

    Server error

    +
    {errorLocales.toString()}
    +
    + )} + {dataLocales && } + + ); + } + + return ( +
    + + Translation differences + {" "} + + Missing translations + {" "} + + Dashboard + +
    + ); +} + +function Container({ children }: { children: React.ReactNode }) { + return ( + + {children} + + ); +} + +function ShowLocales({ locales }: { locales: Locale[] }) { + return ( +
    +

    Select locale

    + + + {locales.map((locale) => { + return ( + + + + + + + + ); + })} + +
    + + {locale.language.English} ({locale.locale}) + {" "} + {!locale.isActive && not active} + {locale.count.toLocaleString()} documents + + Translation differences + {" "} + + + Missing translations + {" "} + + + Dashboard + {" "} +
    +
    + ); +} diff --git a/vendor/yari/client/src/translations/missing/index.tsx b/vendor/yari/client/src/translations/missing/index.tsx new file mode 100644 index 000000000..cf26642b9 --- /dev/null +++ b/vendor/yari/client/src/translations/missing/index.tsx @@ -0,0 +1,692 @@ +import React from "react"; +import { + createSearchParams, + Link, + useSearchParams, + useNavigate, +} from "react-router-dom"; +import useSWR from "swr"; +import dayjs from "dayjs"; +import relativeTime from "dayjs/plugin/relativeTime"; + +import { MainContentContainer } from "../../ui/atoms/page-content"; +import { Paginator } from "../../ui/molecules/paginator"; +import { useLocale } from "../../hooks"; + +dayjs.extend(relativeTime); + +interface DocumentPopularity { + value: number; + ranking: number; + parentValue: number; + parentRanking: number; +} + +type CountByType = { [key: string]: number }; + +interface DocumentDifferences { + countByType: CountByType; + total: number; +} + +interface DocumentEdits { + modified: string; + parentModified: string; + commitURL: string; + parentCommitURL: string; +} + +interface Document { + mdn_url: string; + edits: DocumentEdits; + title: string; + popularity: DocumentPopularity; + differences: DocumentDifferences; +} + +interface Counts { + missing: number; + translated: number; + total: number; + cacheMisses: number; +} + +interface Times { + took: number; +} + +interface FlawLevel { + name: string; + level: string; + ignored: boolean; +} + +interface Data { + counts: Counts; + missingDocuments: Document[]; + times: Times; + flawLevels: FlawLevel[]; +} + +interface LocaleStorageData { + lastLoadTime?: number; + defaultSort?: string; + defaultSortReverse?: string; +} + +interface StorageData { + [locale: string]: LocaleStorageData; +} + +const LOCALSTORAGE_KEY = "translations-dashboard-missing"; + +function saveStorage(locale: string, data: LocaleStorageData) { + try { + const stored = JSON.parse( + localStorage.getItem(LOCALSTORAGE_KEY) || "{}" + ) as StorageData; + stored[locale] = Object.assign({}, stored[locale] || {}, data); + localStorage.setItem(LOCALSTORAGE_KEY, JSON.stringify(stored)); + } catch (err) { + console.warn("Unable to save to localStorage", err); + } +} + +function getStorage(locale: string): LocaleStorageData | null { + try { + const stored = JSON.parse(localStorage.getItem(LOCALSTORAGE_KEY) || "{}"); + if (stored) { + return stored[locale] as LocaleStorageData; + } + } catch (err) { + console.warn("Unable to retrieve from localStorage", err); + } + return null; +} + +export function MissingTranslations() { + const locale = useLocale(); + const [searchParams] = useSearchParams(); + const navigate = useNavigate(); + + const [lastData, setLastData] = React.useState(null); + + React.useEffect(() => { + if (locale.toLowerCase() === "en-us") { + navigate(`/${locale}/_translations`); + } + }, [locale, navigate]); + + React.useEffect(() => { + let title = "Missing translations"; + if (locale.toLowerCase() !== "en-us") { + title += ` for ${locale}`; + } + if (lastData) { + title = `(${lastData.counts.missing.toLocaleString()} found) ${title}`; + } + document.title = title; + }, [lastData, locale]); + + const { data, error, isValidating } = useSWR( + locale.toLowerCase() !== "en-us" + ? `/_translations/missing/?locale=${locale}` + : null, + async (url) => { + const response = await fetch(url); + if (!response.ok) { + throw new Error(`${response.status} (${await response.text()})`); + } + if ( + !(response.headers.get("content-type") || "").includes( + "application/json" + ) + ) { + throw new Error( + `Response is not JSON (${response.headers.get("content-type")})` + ); + } + return response.json(); + }, + { + revalidateOnFocus: false, + } + ); + + // Use this to be able to figure out how long the XHR takes when there's no cache + const startTime = React.useRef(); + React.useEffect(() => { + if (locale) { + if (!data) { + startTime.current = new Date(); + } else { + if ( + data.counts.cacheMisses > 0 && + data.counts.cacheMisses === data.counts.total && + startTime.current + ) { + const lastLoadTime = + new Date().getTime() - startTime.current.getTime(); + saveStorage(locale, { lastLoadTime }); + } + } + } + }, [locale, data]); + + React.useEffect(() => { + if (data) { + setLastData(data); + } + }, [data]); + + const lastStorageData = getStorage(locale); + const defaultSort = lastStorageData?.defaultSort || "popularity"; + const defaultSortReverse = lastStorageData?.defaultSortReverse || "false"; + const sort = searchParams.get("sort") || defaultSort; + const sortReverse = JSON.parse( + searchParams.get("sortReverse") || defaultSortReverse + ); + + React.useEffect(() => { + saveStorage( + locale, + Object.assign({}, lastStorageData, { + defaultSort: sort, + defaultSortReverse: sortReverse, + }) + ); + }, [locale, sort, sortReverse, lastStorageData]); + + if (locale.toLowerCase() === "en-us") { + return null; + } + + return ( + + {lastData && !error && isValidating && ( +

    Reloading...

    + )} + {!data && !error && !lastData && ( + + )} + {lastData && ( +

    + Go to{" "} + + Translation differences for {locale} + +

    + )} + {error && } + {lastData && ( +
    + + +
    + )} + {data && } +
    + ); +} + +function Container({ children }: { children: React.ReactNode }) { + return ( + + {children} + + ); +} + +function ShowSearchError({ error }) { + return ( +
    +

    Search error

    +
    {error.toString()}
    +
    + ); +} + +function BuildTimes({ times }: { times: Times }) { + function format(ms: number) { + if (ms > 1000) { + const s = ms / 1000; + return `${s.toFixed(1)} seconds`; + } else { + return `${Math.trunc(ms)} milliseconds`; + } + } + return ( +
    +

    Time to find all documents {format(times.took)}

    +
    + ); +} + +function Loading({ estimate }: { estimate: number }) { + const startLoadingTime = new Date(); + const [estimateEndTime] = React.useState( + new Date(startLoadingTime.getTime() + estimate) + ); + + const [, setIncrements] = React.useState(0); + React.useEffect(() => { + const interval = setInterval(() => { + setIncrements((state) => state + 1); + }, 1000); + return () => clearInterval(interval); + }, []); + + const distance = estimateEndTime.getTime() - startLoadingTime.getTime(); + const elapsed = new Date().getTime() - startLoadingTime.getTime(); + const percent = (100 * elapsed) / distance; + return ( +
    + + {percent}% + +
    + + Estimated time to finish: {((distance - elapsed) / 1000).toFixed(0)}s{" "} + {elapsed > distance ? ( + + 🙃 + + ) : null} + +
    + ); +} + +function FilterControls() { + const [searchParams, setSearchParams] = useSearchParams(); + const [title, setTitle] = React.useState(searchParams.get("title") || ""); + const [url, setURL] = React.useState(searchParams.get("url") || ""); + + function refreshFilters(reset = false) { + const filterParams = createSearchParams(searchParams); + for (const [key, value] of [ + ["url", url], + ["title", title], + ]) { + if (!reset && value) { + filterParams.set(key, value); + } else { + filterParams.delete(key); + } + } + filterParams.delete("page"); + setSearchParams(filterParams); + } + + function resetFilters() { + setURL(""); + setTitle(""); + refreshFilters(true); + } + + return ( +
    +

    Filters

    +
    { + event.preventDefault(); + refreshFilters(); + }} + > +
    +

    Document

    + { + setURL(event.target.value); + }} + onBlur={() => refreshFilters()} + /> + { + setTitle(event.target.value); + }} + onBlur={() => refreshFilters()} + /> +
    + +
    +

     

    + {" "} + {(url || title) && ( + + )} +
    +
    +
    + ); +} +type NumericOperation = { + operation: "eq" | "gt" | "gte" | "lt" | "lte"; + value: number; +}; + +function getNumericOperation(expression: string): NumericOperation | null { + function parseIntOrThrow(v: string) { + if (!v) { + throw new Error("Can't be empty"); + } + + const parsed = parseInt(v, 10); + if (isNaN(parsed)) { + throw new Error(`'${v}' not a valid number`); + } + return parsed; + } + try { + if (expression.startsWith(">=")) { + return { + operation: "gte", + value: parseIntOrThrow(expression.replace(">=", "")), + }; + } else if (expression.startsWith(">")) { + return { + operation: "gt", + value: parseIntOrThrow(expression.replace(">", "")), + }; + } else if (expression.startsWith("<=")) { + return { + operation: "lte", + value: parseIntOrThrow(expression.replace("<=", "")), + }; + } else if (expression.startsWith("<")) { + return { + operation: "lt", + value: parseIntOrThrow(expression.replace("<", "")), + }; + } else if (expression.startsWith("==") || expression.startsWith("=")) { + return { + operation: "eq", + value: parseIntOrThrow(expression.replace(/=/g, "")), + }; + } else if (expression) { + return { + operation: "eq", + value: parseIntOrThrow(expression), + }; + } else { + return null; + } + } catch (error) { + console.warn(error); + return null; + } +} + +function matchNumericOperation(value: number, op: NumericOperation): boolean { + if (op.operation === "eq") { + if (value !== op.value) { + return false; + } + } else if (op.operation === "gt") { + if (!(value > op.value)) { + return false; + } + } else if (op.operation === "gte") { + if (!(value >= op.value)) { + return false; + } + } else if (op.operation === "lt") { + if (!(value < op.value)) { + return false; + } + } else if (op.operation === "lte") { + if (!(value <= op.value)) { + return false; + } + } else { + throw new Error(`Not implemented operation '${op.operation}'`); + } + return true; +} + +function DocumentsTable({ + counts, + documents, + sort, + sortReverse, +}: { + counts: Counts; + documents: Document[]; + sort: string; + sortReverse: boolean; +}) { + const [searchParams, setSearchParams] = useSearchParams(); + + const page = parseInt(searchParams.get("page") || "1", 10); + const pageSize = parseInt(searchParams.get("pageSize") || "20", 10); + const filterTitle = searchParams.get("title") || ""; + const filterURL = searchParams.get("url") || ""; + const filterDifferences = searchParams.get("differences") || ""; + const filterDifferencesOperation = getNumericOperation(filterDifferences); + + function TableHead({ id, title }: { id: string; title: string }) { + return ( + { + if (sort === id) { + setSearchParams( + createSearchParams({ + sort: id, + sortReverse: JSON.stringify(!sortReverse), + }) + ); + } else { + setSearchParams(createSearchParams({ sort: id })); + } + }} + className="sortable" + > + {title} {sort === id ? (sortReverse ? "↓" : "↑") : null} + + ); + } + + const filteredDocuments = documents + .filter((document) => { + if ( + filterTitle && + !document.title.toLowerCase().includes(filterTitle.toLowerCase()) + ) { + return false; + } + + if ( + filterURL && + !document.mdn_url.toLowerCase().includes(filterURL.toLowerCase()) + ) { + return false; + } + + if ( + filterDifferencesOperation && + !matchNumericOperation( + document.differences.total, + filterDifferencesOperation + ) + ) { + return false; + } + + return true; + }) + .sort((A, B) => { + let reverse = sortReverse ? -1 : 1; + if (sort === "modified") { + const a = new Date(A.edits.modified); + const b = new Date(B.edits.modified); + return reverse * (b.getTime() - a.getTime()); + } else if (sort === "popularity") { + const a = A.popularity.value; + const b = B.popularity.value; + return reverse * (b - a); + } else if (sort === "differences") { + const a = A.differences.total; + const b = B.differences.total; + return reverse * (b - a); + } else if (sort === "title") { + const a = A.title; + const b = B.title; + return reverse * a.localeCompare(b); + } else if (sort === "mdn_url") { + const a = A.mdn_url; + const b = B.mdn_url; + return reverse * a.localeCompare(b); + } else { + throw new Error(`Unrecognized sort '${sort}'`); + } + }); + const pageCount = Math.ceil(counts.total / pageSize); + + return ( +
    +

    + {counts.missing.toLocaleString()} missing translations (of{" "} + {counts.total.toLocaleString()} possible) +

    + + + + + + + + + + + {filteredDocuments + .slice((page - 1) * pageSize, page * pageSize) + .map((doc: Document) => { + return ( + + + + + + ); + })} + +
    + + {filterTitle ? ( + + ) : ( + doc.title + )} + +
    + + + +
    + {!doc.popularity.ranking + ? "n/a" + : `${getGetOrdinal(doc.popularity.ranking)}`}{" "} + + +
    + + +
    + ); +} + +function LastModified({ edits }: { edits: DocumentEdits }) { + const modified = dayjs(edits.modified); + return ( + + + + + + ); +} + +function HighlightedText({ + text, + highlight, +}: { + text: string; + highlight: string; +}) { + // Split on highlight term and include term into parts, ignore case + const parts = text.split(new RegExp(`(${highlight})`, "gi")); + return ( + + {" "} + {parts.map((part, i) => ( + + {part} + + ))}{" "} + + ); +} + +function BriefURL({ uri, filterURL }: { uri: string; filterURL: string }) { + const [left, right] = uri.split(/\/docs\//, 2); + return ( + <> + {left}/docs/ + + {filterURL ? ( + + ) : ( + right + )} + + + ); +} + +// https://gist.github.com/jlbruno/1535691/db35b4f3af3dcbb42babc01541410f291a8e8fac +function getGetOrdinal(n: number) { + const s = ["th", "st", "nd", "rd"]; + const v = n % 100; + return n.toLocaleString() + (s[(v - 20) % 10] || s[v] || s[0]); +} diff --git a/vendor/yari/client/src/types/notecards.ts b/vendor/yari/client/src/types/notecards.ts new file mode 100644 index 000000000..3454a44ab --- /dev/null +++ b/vendor/yari/client/src/types/notecards.ts @@ -0,0 +1,10 @@ +type NotecardType = + | "success" + | "warning" + | "deprecated" + | "error" + | "negative" + | "info" + | "experimental"; + +export type { NotecardType }; diff --git a/vendor/yari/client/src/types/notifications.ts b/vendor/yari/client/src/types/notifications.ts new file mode 100644 index 000000000..b81fd6a27 --- /dev/null +++ b/vendor/yari/client/src/types/notifications.ts @@ -0,0 +1,15 @@ +interface Notification { + id: number; + title: string; + text: string; + created: Date; + url: string; + read: boolean; + deleted: boolean; +} + +interface NotificationData { + items: Array; +} + +export type { Notification, NotificationData }; diff --git a/vendor/yari/client/src/types/playground.ts b/vendor/yari/client/src/types/playground.ts new file mode 100644 index 000000000..1e6b6db56 --- /dev/null +++ b/vendor/yari/client/src/types/playground.ts @@ -0,0 +1,5 @@ +export interface QueueEntry { + key: number; + id: string; + lang?: string | null; +} diff --git a/vendor/yari/client/src/types/theme.ts b/vendor/yari/client/src/types/theme.ts new file mode 100644 index 000000000..9371f2e2b --- /dev/null +++ b/vendor/yari/client/src/types/theme.ts @@ -0,0 +1,4 @@ +type Scheme = "dark" | "light"; +type Theme = Scheme | "os-default"; + +export type { Scheme, Theme }; diff --git a/vendor/yari/client/src/ui-context.tsx b/vendor/yari/client/src/ui-context.tsx new file mode 100644 index 000000000..fdc340f2e --- /dev/null +++ b/vendor/yari/client/src/ui-context.tsx @@ -0,0 +1,153 @@ +import React, { useCallback, useState } from "react"; +import Toast, { ToastData } from "./ui/atoms/toast"; +import { Theme } from "./types/theme"; +import { QueueEntry } from "./types/playground"; + +interface UIStatus { + toggleMobileOverlay: (id: Overlay, shown?: boolean) => void; + isSidebarOpen: boolean; + setIsSidebarOpen: React.Dispatch>; + setToastData: React.Dispatch>; + colorScheme: Theme; + setColorScheme: React.Dispatch>; + queuedExamples: Set; + queue: QueueEntry[]; + setQueue: React.Dispatch>; + highlightedQueueExample: null | string; + setHighlightedQueueExample: (value: string | null) => void; +} + +export enum Overlay { + Sidebar, + ArticleActions, + WatchMenu, + BookmarkMenu, +} + +const UIContext = React.createContext({ + toggleMobileOverlay: () => {}, + isSidebarOpen: false, + setIsSidebarOpen: () => {}, + setToastData: () => {}, + colorScheme: "os-default", + setColorScheme: () => {}, + queuedExamples: new Set(), + queue: [], + setQueue: () => {}, + highlightedQueueExample: null, + setHighlightedQueueExample: () => {}, +}); + +export function UIProvider(props: any) { + const initialTheme = window.localStorage.getItem("theme"); + const [mobileOverlays, setMobileOverlays] = useState>(new Set()); + const [isSidebarOpen, setIsSidebarOpen] = useState(false); + const [toastData, setToastData] = useState(null); + const [colorScheme, setColorScheme] = useState( + (initialTheme as Theme) || "os-default" + ); + const [queuedExamples, setQueuedExamples] = useState>(new Set()); + const [queue, setQueue] = useState([]); + const [highlightedQueueExample, setHighlightedQueueExample] = useState< + string | null + >(null); + + const toggleMobileOverlay = useCallback( + (overlay: Overlay, shown?: boolean) => { + setMobileOverlays((oldOverlays) => { + const overlays = new Set(oldOverlays); + if (typeof shown !== "boolean") { + overlays.has(overlay) + ? overlays.delete(overlay) + : overlays.add(overlay); + } else if (shown) { + overlays.add(overlay); + } else { + overlays.delete(overlay); + } + // if the set hasn't changed, return the old set object + // so react doesn't think it's been mutated + return oldOverlays.size === overlays.size ? oldOverlays : overlays; + }); + }, + [] + ); + + React.useEffect(() => { + const setDark = (event) => { + if (event.matches) { + setColorScheme("dark"); + } + }; + const setLight = (event) => { + if (event.matches) { + setColorScheme("light"); + } + }; + const dark = window.matchMedia("(prefers-color-scheme: dark)"); + if (dark.matches) { + setColorScheme("dark"); + } + + if (!("addEventListener" in dark)) { + // MediaQueryList doesn't inherit EventTarget in Safari < 14. + return; + } + + dark.addEventListener("change", setDark); + const light = window.matchMedia("(prefers-color-scheme: light)"); + light.addEventListener("change", setLight); + return () => { + light.removeEventListener("change", setLight); + dark.removeEventListener("change", setDark); + }; + }, []); + + React.useEffect(() => { + toggleMobileOverlay(Overlay.Sidebar, isSidebarOpen); + }, [isSidebarOpen, toggleMobileOverlay]); + + React.useEffect(() => { + mobileOverlays.size + ? document.body.classList.add("mobile-overlay-active") + : document.body.classList.remove("mobile-overlay-active"); + }, [mobileOverlays]); + + React.useEffect(() => { + setQueuedExamples(new Set(queue.map((item) => item.id))); + }, [queue]); + + return ( + + {props.children} + {toastData ? ( + { + if (toastData?.closeHandler) toastData.closeHandler(e); + setToastData(null); + }} + /> + ) : null} + + ); +} + +export function useUIStatus() { + return React.useContext(UIContext); +} diff --git a/vendor/yari/client/src/ui/README.md b/vendor/yari/client/src/ui/README.md new file mode 100644 index 000000000..084b6c15c --- /dev/null +++ b/vendor/yari/client/src/ui/README.md @@ -0,0 +1,41 @@ +# The UI Folder + +> NOTE: This document is a work in progress. If you have any questions please +> contact me(@schalkneethling) on Slack + +The UI folder contains all the UI components of the application. + +> NOTE: Some of this is still a work in progress + +The most important pieces to understand here is that: + +- Small concrete components like a button, goes into the `atoms` folder +- As soon as you combine more that one `atom`, it goes into the `molecules` + folder +- As soon as you start combining `molecules`, it goes into the `organisms` + folder + +Larger pieces like full pages, will go into the relevant top level folders such +as the `client/src/plus/` folder. + +## The `minimalist` folder + +This is a not in sync copy of +[mdn-minimalist](https://github.com/mdn/mdn-minimalist). See the note on the +status of this under the `theme` folder docs below. + +## The `theme` folder + +When we embarked on the redesign, the idea was to use +[mdn-minimalist](https://github.com/mdn/mdn-minimalist) as the base and override +what is different. In the end this proved more cumbersome than we had hoped. +This means that either the `theme` folder will be removed in future or, the +`client/src/ui/minimalist` folder. + +For the moment it is a little confusing 🙃 - If anything is unclear, please +reach out. + +## The `vars` folder + +This is the folder into which we will generate the Style Dictionary variables. +You should never need to touch these. diff --git a/vendor/yari/client/src/ui/_color-palette.scss b/vendor/yari/client/src/ui/_color-palette.scss new file mode 100644 index 000000000..0eb572b57 --- /dev/null +++ b/vendor/yari/client/src/ui/_color-palette.scss @@ -0,0 +1,19 @@ +@use "sass:color"; + +@function tint($color, $percentage) { + @return color.mix(white, $color, $percentage); +} + +@function shade($color, $percentage) { + @return color.mix(black, $color, $percentage); +} + +@function mdn-color($color, $value) { + @if $value < 50 { + @return tint($color, 100 - ($value * 2)); + } + @if $value > 50 { + @return shade($color, ($value * 2) - 100); + } + @return $color; +} diff --git a/vendor/yari/client/src/ui/_mixins.scss b/vendor/yari/client/src/ui/_mixins.scss new file mode 100644 index 000000000..3194ab2f3 --- /dev/null +++ b/vendor/yari/client/src/ui/_mixins.scss @@ -0,0 +1,44 @@ +@mixin fade-in() { + animation: fade-in 0.5s ease-out; +} + +@keyframes fade-in { + 0% { + opacity: 0; + } + + 50% { + opacity: 0.5; + } + + 100% { + opacity: 1; + } +} + +@mixin line-clamp($lines, $line-height, $background-color) { + max-height: calc(1em * $lines * $line-height); + overflow: hidden; + position: relative; + + &::after { + background: $background-color; + content: ""; + display: block; + height: calc(1em * $line-height); + mask-image: linear-gradient(to right, transparent, #000 75%); + pointer-events: none; + position: absolute; + right: 0; + top: calc(1em * ($lines - 1) * $line-height); + width: 20ch; + } + + &:dir(rtl) { + &::after { + left: 0; + mask-image: linear-gradient(to left, transparent, #000 75%); + right: initial; + } + } +} diff --git a/vendor/yari/client/src/ui/_vars.scss b/vendor/yari/client/src/ui/_vars.scss new file mode 100644 index 000000000..5f09b694f --- /dev/null +++ b/vendor/yari/client/src/ui/_vars.scss @@ -0,0 +1,256 @@ +@use "./color-palette" as *; + +$mdn-color-neutral-light-70: #f9f9fb; +$mdn-color-neutral-light-80: #f2f1f1; +$mdn-color-neutral-light-90: #ebeaea; + +$mdn-color-neutral-10: #e2e2e2; +$mdn-color-neutral-20: #cdcdcd; +$mdn-color-neutral-30: #b3b3b3; +$mdn-color-neutral-40: #9e9e9e; +$mdn-color-neutral-50: #858585; +$mdn-color-neutral-60: #696969; +$mdn-color-neutral-70: #4e4e4e; +$mdn-color-neutral-75: #313131; +$mdn-color-neutral-80: #343434; +$mdn-color-neutral-90: #1b1b1b; + +$mdn-color-light-theme-blue: #0085f2; +$mdn-color-light-theme-green: #009a46; +$mdn-color-light-theme-yellow: #928700; +$mdn-color-light-theme-red: #d30038; +$mdn-color-light-theme-violet: #9b65ff; +$mdn-color-light-theme-pink: #d00058; + +$mdn-color-dark-theme-blue: $mdn-color-light-theme-blue; +$mdn-color-dark-theme-green: $mdn-color-light-theme-green; +$mdn-color-dark-theme-yellow: $mdn-color-light-theme-yellow; +$mdn-color-dark-theme-red: $mdn-color-light-theme-red; +$mdn-color-dark-theme-violet: $mdn-color-light-theme-violet; +$mdn-color-dark-theme-pink: $mdn-color-light-theme-pink; + +$mdn-color-light-theme-blue-10: #dce2f2; +$mdn-color-light-theme-blue-20: #c1cff1; +$mdn-color-light-theme-blue-30: #8cb4ff; +$mdn-color-light-theme-blue-40: #5e9eff; +$mdn-color-light-theme-blue-50: #0085f2; +$mdn-color-light-theme-blue-60: #0069c2; +$mdn-color-light-theme-blue-70: #004d92; +$mdn-color-light-theme-blue-80: #003465; +$mdn-color-light-theme-blue-90: #001b3a; + +$mdn-color-dark-theme-blue-10: $mdn-color-light-theme-blue-10; +$mdn-color-dark-theme-blue-20: $mdn-color-light-theme-blue-20; +$mdn-color-dark-theme-blue-30: $mdn-color-light-theme-blue-30; +$mdn-color-dark-theme-blue-40: $mdn-color-light-theme-blue-40; +$mdn-color-dark-theme-blue-50: $mdn-color-light-theme-blue-50; +$mdn-color-dark-theme-blue-60: $mdn-color-light-theme-blue-60; +$mdn-color-dark-theme-blue-70: $mdn-color-light-theme-blue-70; +$mdn-color-dark-theme-blue-80: $mdn-color-light-theme-blue-80; +$mdn-color-dark-theme-blue-90: $mdn-color-light-theme-blue-90; + +$mdn-color-light-theme-green-10: #a9f3ba; +$mdn-color-light-theme-green-20: #73e693; +$mdn-color-light-theme-green-30: #00d061; +$mdn-color-light-theme-green-40: #00b755; +$mdn-color-light-theme-green-50: #009a46; +$mdn-color-light-theme-green-60: #007936; +$mdn-color-light-theme-green-70: #005a26; +$mdn-color-light-theme-green-80: #003d18; +$mdn-color-light-theme-green-90: #00210a; + +$mdn-color-dark-theme-green-10: $mdn-color-light-theme-green-10; +$mdn-color-dark-theme-green-20: $mdn-color-light-theme-green-20; +$mdn-color-dark-theme-green-30: $mdn-color-light-theme-green-30; +$mdn-color-dark-theme-green-40: $mdn-color-light-theme-green-40; +$mdn-color-dark-theme-green-50: $mdn-color-light-theme-green-50; +$mdn-color-dark-theme-green-60: $mdn-color-light-theme-green-60; +$mdn-color-dark-theme-green-70: $mdn-color-light-theme-green-70; +$mdn-color-dark-theme-green-80: $mdn-color-light-theme-green-80; +$mdn-color-dark-theme-green-90: $mdn-color-light-theme-green-90; + +$mdn-color-light-theme-yellow-10: #f0e498; +$mdn-color-light-theme-yellow-20: #dfd172; +$mdn-color-light-theme-yellow-30: #c7b700; +$mdn-color-light-theme-yellow-40: #afa100; +$mdn-color-light-theme-yellow-50: #938700; +$mdn-color-light-theme-yellow-60: #746a00; +$mdn-color-light-theme-yellow-70: #564e00; +$mdn-color-light-theme-yellow-80: #3a3500; +$mdn-color-light-theme-yellow-90: #1f1c00; + +$mdn-color-dark-theme-yellow-10: $mdn-color-light-theme-yellow-10; +$mdn-color-dark-theme-yellow-20: $mdn-color-light-theme-yellow-20; +$mdn-color-dark-theme-yellow-30: $mdn-color-light-theme-yellow-30; +$mdn-color-dark-theme-yellow-40: $mdn-color-light-theme-yellow-40; +$mdn-color-dark-theme-yellow-50: $mdn-color-light-theme-yellow-50; +$mdn-color-dark-theme-yellow-60: $mdn-color-light-theme-yellow-60; +$mdn-color-dark-theme-yellow-70: $mdn-color-light-theme-yellow-70; +$mdn-color-dark-theme-yellow-80: $mdn-color-light-theme-yellow-80; +$mdn-color-dark-theme-yellow-90: $mdn-color-light-theme-yellow-90; + +$mdn-color-light-theme-red-10: #ffd9dc; +$mdn-color-light-theme-red-20: #ffc0c4; +$mdn-color-light-theme-red-30: #ff97a0; +$mdn-color-light-theme-red-40: #ff707f; +$mdn-color-light-theme-red-50: #ff2a51; +$mdn-color-light-theme-red-60: #d30038; +$mdn-color-light-theme-red-70: #9e0027; +$mdn-color-light-theme-red-80: #6f0019; +$mdn-color-light-theme-red-90: #40000a; + +$mdn-color-dark-theme-red-10: $mdn-color-light-theme-red-10; +$mdn-color-dark-theme-red-20: $mdn-color-light-theme-red-20; +$mdn-color-dark-theme-red-30: $mdn-color-light-theme-red-30; +$mdn-color-dark-theme-red-40: $mdn-color-light-theme-red-40; +$mdn-color-dark-theme-red-50: $mdn-color-light-theme-red-50; +$mdn-color-dark-theme-red-60: $mdn-color-light-theme-red-60; +$mdn-color-dark-theme-red-70: $mdn-color-light-theme-red-70; +$mdn-color-dark-theme-red-80: $mdn-color-light-theme-red-80; +$mdn-color-dark-theme-red-90: $mdn-color-light-theme-red-90; + +$mdn-color-light-theme-violet-10: #e6deff; +$mdn-color-light-theme-violet-20: #d4c5ff; +$mdn-color-light-theme-violet-30: #bea5ff; +$mdn-color-light-theme-violet-40: #ae8aff; +$mdn-color-light-theme-violet-50: #9b65ff; +$mdn-color-light-theme-violet-60: #872bff; +$mdn-color-light-theme-violet-70: #6800cf; +$mdn-color-light-theme-violet-80: #480091; +$mdn-color-light-theme-violet-90: #280056; + +$mdn-color-dark-theme-violet-10: $mdn-color-light-theme-violet-10; +$mdn-color-dark-theme-violet-20: $mdn-color-light-theme-violet-20; +$mdn-color-dark-theme-violet-30: $mdn-color-light-theme-violet-30; +$mdn-color-dark-theme-violet-40: $mdn-color-light-theme-violet-40; +$mdn-color-dark-theme-violet-50: $mdn-color-light-theme-violet-50; +$mdn-color-dark-theme-violet-60: $mdn-color-light-theme-violet-60; +$mdn-color-dark-theme-violet-70: $mdn-color-light-theme-violet-70; +$mdn-color-dark-theme-violet-80: $mdn-color-light-theme-violet-80; +$mdn-color-dark-theme-violet-90: $mdn-color-light-theme-violet-90; + +$mdn-color-light-theme-pink-10: #ffd9df; +$mdn-color-light-theme-pink-20: #ffbbc8; +$mdn-color-light-theme-pink-30: #ff93aa; +$mdn-color-light-theme-pink-40: #ff6d91; +$mdn-color-light-theme-pink-50: #ff1f72; +$mdn-color-light-theme-pink-60: #d00058; +$mdn-color-light-theme-pink-70: #9e0041; +$mdn-color-light-theme-pink-80: #6d002b; +$mdn-color-light-theme-pink-90: #3f0015; + +$mdn-color-dark-theme-pink-10: $mdn-color-light-theme-pink-10; +$mdn-color-dark-theme-pink-20: $mdn-color-light-theme-pink-20; +$mdn-color-dark-theme-pink-30: $mdn-color-light-theme-pink-30; +$mdn-color-dark-theme-pink-40: $mdn-color-light-theme-pink-40; +$mdn-color-dark-theme-pink-50: $mdn-color-light-theme-pink-50; +$mdn-color-dark-theme-pink-60: $mdn-color-light-theme-pink-60; +$mdn-color-dark-theme-pink-70: $mdn-color-light-theme-pink-70; +$mdn-color-dark-theme-pink-80: $mdn-color-light-theme-pink-80; +$mdn-color-dark-theme-pink-90: $mdn-color-light-theme-pink-90; + +$mdn-color-black: #000; +$mdn-color-white: #fff; +$mdn-color-ads: #00d0aa; + +$mdn-theme-light-text-primary: $mdn-color-neutral-90; +$mdn-theme-light-text-secondary: $mdn-color-neutral-70; +$mdn-theme-light-text-active: #{$mdn-color-neutral-50}; +$mdn-theme-light-text-inactive: #{$mdn-color-neutral-40}a6; +$mdn-theme-light-text-link: $mdn-color-light-theme-blue-60; +$mdn-theme-light-text-invert: $mdn-color-white; +$mdn-theme-light-text-muted: #6f6f6f; +$mdn-theme-light-background-primary: $mdn-color-white; +$mdn-theme-light-background-secondary: $mdn-color-neutral-light-70; +$mdn-theme-light-background-tertiary: #ebeaea; +$mdn-theme-light-background-toc-active: $mdn-color-neutral-light-90; +$mdn-theme-light-border-primary: $mdn-color-neutral-20; +$mdn-theme-light-border-secondary: $mdn-color-neutral-20; +$mdn-theme-light-border-success: $mdn-color-light-theme-green-20; +$mdn-theme-light-button-primary-default: $mdn-color-neutral-90; +$mdn-theme-light-button-primary-hover: $mdn-color-neutral-60; +$mdn-theme-light-button-primary-active: $mdn-color-neutral-40; +$mdn-theme-light-button-primary-inactive: $mdn-color-neutral-90; +$mdn-theme-light-button-secondary-default: $mdn-color-white; +$mdn-theme-light-button-secondary-hover: $mdn-color-neutral-20; +$mdn-theme-light-button-secondary-active: $mdn-color-neutral-20; +$mdn-theme-light-button-secondary-inactive: $mdn-color-neutral-light-70; +$mdn-theme-light-button-secondary-border-focus: $mdn-color-light-theme-blue-50; +$mdn-theme-light-button-secondary-border-red: $mdn-color-light-theme-red-30; +$mdn-theme-light-button-secondary-border-red-focus: $mdn-color-light-theme-red-10; +$mdn-theme-light-icon-primary: $mdn-color-neutral-60; +$mdn-theme-light-icon-secondary: $mdn-color-neutral-30; +$mdn-theme-light-icon-information: $mdn-color-light-theme-blue-50; +$mdn-theme-light-icon-warning: $mdn-color-light-theme-red-50; +$mdn-theme-light-icon-critical: $mdn-color-light-theme-red-60; +$mdn-theme-light-icon-success: $mdn-color-light-theme-green-60; +$mdn-theme-light-accent-primary: $mdn-color-light-theme-blue-50; +$mdn-theme-light-accent-secondary: $mdn-color-light-theme-blue-50; +$mdn-theme-light-field-focus-border: $mdn-color-light-theme-blue-50; +$mdn-theme-light-focus-01: 0 0 0 3px rgba(0, 144, 237, 0.4); +$mdn-theme-light-shadow-01: 0 1px 2px rgba(43, 42, 51, 0.05); +$mdn-theme-light-shadow-02: 0 1px 6px rgba(43, 42, 51, 0.1); + +$mdn-theme-light-code-token-tag: $mdn-color-light-theme-blue-60; +$mdn-theme-light-code-token-punctuation: $mdn-color-neutral-50; +$mdn-theme-light-code-token-attribute-name: $mdn-color-light-theme-red-60; +$mdn-theme-light-code-token-attribute-value: $mdn-color-light-theme-green-60; +$mdn-theme-light-code-token-comment: $mdn-color-neutral-50; +$mdn-theme-light-code-token-default: $mdn-color-neutral-90; +$mdn-theme-light-code-token-selector: $mdn-color-light-theme-violet-60; +$mdn-theme-light-code-background-inline: $mdn-color-neutral-light-80; +$mdn-theme-light-code-background-block: $mdn-color-neutral-light-80; + +$mdn-theme-dark-text-primary: $mdn-color-white; +$mdn-theme-dark-text-secondary: $mdn-color-neutral-20; +$mdn-theme-dark-text-active: #{$mdn-color-neutral-50}; +$mdn-theme-dark-text-inactive: #{$mdn-color-neutral-20}a6; +$mdn-theme-dark-text-link: $mdn-color-dark-theme-blue-30; +$mdn-theme-dark-text-invert: $mdn-color-neutral-90; +$mdn-theme-dark-text-muted: #858585; +$mdn-theme-dark-background-primary: $mdn-color-neutral-90; +$mdn-theme-dark-background-secondary: $mdn-color-neutral-75; +$mdn-theme-dark-background-tertiary: #858585; +$mdn-theme-dark-background-toc-active: $mdn-color-neutral-80; +$mdn-theme-dark-border-primary: $mdn-color-neutral-50; +$mdn-theme-dark-border-secondary: $mdn-color-neutral-60; +$mdn-theme-dark-border-success: $mdn-color-dark-theme-green-20; +$mdn-theme-dark-button-primary-default: $mdn-color-white; +$mdn-theme-dark-button-primary-hover: $mdn-color-neutral-20; +$mdn-theme-dark-button-primary-active: $mdn-color-neutral-40; +$mdn-theme-dark-button-primary-inactive: $mdn-color-white; +$mdn-theme-dark-button-secondary-default: $mdn-color-neutral-70; +$mdn-theme-dark-button-secondary-hover: $mdn-color-neutral-50; +$mdn-theme-dark-button-secondary-active: $mdn-color-neutral-40; +$mdn-theme-dark-button-secondary-inactive: $mdn-color-neutral-70; +$mdn-theme-dark-shadow-01: 0 1px 2px rgba(251, 251, 254, 0.2); +$mdn-theme-dark-shadow-02: 0 1px 6px rgba(251, 251, 254, 0.2); +$mdn-theme-dark-icon-primary: $mdn-color-white; +$mdn-theme-dark-icon-secondary: $mdn-color-neutral-30; +$mdn-theme-dark-icon-information: $mdn-color-dark-theme-blue-40; +$mdn-theme-dark-icon-warning: $mdn-color-dark-theme-yellow-40; +$mdn-theme-dark-icon-critical: $mdn-color-dark-theme-red-40; +$mdn-theme-dark-icon-success: $mdn-color-dark-theme-green-40; +$mdn-theme-dark-accent-primary: $mdn-color-dark-theme-blue-40; +$mdn-theme-dark-accent-secondary: $mdn-color-dark-theme-blue-40; +$mdn-theme-dark-field-focus-border: $mdn-color-white; +$mdn-theme-dark-focus-01: 0 0 0 3px rgba(251, 251, 254, 0.5); + +$mdn-theme-dark-code-token-tag: $mdn-color-dark-theme-blue-20; +$mdn-theme-dark-code-token-punctuation: $mdn-color-neutral-30; +$mdn-theme-dark-code-token-attribute-name: $mdn-color-dark-theme-red-30; +$mdn-theme-dark-code-token-attribute-value: $mdn-color-dark-theme-green-30; +$mdn-theme-dark-code-token-comment: $mdn-color-neutral-30; +$mdn-theme-dark-code-token-default: $mdn-color-white; +$mdn-theme-dark-code-token-selector: $mdn-color-dark-theme-violet-30; +$mdn-theme-dark-code-background-inline: $mdn-color-neutral-80; +$mdn-theme-dark-code-background-block: $mdn-color-neutral-80; + +$screen-sm: 426px; +$screen-md: 769px; +$screen-lg: 992px; +$screen-xl: 1200px; +$screen-xxl: 1441px; + +// screen is to small for sticky placement +$screen-height-place-limit: 44rem; diff --git a/vendor/yari/client/src/ui/atoms/auth-disabled/index.scss b/vendor/yari/client/src/ui/atoms/auth-disabled/index.scss new file mode 100644 index 000000000..5090e2e2a --- /dev/null +++ b/vendor/yari/client/src/ui/atoms/auth-disabled/index.scss @@ -0,0 +1,13 @@ +@use "../../vars" as *; + +.auth-disabled { + border: 1px solid var(--border-primary); + border-radius: var(--elem-radius); + box-shadow: var(--shadow-01); + color: var(--text-secondary); + padding: 16px; + + p { + margin-bottom: 0; + } +} diff --git a/vendor/yari/client/src/ui/atoms/auth-disabled/index.tsx b/vendor/yari/client/src/ui/atoms/auth-disabled/index.tsx new file mode 100644 index 000000000..ee4a0062a --- /dev/null +++ b/vendor/yari/client/src/ui/atoms/auth-disabled/index.tsx @@ -0,0 +1,12 @@ +import "./index.scss"; + +export function AuthDisabled() { + return ( +
    +

    + Authentication disabled: Authentication and the user + settings app is currently disabled. +

    +
    + ); +} diff --git a/vendor/yari/client/src/ui/atoms/avatar/index.scss b/vendor/yari/client/src/ui/atoms/avatar/index.scss new file mode 100644 index 000000000..4d48929c0 --- /dev/null +++ b/vendor/yari/client/src/ui/atoms/avatar/index.scss @@ -0,0 +1,31 @@ +@use "../../vars" as *; + +.avatar { + border-radius: 50%; + + &-wrap { + border-radius: 50%; + height: 32px; + /* pull the avatar into the space on the left + introduced by the border */ + margin-left: -7px; + margin-right: 0.1rem; + position: relative; + width: 32px; + + /* + &.is-subscriber { + padding: 2px; + background: radial-gradient( + circle, + white 55%, + var(--background-mark-yellow) 55% + ); + } + */ + } + + @media (min-width: $screen-md) { + margin: initial; + } +} diff --git a/vendor/yari/client/src/ui/atoms/avatar/index.tsx b/vendor/yari/client/src/ui/atoms/avatar/index.tsx new file mode 100644 index 000000000..cacc93810 --- /dev/null +++ b/vendor/yari/client/src/ui/atoms/avatar/index.tsx @@ -0,0 +1,21 @@ +import { UserData } from "../../../user-context"; + +import "./index.scss"; + +export const Avatar = ({ userData }: { userData: UserData }) => { + // If we have user data and the user is logged in, show their + // profile pic, defaulting to the dino head if the avatar + // URL doesn't work. + const avatarImage = "/assets/avatar.png"; + + return ( + + ); +}; diff --git a/vendor/yari/client/src/ui/atoms/button/_mixins.scss b/vendor/yari/client/src/ui/atoms/button/_mixins.scss new file mode 100644 index 000000000..d6c6d84c4 --- /dev/null +++ b/vendor/yari/client/src/ui/atoms/button/_mixins.scss @@ -0,0 +1,49 @@ +@mixin _button { + --button-font: var(--type-emphasis-m); + --button-padding: 0.43rem 1rem; + --button-radius: var(--elem-radius, 0.25rem); + + background-color: var(--button-bg); + border: 1px solid var(--button-border-color); + border-radius: var(--button-radius); + color: var(--button-color); + display: inline-block; + font: var(--button-font); + letter-spacing: normal; + padding: var(--button-padding); + text-align: center; + text-decoration: none; + + &.external:after { + display: none; + } + + &:hover { + --button-border-color: var(--button-bg-hover); + --button-bg: var(--button-bg-hover); + } + + &:active { + --button-bg: var(--button-bg-active); + } +} + +@mixin primary { + --button-bg: var(--button-primary-default); + --button-bg-hover: var(--button-primary-hover); + --button-bg-active: var(--button-primary-active); + --button-border-color: var(--button-primary-default); + --button-color: var(--background-primary); + + @include _button; +} + +@mixin secondary { + --button-bg: var(--button-secondary-default); + --button-bg-hover: var(--button-secondary-hover); + --button-bg-active: var(--button-secondary-active); + --button-border-color: var(--border-primary); + --button-color: var(--text-secondary); + + @include _button; +} diff --git a/vendor/yari/client/src/ui/atoms/button/index.scss b/vendor/yari/client/src/ui/atoms/button/index.scss new file mode 100644 index 000000000..947f5421f --- /dev/null +++ b/vendor/yari/client/src/ui/atoms/button/index.scss @@ -0,0 +1,226 @@ +button, +.button { + appearance: none; + background: none; + border: none; +} + +.button { + --button-bg: var(--button-primary-default); + --button-bg-hover: var(--button-primary-hover); + --button-bg-active: var(--button-primary-active); + --button-border-color: var(--button-primary-default); + --button-focus-effect: var(--focus-effect); + --button-height: var(--form-elem-height, 2rem); + --button-color: var(--background-primary); + --button-font: var(--type-emphasis-m); + --button-padding: 0.5rem; + --button-radius: var(--elem-radius, 0.25rem); + border-radius: var(--button-radius); + + cursor: pointer; + display: inline-block; + padding: 0; + text-decoration: none; +} + +.button-wrap { + align-items: center; + background-color: var(--button-bg); + border: 1px solid var(--button-border-color); + border-radius: var(--button-radius); + color: var(--button-color); + display: flex; + font: var(--button-font); + gap: 0.25rem; + height: var(--button-height); + justify-content: center; + padding-left: var(--button-padding); + padding-right: var(--button-padding); + position: relative; +} + +.button .icon { + background-color: var(--button-color); + margin: 0 -1px; // shrinks icon-only buttons to square. +} + +/* Button States */ + +.button:hover, +.button.hover { + // In most cases, we want the border to be the same color as the background. + --button-border-color: var(--button-bg-hover, var(--button-bg)); + + .button-wrap { + background-color: var(--button-bg-hover, var(--button-bg)); + } +} + +.button:active, +.button.active { + .button-wrap { + background-color: var(--button-bg-active, var(--button-bg)); + } +} + +.button:focus, +.button.focus { + outline: none; + + .button-wrap { + border: 1px solid var(--button-secondary-border-focus); + box-shadow: var(--button-focus-effect); + } +} + +.button.button[disabled], +.button.button.inactive { + cursor: default; + opacity: 0.65; + + &:hover { + --button-bg-hover: unset; + } + + &:active { + --button-bg-active: unset; + } +} + +/* Standard Button Modifiers */ + +.button.small, +.button.small .button-wrap { + --button-height: 1.75rem; + --button-padding: 0.25rem; +} + +/* Secondary Version */ + +.button.secondary { + --button-bg: var(--button-secondary-default); + --button-border-color: var(--border-primary); + --button-color: var(--text-secondary); + --button-bg-hover: var(--button-secondary-hover); + --button-bg-active: var(--button-secondary-active); + + &:focus { + --button-border-color: var(--button-secondary-border-focus); + } +} + +/* Action Version */ + +.button.action { + --button-bg: transparent; + --button-border-color: var(--button-bg); + --button-color: var(--text-secondary); + --button-font: var(--type-label-s); + --button-bg-hover: var(--button-secondary-hover); + --button-bg-active: var(--button-secondary-active); + + &.has-icon { + --button-font: var(--type-emphasis-m); + text-transform: initial; + } + + &:focus { + --button-border-color: var(--button-secondary-border-focus); + } + + .button-wrap { + text-transform: var(--button-action-transform, uppercase); + } + + &.highlight { + --button-color: var(--button-primary-default); + } +} + +/* Select Version */ +.button.select { + --button-bg: var(--button-secondary-default); + --button-bg-hover: var(--button-secondary-hover); + --button-bg-active: var(--button-secondary-active); + --button-border-color: var(--border-primary); + --button-color: var(--text-secondary); + appearance: none; + background: none; + border: none; + padding: 0; + text-decoration: none; + + .button-wrap { + box-shadow: var(--shadow-01); + padding-right: 26px; + position: relative; + } + + .button-wrap::after { + background-color: var(--icon-primary); + content: ""; + display: block; + height: 16px; + mask-image: url("../../../assets/icons/small-arrow.svg"); + mask-size: cover; + position: absolute; + right: 0.5rem; + top: calc(50% - 0.5rem); + width: 16px; + } +} + +.button.link { + --button-bg: none; + --button-bg-hover: none; + --button-bg-active: none; + --button-border-color: none; + --button-focus-effect: none; + --button-secondary-border-focus: none; + --button-height: auto; + --button-font: unset; + --button-padding: 0; + --button-radius: 0; + + --button-color: var(--text-link); + appearance: none; + display: inline; + text-decoration: none; + + &:focus-visible { + outline-color: var(--accent-primary); + outline-offset: 1px; + outline-style: auto; + } +} + +/* +.high-contrast-white { + .button:focus { + --button-border-color: var(--border-primary); + --button-focus-effect: 0 0 0 4px var(--background-primary), + 0 0 0 7px var(--border-primary); + } +} + +.high-contrast-black { + .button:focus { + --button-border-color: var(--border-primary); + --button-focus-shadow: 0 0 0 4px var(--background-primary), + 0 0 0 7px var(--border-primary); + } + + .button { + --button-color: var(--button-secondary-default); + } + + .button.secondary { + --button-border-color: var(--button-color); + } + + .button.action { + --button-color: var(--text-secondary); + } +} +*/ diff --git a/vendor/yari/client/src/ui/atoms/button/index.tsx b/vendor/yari/client/src/ui/atoms/button/index.tsx new file mode 100644 index 000000000..d6584df1f --- /dev/null +++ b/vendor/yari/client/src/ui/atoms/button/index.tsx @@ -0,0 +1,134 @@ +import * as React from "react"; +import { Icon } from "../icon"; +import InternalLink from "../internal-link"; + +import "./index.scss"; +import { FormMethod } from "react-router-dom"; + +type ButtonProps = { + title?: string; + + type?: "primary" | "secondary" | "action" | "select" | "link"; + + /** + * The `type` of the button. Not used with links. + */ + buttonType?: "button" | "submit" | "reset"; + name?: string; + extraClasses?: string | null; + href?: string; + target?: string; + rel?: string; + icon?: string; + + id?: string; + /** + * Should the button be disabled? This is optional with a default of false + */ + isDisabled?: boolean; + formMethod?: FormMethod | "dialog"; + onClickHandler?: (event: React.MouseEvent) => void; + onFocusHandler?: (event: React.FocusEvent) => void; + + size?: "small" | "medium"; + + state?: "default" | "hover" | "active" | "focused" | "inactive"; + value?: string; + children?: React.ReactNode; +}; + +export const Button = ({ + title, + name, + type = "primary", + buttonType = "button", + extraClasses, + href, + target, + rel, + icon, + id, + isDisabled = false, + onClickHandler, + onFocusHandler, + size, + state, + value, + formMethod, + children, + ...passthroughAttrs +}: ButtonProps) => { + let buttonClasses = "button"; + [type, size, state].forEach((attr) => { + if (attr) { + buttonClasses += ` ${attr}`; + } + }); + + buttonClasses += icon ? " has-icon" : ""; + buttonClasses += extraClasses ? ` ${extraClasses}` : ""; + + function renderContent() { + if (icon) { + return ( + <> + + {children} + + ); + } + + return children; + } + + if (href) { + if (target) { + return ( + + {renderContent()} + + ); + } + return ( + + {renderContent()} + + ); + } + return ( + + ); +}; diff --git a/vendor/yari/client/src/ui/atoms/checkbox/index.tsx b/vendor/yari/client/src/ui/atoms/checkbox/index.tsx new file mode 100644 index 000000000..90f39f6af --- /dev/null +++ b/vendor/yari/client/src/ui/atoms/checkbox/index.tsx @@ -0,0 +1,33 @@ +import React from "react"; + +type CheckboxProps = { + checked?: boolean; + indeterminate?: boolean; + id?: string; + name?: string; + onChange?: React.ChangeEventHandler; +}; + +export function Checkbox({ + checked, + indeterminate, + children, + id, + name, + onChange, +}: React.PropsWithChildren) { + return ( + <> + el && (el.indeterminate = !!indeterminate)} + onChange={onChange} + /> + {children && } + + ); +} diff --git a/vendor/yari/client/src/ui/atoms/container/index.scss b/vendor/yari/client/src/ui/atoms/container/index.scss new file mode 100644 index 000000000..f80d46ddd --- /dev/null +++ b/vendor/yari/client/src/ui/atoms/container/index.scss @@ -0,0 +1,8 @@ +.container { + margin-left: auto; + margin-right: auto; + max-width: var(--max-width); + padding-left: var(--gutter); + padding-right: var(--gutter); + width: 100%; +} diff --git a/vendor/yari/client/src/ui/atoms/container/index.tsx b/vendor/yari/client/src/ui/atoms/container/index.tsx new file mode 100644 index 000000000..c5edc3ef3 --- /dev/null +++ b/vendor/yari/client/src/ui/atoms/container/index.tsx @@ -0,0 +1,21 @@ +import "./index.scss"; + +export default function Container({ + children, + extraClasses, + optional, +}: { + children: React.ReactNode; + extraClasses?: string; + optional?: boolean; +}) { + return ( + <> + {optional === true ? ( + <>{children} + ) : ( +
    {children}
    + )} + + ); +} diff --git a/vendor/yari/client/src/ui/atoms/form/expanding-textarea.tsx b/vendor/yari/client/src/ui/atoms/form/expanding-textarea.tsx new file mode 100644 index 000000000..841361c6d --- /dev/null +++ b/vendor/yari/client/src/ui/atoms/form/expanding-textarea.tsx @@ -0,0 +1,54 @@ +import { + DetailedHTMLProps, + TextareaHTMLAttributes, + forwardRef, + useEffect, + useImperativeHandle, + useRef, +} from "react"; + +type AreaProps = DetailedHTMLProps< + TextareaHTMLAttributes, + HTMLTextAreaElement +>; + +const ExpandingTextarea = forwardRef(function ExpandingTextarea( + props: AreaProps | { enterKeyHint: string }, + ref +) { + const { value } = props as AreaProps; + const textAreaRef = useRef(null); + + useImperativeHandle(ref, () => { + return { + focus() { + textAreaRef.current?.focus(); + }, + }; + }, []); + useEffect(() => { + const node = textAreaRef.current; + + if (!node) { + return; + } + + // Collapse. + node.style.height = ""; + + if (value && node.scrollHeight > node.clientHeight) { + // Expand. + node.style.height = `${node.scrollHeight + 2}px`; + } + }, [value]); + + return ( +

    + Unsubscribe now via the{" "} + + Settings Page. + +