diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 68bc6080ff61..0716bad5703f 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "2.42.1" + ".": "2.43.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index db97cd28e7d2..de3a9110c650 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,32 @@ # Changelog +## [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) diff --git a/build/blog.ts b/build/blog.ts index a79c6af15d28..b6c22ef8b9cf 100644 --- a/build/blog.ts +++ b/build/blog.ts @@ -281,7 +281,7 @@ export async function buildBlogPosts(options: { const url = `/${locale}/blog/${blogMeta.slug}/`; const renderUrl = `/${locale}/blog/${blogMeta.slug}`; - const renderDoc = { + const renderDoc: BlogPostDoc = { url: renderUrl, rawBody: body, metadata: { locale, ...blogMeta }, @@ -344,11 +344,11 @@ export async function buildBlogPosts(options: { } } -interface BlogPostDoc { +export interface BlogPostDoc { url: string; rawBody: string; metadata: BlogPostMetadata & { locale: string }; - isMarkdown: boolean; + isMarkdown: true; fileInfo: { path: string; }; @@ -368,7 +368,7 @@ export async function buildPost( let $ = null; const liveSamples: LiveSample[] = []; - [$] = await kumascript.render(document.url, {}, document as any); + [$] = await kumascript.render(document.url, {}, document); const liveSamplePages = await kumascript.buildLiveSamplePages( document.url, @@ -449,8 +449,12 @@ export async function buildBlogFeed(options: { verbose?: boolean }) { description: post.description, author: [ { - name: post.author?.name || "The MDN Team", - link: post.author?.link, + 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), diff --git a/build/curriculum.ts b/build/curriculum.ts index 1a2ed232e58f..1a7cc7c77e65 100644 --- a/build/curriculum.ts +++ b/build/curriculum.ts @@ -40,7 +40,7 @@ import { memoize, slugToFolder } from "../content/utils.js"; import { renderHTML } from "../ssr/dist/main.js"; import { CheerioAPI } from "cheerio"; -export const allFiles: () => string[] = memoize(async () => { +export const allFiles = memoize(async () => { const api = new fdir() .withFullPaths() .withErrors() @@ -49,7 +49,7 @@ export const allFiles: () => string[] = memoize(async () => { return (await api.withPromise()).sort(); }); -export const buildIndex: () => CurriculumMetaData[] = memoize(async () => { +export const buildIndex = memoize(async () => { const files = await allFiles(); const modules = await Promise.all( files.map( diff --git a/build/flaws/broken-links.ts b/build/flaws/broken-links.ts index 7cfa890de067..f0468bc6b3c7 100644 --- a/build/flaws/broken-links.ts +++ b/build/flaws/broken-links.ts @@ -49,13 +49,16 @@ function mutateLink( ) { if (isSelfLink) { $element.attr("aria-current", "page"); - } else if (suggestion) { - $element.attr("href", suggestion); } else if (enUSFallback) { + // 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.append(` (${DEFAULT_LOCALE})`); $element.addClass("only-in-en-us"); $element.attr("title", "Currently only available in English (US)"); + } else if (suggestion) { + $element.attr("href", suggestion); } else { $element.addClass("page-not-created"); $element.attr("title", "This is a link to an unwritten page"); @@ -299,7 +302,6 @@ export function getBrokenLinksFlaws( resolved + absoluteURL.search + absoluteURL.hash.toLowerCase() ); } else { - let enUSFallbackURL = null; // 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. @@ -316,28 +318,38 @@ export function getBrokenLinksFlaws( `/${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) { - enUSFallbackURL = enUSFound.url; + // 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); } - addBrokenLink( - a, - checked.get(href), - href, - null, - enUSFallbackURL - ? "Can use the English (en-US) link as a fallback" - : null, - enUSFallbackURL - ); } } // But does it have the correct case?! diff --git a/build/spas.ts b/build/spas.ts index f64c294c2ed6..1afb175a51a5 100644 --- a/build/spas.ts +++ b/build/spas.ts @@ -2,7 +2,6 @@ import fs from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; -import cheerio from "cheerio"; import frontmatter from "front-matter"; import { fdir, PathsOutput } from "fdir"; import got from "got"; @@ -22,7 +21,7 @@ import { DEV_MODE, } from "../libs/env/index.js"; import { isValidLocale } from "../libs/locale-utils/index.js"; -import { DocFrontmatter, NewsItem } from "../libs/types/document.js"; +import { DocFrontmatter, DocParent, NewsItem } from "../libs/types/document.js"; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore import { renderHTML } from "../ssr/dist/main.js"; @@ -38,6 +37,12 @@ const FEATURED_ARTICLES = [ "docs/Web/CSS/color_value", ]; +const LATEST_NEWS: (NewsItem | string)[] = [ + "blog/mdn-curriculum-launch/", + "blog/baseline-evolution-on-mdn/", + "blog/introducing-the-mdn-playground/", +]; + const contributorSpotlightRoot = CONTRIBUTOR_SPOTLIGHT_ROOT; async function buildContributorSpotlight( @@ -318,6 +323,10 @@ export async function buildSPAs(options: { mdn_url: `/${DEFAULT_LOCALE}/blog/${slug}/`, summary: description, title, + tag: { + uri: `/${DEFAULT_LOCALE}/blog/`, + title: "Blog", + } satisfies DocParent, }; } } @@ -415,90 +424,37 @@ async function fetchRecentContributions() { } async function fetchLatestNews() { - const items: NewsItem[] = []; - - items.push( - { - title: "Responsibly empowering developers with AI on MDN", - url: `https://blog.mozilla.org/en/products/mdn/responsibly-empowering-developers-with-ai-on-mdn/`, - author: "Steve Teixeira", - published_at: new Date("Thu, 06 Jul 2023 14:41:20 +0000").toString(), - source: { - name: "blog.mozilla.org", - url: `https://blog.mozilla.org/en/latest/`, - }, - }, - { - title: "Introducing AI Help: Your Trusted Companion for Web Development", - url: `/${DEFAULT_LOCALE}/blog/introducing-ai-help/`, - author: "Hermina Condei", - published_at: new Date("2023-06-27").toString(), - source: { - name: "developer.mozilla.org", - url: `/${DEFAULT_LOCALE}/blog/`, - }, - }, - { - title: "Introducing the MDN Playground: Bring your code to life!", - url: `/${DEFAULT_LOCALE}/blog/introducing-the-mdn-playground/`, - author: "Florian Dieminger", - published_at: new Date("2023-06-22").toString(), - source: { - name: "developer.mozilla.org", - url: `/${DEFAULT_LOCALE}/blog/`, - }, - }, - { - title: "Introducing Baseline: a unified view of stable web features", - url: `/${DEFAULT_LOCALE}/blog/baseline-unified-view-stable-web-features/`, - author: "Hermina Condei", - published_at: new Date("2023-05-10").toString(), - source: { - name: "developer.mozilla.org", - url: `/${DEFAULT_LOCALE}/blog/`, - }, - }, - ...(await fetchHacksNews()) - ); + const items: NewsItem[] = ( + await Promise.all( + LATEST_NEWS.map(async (itemOrUrl) => { + if (typeof itemOrUrl !== "string") { + return itemOrUrl; + } + const url = itemOrUrl; + const post = await findPostBySlug( + getSlugByBlogPostUrl(`/${DEFAULT_LOCALE}/${url}`) + ); + if (post) { + const { + doc: { title }, + blogMeta: { author, date, slug }, + } = post; + return { + title, + url: `/${DEFAULT_LOCALE}/blog/${slug}/`, + author: author?.name || "The MDN Team", + published_at: new Date(date).toString(), + source: { + name: "developer.mozilla.org", + url: `/${DEFAULT_LOCALE}/blog/`, + }, + }; + } + }) + ) + ).filter(Boolean); return { items, }; } - -async function fetchHacksNews(): Promise { - try { - const xml = await got( - "https://hacks.mozilla.org/category/mdn/feed/" - ).text(); - - const $ = cheerio.load(xml, { xmlMode: true }); - - const items: NewsItem[] = []; - $("item").each((i, item) => { - const $item = $(item); - - items.push({ - title: $item.find("title").text(), - url: $item.find("guid").text(), - author: $item.find("dc\\:creator").text(), - published_at: $item.find("pubDate").text(), - source: { - name: "hacks.mozilla.org", - url: "https://hacks.mozilla.org/category/mdn/", - }, - }); - }); - - return items; - } catch (e) { - const msg = "Couldn't fetch hacks.mozilla.org feed!"; - if (!DEV_MODE) { - console.error(`Error: ${msg}`); - throw e; - } - - console.warn(`Warning: ${msg}`); - return []; - } -} diff --git a/client/pwa/package.json b/client/pwa/package.json index be13e72a313d..7e14de1ed888 100644 --- a/client/pwa/package.json +++ b/client/pwa/package.json @@ -12,13 +12,13 @@ "dev": "webpack-cli --watch" }, "dependencies": { - "@zip.js/zip.js": "2.7.36", - "dexie": "3.2.5" + "@zip.js/zip.js": "2.7.40", + "dexie": "3.2.6" }, "devDependencies": { "@types/dexie": "1.3.1", "ts-loader": "^9.5.1", - "typescript": "^5.3.3", + "typescript": "^5.4.2", "webpack": "^5.90.3", "webpack-cli": "^5.1.4", "workers-preview": "^1.0.6" diff --git a/client/pwa/yarn.lock b/client/pwa/yarn.lock index c6f283910778..c05ed09ecf1d 100644 --- a/client/pwa/yarn.lock +++ b/client/pwa/yarn.lock @@ -249,10 +249,10 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -"@zip.js/zip.js@2.7.36": - version "2.7.36" - resolved "https://registry.yarnpkg.com/@zip.js/zip.js/-/zip.js-2.7.36.tgz#eb1ee00b5cf00769ebf6e0ad0570546acb9221bb" - integrity sha512-u11fkedhUmMYIH1RRiVJM7fVw4CY+VPl0k6BxLBgngsIml70gGvbTHLhbXcN+BMBmQbZWL3DGEVxIo2xXVkLWg== +"@zip.js/zip.js@2.7.40": + version "2.7.40" + resolved "https://registry.yarnpkg.com/@zip.js/zip.js/-/zip.js-2.7.40.tgz#e53626cfe051119df97bf1672188b9f36dfe75b8" + integrity sha512-kSYwO0Wth6G66QM4CejZqG0nRhBsVVTaR18M/Ta8EcqcvaV0dYrnDDyKAstfy0V5+ejK4b9w5xc1W0ECATJTvA== acorn-import-assertions@^1.9.0: version "1.9.0" @@ -371,10 +371,10 @@ cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -dexie@*, dexie@3.2.5: - version "3.2.5" - resolved "https://registry.yarnpkg.com/dexie/-/dexie-3.2.5.tgz#f68e34b98e0e5e3412cf86b540a2cc6cbf9b0266" - integrity sha512-MA7vYQvXxWN2+G50D0GLS4FqdYUyRYQsN0FikZIVebOmRoNCSCL9+eUbIF80dqrfns3kmY+83+hE2GN9CnAGyA== +dexie@*, dexie@3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/dexie/-/dexie-3.2.6.tgz#c5980e4228d7e81744bb324c81459afa6604da41" + integrity sha512-R9VzQ27/cncQymoAeD1kfu66NUrdxcnMNXVfEoFLnQ+apVVbS4++veUcSGxft9V++zaeiLkMAREOMf8EwgR/Vw== dependencies: karma-safari-launcher "^1.0.0" @@ -849,10 +849,10 @@ ts-loader@^9.5.1: semver "^7.3.4" source-map "^0.7.4" -typescript@^5.3.3: - version "5.3.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" - integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== +typescript@^5.4.2: + version "5.4.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.2.tgz#0ae9cebcfae970718474fe0da2c090cad6577372" + integrity sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ== update-browserslist-db@^1.0.13: version "1.0.13" diff --git a/client/src/assets/article-footer/article-footer.svg b/client/src/assets/article-footer/article-footer.svg new file mode 100644 index 000000000000..4399f437fd58 --- /dev/null +++ b/client/src/assets/article-footer/article-footer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/client/src/blog/post.tsx b/client/src/blog/post.tsx index f54fbdadb6c9..75282a72fc3d 100644 --- a/client/src/blog/post.tsx +++ b/client/src/blog/post.tsx @@ -15,7 +15,6 @@ import { AuthorMetadata, } from "../../../libs/types/blog"; import { - useCollectSample, useCopyExamplesToClipboardAndAIExplain, useRunSample, } from "../document/hooks"; @@ -191,7 +190,6 @@ export function BlogPost(props: HydrationData) { ); const { doc, blogMeta } = data || props || {}; useRunSample(doc); - useCollectSample(doc); useCopyExamplesToClipboardAndAIExplain(doc); return ( <> diff --git a/client/src/document/index.scss b/client/src/document/index.scss index 3e01a1fe1370..8ea6914a3bfe 100644 --- a/client/src/document/index.scss +++ b/client/src/document/index.scss @@ -254,10 +254,13 @@ @media screen and (min-width: $screen-sm) { padding: 3rem; + // Reduce space to article footer. + padding-bottom: 0; } @media screen and (min-width: $screen-md) { - margin-bottom: 0.5rem; + // Reduce space to article footer. + margin-bottom: 0; padding: 0; } } @@ -276,7 +279,7 @@ table { width: 100%; th { - background: var(--background-tertiary); + background: var(--background-primary); font-weight: var(--font-body-strong-weight); line-height: 1.5; text-align: left; diff --git a/client/src/document/index.tsx b/client/src/document/index.tsx index d7d5a49261c8..1a5edd1e4503 100644 --- a/client/src/document/index.tsx +++ b/client/src/document/index.tsx @@ -28,7 +28,7 @@ import { RenderSideBar } from "./organisms/sidebar"; import { RetiredLocaleNote } from "./molecules/retired-locale-note"; import { MainContentContainer } from "../ui/atoms/page-content"; import { Loading } from "../ui/atoms/loading"; -import { Metadata } from "./organisms/metadata"; +import { ArticleFooter } from "./organisms/article-footer"; import { PageNotFound } from "../page-not-found"; import "./index.scss"; @@ -46,6 +46,8 @@ import { useInteractiveExamplesActionHandler as useInteractiveExamplesTelemetry import { BottomBanner, SidePlacement } from "../ui/organisms/placement"; import { BaselineIndicator } from "./baseline-indicator"; import { PlayQueue } from "../playground/queue"; +import { useGleanClick } from "../telemetry/glean-context"; +import { CLIENT_SIDE_NAVIGATION } from "../telemetry/constants"; // import { useUIStatus } from "../ui-context"; // Lazy sub-components @@ -66,6 +68,7 @@ export class HTTPError extends Error { export function Document(props /* TODO: define a TS interface for this */) { const ga = useGA(); + const gleanClick = useGleanClick(); const isServer = useIsServer(); const mountCounter = React.useRef(0); @@ -139,6 +142,7 @@ export function Document(props /* TODO: define a TS interface for this */) { React.useEffect(() => { if (doc && !error) { if (mountCounter.current > 0) { + const location = window.location.toString(); // 'dimension19' means it's a client-side navigation. // I.e. not the initial load but the location has now changed. // Note that in local development, where you use `localhost:3000` @@ -146,15 +150,16 @@ export function Document(props /* TODO: define a TS interface for this */) { ga("set", "dimension19", "Yes"); ga("send", { hitType: "pageview", - location: window.location.toString(), + location, }); + 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++; } - }, [ga, doc, error]); + }, [ga, gleanClick, doc, error]); React.useEffect(() => { const location = document.location; @@ -265,8 +270,8 @@ export function Document(props /* TODO: define a TS interface for this */) { - + {false && } diff --git a/client/src/document/ingredients/browser-compatibility-table/feature-row.tsx b/client/src/document/ingredients/browser-compatibility-table/feature-row.tsx index e933b3278b7f..d3a9df3ff70b 100644 --- a/client/src/document/ingredients/browser-compatibility-table/feature-row.tsx +++ b/client/src/document/ingredients/browser-compatibility-table/feature-row.tsx @@ -336,7 +336,7 @@ function getNotes( (otherItem) => otherItem.version_added === item.version_removed ) ? { - iconName: "disabled", + iconName: "footnote", label: ( <> Removed in {labelFromString(item.version_removed, browser)}{" "} diff --git a/client/src/document/ingredients/browser-compatibility-table/index.scss b/client/src/document/ingredients/browser-compatibility-table/index.scss index 82241659a1cc..7fdb5556ca31 100644 --- a/client/src/document/ingredients/browser-compatibility-table/index.scss +++ b/client/src/document/ingredients/browser-compatibility-table/index.scss @@ -29,7 +29,7 @@ } th { - background: var(--background-tertiary); + background: var(--background-primary); padding: 0.4rem; vertical-align: bottom; } diff --git a/client/src/document/on-github.tsx b/client/src/document/on-github.tsx index 5c6ac39f0d42..f73b59ab8a3f 100644 --- a/client/src/document/on-github.tsx +++ b/client/src/document/on-github.tsx @@ -3,59 +3,17 @@ import { Doc } from "../../../libs/types/document"; export function OnGitHubLink({ doc }: { doc: Doc }) { return (
-

Found a content problem with this page?

-
    -
  • - Edit the page on GitHub - . -
  • -
  • - - Report the content issue - - . -
  • -
  • - - View the source on GitHub - - . -
  • -
- Want to get more involved?{" "} - - Learn how to contribute - - . + + View this page on GitHub + {" "} + •{" "} + + Report a problem with this content +
); } -function EditOnGitHubLink({ - doc, - children, -}: { - doc: Doc; - children: React.ReactNode; -}) { - const { github_url } = doc.source; - return ( - - {children} - - ); -} - const METADATA_TEMPLATE = `
diff --git a/client/src/document/organisms/article-footer/index.scss b/client/src/document/organisms/article-footer/index.scss new file mode 100644 index 000000000000..a2efd690d347 --- /dev/null +++ b/client/src/document/organisms/article-footer/index.scss @@ -0,0 +1,110 @@ +@use "../../../ui/vars" as *; + +.article-footer { + background-color: var(--background-secondary); + border: 1px solid var(--border-primary); + border-radius: var(--elem-radius); + box-shadow: var(--shadow-01); + margin: 0; + padding: 1rem; + + @media screen and (max-width: $screen-md) { + margin: 3rem; + // Reduce space to article content. + margin-top: 0; + } + + .article-footer-inner { + margin: 0 auto; + max-width: 1440px; + width: 100%; + + .svg-container { + position: relative; + + svg { + height: auto; + position: absolute; + right: 0; + top: 0; + width: 20%; + } + } + + h2 { + margin-top: 0; + padding: 0; + } + + .feedback { + border: none; + margin: 0; + margin-bottom: 0.25rem; + padding: 0; + + > label { + display: block; + margin-bottom: 0.25rem; + } + + .thank-you { + display: block; + margin-bottom: calc(2.75rem + 2px); + } + + .button-container { + // Ensure both buttons take minimal width. + display: inline-flex; + gap: 0.75rem; + margin: 0.25rem 0; + } + + button { + // Ensure both buttons have same size. + flex: 1; + min-width: 0; + + &:not(:hover) { + --button-bg: var(--background-secondary); + --button-color: var(--text-primary); + } + + &.yes { + --button-bg-hover: var(--text-primary-green); + } + + &.no { + --button-bg-hover: var(--text-primary-red); + } + } + + .button-wrap { + display: flex; + // Increase space between icon and button label. + gap: 0.5rem; + padding: 1rem; + } + + .radio-container { + align-items: center; + display: flex; + gap: 0.25rem; + margin: 0.25rem 0; + } + } + + .contribute { + margin-top: 0.25rem; + } + + .last-modified-date { + margin-bottom: 0; + margin-top: 2rem; + } + + .emoji { + // Ensure emojis are shown in color. + font-family: initial; + } + } +} diff --git a/client/src/document/organisms/article-footer/index.tsx b/client/src/document/organisms/article-footer/index.tsx new file mode 100644 index 000000000000..d190c7bf5e55 --- /dev/null +++ b/client/src/document/organisms/article-footer/index.tsx @@ -0,0 +1,156 @@ +import { useState } from "react"; +import { Button } from "../../../ui/atoms/button"; +import { OnGitHubLink } from "../../on-github"; +import { ReactComponent as ArticleFooterSVG } from "../../../assets/article-footer/article-footer.svg"; +import "./index.scss"; +import { useGleanClick } from "../../../telemetry/glean-context"; +import { ARTICLE_FOOTER, THUMBS } from "../../../telemetry/constants"; + +export function LastModified({ value, locale }) { + if (!value) { + return Last modified date not known; + } + const date = new Date(value); + // Justification for these is to match historically + const dateStringOptions: Intl.DateTimeFormatOptions = { + year: "numeric", + month: "short", + day: "numeric", + }; + return ( + <> + This page was last modified on{" "} + + + ); +} + +export function Authors({ url }) { + return MDN contributors; +} + +enum ArticleFooterView { + Vote, + Feedback, + Thanks, +} + +type FeedbackReason = "outdated" | "incomplete" | "code_examples" | "other"; + +const FEEDBACK_REASONS: Required> = { + outdated: "Content is out of date", + incomplete: "Missing information", + code_examples: "Code examples not working as expected", + other: "Other", +}; + +export function ArticleFooter({ doc, locale }) { + const [view, setView] = useState(ArticleFooterView.Vote); + const [reason, setReason] = useState(); + + const gleanClick = useGleanClick(); + + function handleVote(value: boolean) { + setView(value ? ArticleFooterView.Thanks : ArticleFooterView.Feedback); + // Reusing Thumbs' key to be able to reuse queries. + gleanClick(`${THUMBS}: ${ARTICLE_FOOTER} -> ${Number(value)}`); + } + + function handleFeedback() { + setView(ArticleFooterView.Thanks); + gleanClick(`${ARTICLE_FOOTER}: feedback -> ${reason}`); + } + + return ( + + ); +} + +function Contribute() { + return ( + <> + + Learn how to contribute + + . + + ); +} diff --git a/client/src/document/organisms/metadata/index.scss b/client/src/document/organisms/metadata/index.scss deleted file mode 100644 index 9bcdf4ee59e6..000000000000 --- a/client/src/document/organisms/metadata/index.scss +++ /dev/null @@ -1,26 +0,0 @@ -@use "../../../ui/vars" as *; - -.main-page-content .metadata { - background-color: var(--background-secondary); - border: 1px solid var(--border-primary); - border-radius: var(--elem-radius); - box-shadow: var(--shadow-01); - margin: 2rem 0; - padding: 1rem; - - h3 { - font: var(--type-heading-h4); - margin-top: 0.5rem; - padding: 0; - } -} - -.metadata-content-container { - margin: 0 auto; - max-width: 1440px; - width: 100%; - - .last-modified-date { - margin-bottom: 0; - } -} diff --git a/client/src/document/organisms/metadata/index.tsx b/client/src/document/organisms/metadata/index.tsx deleted file mode 100644 index 43dfbc99f324..000000000000 --- a/client/src/document/organisms/metadata/index.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { OnGitHubLink } from "../../on-github"; - -import "./index.scss"; - -export function LastModified({ value, locale }) { - if (!value) { - return Last modified date not known; - } - const date = new Date(value); - // Justification for these is to match historically - const dateStringOptions: Intl.DateTimeFormatOptions = { - year: "numeric", - month: "short", - day: "numeric", - }; - return ( - <> - This page was last modified on{" "} - - - ); -} - -export function Authors({ url }) { - return MDN contributors; -} - -export function Metadata({ doc, locale }) { - return ( - - ); -} diff --git a/client/src/homepage/featured-articles/index.scss b/client/src/homepage/featured-articles/index.scss index 44c7c2748ab1..0eb91706a122 100644 --- a/client/src/homepage/featured-articles/index.scss +++ b/client/src/homepage/featured-articles/index.scss @@ -45,7 +45,7 @@ } .tile-title { - align-items: flex-end; + align-items: flex-start; display: flex; flex-grow: 1; font: var(--type-heading-h5); diff --git a/client/src/homepage/recent-contributions/index.scss b/client/src/homepage/recent-contributions/index.scss index 4c1e6f7af7a3..e30f6673b249 100644 --- a/client/src/homepage/recent-contributions/index.scss +++ b/client/src/homepage/recent-contributions/index.scss @@ -50,6 +50,7 @@ gap: 0.125rem; line-height: var(--base-line-height); margin: 0; + overflow-wrap: break-word; a { color: var(--text-primary); diff --git a/client/src/plus/ai-help/index.scss b/client/src/plus/ai-help/index.scss index 0a7b0d4e155a..ecb6c0358724 100644 --- a/client/src/plus/ai-help/index.scss +++ b/client/src/plus/ai-help/index.scss @@ -475,21 +475,10 @@ } } - &.status-stopped .ai-help-message-content { - &.empty::after, - > :not(ol):not(ul):not(pre):last-child:after, - > ol:last-child li:last-child:after, - > pre:last-child code:after, - > ul:last-child li:last-child:after { - color: var(--text-muted); - content: "■\00a0Stopped answering"; - display: block; - margin-top: 1.7rem; - } - - &.empty::after { - margin-left: unset; - } + .stopped-message { + color: var(--text-muted); + display: block; + margin-top: 1.7rem; } } diff --git a/client/src/plus/ai-help/index.tsx b/client/src/plus/ai-help/index.tsx index 2c1943b92c51..a8f8920e7ac5 100644 --- a/client/src/plus/ai-help/index.tsx +++ b/client/src/plus/ai-help/index.tsx @@ -489,6 +489,11 @@ function AIHelpAssistantResponse({ > {isOffTopic ? SORRY_FRONTEND : message.content} + {message.status === "stopped" && ( +
+ {"■\u00a0Stopped answering"} +
+ )} {(message.status === "complete" || isOffTopic) && ( <>
@@ -536,7 +541,7 @@ function AIHelpAssistantResponseSources({
import("./form")); const SearchResults = React.lazy(() => import("./search-results")); @@ -13,6 +15,7 @@ const SearchResults = React.lazy(() => import("./search-results")); export function SiteSearch() { const isServer = useIsServer(); const ga = useGA(); + const gleanClick = useGleanClick(); const [searchParams] = useSearchParams(); const query = searchParams.get("q"); @@ -33,6 +36,7 @@ export function SiteSearch() { React.useEffect(() => { if (ga) { if (mountCounter.current > 0) { + const location = window.location.toString(); // 'dimension19' means it's a client-side navigation. // I.e. not the initial load but the location has now changed. // Note that in local development, where you use `localhost:3000` @@ -40,14 +44,15 @@ export function SiteSearch() { ga("set", "dimension19", "Yes"); ga("send", { hitType: "pageview", - location: window.location.toString(), + location, }); + 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, ga]); + }, [query, page, ga, gleanClick]); return (
diff --git a/client/src/site-search/search-results.tsx b/client/src/site-search/search-results.tsx index 25143953bad2..a17e7cea7b48 100644 --- a/client/src/site-search/search-results.tsx +++ b/client/src/site-search/search-results.tsx @@ -9,7 +9,6 @@ import { appendURL } from "./utils"; import { Button } from "../ui/atoms/button"; import "./search-results.scss"; -import { useGA } from "../ga-context"; import NoteCard from "../ui/molecules/notecards"; import LANGUAGES_RAW from "../../../libs/languages"; @@ -85,7 +84,6 @@ class ServerOperationalError extends Error { } export default function SearchResults() { - const ga = useGA(); const [searchParams] = useSearchParams(); const locale = useLocale(); // A call to `/api/v1/search` will default to mean the same thing as @@ -112,15 +110,6 @@ export default function SearchResults() { throw new Error(`${response.status} on ${url}`); } - // See docs/experiments/0001_site-search-x-cache.md - const xCacheHeaderValue = response.headers.get("x-cache"); - ga("send", { - hitType: "event", - eventCategory: "Site-search X-Cache", - eventAction: url, - eventLabel: xCacheHeaderValue || "no value", - }); - return await response.json(); }, { diff --git a/client/src/telemetry/constants.ts b/client/src/telemetry/constants.ts index 9be726b98719..6cf1a3ace4f5 100644 --- a/client/src/telemetry/constants.ts +++ b/client/src/telemetry/constants.ts @@ -24,6 +24,8 @@ export const PLAYGROUND = "play_action"; export const AI_EXPLAIN = "ai_explain"; export const SETTINGS = "settings"; +export const A11Y_MENU = "a11y_menu"; + export const MENU = Object.freeze({ CLICK_LINK: "menu_click_link", CLICK_MENU: "menu_click_menu", @@ -63,6 +65,8 @@ export const VIEWPORT_BREAKPOINTS: readonly [ViewportBreakpoint, number][] = ["sm", 426], ["xs", 0], ]); + +export const ARTICLE_FOOTER = "article_footer"; export const THUMBS = "thumbs"; export const BASELINE = Object.freeze({ @@ -71,3 +75,7 @@ export const BASELINE = Object.freeze({ 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 THEME_SWITCHER = "theme_switcher"; diff --git a/client/src/telemetry/glean-context.tsx b/client/src/telemetry/glean-context.tsx index b7ea335467ed..b72e278a8211 100644 --- a/client/src/telemetry/glean-context.tsx +++ b/client/src/telemetry/glean-context.tsx @@ -172,14 +172,14 @@ const gleanAnalytics = glean(); const GleanContext = React.createContext(gleanAnalytics); function handleButtonClick(ev: MouseEvent, click: (source: string) => void) { - const button = ev?.target; + const button = (ev?.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 anchor = ev?.target; + const anchor = (ev?.target as HTMLElement | null)?.closest("a"); if (anchor instanceof HTMLAnchorElement) { if (anchor.dataset.glean) { click(anchor.dataset.glean); diff --git a/client/src/ui/_vars.scss b/client/src/ui/_vars.scss index c77a0ba3bfa6..5f09b694fa98 100644 --- a/client/src/ui/_vars.scss +++ b/client/src/ui/_vars.scss @@ -162,7 +162,7 @@ $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: $mdn-color-white; +$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; @@ -210,7 +210,7 @@ $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: $mdn-color-neutral-90; +$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; diff --git a/client/src/ui/atoms/limit-banner/index.scss b/client/src/ui/atoms/limit-banner/index.scss index 70377cb49288..10e078e6c4e8 100644 --- a/client/src/ui/atoms/limit-banner/index.scss +++ b/client/src/ui/atoms/limit-banner/index.scss @@ -1,7 +1,7 @@ @use "../../vars.scss" as *; .limit-banner { - background: var(--background-tertiary); + background: var(--background-primary); border: 1px solid var(--border-secondary); border-radius: var(--elem-radius); margin-top: 0.5rem; diff --git a/client/src/ui/atoms/logo/index.scss b/client/src/ui/atoms/logo/index.scss index 236a909f2859..cd204f9e1921 100644 --- a/client/src/ui/atoms/logo/index.scss +++ b/client/src/ui/atoms/logo/index.scss @@ -3,6 +3,8 @@ .logo { align-items: center; display: flex; + // Width of largest logo ("mdn web docs"). + width: 160px; svg { height: 1.5rem; diff --git a/client/src/ui/molecules/a11y-nav/index.tsx b/client/src/ui/molecules/a11y-nav/index.tsx index b4e35fccadf2..e92cd01f1a17 100644 --- a/client/src/ui/molecules/a11y-nav/index.tsx +++ b/client/src/ui/molecules/a11y-nav/index.tsx @@ -1,11 +1,12 @@ import { useLocation } from "react-router-dom"; -import { useGA } from "../../../ga-context"; +import { useGleanClick } from "../../../telemetry/glean-context"; import "./index.scss"; +import { A11Y_MENU } from "../../../telemetry/constants"; export function A11yNav() { - const ga = useGA(); + const gleanClick = useGleanClick(); const { pathname } = useLocation(); const showLangMenuSkiplink = pathname.includes("/docs/"); @@ -16,14 +17,8 @@ export function A11yNav() { */ function sendAccessMenuItemClick(event) { const action = new URL(event.target.href).hash; - const label = event.target.textContent; - ga("send", { - hitType: "event", - eventCategory: "Access Links", - eventAction: action, - eventLabel: label, - }); + gleanClick(`${A11Y_MENU}: click ${action}`); } return ( diff --git a/client/src/ui/molecules/theme-switcher/index.tsx b/client/src/ui/molecules/theme-switcher/index.tsx index f542527e3886..91e143ccb6f0 100644 --- a/client/src/ui/molecules/theme-switcher/index.tsx +++ b/client/src/ui/molecules/theme-switcher/index.tsx @@ -9,6 +9,8 @@ import "./index.scss"; import { switchTheme } from "../../../utils"; import { Theme } from "../../../types/theme"; import { useUIStatus } from "../../../ui-context"; +import { useGleanClick } from "../../../telemetry/glean-context"; +import { THEME_SWITCHER } from "../../../telemetry/constants"; type ThemeButton = { id: Theme; @@ -19,6 +21,7 @@ export const ThemeSwitcher = () => { const menuId = "themes-menu"; const [isOpen, setIsOpen] = useState(false); + const gleanClick = useGleanClick(); const { setColorScheme } = useUIStatus(); const [activeTheme, setActiveTheme] = React.useState("os-default"); @@ -30,6 +33,7 @@ export const ThemeSwitcher = () => { `} icon={`theme-${id}`} onClickHandler={() => { + gleanClick(`${THEME_SWITCHER}: switch -> ${id}`); setColorScheme(id); switchTheme(id, setActiveTheme); setIsOpen(false); @@ -74,6 +78,7 @@ export const ThemeSwitcher = () => { icon={`theme-${activeTheme}`} extraClasses="theme-switcher-menu small" onClickHandler={() => { + gleanClick(`${THEME_SWITCHER}: ${isOpen ? "close" : "open"}`); setIsOpen(!isOpen); }} > diff --git a/client/src/ui/organisms/article-actions/language-menu/index.tsx b/client/src/ui/organisms/article-actions/language-menu/index.tsx index eb092e83b5d0..ee46ec371ab8 100644 --- a/client/src/ui/organisms/article-actions/language-menu/index.tsx +++ b/client/src/ui/organisms/article-actions/language-menu/index.tsx @@ -1,7 +1,7 @@ import { useState } from "react"; import { useLocation } from "react-router-dom"; -import { useGA } from "../../../../ga-context"; +import { useGleanClick } from "../../../../telemetry/glean-context"; import { Translation } from "../../../../../../libs/types/document"; import { Button } from "../../../atoms/button"; import { Submenu } from "../../../molecules/submenu"; @@ -9,6 +9,7 @@ import { Submenu } from "../../../molecules/submenu"; import "./index.scss"; import { DropdownMenu, DropdownMenuWrapper } from "../../../molecules/dropdown"; import { useLocale } from "../../../../hooks"; +import { LANGUAGE } from "../../../../telemetry/constants"; // This needs to match what's set in 'libs/constants.js' on the server/builder! const PREFERRED_LOCALE_COOKIE_NAME = "preferredlocale"; @@ -23,7 +24,7 @@ export function LanguageMenu({ native: string; }) { const menuId = "language-menu"; - const ga = useGA(); + const gleanClick = useGleanClick(); const locale = useLocale(); const [isOpen, setIsOpen] = useState(false); @@ -56,14 +57,8 @@ export function LanguageMenu({ } } - ga("send", { - hitType: "event", - eventCategory: "Language", - eventAction: `Change preferred language (cookie before: ${ - cookieValueBefore || "none" - })`, - eventLabel: `${window.location.pathname} to ${event.currentTarget.href}`, - }); + const oldValue = cookieValueBefore || "none"; + gleanClick(`${LANGUAGE}: ${oldValue} -> ${preferredLocale}`); } }; diff --git a/cloud-function/src/middlewares/redirect-locale.ts b/cloud-function/src/middlewares/redirect-locale.ts index 413fcd46add6..999c2687658b 100644 --- a/cloud-function/src/middlewares/redirect-locale.ts +++ b/cloud-function/src/middlewares/redirect-locale.ts @@ -4,7 +4,8 @@ import { getLocale } from "../internal/locale-utils/index.js"; import { VALID_LOCALES } from "../internal/constants/index.js"; import { redirect } from "../utils.js"; -const NEEDS_LOCALE = /^\/(?:docs|search|settings|signin|signup|plus)(?:$|\/)/; +const NEEDS_LOCALE = + /^\/(?:blog|curriculum|docs|play|search|settings|plus)(?:$|\/)/; export async function redirectLocale( req: Request, diff --git a/content/document.ts b/content/document.ts index dc4060c53865..6a7c4d126fa8 100644 --- a/content/document.ts +++ b/content/document.ts @@ -34,7 +34,7 @@ import { MEMOIZE_INVALIDATE, } from "./utils.js"; import * as Redirect from "./redirect.js"; -import { DocFrontmatter } from "../libs/types/document.js"; +import { DocFrontmatter, UnbuiltDocument } from "../libs/types/document.js"; export { urlToFolderPath, MEMOIZE_INVALIDATE } from "./utils.js"; @@ -185,173 +185,179 @@ export function getFolderPath(metadata, root: string | null = null) { ); } -export const read = memoize((folderOrFilePath: string, ...roots: string[]) => { - if (roots.length === 0) { - roots = ROOTS; - } - let filePath: string = null; - let folder: string = null; - let root: string = null; - let locale: string = null; - - if (fs.existsSync(folderOrFilePath)) { - filePath = folderOrFilePath; - - // It exists, but it is sane? - if ( - !( - filePath.endsWith(HTML_FILENAME) || filePath.endsWith(MARKDOWN_FILENAME) - ) - ) { - throw new Error(`'${filePath}' is not a HTML or Markdown file.`); +export const read = memoize( + (folderOrFilePath: string, ...roots: string[]): UnbuiltDocument => { + if (roots.length === 0) { + roots = ROOTS; } + let filePath: string = null; + let folder: string = null; + let root: string = null; + let locale: string = null; + + if (fs.existsSync(folderOrFilePath)) { + filePath = folderOrFilePath; + + // It exists, but it is sane? + if ( + !( + filePath.endsWith(HTML_FILENAME) || + filePath.endsWith(MARKDOWN_FILENAME) + ) + ) { + throw new Error(`'${filePath}' is not a HTML or Markdown file.`); + } - root = roots.find((possibleRoot) => filePath.startsWith(possibleRoot)); - if (root) { - folder = filePath - .replace(root + path.sep, "") - .replace(path.sep + HTML_FILENAME, "") - .replace(path.sep + MARKDOWN_FILENAME, ""); - locale = extractLocale(filePath.replace(root + path.sep, "")); + root = roots.find((possibleRoot) => filePath.startsWith(possibleRoot)); + if (root) { + folder = filePath + .replace(root + path.sep, "") + .replace(path.sep + HTML_FILENAME, "") + .replace(path.sep + MARKDOWN_FILENAME, ""); + locale = extractLocale(filePath.replace(root + path.sep, "")); + } else { + // The file exists but it doesn't appear to belong to any of our roots. + // That could happen if you pass in a file that is something completely + // different not a valid file anyway. + throw new Error( + `'${filePath}' does not appear to exist in any known content roots.` + ); + } } else { - // The file exists but it doesn't appear to belong to any of our roots. - // That could happen if you pass in a file that is something completely - // different not a valid file anyway. + folder = folderOrFilePath; + for (const possibleRoot of roots) { + const possibleMarkdownFilePath = path.join( + possibleRoot, + getMarkdownPath(folder) + ); + if (fs.existsSync(possibleMarkdownFilePath)) { + root = possibleRoot; + filePath = possibleMarkdownFilePath; + break; + } + const possibleHTMLFilePath = path.join( + possibleRoot, + getHTMLPath(folder) + ); + if (fs.existsSync(possibleHTMLFilePath)) { + root = possibleRoot; + filePath = possibleHTMLFilePath; + break; + } + } + if (!filePath) { + return; + } + locale = extractLocale(folder); + } + + if (folder.includes(" ")) { throw new Error( - `'${filePath}' does not appear to exist in any known content roots.` + `Folder contains whitespace which is not allowed (${util.inspect( + filePath + )})` ); } - } else { - folder = folderOrFilePath; - for (const possibleRoot of roots) { - const possibleMarkdownFilePath = path.join( - possibleRoot, - getMarkdownPath(folder) + if (folder.includes("\u200b")) { + throw new Error( + `Folder contains zero width whitespace which is not allowed (${filePath})` ); - if (fs.existsSync(possibleMarkdownFilePath)) { - root = possibleRoot; - filePath = possibleMarkdownFilePath; - break; - } - const possibleHTMLFilePath = path.join(possibleRoot, getHTMLPath(folder)); - if (fs.existsSync(possibleHTMLFilePath)) { - root = possibleRoot; - filePath = possibleHTMLFilePath; - break; - } } - if (!filePath) { - return; - } - locale = extractLocale(folder); - } - - if (folder.includes(" ")) { - throw new Error( - `Folder contains whitespace which is not allowed (${util.inspect( - filePath - )})` - ); - } - if (folder.includes("\u200b")) { - throw new Error( - `Folder contains zero width whitespace which is not allowed (${filePath})` + // Use Boolean() because otherwise, `isTranslated` might become `undefined` + // rather than an actual boolean value. + const isTranslated = Boolean( + CONTENT_TRANSLATED_ROOT && filePath.startsWith(CONTENT_TRANSLATED_ROOT) ); - } - // Use Boolean() because otherwise, `isTranslated` might become `undefined` - // rather than an actual boolean value. - const isTranslated = Boolean( - CONTENT_TRANSLATED_ROOT && filePath.startsWith(CONTENT_TRANSLATED_ROOT) - ); - const rawContent = fs.readFileSync(filePath, "utf-8"); - if (!rawContent) { - throw new Error(`${filePath} is an empty file`); - } + const rawContent = fs.readFileSync(filePath, "utf-8"); + if (!rawContent) { + throw new Error(`${filePath} is an empty file`); + } - // This is very useful in CI where every page gets built. If there's an - // accidentally unresolved git conflict, that's stuck in the content, - // bail extra early. - if ( - // If the document itself, is a page that explains and talks about git merge - // conflicts, i.e. a false positive, those angled brackets should be escaped - /^<<<<<<< HEAD\n/m.test(rawContent) && - /^=======\n/m.test(rawContent) && - /^>>>>>>>/m.test(rawContent) - ) { - throw new Error(`${filePath} contains git merge conflict markers`); - } + // This is very useful in CI where every page gets built. If there's an + // accidentally unresolved git conflict, that's stuck in the content, + // bail extra early. + if ( + // If the document itself, is a page that explains and talks about git merge + // conflicts, i.e. a false positive, those angled brackets should be escaped + /^<<<<<<< HEAD\n/m.test(rawContent) && + /^=======\n/m.test(rawContent) && + /^>>>>>>>/m.test(rawContent) + ) { + throw new Error(`${filePath} contains git merge conflict markers`); + } - const { - attributes: metadata, - body: rawBody, - bodyBegin: frontMatterOffset, - } = fm(rawContent); + const { + attributes: metadata, + body: rawBody, + bodyBegin: frontMatterOffset, + } = fm(rawContent); - const url = `/${locale}/docs/${metadata.slug}`; + const url = `/${locale}/docs/${metadata.slug}`; - const isActive = ACTIVE_LOCALES.has(locale.toLowerCase()); + const isActive = ACTIVE_LOCALES.has(locale.toLowerCase()); - // The last-modified is always coming from the git logs. Independent of - // which root it is. - const gitHistory = getGitHistories(root, locale).get( - path.relative(root, filePath) - ); - let modified = null; - let hash = null; - if (gitHistory) { - if ( - gitHistory.merged && - gitHistory.merged.modified && - gitHistory.merged.hash - ) { - modified = gitHistory.merged.modified; - hash = gitHistory.merged.hash; - } else { - modified = gitHistory.modified; - hash = gitHistory.hash; + // The last-modified is always coming from the git logs. Independent of + // which root it is. + const gitHistory = getGitHistories(root, locale).get( + path.relative(root, filePath) + ); + let modified = null; + let hash = null; + if (gitHistory) { + if ( + gitHistory.merged && + gitHistory.merged.modified && + gitHistory.merged.hash + ) { + modified = gitHistory.merged.modified; + hash = gitHistory.merged.hash; + } else { + modified = gitHistory.modified; + hash = gitHistory.hash; + } } + // Use the wiki histories for a list of legacy contributors. + const wikiHistory = getWikiHistories(root, locale).get(url); + if (!modified && wikiHistory && wikiHistory.modified) { + modified = wikiHistory.modified; + } + const fullMetadata = { + metadata: { + ...metadata, + // This is our chance to record and remember which keys were actually + // dug up from the front-matter. + // It matters because the keys in front-matter are arbitrary. + // Meaning, if a document contains `foo: bar` as a front-matter key/value + // we need to take note of that and make sure we preserve that if we + // save the metadata back (e.g. fixable flaws). + frontMatterKeys: Object.keys(metadata), + locale, + popularity: getPopularities().get(url) || 0.0, + modified, + hash, + contributors: wikiHistory ? wikiHistory.contributors : [], + }, + url, + }; + + return { + ...fullMetadata, + // ...{ rawContent }, + rawContent, // HTML or Markdown whole string with all the front-matter + rawBody, // HTML or Markdown string without the front-matter + isMarkdown: filePath.endsWith(MARKDOWN_FILENAME), + isTranslated, + isActive, + fileInfo: { + folder, + path: filePath, + frontMatterOffset, + root, + }, + }; } - // Use the wiki histories for a list of legacy contributors. - const wikiHistory = getWikiHistories(root, locale).get(url); - if (!modified && wikiHistory && wikiHistory.modified) { - modified = wikiHistory.modified; - } - const fullMetadata = { - metadata: { - ...metadata, - // This is our chance to record and remember which keys were actually - // dug up from the front-matter. - // It matters because the keys in front-matter are arbitrary. - // Meaning, if a document contains `foo: bar` as a front-matter key/value - // we need to take note of that and make sure we preserve that if we - // save the metadata back (e.g. fixable flaws). - frontMatterKeys: Object.keys(metadata), - locale, - popularity: getPopularities().get(url) || 0.0, - modified, - hash, - contributors: wikiHistory ? wikiHistory.contributors : [], - }, - url, - }; - - return { - ...fullMetadata, - // ...{ rawContent }, - rawContent, // HTML or Markdown whole string with all the front-matter - rawBody, // HTML or Markdown string without the front-matter - isMarkdown: filePath.endsWith(MARKDOWN_FILENAME), - isTranslated, - isActive, - fileInfo: { - folder, - path: filePath, - frontMatterOffset, - root, - }, - }; -}); +); export async function update(url: string, rawBody: string, metadata) { const folder = urlToFolderPath(url); diff --git a/content/translations.ts b/content/translations.ts index 3b06a4c59f23..d1fe335e6f71 100644 --- a/content/translations.ts +++ b/content/translations.ts @@ -1,6 +1,7 @@ import * as Document from "./document.js"; import { VALID_LOCALES } from "../libs/constants/index.js"; import LANGUAGES_RAW from "../libs/languages/index.js"; +import { Translation } from "../libs/types/document.js"; const LANGUAGES = new Map( Object.entries(LANGUAGES_RAW).map(([locale, data]) => { @@ -8,12 +9,6 @@ const LANGUAGES = new Map( }) ); -type Translation = { - locale: string; - title: string; - native: string; -}; - const TRANSLATIONS_OF = new Map>(); // gather and cache all translations of a document, diff --git a/content/utils.ts b/content/utils.ts index fc359f1c20a8..7e750e864f23 100644 --- a/content/utils.ts +++ b/content/utils.ts @@ -38,15 +38,15 @@ export function buildURL(locale: string, slug: string) { * Note: The parameter are turned into a cache key quite naively, so * different object key order would lead to new cache entries. */ -export function memoize( - fn: (...args: Args[]) => any -): (...args: (Args | typeof MEMOIZE_INVALIDATE)[]) => any { +export function memoize any>( + fn: F +): (...args: [...Parameters, typeof MEMOIZE_INVALIDATE?]) => ReturnType { if (process.env.NODE_ENV !== "production") { - return fn as (...args: (Args | typeof MEMOIZE_INVALIDATE)[]) => any; + return fn; } const cache = new LRUCache({ max: 2000 }); - return (...args: (Args | typeof MEMOIZE_INVALIDATE)[]) => { + return (...args) => { let invalidate = false; if (args.includes(MEMOIZE_INVALIDATE)) { args.splice(args.indexOf(MEMOIZE_INVALIDATE), 1); @@ -62,7 +62,7 @@ export function memoize( } } - const value = fn(...(args as Args[])); + const value = fn(...args); cache.set(key, value); if (value instanceof Promise) { value.catch(() => { diff --git a/deployer/poetry.lock b/deployer/poetry.lock index e6d77f97b0a7..4b0e9cd33194 100644 --- a/deployer/poetry.lock +++ b/deployer/poetry.lock @@ -48,17 +48,17 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "boto3" -version = "1.34.54" +version = "1.34.59" description = "The AWS SDK for Python" optional = false python-versions = ">= 3.8" files = [ - {file = "boto3-1.34.54-py3-none-any.whl", hash = "sha256:f201b6a416f809283d554c652211eecec9fe3a52ed4063dab3f3e7aea7571d9c"}, - {file = "boto3-1.34.54.tar.gz", hash = "sha256:8b3f5cc7fbedcbb22271c328039df8a6ab343001e746e0cdb24774c426cadcf8"}, + {file = "boto3-1.34.59-py3-none-any.whl", hash = "sha256:004e67b078be58d34469406f93cc8b95bc43becef4bbe44523a0b8e51f84c668"}, + {file = "boto3-1.34.59.tar.gz", hash = "sha256:162edf182e53c198137a28432a626dba103f787a8f5000ed4758b73ccd203fa0"}, ] [package.dependencies] -botocore = ">=1.34.54,<1.35.0" +botocore = ">=1.34.59,<1.35.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -67,13 +67,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.34.54" +version = "1.34.59" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">= 3.8" files = [ - {file = "botocore-1.34.54-py3-none-any.whl", hash = "sha256:bf215d93e9d5544c593962780d194e74c6ee40b883d0b885e62ef35fc0ec01e5"}, - {file = "botocore-1.34.54.tar.gz", hash = "sha256:4061ff4be3efcf53547ebadf2c94d419dfc8be7beec24e9fa1819599ffd936fa"}, + {file = "botocore-1.34.59-py3-none-any.whl", hash = "sha256:4bc112dafb1679ab571117593f7656604726a3da0e5ae5bad00ea772fa40e75c"}, + {file = "botocore-1.34.59.tar.gz", hash = "sha256:24edb4d21d7c97dea0c6c4a80d36b3809b1443a30b0bd5e317d6c319dfac823f"}, ] [package.dependencies] @@ -639,13 +639,13 @@ tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] [[package]] name = "pytest" -version = "8.1.0" +version = "8.1.1" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.1.0-py3-none-any.whl", hash = "sha256:ee32db7af8de4629a455806befa90559f307424c07b8413ccfc30bf5b221dd7e"}, - {file = "pytest-8.1.0.tar.gz", hash = "sha256:f8fa04ab8f98d185113ae60ea6d79c22f8143b14bc1caeced44a0ab844928323"}, + {file = "pytest-8.1.1-py3-none-any.whl", hash = "sha256:2a8386cfc11fa9d2c50ee7b2a57e7d898ef90470a7a34c4b949ff59662bb78b7"}, + {file = "pytest-8.1.1.tar.gz", hash = "sha256:ac978141a75948948817d360297b7aae0fcb9d6ff6bc9ec6d514b85d5a65c044"}, ] [package.dependencies] @@ -724,67 +724,67 @@ crt = ["botocore[crt] (>=1.33.2,<2.0a.0)"] [[package]] name = "selectolax" -version = "0.3.20" +version = "0.3.21" description = "Fast HTML5 parser with CSS selectors." optional = false python-versions = "*" files = [ - {file = "selectolax-0.3.20-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5fe1c607667d54c279233abe0fbf8a28fddb540bbe7b788c91dddfcc572a0fb8"}, - {file = "selectolax-0.3.20-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7916bd9c511fd39e81a939f6151246c08e29a8f845adf2b808c3e2614659b2b2"}, - {file = "selectolax-0.3.20-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afd1e0ae17232f8206bac5506c3c5ec54eb16ef20e7a63d614b2d421c02c579f"}, - {file = "selectolax-0.3.20-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd7669ca645a280d50a7d92048d2d7c4798146924f0ade358d4f75e178d14b44"}, - {file = "selectolax-0.3.20-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:adac6e4561ab44aad6735d41c8c42f427a44e247eeecab8d7da763aa15951fd2"}, - {file = "selectolax-0.3.20-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dc1df244a170b50317f54178400a4472ff3ab68e802c4ed50b16f8550d958072"}, - {file = "selectolax-0.3.20-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3373827c09b43c0218192a968165b33969183943d90e4f6604935bf06aae5024"}, - {file = "selectolax-0.3.20-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e5b420be6c6ed4e25e085cd01c6227f4930f3b6947e05b5f43e9a5a0b5518cca"}, - {file = "selectolax-0.3.20-cp310-cp310-win32.whl", hash = "sha256:7212ee4cfd477c0c72f4909ba02685f019d2134b2ee88391011ff1fe99f61c2a"}, - {file = "selectolax-0.3.20-cp310-cp310-win_amd64.whl", hash = "sha256:e60a39c8be6b8e45112944c3bf457c34c5f43205ee648a1e35e157d503566bc8"}, - {file = "selectolax-0.3.20-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1c1d96eed7c90281cd637c828a6da90f9e8bf0f297d4fdfd0340b8e905325bb8"}, - {file = "selectolax-0.3.20-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4cb3be68ffaf40fe6110186d2024731910f5e788c417bfde894196471f50c013"}, - {file = "selectolax-0.3.20-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d44c92ddb6a083b491ed80ddf15f24c8ad272fe2ea8f997a4ba13afa6b5431d3"}, - {file = "selectolax-0.3.20-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca9736e1053c8200ef3fc8409079812ebbaf689a98638eb7650ce1e1fc6bca6a"}, - {file = "selectolax-0.3.20-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d04f9a2aeacb67c2c5066d3501148ade2f6369d1117c3dbeb587c3b39d2a1b7a"}, - {file = "selectolax-0.3.20-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f4b995f135247232076e58c8005c69eb51fb3eec94627f3e7ca92ba5267d295e"}, - {file = "selectolax-0.3.20-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03e721fa4517f1ae9eaa2cbc991dc6df8407226bf618e92aa7c12a8ac7f496a3"}, - {file = "selectolax-0.3.20-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dd65cff7c964f94957f274261a51e1fe0705416338e389c2cffa542a3cb6351d"}, - {file = "selectolax-0.3.20-cp311-cp311-win32.whl", hash = "sha256:19b23530cf49c119b9a9dad42d3ed74428222f3adbb193572218bb0f2f8093ef"}, - {file = "selectolax-0.3.20-cp311-cp311-win_amd64.whl", hash = "sha256:b568b6bd515f4fc7f342e498e8480ea4577cd88c934ecd913762a92121301649"}, - {file = "selectolax-0.3.20-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:883e1b57dd3da4e5f420b01ce7a83c0a08ab8d5ed582b7c986c25ebcc3fc3a7a"}, - {file = "selectolax-0.3.20-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5cb267cbf5f529df9f23cec52fdd3a1c47f245c513e64ea067def351c1040933"}, - {file = "selectolax-0.3.20-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ef45f3db59c6875d3e93aeeefef2e3ae4ed3fffe2cde7c265656a7cb998fb00"}, - {file = "selectolax-0.3.20-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdb78206860c4e981ea254833fb55a26fd5f2c3465c1219643fc381e63982128"}, - {file = "selectolax-0.3.20-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09785432add9424af6967d2ae08feadf6bb0f81248ce95e08d8c2a9705addd7"}, - {file = "selectolax-0.3.20-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:62a4fe0b7cfe46a3363ed0ab9da3132a7014cd98f0121f3cf25892db17910665"}, - {file = "selectolax-0.3.20-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:b3708b59abc96ddedbe61d93d4e5812effd46729ebcc17ba69e8c6055ef614ee"}, - {file = "selectolax-0.3.20-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f1f8db12563a2b0367edb95a4c29180f9d83909828e9fba880d738285c30bcf3"}, - {file = "selectolax-0.3.20-cp312-cp312-win32.whl", hash = "sha256:a0caa388b0bb960d9391a02e4d7de484466639d51971e8fa65bfff4843232a5b"}, - {file = "selectolax-0.3.20-cp312-cp312-win_amd64.whl", hash = "sha256:7404c130e6c94cf6b270ea799a95e9932c5fc3bebfdcf96a4e9f188a9175502a"}, - {file = "selectolax-0.3.20-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9efa1d1968ca71b6a658883982fd23e0bc3a8863c62c3d907f7c8915767b509"}, - {file = "selectolax-0.3.20-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:557b0010e8d69336e60f22a0fd8f7e916456f71436c758abee003d5a51c466fc"}, - {file = "selectolax-0.3.20-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8fcfaf66b10c142db736bd80f2a1ba52591ffefc1fbdba763d8934385ab91e22"}, - {file = "selectolax-0.3.20-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:56f18df65df0e6c6fc1740e5a9b8b36d8eafeaa4f551926400c22c656be211d6"}, - {file = "selectolax-0.3.20-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:52e7a9cc0a258cf1acfe0b15b1a35c6435a1638048085c1147e695f7521ad8a5"}, - {file = "selectolax-0.3.20-cp37-cp37m-win32.whl", hash = "sha256:03f794cf7aba4481e2ecc8ace9e444c933e9fbd425d83941135d05b0e2e6b716"}, - {file = "selectolax-0.3.20-cp37-cp37m-win_amd64.whl", hash = "sha256:2660383e476d5d54b4030d5cc5eddd91780701f882a1239a9d9c4ffd45139f2f"}, - {file = "selectolax-0.3.20-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5a84ae23b7280ebd1ffa5a658a6a92ccc11ebc404ab8418974022fc30bf65370"}, - {file = "selectolax-0.3.20-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e1b8f024340531551809dda0adac73974d4e64c7f8aea937fd6362401b8bf82a"}, - {file = "selectolax-0.3.20-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c6ae3c91e38a44cdbda3d4094c38529383878d2a780ec56e5c694b26b77d095"}, - {file = "selectolax-0.3.20-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da0a854006735f28aa8991bfd1bae5d4a0577e058ea8e2f2d6c79003ae85cf75"}, - {file = "selectolax-0.3.20-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:860134038b4feb8feea248bf52e0dfd7c96e8c8745152033b7645de9528e41db"}, - {file = "selectolax-0.3.20-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d51ad657bed4684730753a69551d9cf0a663447d7ee5eeed37db72c75c2e2f2d"}, - {file = "selectolax-0.3.20-cp38-cp38-win32.whl", hash = "sha256:7b3ed1275c99b43f131f1cc45f86966a322078b8fda82a61e919220798aadc5a"}, - {file = "selectolax-0.3.20-cp38-cp38-win_amd64.whl", hash = "sha256:4cfa96ce6e80d2226c2203d5860488be01433963b577e02d8b5e8413cd10acaf"}, - {file = "selectolax-0.3.20-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:853a530f9b029f97f86fa0aca01f85997fb2e299fe5c0dcf7172172b8c6863d7"}, - {file = "selectolax-0.3.20-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:436709166c804d314664325170a09d1a2dae9ad6217c62dfec872bfe0a542757"}, - {file = "selectolax-0.3.20-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6be17a4b8e4e8fba7b01191caad3313d0706510d478c66dbfc36cff47c07c420"}, - {file = "selectolax-0.3.20-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9f2e60aebcdcc68dae0d22be6829cf3f0c4961684666a8c842f3f429527e913"}, - {file = "selectolax-0.3.20-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f49614a86a517703ab37d2e5c029e4e5e3ba9d0d40740de48f62eafa505d3fe0"}, - {file = "selectolax-0.3.20-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9db79d4153e5e8cbf275c0eddbaea8fe2bf5ea010520c27cafaf04e96174f569"}, - {file = "selectolax-0.3.20-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0b53e3c65b88c32df9a5395507d19947013260b92b7d51f3150bdc5decd940a5"}, - {file = "selectolax-0.3.20-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:da83849387b13a45f2a4235551ff0b497bdd41934f0032bacb6075bdfb9d04e9"}, - {file = "selectolax-0.3.20-cp39-cp39-win32.whl", hash = "sha256:b0289d8f84626ef6f912c8f1ec53522b815420b964a7a1d08674f8b8e66d571d"}, - {file = "selectolax-0.3.20-cp39-cp39-win_amd64.whl", hash = "sha256:7795440a2fd9240f5b9d45e1b8b11a71942355d0c634460134e7253db7922253"}, - {file = "selectolax-0.3.20.tar.gz", hash = "sha256:17c544e735f237ba087a407af37e8bafb3e64d77b329aed8710aa0d500cf2574"}, + {file = "selectolax-0.3.21-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7be91179992b9f2da6bca64b9e853b0a89582c6ea8c8efa89be956409c2df03c"}, + {file = "selectolax-0.3.21-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:635714e93669b04c96fefa97ce6dbd4bd1a64970854e6be857a43b1a7826039a"}, + {file = "selectolax-0.3.21-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:652fc8fc0432979fa5d17de715ea9183bef5255875868fb4e273c999c57c82dc"}, + {file = "selectolax-0.3.21-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00160ecbc94604ef98e162627a56ea0fd76940580dbe291371a618dd3fe0fff4"}, + {file = "selectolax-0.3.21-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dbbd5c3a6070665d5956fd49fe1c4b6008179a3ce6e5dcf7c22276697b9674c"}, + {file = "selectolax-0.3.21-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e6de18a9dfbbc623fd5089666e60b3468d803d70aa594c5bee00d70a5c33cada"}, + {file = "selectolax-0.3.21-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a41ce2b035c7fed60dd54dedcc4c153fdc82970f873bed02966b9abf8559aa67"}, + {file = "selectolax-0.3.21-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b817137ca58dccc4770d1df41fd674c1061c0f810ca46c8afda5c3146590a6b3"}, + {file = "selectolax-0.3.21-cp310-cp310-win32.whl", hash = "sha256:0809bcecadea894e0c77654ac814bc92d58cbbc4c93892408fe49d078a312974"}, + {file = "selectolax-0.3.21-cp310-cp310-win_amd64.whl", hash = "sha256:2c0687054a9d8408c6cb748839471235b62df07bd9a6d8ebca576337218300c6"}, + {file = "selectolax-0.3.21-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d28c82c601f1b28b1f3d7bd7f75c319682d777c11f2a49520edf6361dbe6d89"}, + {file = "selectolax-0.3.21-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5c52cd8a6048a0837694c59ed5a6c33f9e48312a8f7f4db99c09c2a890a59466"}, + {file = "selectolax-0.3.21-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:712eaeec13136d6d0a0fce8494b538838d6a424c5a1c8fc865b524b3b8d17d33"}, + {file = "selectolax-0.3.21-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cce7dead273370c572797b36bdf55c8a57f3232334555864f3e8c5c2bcfae8e0"}, + {file = "selectolax-0.3.21-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed7fba0fd763f7505200fa0b26d896c0dbef2eabdd0a240f0c4abbaf583925"}, + {file = "selectolax-0.3.21-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:09feb7b9bea4855ead57f4954fe4f2515d4e7c04e38eb58f4be494188b7467a1"}, + {file = "selectolax-0.3.21-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e2dbc29a1b990c75e143bc0ed1a2ac7c4f995584cedf9418af1284ed19978d75"}, + {file = "selectolax-0.3.21-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d484f88e15c0ce0b00a98f347632de2b32a39acee7f519b86fe75cf0c2f7cf94"}, + {file = "selectolax-0.3.21-cp311-cp311-win32.whl", hash = "sha256:420eeb44bb7391731472305a2100b7300a5afc815f245c1c786e977b4d721ee0"}, + {file = "selectolax-0.3.21-cp311-cp311-win_amd64.whl", hash = "sha256:687fad57c17c04ef744f6689cc68d29fc4029b0dad8a7e26cdac4b81e8fafb74"}, + {file = "selectolax-0.3.21-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f07fe837da86fcfe7223652c311f55f2062923ad9fbe12142cf8d948539a35a0"}, + {file = "selectolax-0.3.21-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:2a3bdb30f63ac192058070190af887b05e15a0c45d082a86fdd38af96b65a6e0"}, + {file = "selectolax-0.3.21-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec7950fde98c1731b1cb4e2e396cfc177cdfe98dbd9f8d04748a75f1dcaff5c5"}, + {file = "selectolax-0.3.21-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72e0dc806998f2108e65bbaf1f4a1d2a5079a9fc6c4ee848d3da2cbacef47d8c"}, + {file = "selectolax-0.3.21-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:335bb8ffc6d49bf46f8299bdcb415b039674ebfe86ffd4826a132f810ae31e51"}, + {file = "selectolax-0.3.21-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c5055b97b29e1357a836beab2799691660d5aa4d33805ce7a1e4fd73ecdfdff4"}, + {file = "selectolax-0.3.21-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5a56ce8b48c9f6cadbaa7aaa2364bdc6eb90bff5acfda7a8b82c815d99598a7b"}, + {file = "selectolax-0.3.21-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f7bc18ad43633377defc013589e386a30af8695828bbe2c7f711c8ee8a9ca812"}, + {file = "selectolax-0.3.21-cp312-cp312-win32.whl", hash = "sha256:0561b8675fb562198d760bbf904d46e751172f8e5040d57121d65039a9acd21c"}, + {file = "selectolax-0.3.21-cp312-cp312-win_amd64.whl", hash = "sha256:d38fc69f3c4b06f233e07adbca0e3d58aecc3cdb3d9a72436f64fc0c6d8fa30f"}, + {file = "selectolax-0.3.21-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:79c203a4bdd7642f5b986a8ec121606f01d8a6496c7a2550621bec67a7470221"}, + {file = "selectolax-0.3.21-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0d2fec2ee41b1d7cf146970b09ad04d0ddeaf9947bd55cd4504a38b7bc6322b"}, + {file = "selectolax-0.3.21-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e642adf208b20b3887bfca8e249867b0441bdd238eda026e17c523d3fc30500b"}, + {file = "selectolax-0.3.21-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:54efd47eaea31b89c955a93383f4eb6d975abdb445e6721f9a49ca2141f385b0"}, + {file = "selectolax-0.3.21-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:462ac9bffcea5c34ab4d9f6720916deec3edbb45669ccd3257d930a330d55419"}, + {file = "selectolax-0.3.21-cp37-cp37m-win32.whl", hash = "sha256:8b3700ca92b288442cd29cc499c9f0deff317c413dbb274ea08a8b4a02e0258f"}, + {file = "selectolax-0.3.21-cp37-cp37m-win_amd64.whl", hash = "sha256:c60d2ec8285b242f799ec7de8b6d7dda987f05de2a5012f64fce0ce4fd645b3b"}, + {file = "selectolax-0.3.21-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:d1a4842818e5659cb753f2f1d49885497680e0904fdd3db4eb97771cc241ef2d"}, + {file = "selectolax-0.3.21-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9a38ce752404e399e45f5978b64a58fdea09e8b4647beea7c014b3602f7ed5f0"}, + {file = "selectolax-0.3.21-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5851c23585618ae7ff24ba4c8a718d0c5e027523b3c0f62e74047b9e385339aa"}, + {file = "selectolax-0.3.21-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e3ec204cc3819a1fa8fdfde99cc1c65793d954bca9f6e4e7007267951c15b38"}, + {file = "selectolax-0.3.21-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a3c6a39b00cf27dcb9e4644ef6e729cd43d9c20e928acecaa118045bcc9a166f"}, + {file = "selectolax-0.3.21-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ca5ffd105762c61c6300562036f7d9d90dce007a32b4bd8ee2a33fb7399e0fdc"}, + {file = "selectolax-0.3.21-cp38-cp38-win32.whl", hash = "sha256:a802e3b630cb55d92fe5aee8091e7b337fbe4f67872dde936912ffc9d149ee4a"}, + {file = "selectolax-0.3.21-cp38-cp38-win_amd64.whl", hash = "sha256:636711ed17609b0f6c120ac147bdffd7960b57c14f52746ea8b3ceb549fa4622"}, + {file = "selectolax-0.3.21-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a04e9cf87f9bcdd6418e0462e8a190a5567c33989966257433da7cd8cc907c4"}, + {file = "selectolax-0.3.21-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae41d1d5eaabf94548c64bee4652c16a7b66e41398522626f006d70522f1f5f2"}, + {file = "selectolax-0.3.21-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eeca4492ee12b4e873437531df3d858b6970f1dd8c0c2c88fa99281735e864a6"}, + {file = "selectolax-0.3.21-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57904e1b22b8257ea4d8bda090321cd23d4e00595a257bb74500bf42701b7120"}, + {file = "selectolax-0.3.21-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:252881a79f354efb355db8dac1aa2022068b5faa5d6d0e8dd384bb79b2480e96"}, + {file = "selectolax-0.3.21-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:79f99c273f0f0d06763d786c9fc67a763e3176e85b60e3e2bddb9f6b53380771"}, + {file = "selectolax-0.3.21-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:55c52a40df576a355b6a7b580b779efe98cf8b603a23709c556e000eee0875f5"}, + {file = "selectolax-0.3.21-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c3d309b7c47cbf53a6655ce74e0bffd076b67b990bd2941487f368584048d48c"}, + {file = "selectolax-0.3.21-cp39-cp39-win32.whl", hash = "sha256:7f12f7c2091ce7ef302e4c70ace4273551bee3ccfeacf708e786eb6114e97104"}, + {file = "selectolax-0.3.21-cp39-cp39-win_amd64.whl", hash = "sha256:b2cc8d49da1cf06c6052508d052e425a544dbbffd4ea137cc9ec522d3560c32d"}, + {file = "selectolax-0.3.21.tar.gz", hash = "sha256:cdf532c0fbad04be1b94bcfbf373df1e1b09edfe9015c9a13fb00291bee8379e"}, ] [package.extras] @@ -936,4 +936,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "82da42cb7cb85c735842f8c04a5cdfc4477fa308695e249cbe22974b7a2c522f" +content-hash = "269abe705931f2c9306583199aa7470d9e8590279ee411fc7871fac970f356d4" diff --git a/deployer/pyproject.toml b/deployer/pyproject.toml index fc54d91c1064..736de12fa582 100644 --- a/deployer/pyproject.toml +++ b/deployer/pyproject.toml @@ -10,18 +10,18 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.10" click = "^8.1.7" -boto3 = "^1.34.54" +boto3 = "^1.34.59" python-decouple = "^3.8" requests = {extras = ["security"], version = "^2.31.0"} elasticsearch-dsl = "^7.4.1" -selectolax = "^0.3.20" +selectolax = "^0.3.21" PyGithub = "^1.59" unidiff = "^0.7.5" [tool.poetry.dev-dependencies] black = "^24.2" flake8 = "^7.0.0" -pytest = "^8.1.0" +pytest = "^8.1.1" [tool.poetry.scripts] deployer = "deployer.main:cli" diff --git a/kumascript/index.ts b/kumascript/index.ts index 78a59928820a..123bc77c6e06 100644 --- a/kumascript/index.ts +++ b/kumascript/index.ts @@ -93,7 +93,7 @@ export async function render( { ...metadata, url, - tags: metadata.tags || [], + tags: "tags" in metadata ? metadata.tags || [] : [], selective_mode, interactive_examples: { base_url: INTERACTIVE_EXAMPLES_BASE_URL, diff --git a/kumascript/macros/no_tag_omission.ejs b/kumascript/macros/no_tag_omission.ejs index db7e1675de09..8b422882c0e9 100644 --- a/kumascript/macros/no_tag_omission.ejs +++ b/kumascript/macros/no_tag_omission.ejs @@ -1,3 +1,4 @@ +<% mdn.deprecated(); %> <% /* This string will be extended in the future as there are discussion to apply animation-delay to non-animatable property */ @@ -10,5 +11,4 @@ var str = mdn.localString({ "zh-CN": "不允许,开始标签和结束标签都不能省略。" }); - %><%- str %> diff --git a/libs/types/document.ts b/libs/types/document.ts index f870d4ee032b..5500bf85cd08 100644 --- a/libs/types/document.ts +++ b/libs/types/document.ts @@ -228,3 +228,27 @@ export interface BuildData { path: string; }; } + +export interface UnbuiltDocument { + metadata: DocFrontmatter & { + frontMatterKeys: string[]; + locale: string; + popularity: number; + modified: any; + hash: any; + contributors: any; + }; + url: string; + rawContent: string; + rawBody: string; + isMarkdown: boolean; + isTranslated: boolean; + isActive: boolean; + fileInfo: { + folder: string; + path: string; + frontMatterOffset: number; + root: string; + }; + translations?: Translation[]; +} diff --git a/package.json b/package.json index 2d20b1335aaf..4387604486f8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@mdn/yari", - "version": "2.42.1", + "version": "2.43.0", "repository": "https://github.com/mdn/yari", "license": "MPL-2.0", "author": "MDN Web Docs", @@ -71,14 +71,14 @@ "@codemirror/theme-one-dark": "^6.1.2", "@fast-csv/parse": "^5.0.0", "@mdn/bcd-utils-api": "^0.0.5", - "@mdn/browser-compat-data": "^5.5.13", + "@mdn/browser-compat-data": "^5.5.15", "@mozilla/glean": "4.0.0", - "@sentry/integrations": "^7.105.0", - "@sentry/node": "^7.105.0", - "@stripe/stripe-js": "^3.0.6", + "@sentry/integrations": "^7.107.0", + "@sentry/node": "^7.107.0", + "@stripe/stripe-js": "^3.0.10", "@use-it/interval": "^1.0.0", "@vscode/ripgrep": "^1.15.9", - "@webref/css": "^6.12.1", + "@webref/css": "^6.12.3", "accept-language-parser": "^1.5.0", "async": "^3.2.5", "chalk": "^5.3.0", @@ -90,7 +90,7 @@ "cookie-parser": "^1.4.6", "css-tree": "^2.3.1", "dayjs": "^1.11.10", - "dexie": "^3.2.5", + "dexie": "^3.2.6", "dotenv": "^16.4.5", "ejs": "^3.1.9", "express": "^4.18.3", @@ -108,7 +108,7 @@ "imagemin-mozjpeg": "^10.0.0", "imagemin-pngquant": "^9.0.2", "imagemin-svgo": "^10.0.1", - "inquirer": "^9.2.15", + "inquirer": "^9.2.16", "is-svg": "^5.0.0", "js-yaml": "^4.1.0", "loglevel": "^1.9.1", @@ -117,9 +117,9 @@ "mdast-util-from-markdown": "^2.0.0", "mdast-util-phrasing": "^4.1.0", "mdn-data": "^2.4.2", - "open": "^10.0.4", + "open": "^10.1.0", "open-editor": "^4.1.1", - "openai": "^4.28.4", + "openai": "^4.29.0", "pg": "^8.11.3", "pgvector": "^0.1.8", "prism-svelte": "^0.5.0", @@ -140,13 +140,13 @@ "sanitize-filename": "^1.6.3", "send": "^0.18.0", "source-map-support": "^0.5.21", - "sse.js": "^2.3.0", + "sse.js": "^2.4.1", "tempy": "^3.1.0", "unified": "^11.0.4", "unist-builder": "^4.0.0", "unist-util-visit": "^5.0.0", - "web-features": "^0.5.1", - "web-specs": "^3.4.0" + "web-features": "^0.6.0", + "web-specs": "^3.5.0" }, "devDependencies": { "@babel/core": "^7.24.0", @@ -158,7 +158,7 @@ "@playwright/test": "^1.42.1", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11", "@svgr/webpack": "^8.1.0", - "@swc/core": "^1.4.2", + "@swc/core": "^1.4.8", "@testing-library/react": "^14.2.1", "@types/async": "^3.2.24", "@types/cli-progress": "^3.11.5", @@ -166,8 +166,8 @@ "@types/jest": "^29.5.12", "@types/mdast": "^4.0.3", "@types/node": "^18.16.6", - "@types/react": "^18.2.61", - "@types/react-dom": "^18.2.19", + "@types/react": "^18.2.66", + "@types/react-dom": "^18.2.22", "@types/react-modal": "^3.16.3", "babel-jest": "^29.7.0", "babel-loader": "^9.1.3", @@ -194,12 +194,12 @@ "eslint-plugin-react": "^7.34.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-unicorn": "^51.0.1", - "eslint-webpack-plugin": "^4.0.1", + "eslint-webpack-plugin": "^4.1.0", "extend": "^3.0.2", "file-loader": "^6.2.0", "foreman": "^3.0.1", "history": "^5.2.0", - "html-validate": "^8.12.0", + "html-validate": "^8.15.0", "html-webpack-plugin": "^5.6.0", "husky": "^9.0.11", "identity-obj-proxy": "^3.0.0", @@ -219,7 +219,7 @@ "postcss-flexbugs-fixes": "^5.0.2", "postcss-loader": "^8.1.1", "postcss-normalize": "^10.0.1", - "postcss-preset-env": "^9.4.0", + "postcss-preset-env": "^9.5.1", "prettier": "^3.2.5", "prettier-plugin-packagejson": "^2.4.12", "prompts": "^2.4.2", @@ -235,7 +235,7 @@ "resolve": "^1.22.8", "resolve-url-loader": "^5.0.0", "rough-notation": "^0.5.1", - "sass": "^1.71.1", + "sass": "^1.72.0", "sass-loader": "^14.1.1", "semver": "^7.6.0", "source-map-explorer": "^2.5.3", @@ -256,11 +256,11 @@ "ts-jest": "^29.1.2", "ts-loader": "^9.5.1", "ts-node": "^10.9.2", - "typescript": "^5.3.3", - "typescript-eslint": "^7.1.0", + "typescript": "^5.4.2", + "typescript-eslint": "^7.2.0", "webpack": "^5.90.3", "webpack-cli": "^5.1.4", - "webpack-dev-server": "^5.0.2", + "webpack-dev-server": "^5.0.3", "webpack-manifest-plugin": "^5.0.0", "webpack-node-externals": "^3.0.0", "workbox-webpack-plugin": "^7.0.0" diff --git a/testing/integration/poetry.lock b/testing/integration/poetry.lock index af47c45ebb98..99c7c94d76f2 100644 --- a/testing/integration/poetry.lock +++ b/testing/integration/poetry.lock @@ -461,13 +461,13 @@ test = ["pytest", "pytest-cov", "requests", "webob", "webtest"] [[package]] name = "pytest" -version = "8.1.0" +version = "8.1.1" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.1.0-py3-none-any.whl", hash = "sha256:ee32db7af8de4629a455806befa90559f307424c07b8413ccfc30bf5b221dd7e"}, - {file = "pytest-8.1.0.tar.gz", hash = "sha256:f8fa04ab8f98d185113ae60ea6d79c22f8143b14bc1caeced44a0ab844928323"}, + {file = "pytest-8.1.1-py3-none-any.whl", hash = "sha256:2a8386cfc11fa9d2c50ee7b2a57e7d898ef90470a7a34c4b949ff59662bb78b7"}, + {file = "pytest-8.1.1.tar.gz", hash = "sha256:ac978141a75948948817d360297b7aae0fcb9d6ff6bc9ec6d514b85d5a65c044"}, ] [package.dependencies] @@ -576,4 +576,4 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "7e60fb818b0a4ebe709cf1d540812e673e8ba25565ba7f25dba66717f9d5e155" +content-hash = "79c8c6b0f7bf8d22942cf0bac57501e2e913433e47fe0d0ea796553047bd6aed" diff --git a/testing/integration/pyproject.toml b/testing/integration/pyproject.toml index 84afed6bf703..1906b6d4a9a6 100644 --- a/testing/integration/pyproject.toml +++ b/testing/integration/pyproject.toml @@ -9,7 +9,7 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.10" -pytest = "^8.1.0" +pytest = "^8.1.1" pytest-base-url = "^2.1.0" pytest-rerunfailures = "^13.0" requests = "^2.31.0" diff --git a/testing/tests/headless.index.spec.ts b/testing/tests/headless.index.spec.ts index 3da275c48f94..e80c53b6ca72 100644 --- a/testing/tests/headless.index.spec.ts +++ b/testing/tests/headless.index.spec.ts @@ -22,7 +22,7 @@ test.describe("Basic viewing of functional pages", () => { await page.goto(testURL("/en-US/docs/Web/Foo")); expect(await page.title()).toContain(": A test tag"); expect(await page.innerText("h1")).toBe(": A test tag"); - expect(await page.isVisible(".metadata time")).toBeTruthy(); + expect(await page.isVisible(".article-footer time")).toBeTruthy(); }); // @TODO Temporarily disabled until we reintroduce the language selector diff --git a/testing/tests/index.test.ts b/testing/tests/index.test.ts index cd0f5ec4f952..83c06cafe614 100644 --- a/testing/tests/index.test.ts +++ b/testing/tests/index.test.ts @@ -1613,19 +1613,23 @@ test("translated content broken links can fall back to en-us", () => { const { doc } = JSON.parse(fs.readFileSync(jsonFile, "utf-8")) as { doc: Doc; }; + const map = new Map(doc.flaws.broken_links.map((x) => [x.href, x])); - expect(map.get("/fr/docs/Web/CSS/dumber").explanation).toBe( - "Can use the English (en-US) link as a fallback" - ); - expect(map.get("/fr/docs/Web/CSS/number").explanation).toBe( - "Can use the English (en-US) link as a fallback" - ); + expect(map.get("/fr/docs/Web/CSS/dumber")).toMatchObject({ + explanation: "Can't resolve /fr/docs/Web/CSS/dumber", + suggestion: "/fr/docs/Web/CSS/number", + fixable: true, + line: 19, + column: 16, + }); + expect(map.get("/fr/docs/Web/CSS/number")).toBeUndefined(); const htmlFile = path.join(builtFolder, "index.html"); const html = fs.readFileSync(htmlFile, "utf-8"); const $ = cheerio.load(html); expect($('article a[href="/fr/docs/Web/CSS/dumber"]')).toHaveLength(0); expect($('article a[href="/fr/docs/Web/CSS/number"]')).toHaveLength(0); + // Localized docs don't exist, but fallback to en-US is possible expect($('article a[href="/en-US/docs/Web/CSS/number"]')).toHaveLength(2); expect($("article a.only-in-en-us")).toHaveLength(2); expect($("article a.only-in-en-us").attr("title")).toBe( diff --git a/yarn.lock b/yarn.lock index 5768e126ec49..d84c9f97f42f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1501,58 +1501,58 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@csstools/cascade-layer-name-parser@^1.0.8": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.8.tgz#24d841d80e78f6c2970a36d53e6b58e8fcea41f6" - integrity sha512-xHxXavWvXB5nAA9IvZtjEzkONM3hPXpxqYK4cEw60LcqPiFjq7ZlEFxOyYFPrG4UdANKtnucNtRVDy7frjq6AA== +"@csstools/cascade-layer-name-parser@^1.0.9": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.9.tgz#7093f9c26fd92dee87d853a97de0647c5a8c4262" + integrity sha512-RRqNjxTZDUhx7pxYOBG/AkCVmPS3zYzfE47GEhIGkFuWFTQGJBgWOUUkKNo5MfxIfjDz5/1L3F3rF1oIsYaIpw== "@csstools/color-helpers@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@csstools/color-helpers/-/color-helpers-4.0.0.tgz#a1d6ffcefe5c1d389cbcca15f46da3cdaf241443" integrity sha512-wjyXB22/h2OvxAr3jldPB7R7kjTUEzopvjitS8jWtyd8fN6xJ8vy1HnHu0ZNfEkqpBJgQ76Q+sBDshWcMvTa/w== -"@csstools/css-calc@^1.1.7": - version "1.1.7" - resolved "https://registry.yarnpkg.com/@csstools/css-calc/-/css-calc-1.1.7.tgz#89b5cde81ecb4686d9abd66b7eb54015cf39c442" - integrity sha512-+7bUzB5I4cI97tKmBJA8ilTl/YRo6VAOdlrnd/4x2NyK60nvYurGKa5TZpE1zcgIrTC97iJRE0/V65feyFytuw== +"@csstools/css-calc@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@csstools/css-calc/-/css-calc-1.2.0.tgz#a45145a868e644c31c79baf74c8de64fd09b3415" + integrity sha512-iQqIW5vDPqQdLx07/atCuNKDprhIWjB0b8XRhUyXZWBZYUG+9mNyFwyu30rypX84WLevVo25NYW2ipxR8WyseQ== -"@csstools/css-color-parser@^1.5.2": - version "1.5.2" - resolved "https://registry.yarnpkg.com/@csstools/css-color-parser/-/css-color-parser-1.5.2.tgz#4fdf8e23960b4724913f7cbfd4f413eb8f35724b" - integrity sha512-5GEkuuUxD5dael3xoWjyf7gAPAi4pwm8X8JW/nUMhxntGY4Wo4Lp7vKlex4V5ZgTfAoov14rZFsZyOantdTatg== +"@csstools/css-color-parser@^1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@csstools/css-color-parser/-/css-color-parser-1.6.0.tgz#03b9fd3bfde91c452856f8b222539a4b26f40999" + integrity sha512-Wc1X6jZvGhT8Bii4jUF6tC3Je3wgDFg7D/SvGKndrnakDsCPk4TMxtt4AQHyWdMBrBJ1hLjXbppaXgP1DUIpBw== dependencies: "@csstools/color-helpers" "^4.0.0" - "@csstools/css-calc" "^1.1.7" + "@csstools/css-calc" "^1.2.0" "@csstools/css-parser-algorithms@^2.3.1": version "2.3.2" resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.3.2.tgz#1e0d581dbf4518cb3e939c3b863cb7180c8cedad" integrity sha512-sLYGdAdEY2x7TSw9FtmdaTrh2wFtRJO5VMbBrA8tEqEod7GEggFmxTSK9XqExib3yMuYNcvcTdCZIP6ukdjAIA== -"@csstools/css-parser-algorithms@^2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.0.tgz#b45d3c7cbdd4214261724c82f96e33c746fedd58" - integrity sha512-YfEHq0eRH98ffb5/EsrrDspVWAuph6gDggAE74ZtjecsmyyWpW768hOyiONa8zwWGbIWYfa2Xp4tRTrpQQ00CQ== +"@csstools/css-parser-algorithms@^2.6.1": + version "2.6.1" + resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.1.tgz#c45440d1efa2954006748a01697072dae5881bcd" + integrity sha512-ubEkAaTfVZa+WwGhs5jbo5Xfqpeaybr/RvWzvFxRs4jfq16wH8l8Ty/QEEpINxll4xhuGfdMbipRyz5QZh9+FA== "@csstools/css-tokenizer@^2.2.0": version "2.2.1" resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.2.1.tgz#9dc431c9a5f61087af626e41ac2a79cce7bb253d" integrity sha512-Zmsf2f/CaEPWEVgw29odOj+WEVoiJy9s9NOv5GgNY9mZ1CZ7394By6wONrONrTsnNDv6F9hR02nvFihrGVGHBg== -"@csstools/css-tokenizer@^2.2.3": - version "2.2.3" - resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.2.3.tgz#b099d543ea57b64f495915a095ead583866c50c6" - integrity sha512-pp//EvZ9dUmGuGtG1p+n17gTHEOqu9jO+FiCUjNN3BDmyhdA2Jq9QsVeR7K8/2QCK17HSsioPlTW9ZkzoWb3Lg== +"@csstools/css-tokenizer@^2.2.4": + version "2.2.4" + resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.2.4.tgz#a4b8718ed7fcd2dcd555de16b31ca59ad4b96a06" + integrity sha512-PuWRAewQLbDhGeTvFuq2oClaSCKPIBmHyIobCV39JHRYN0byDcUWJl5baPeNUcqrjtdMNqFooE0FGl31I3JOqw== "@csstools/media-query-list-parser@^2.1.4": version "2.1.5" resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.5.tgz#94bc8b3c3fd7112a40b7bf0b483e91eba0654a0f" integrity sha512-IxVBdYzR8pYe89JiyXQuYk4aVVoCPhMJkz6ElRwlVysjwURTsTk/bmY/z4FfeRE+CRBMlykPwXEVUg8lThv7AQ== -"@csstools/media-query-list-parser@^2.1.8": - version "2.1.8" - resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.8.tgz#36157fbe54ea30d5f2b1767c69fcdf92048a7b1d" - integrity sha512-DiD3vG5ciNzeuTEoh74S+JMjQDs50R3zlxHnBnfd04YYfA/kh2KiBCGhzqLxlJcNq+7yNQ3stuZZYLX6wK/U2g== +"@csstools/media-query-list-parser@^2.1.9": + version "2.1.9" + resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.9.tgz#feb4b7268f998956eb3ded69507869e73d005dda" + integrity sha512-qqGuFfbn4rUmyOB0u8CVISIp5FfJ5GAR3mBrZ9/TKndHakdnm6pY0L/fbLcpPnrzwCyyTEZl1nUcXAYHEWneTA== "@csstools/normalize.css@*": version "12.0.0" @@ -1567,36 +1567,36 @@ "@csstools/selector-specificity" "^3.0.2" postcss-selector-parser "^6.0.13" -"@csstools/postcss-color-function@^3.0.10": - version "3.0.10" - resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-3.0.10.tgz#708d34f24daf5ff9978d2d4e8d3413f638a41158" - integrity sha512-jxiXmSl4ZYX8KewFjL5ef6of9uW73VkaHeDb2tqb5q4ZDPYxjusNX1KJ8UXY8+7ydqS5QBo42tVMrSMGy+rDmw== +"@csstools/postcss-color-function@^3.0.11": + version "3.0.11" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-3.0.11.tgz#4413446730c7fd8496b0a64ebae136f4c2c07b54" + integrity sha512-z53Pp2tsemiIq72PKu4vjD0CtcQlXdvA22elEHuDOvCIlqphNjd5ZD5HBns/ZjaJF7BjPls2zaAT58hfLyS0MQ== dependencies: - "@csstools/css-color-parser" "^1.5.2" - "@csstools/css-parser-algorithms" "^2.6.0" - "@csstools/css-tokenizer" "^2.2.3" - "@csstools/postcss-progressive-custom-properties" "^3.1.0" + "@csstools/css-color-parser" "^1.6.0" + "@csstools/css-parser-algorithms" "^2.6.1" + "@csstools/css-tokenizer" "^2.2.4" + "@csstools/postcss-progressive-custom-properties" "^3.1.1" "@csstools/utilities" "^1.0.0" -"@csstools/postcss-color-mix-function@^2.0.10": - version "2.0.10" - resolved "https://registry.yarnpkg.com/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-2.0.10.tgz#fd86d1f3b334fb59a3558d33f121ce5dff758da8" - integrity sha512-zeD856+FDCUjB077pPS+Z9OnTQnqpiJrao3TW+sasCb/gJ3vZCX7sRSRFsRUo0/MntTtJu9hkKv9eMkFmfjydA== +"@csstools/postcss-color-mix-function@^2.0.11": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-2.0.11.tgz#b3a6beb8e083c441151d53810b6c00b6f28ca64b" + integrity sha512-Jz1R5ZXxpT5FIY95F3VSJtwQYWCYOtCBUBS/ShDxS+fUtd3sAdAtD3a9tAdz3FG3BvkmqtlURyoIhJRu/wfo/A== dependencies: - "@csstools/css-color-parser" "^1.5.2" - "@csstools/css-parser-algorithms" "^2.6.0" - "@csstools/css-tokenizer" "^2.2.3" - "@csstools/postcss-progressive-custom-properties" "^3.1.0" + "@csstools/css-color-parser" "^1.6.0" + "@csstools/css-parser-algorithms" "^2.6.1" + "@csstools/css-tokenizer" "^2.2.4" + "@csstools/postcss-progressive-custom-properties" "^3.1.1" "@csstools/utilities" "^1.0.0" -"@csstools/postcss-exponential-functions@^1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-1.0.4.tgz#c8c3773d4f761428717b80803302722ed2f849f1" - integrity sha512-frMf0CFVnZoGEKAHlxLy3s4g/tpjyFn5+A+h895UJNm9Uc+ewGT7+EeK7Kh9IHH4pD4FkaGW1vOQtER00PLurQ== +"@csstools/postcss-exponential-functions@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-1.0.5.tgz#ac6f9e545cf6bbf9d6bad11e655ca693c4982e58" + integrity sha512-7S7I7KgwHWQYzJJAoIjRtUf7DQs1dxipeg1A6ikZr0PYapNJX7UHz0evlpE67SQqYj1xBs70gpG7xUv3uLp4PA== dependencies: - "@csstools/css-calc" "^1.1.7" - "@csstools/css-parser-algorithms" "^2.6.0" - "@csstools/css-tokenizer" "^2.2.3" + "@csstools/css-calc" "^1.2.0" + "@csstools/css-parser-algorithms" "^2.6.1" + "@csstools/css-tokenizer" "^2.2.4" "@csstools/postcss-font-format-keywords@^3.0.2": version "3.0.2" @@ -1606,43 +1606,43 @@ "@csstools/utilities" "^1.0.0" postcss-value-parser "^4.2.0" -"@csstools/postcss-gamut-mapping@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-1.0.3.tgz#e5323fb1bf46f6d32d760e98028a8e9da9d8fe4b" - integrity sha512-P0+ude1KyCy9LXOe2pHJmpcXK4q/OQbr2Sn2wQSssMw0rALGmny2MfHiCqEu8n6mf2cN6lWDZdzY8enBk8WHXQ== - dependencies: - "@csstools/css-color-parser" "^1.5.2" - "@csstools/css-parser-algorithms" "^2.6.0" - "@csstools/css-tokenizer" "^2.2.3" - -"@csstools/postcss-gradients-interpolation-method@^4.0.10": - version "4.0.10" - resolved "https://registry.yarnpkg.com/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-4.0.10.tgz#0228a9a2c652c1976358f9731bea0ea4de4bf979" - integrity sha512-PwKOxVuX8lo52bPtPeKjaIp6oH2EzhcBxCndRcvGZKsqZYQ35k9A5G4yihZ+wp7PoxPqDNiXuhQsvQG2lqMpOA== - dependencies: - "@csstools/css-color-parser" "^1.5.2" - "@csstools/css-parser-algorithms" "^2.6.0" - "@csstools/css-tokenizer" "^2.2.3" - "@csstools/postcss-progressive-custom-properties" "^3.1.0" +"@csstools/postcss-gamut-mapping@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-1.0.4.tgz#675357a892740417baab4af8a403d16c891815c8" + integrity sha512-jjHP44awnSijgddNJpZEFfmb8csFx+BiYYpX+ydyScWwLzSpve5eLXneu4uIhZmKom+WXLXWc4y7CvOfVLQ2VQ== + dependencies: + "@csstools/css-color-parser" "^1.6.0" + "@csstools/css-parser-algorithms" "^2.6.1" + "@csstools/css-tokenizer" "^2.2.4" + +"@csstools/postcss-gradients-interpolation-method@^4.0.12": + version "4.0.12" + resolved "https://registry.yarnpkg.com/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-4.0.12.tgz#0f08d98736df7528aa2e2ac4a71caa63235f9950" + integrity sha512-F1mOb6MuIMAV7qq9dYLhi2tlmmQn+osCVl+VdDNI+4AO6y3l6dTWmc7XVQMsVxIZCKEZMie9KLtE0PRp3i1UyQ== + dependencies: + "@csstools/css-color-parser" "^1.6.0" + "@csstools/css-parser-algorithms" "^2.6.1" + "@csstools/css-tokenizer" "^2.2.4" + "@csstools/postcss-progressive-custom-properties" "^3.1.1" "@csstools/utilities" "^1.0.0" -"@csstools/postcss-hwb-function@^3.0.9": - version "3.0.9" - resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-3.0.9.tgz#15c5b8d43cffe62283b6175494188d6957712d91" - integrity sha512-S3/Z+mGHWIKAex7DLsHFDiku5lBEK34avT2My6sGPNCXB38TZjrKI0rd7JdN9oulem5sn+CU7oONyIftui24oQ== +"@csstools/postcss-hwb-function@^3.0.10": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-3.0.10.tgz#f1171b8b6a84f7ec35d3d77059e11239b2921839" + integrity sha512-wYyhFLQ1zkirAhfRxh5BK9WRIJGBb7jtE9H9a2wPOf20kGbS/PmqxHtGmE+o1vSz/MaBIbW+6lqyS16yEzjQJA== dependencies: - "@csstools/css-color-parser" "^1.5.2" - "@csstools/css-parser-algorithms" "^2.6.0" - "@csstools/css-tokenizer" "^2.2.3" - "@csstools/postcss-progressive-custom-properties" "^3.1.0" + "@csstools/css-color-parser" "^1.6.0" + "@csstools/css-parser-algorithms" "^2.6.1" + "@csstools/css-tokenizer" "^2.2.4" + "@csstools/postcss-progressive-custom-properties" "^3.1.1" "@csstools/utilities" "^1.0.0" -"@csstools/postcss-ic-unit@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-3.0.4.tgz#9f4bffaed6ece2a79e1e15fbd7ba6aea8d61c851" - integrity sha512-OB6ojl33/TQHhjVx1NI+n3EnYbdUM6Q/mSUv3WFATdcz7IrH/CmBaZt7P1R6j1Xdp58thIa6jm4Je7saGs+2AA== +"@csstools/postcss-ic-unit@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-3.0.5.tgz#3ca9a830c55aab0e9b2561b3c94a0a08d9ffa9cf" + integrity sha512-9CriM/zvKXa/lDARlxs/MgeyKE6ZmmX4V77VLD7VUxKLVSt0Go3NCy/gRMbwGzxbrk3iaHFXnFbc2lNw+/7jcg== dependencies: - "@csstools/postcss-progressive-custom-properties" "^3.1.0" + "@csstools/postcss-progressive-custom-properties" "^3.1.1" "@csstools/utilities" "^1.0.0" postcss-value-parser "^4.2.0" @@ -1659,14 +1659,14 @@ "@csstools/selector-specificity" "^3.0.2" postcss-selector-parser "^6.0.13" -"@csstools/postcss-light-dark-function@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-1.0.0.tgz#31407d716f0083bb386097dc07a084b09356d73d" - integrity sha512-KHo633V16DGo6tmpr1ARAwO73CPBNmDI3PfSQYe7ZBMiv60WEizbcEroK75fHjxKYJ4tj9uCCzp5sYG4cEUqqw== +"@csstools/postcss-light-dark-function@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-1.0.1.tgz#e9b30e7d5a2473f1ddd824c05253d7c7c48e07e8" + integrity sha512-CJOcp+m7Njbu91HtYMMoYuZznsvNSpJtLiR/7BO8/bHTXYPiuAZfxunh7wXLkMbHd5dRBgAVAQZ+H4iFqrvWZw== dependencies: - "@csstools/css-parser-algorithms" "^2.6.0" - "@csstools/css-tokenizer" "^2.2.3" - "@csstools/postcss-progressive-custom-properties" "^3.1.0" + "@csstools/css-parser-algorithms" "^2.6.1" + "@csstools/css-tokenizer" "^2.2.4" + "@csstools/postcss-progressive-custom-properties" "^3.1.1" "@csstools/utilities" "^1.0.0" "@csstools/postcss-logical-float-and-clear@^2.0.1": @@ -1691,32 +1691,32 @@ dependencies: postcss-value-parser "^4.2.0" -"@csstools/postcss-logical-viewport-units@^2.0.6": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-2.0.6.tgz#1f91e865e73f5d135038c519957a3b95ffe552ad" - integrity sha512-6hV0ngZh8J7HqNY3kyt+z5ABN/XE18qvrU7ne4YSkKfltrWDnQgGiW/Q+h7bdQz8/W5juAefcdCCAJUIBE7erg== +"@csstools/postcss-logical-viewport-units@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-2.0.7.tgz#3bb03b9a57fe9ec2304bc35cf6c3d5d7c938ee26" + integrity sha512-L4G3zsp/bnU0+WXUyysihCUH14LkfMgUJsS9vKz3vCYbVobOTqQRoNXnEPpyNp8WYyolLqAWbGGJhVu8J6u2OQ== dependencies: - "@csstools/css-tokenizer" "^2.2.3" + "@csstools/css-tokenizer" "^2.2.4" "@csstools/utilities" "^1.0.0" -"@csstools/postcss-media-minmax@^1.1.3": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@csstools/postcss-media-minmax/-/postcss-media-minmax-1.1.3.tgz#87ff7af309916b36fe00e1f4ad6e03a5c16e74b9" - integrity sha512-W9AFRQSLvT+Dxtp20AewzGTUxzkJ21XSKzqRALwQdAv0uJGXkR76qgdhkoX0L/tcV4gXtgDfVtGYL/x2Nz/M5Q== +"@csstools/postcss-media-minmax@^1.1.4": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@csstools/postcss-media-minmax/-/postcss-media-minmax-1.1.4.tgz#1af01cc02fdb936a1c10a11e2663fd1b1ce1bd79" + integrity sha512-xl/PIO3TUbXO1ZA4SA6HCw+Q9UGe2cgeRKx3lHCzoNig2D4bT5vfVCOrwhxjUb09oHihc9eI3I0iIfVPiXaN1A== dependencies: - "@csstools/css-calc" "^1.1.7" - "@csstools/css-parser-algorithms" "^2.6.0" - "@csstools/css-tokenizer" "^2.2.3" - "@csstools/media-query-list-parser" "^2.1.8" + "@csstools/css-calc" "^1.2.0" + "@csstools/css-parser-algorithms" "^2.6.1" + "@csstools/css-tokenizer" "^2.2.4" + "@csstools/media-query-list-parser" "^2.1.9" -"@csstools/postcss-media-queries-aspect-ratio-number-values@^2.0.6": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-2.0.6.tgz#ca6dae6949bfb0f274a4029776614720e243acbe" - integrity sha512-awc2qenSDvx6r+w6G9xxENp+LsbvHC8mMMV23KYmk4pR3YL8JxeKPDSiDhmqd93FQ9nNNDc/CaCQEcvP+GV4rw== +"@csstools/postcss-media-queries-aspect-ratio-number-values@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-2.0.7.tgz#5f4939e6330a3c2cd0cba1e1b76bc51a74dc839c" + integrity sha512-HBDAQw1K0NilcHGMUHv8jzf2mpOtcWTVKtuY3AeZ5TS1uyWWNVi5/yuA/tREPLU9WifNdqHQ+rfbsV/8zTIkTg== dependencies: - "@csstools/css-parser-algorithms" "^2.6.0" - "@csstools/css-tokenizer" "^2.2.3" - "@csstools/media-query-list-parser" "^2.1.8" + "@csstools/css-parser-algorithms" "^2.6.1" + "@csstools/css-tokenizer" "^2.2.4" + "@csstools/media-query-list-parser" "^2.1.9" "@csstools/postcss-nested-calc@^3.0.2": version "3.0.2" @@ -1733,33 +1733,33 @@ dependencies: postcss-value-parser "^4.2.0" -"@csstools/postcss-oklab-function@^3.0.10": - version "3.0.10" - resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-3.0.10.tgz#9f230ce28a266de8a8e264025aebce41313d4053" - integrity sha512-s9trs1c+gUMtaTtwrrIpdVQkUbRuwi6bQ9rBHaqwt4kd3kEnEYfP85uLY1inFx6Rt8OM2XVg3PSYbfnFSAO51A== +"@csstools/postcss-oklab-function@^3.0.11": + version "3.0.11" + resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-3.0.11.tgz#919f829c7b193f1e696add9ed463a0d69e678e7c" + integrity sha512-nIeOZqTFn/zJXSb70JwUcyUBb9658FED7saZlaZNEEhQ3GYxjRhdlV7hgflNi0FDdqNqaEeeI/B/BqnPG9+Q/Q== dependencies: - "@csstools/css-color-parser" "^1.5.2" - "@csstools/css-parser-algorithms" "^2.6.0" - "@csstools/css-tokenizer" "^2.2.3" - "@csstools/postcss-progressive-custom-properties" "^3.1.0" + "@csstools/css-color-parser" "^1.6.0" + "@csstools/css-parser-algorithms" "^2.6.1" + "@csstools/css-tokenizer" "^2.2.4" + "@csstools/postcss-progressive-custom-properties" "^3.1.1" "@csstools/utilities" "^1.0.0" -"@csstools/postcss-progressive-custom-properties@^3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-3.1.0.tgz#e4d6143b3ba50d1f7435932fd112db31e18f05af" - integrity sha512-Mfb1T1BHa6pktLI+poMEHI7Q+VYvAsdwJZPFsSkIB2ZUsawCiPxXLw06BKSVPITxFlaY/FEUzfpyOTfX9YCE2w== +"@csstools/postcss-progressive-custom-properties@^3.1.1": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-3.1.1.tgz#c90d99bbe1ac9ae40a6f13631c341a6976c69558" + integrity sha512-cx/bZgj+MK8SpRZNTu2zGeVFMCQfhsaeuDhukAhfA53yykvIXaTIwLi5shW9hfkvPrkqBeFoiRAzq/qogxeHTA== dependencies: postcss-value-parser "^4.2.0" -"@csstools/postcss-relative-color-syntax@^2.0.10": - version "2.0.10" - resolved "https://registry.yarnpkg.com/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-2.0.10.tgz#07b9484c841623e32777bd7becac7679ce62c08d" - integrity sha512-IkTIk9Eq2VegSN4lgsljGY8boyfX3l3Pw58e+R9oyPe/Ye7r3NwuiQ3w0nkXoQ+RC+d240V6n7eZme2mEPqQvg== +"@csstools/postcss-relative-color-syntax@^2.0.11": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-2.0.11.tgz#07a6b39ae6e6042115af81605f8b3558168ad4ca" + integrity sha512-YmYGwGLoqZp71wXqjyFuG+JApL+CoZqUZ+MJshlokdqqryKX/zj/NrSrwMTAwB4xSx2DgHJUQK3iWumUse8rXw== dependencies: - "@csstools/css-color-parser" "^1.5.2" - "@csstools/css-parser-algorithms" "^2.6.0" - "@csstools/css-tokenizer" "^2.2.3" - "@csstools/postcss-progressive-custom-properties" "^3.1.0" + "@csstools/css-color-parser" "^1.6.0" + "@csstools/css-parser-algorithms" "^2.6.1" + "@csstools/css-tokenizer" "^2.2.4" + "@csstools/postcss-progressive-custom-properties" "^3.1.1" "@csstools/utilities" "^1.0.0" "@csstools/postcss-scope-pseudo-class@^3.0.1": @@ -1769,14 +1769,14 @@ dependencies: postcss-selector-parser "^6.0.13" -"@csstools/postcss-stepped-value-functions@^3.0.5": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-3.0.5.tgz#857cf8eb6bb6ac2831cabe58c15604cfb95af1b2" - integrity sha512-B8K8RaTrYVZLxbNzVUvFO3SlCDJDaUTAO7KRth05fa7f01ufPvb6ztdBuxSoRwOtmNp8iROxPJHOemWo2kBBtA== +"@csstools/postcss-stepped-value-functions@^3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-3.0.6.tgz#8263ddafab483100e13d63929d43cd12fb14767f" + integrity sha512-rnyp8tWRuBXERTHVdB5hjUlif5dQgPcyN+BX55wUnYpZ3LN9QPfK2Z3/HUZymwyou8Gg6vhd6X2W+g1pLq1jYg== dependencies: - "@csstools/css-calc" "^1.1.7" - "@csstools/css-parser-algorithms" "^2.6.0" - "@csstools/css-tokenizer" "^2.2.3" + "@csstools/css-calc" "^1.2.0" + "@csstools/css-parser-algorithms" "^2.6.1" + "@csstools/css-tokenizer" "^2.2.4" "@csstools/postcss-text-decoration-shorthand@^3.0.4": version "3.0.4" @@ -1786,20 +1786,25 @@ "@csstools/color-helpers" "^4.0.0" postcss-value-parser "^4.2.0" -"@csstools/postcss-trigonometric-functions@^3.0.5": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-3.0.5.tgz#bf9f061120bed802fe133188a94c82ba79c440d6" - integrity sha512-RhBfQ0TsBudyPuoo8pXKdfQuUiQxMU/Sc5GyV57bWk93JbUHXq6b4CdPx+B/tHUeFKvocVJn/e2jbu96rh0d3Q== +"@csstools/postcss-trigonometric-functions@^3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-3.0.6.tgz#f8227f1807d28e817e4ff9053093eb8f1bcd9e13" + integrity sha512-i5Zd0bMJooZAn+ZcDmPij2WCkcOJJJ6opzK+QeDjxbMrYmoGQl0CY8FDHdeQyBF1Nly+Q0Fq3S7QfdNLKBBaCg== dependencies: - "@csstools/css-calc" "^1.1.7" - "@csstools/css-parser-algorithms" "^2.6.0" - "@csstools/css-tokenizer" "^2.2.3" + "@csstools/css-calc" "^1.2.0" + "@csstools/css-parser-algorithms" "^2.6.1" + "@csstools/css-tokenizer" "^2.2.4" "@csstools/postcss-unset-value@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@csstools/postcss-unset-value/-/postcss-unset-value-3.0.1.tgz#598a25630fd9ab0edf066d235916f7441404942a" integrity sha512-dbDnZ2ja2U8mbPP0Hvmt2RMEGBiF1H7oY6HYSpjteXJGihYwgxgTr6KRbbJ/V6c+4wd51M+9980qG4gKVn5ttg== +"@csstools/selector-resolve-nested@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@csstools/selector-resolve-nested/-/selector-resolve-nested-1.1.0.tgz#d872f2da402d3ce8bd0cf16ea5f9fba76b18e430" + integrity sha512-uWvSaeRcHyeNenKg8tp17EVDRkpflmdyvbE0DHo6D/GdBb6PDnCYYU6gRpXhtICMGMcahQmj2zGxwFM/WC8hCg== + "@csstools/selector-specificity@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-3.0.0.tgz#798622546b63847e82389e473fd67f2707d82247" @@ -2256,22 +2261,22 @@ dependencies: "@lezer/common" "^1.0.0" -"@ljharb/through@^2.3.12": - version "2.3.12" - resolved "https://registry.yarnpkg.com/@ljharb/through/-/through-2.3.12.tgz#c418c43060eee193adce48b15c2206096a28e9ea" - integrity sha512-ajo/heTlG3QgC8EGP6APIejksVAYt4ayz4tqoP3MolFELzcH1x1fzwEYRJTPO0IELutZ5HQ0c26/GqAYy79u3g== +"@ljharb/through@^2.3.13": + version "2.3.13" + resolved "https://registry.yarnpkg.com/@ljharb/through/-/through-2.3.13.tgz#b7e4766e0b65aa82e529be945ab078de79874edc" + integrity sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ== dependencies: - call-bind "^1.0.5" + call-bind "^1.0.7" "@mdn/bcd-utils-api@^0.0.5": version "0.0.5" resolved "https://registry.yarnpkg.com/@mdn/bcd-utils-api/-/bcd-utils-api-0.0.5.tgz#9587c6b592e87f8a5ccab80ccdd8b5184f867922" integrity sha512-+8zfCGZzBoAoLK6jYnOm9Xa2LcdNRDVrUXatuBNuGJHyt7tpR+k/+de2LSGHiU34TYrfAXk7g9x8/IpXR+4zhw== -"@mdn/browser-compat-data@^5.5.13": - version "5.5.13" - resolved "https://registry.yarnpkg.com/@mdn/browser-compat-data/-/browser-compat-data-5.5.13.tgz#2894aaeffc1d51b7b8c7420af895bdf642be9f64" - integrity sha512-TebJo+nW4mfxxHcCoYC+3GgSitQGwjp6sAT/b6tqfKifyLfn9jlf3xa0tE/fnhGFerLzGauFrTf1HCTuVyYysQ== +"@mdn/browser-compat-data@^5.5.15": + version "5.5.15" + resolved "https://registry.yarnpkg.com/@mdn/browser-compat-data/-/browser-compat-data-5.5.15.tgz#344f8360085c8fdb69ce367850bd66b3d45f6060" + integrity sha512-BWm+TMK60HSepXOZcu39bDs/2sJZVetHO5w0mkuxhpkZvz0G5yGAoyimfaru8g5nK6LXXUIeX6Uk/SWzOfph3g== "@mdn/dinocons@^0.5.5": version "0.5.5" @@ -2406,54 +2411,54 @@ resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== -"@sentry-internal/tracing@7.105.0": - version "7.105.0" - resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.105.0.tgz#9cb06f8281454343215cfe4b119c8198f032ec72" - integrity sha512-b+AFYB7Bc9vmyxl2jbmuT4esX5G0oPfpz35A0sxFzmJIhvMg1YMDNio2c81BtKN+VSPORCnKMLhfk3kyKKvWMQ== +"@sentry-internal/tracing@7.107.0": + version "7.107.0" + resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.107.0.tgz#a10b4abcbc9e0d8da948e3a95029574387ca7b16" + integrity sha512-le9wM8+OHBbq7m/8P7JUJ1UhSPIty+Z/HmRXc5Z64ODZcOwFV6TmDpYx729IXDdz36XUKmeI+BeM7yQdTTZPfQ== dependencies: - "@sentry/core" "7.105.0" - "@sentry/types" "7.105.0" - "@sentry/utils" "7.105.0" + "@sentry/core" "7.107.0" + "@sentry/types" "7.107.0" + "@sentry/utils" "7.107.0" -"@sentry/core@7.105.0": - version "7.105.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.105.0.tgz#89db519dd9aa7326de63a7eaccf861de3769ab1c" - integrity sha512-5xsaTG6jZincTeJUmZomlv20mVRZUEF1U/g89lmrSOybyk2+opEnB1JeBn4ODwnvmSik8r2QLr6/RiYlaxRJCg== +"@sentry/core@7.107.0": + version "7.107.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.107.0.tgz#926838ba2c2861d6bd2bced0232e1f9d1ead6c75" + integrity sha512-C7ogye6+KPyBi8NVL0P8Rxx3Ur7Td8ufnjxosVy678lqY+dcYPk/HONROrzUFYW5fMKWL4/KYnwP+x9uHnkDmw== dependencies: - "@sentry/types" "7.105.0" - "@sentry/utils" "7.105.0" + "@sentry/types" "7.107.0" + "@sentry/utils" "7.107.0" -"@sentry/integrations@^7.105.0": - version "7.105.0" - resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.105.0.tgz#8953bd310d8681f9a29f918269b98640ab302abe" - integrity sha512-AgzecTkF0o+C4svbroMGA+cW5LRnfFSoJnzF5ltUB67hnX906amlwbOvdkKD3MugYO02nRSjF/eEi26E1HACMA== +"@sentry/integrations@^7.107.0": + version "7.107.0" + resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.107.0.tgz#a46a82be885ef1482197ed7073d7982bd266c09a" + integrity sha512-0h2sZcjcdptS2pju1KSF4+sXaRaFTlmAN1ZokFfmfnVTs6cVtIFttUFxTYrwQUEE2knpAV05pz87zg1yfPAfYg== dependencies: - "@sentry/core" "7.105.0" - "@sentry/types" "7.105.0" - "@sentry/utils" "7.105.0" + "@sentry/core" "7.107.0" + "@sentry/types" "7.107.0" + "@sentry/utils" "7.107.0" localforage "^1.8.1" -"@sentry/node@^7.105.0": - version "7.105.0" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-7.105.0.tgz#cfe8e5602dff2cc754a95412f44c9ca8156422ff" - integrity sha512-b0QwZ7vT4hcJi6LmNRh3dcaYpLtXnkYXkL0rfhMb8hN8sUx8zuOWFMI7j0cfAloVThUeJVwGyv9dERfzGS2r2w== +"@sentry/node@^7.107.0": + version "7.107.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-7.107.0.tgz#d60c2e28953f2ba14d12ada9190f1fc577b2b280" + integrity sha512-UZXkG7uThT2YyPW8AOSKRXp1LbVcBHufa4r1XAwBukA2FKO6HHJPjMUgY6DYVQ6k+BmA56CNfVjYrdLbyjBYYA== dependencies: - "@sentry-internal/tracing" "7.105.0" - "@sentry/core" "7.105.0" - "@sentry/types" "7.105.0" - "@sentry/utils" "7.105.0" + "@sentry-internal/tracing" "7.107.0" + "@sentry/core" "7.107.0" + "@sentry/types" "7.107.0" + "@sentry/utils" "7.107.0" -"@sentry/types@7.105.0": - version "7.105.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.105.0.tgz#51dadb7ad650e883459acf18df2ecbb5b4b6e5c2" - integrity sha512-80o0KMVM+X2Ym9hoQxvJetkJJwkpCg7o6tHHFXI+Rp7fawc2iCMTa0IRQMUiSkFvntQLYIdDoNNuKdzz2PbQGA== +"@sentry/types@7.107.0": + version "7.107.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.107.0.tgz#5ba4b472be6ccad9aecd58dbc0141a09dafb68c1" + integrity sha512-H7qcPjPSUWHE/Zf5bR1EE24G0pGVuJgrSx8Tvvl5nKEepswMYlbXHRVSDN0gTk/E5Z7cqf+hUBOpkQgZyps77w== -"@sentry/utils@7.105.0": - version "7.105.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.105.0.tgz#727187d252b97cb9e6c78bcdd0e9a1d14e60f313" - integrity sha512-YVAV0c2KLM8+VZCicQ/E/P2+J9Vs0hGhrXwV7w6ZEAtvxrg4oF270toL1WRhvcaf8JO4J1v4V+LuU6Txs4uEeQ== +"@sentry/utils@7.107.0": + version "7.107.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.107.0.tgz#b8524539d052a40f9c5f34a8347501f0f81a0751" + integrity sha512-C6PbN5gHh73MRHohnReeQ60N8rrLYa9LciHue3Ru2290eSThg4CzsPnx4SzkGpkSeVlhhptKtKZ+hp/ha3iVuw== dependencies: - "@sentry/types" "7.105.0" + "@sentry/types" "7.107.0" "@sidvind/better-ajv-errors@2.1.3": version "2.1.3" @@ -2492,10 +2497,10 @@ dependencies: "@sinonjs/commons" "^2.0.0" -"@stripe/stripe-js@^3.0.6": - version "3.0.6" - resolved "https://registry.yarnpkg.com/@stripe/stripe-js/-/stripe-js-3.0.6.tgz#80844af42eae50a9a0ba452038672c20217c7117" - integrity sha512-Ef3A0/zvgKbiMdCPT+rZgQBQqhNZ66wuR6Eg2w9YUuqykcIFFKU4nYApBr05WTvInrge8GuOqY5acSDiv6DOjA== +"@stripe/stripe-js@^3.0.10": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@stripe/stripe-js/-/stripe-js-3.0.10.tgz#279b014db9bd3168589aebf0c5fbb768649db828" + integrity sha512-CFRNha+aPXR8GrqJss2TbK1j4aSGZXQY8gx0hvaYiSp+dU7EK/Zs5uwFTSAgV+t8H4+jcZ/iBGajAvoMYOwy+A== "@surma/rollup-plugin-off-main-thread@^2.2.3": version "2.2.3" @@ -2613,74 +2618,74 @@ "@svgr/plugin-jsx" "8.1.0" "@svgr/plugin-svgo" "8.1.0" -"@swc/core-darwin-arm64@1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.2.tgz#3b5677c5b9c5a7a91d953b96cd603c94064e2835" - integrity sha512-1uSdAn1MRK5C1m/TvLZ2RDvr0zLvochgrZ2xL+lRzugLlCTlSA+Q4TWtrZaOz+vnnFVliCpw7c7qu0JouhgQIw== +"@swc/core-darwin-arm64@1.4.8": + version "1.4.8" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.8.tgz#2fb702e209310c2da2bc712b0757c011b583a60d" + integrity sha512-hhQCffRTgzpTIbngSnC30vV6IJVTI9FFBF954WEsshsecVoCGFiMwazBbrkLG+RwXENTrMhgeREEFh6R3KRgKQ== -"@swc/core-darwin-x64@1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.4.2.tgz#bbc8bbf420389b12541151255a50f319cc17ef96" - integrity sha512-TYD28+dCQKeuxxcy7gLJUCFLqrwDZnHtC2z7cdeGfZpbI2mbfppfTf2wUPzqZk3gEC96zHd4Yr37V3Tvzar+lQ== +"@swc/core-darwin-x64@1.4.8": + version "1.4.8" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.4.8.tgz#a5bcbec6830800ca8acafbda1944464ca8421804" + integrity sha512-P3ZBw8Jr8rKhY/J8d+6WqWriqngGTgHwtFeJ8MIakQJTbdYbFgXSZxcvDiERg3psbGeFXaUaPI0GO6BXv9k/OQ== -"@swc/core-linux-arm-gnueabihf@1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.2.tgz#aa9a18f130820717df08c9dd882043fc47e8d35a" - integrity sha512-Eyqipf7ZPGj0vplKHo8JUOoU1un2sg5PjJMpEesX0k+6HKE2T8pdyeyXODN0YTFqzndSa/J43EEPXm+rHAsLFQ== +"@swc/core-linux-arm-gnueabihf@1.4.8": + version "1.4.8" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.8.tgz#0bf6ae3793bbb7dd0e47c3d153350d31b7e63cf9" + integrity sha512-PP9JIJt19bUWhAGcQW6qMwTjZOcMyzkvZa0/LWSlDm0ORYVLmDXUoeQbGD3e0Zju9UiZxyulnpjEN0ZihJgPTA== -"@swc/core-linux-arm64-gnu@1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.2.tgz#5ef1de0ca7cc3a034aa3a1c3c1794b78e6ca207e" - integrity sha512-wZn02DH8VYPv3FC0ub4my52Rttsus/rFw+UUfzdb3tHMHXB66LqN+rR0ssIOZrH6K+VLN6qpTw9VizjyoH0BxA== +"@swc/core-linux-arm64-gnu@1.4.8": + version "1.4.8" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.8.tgz#8d3d3e698fc243d4a55c01a968b7297547aa6275" + integrity sha512-HvEWnwKHkoVUr5iftWirTApFJ13hGzhAY2CMw4lz9lur2m+zhPviRRED0FCI6T95Knpv7+8eUOr98Z7ctrG6DQ== -"@swc/core-linux-arm64-musl@1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.2.tgz#5dfd2a8c0483770a307de0ccb6019a082ff0d902" - integrity sha512-3G0D5z9hUj9bXNcwmA1eGiFTwe5rWkuL3DsoviTj73TKLpk7u64ND0XjEfO0huVv4vVu9H1jodrKb7nvln/dlw== +"@swc/core-linux-arm64-musl@1.4.8": + version "1.4.8" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.8.tgz#ace70bbb650ceb70609987c5b07ff34462960b9e" + integrity sha512-kY8+qa7k/dEeBq9p0Hrta18QnJPpsiJvDQSLNaTIFpdM3aEM9zbkshWz8gaX5VVGUEALowCBUWqmzO4VaqM+2w== -"@swc/core-linux-x64-gnu@1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.2.tgz#314aa76b7c1208e315e3156ab57b7188fb605bc2" - integrity sha512-LFxn9U8cjmYHw3jrdPNqPAkBGglKE3tCZ8rA7hYyp0BFxuo7L2ZcEnPm4RFpmSCCsExFH+LEJWuMGgWERoktvg== +"@swc/core-linux-x64-gnu@1.4.8": + version "1.4.8" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.8.tgz#76e7fb06e5b6a14ed6dbc0fd00743706d022eb02" + integrity sha512-0WWyIw432wpO/zeGblwq4f2YWam4pn8Z/Ig4KzHMgthR/KmiLU3f0Z7eo45eVmq5vcU7Os1zi/Zb65OOt09q/w== -"@swc/core-linux-x64-musl@1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.2.tgz#b2b226657f6a8d48f561cb3dbe2d414cfbafe467" - integrity sha512-dp0fAmreeVVYTUcb4u9njTPrYzKnbIH0EhH2qvC9GOYNNREUu2GezSIDgonjOXkHiTCvopG4xU7y56XtXj4VrQ== +"@swc/core-linux-x64-musl@1.4.8": + version "1.4.8" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.8.tgz#a6e03fe6207fcb9715250c7af260e5ee1bf43c5a" + integrity sha512-p4yxvVS05rBNCrBaSTa20KK88vOwtg8ifTW7ec/yoab0bD5EwzzB8KbDmLLxE6uziFa0sdjF0dfRDwSZPex37Q== -"@swc/core-win32-arm64-msvc@1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.2.tgz#582f79fa328ce0f426ab8313b3d881e7315fab2f" - integrity sha512-HlVIiLMQkzthAdqMslQhDkoXJ5+AOLUSTV6fm6shFKZKqc/9cJvr4S8UveNERL9zUficA36yM3bbfo36McwnvQ== +"@swc/core-win32-arm64-msvc@1.4.8": + version "1.4.8" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.8.tgz#5daa44087324c49c64fdbb48fdb3aa00218de03b" + integrity sha512-jKuXihxAaqUnbFfvPxtmxjdJfs87F1GdBf33il+VUmSyWCP4BE6vW+/ReDAe8sRNsKyrZ3UH1vI5q1n64csBUA== -"@swc/core-win32-ia32-msvc@1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.2.tgz#15c8289e1c18857f79b9b888100ab1f871bf58f6" - integrity sha512-WCF8faPGjCl4oIgugkp+kL9nl3nUATlzKXCEGFowMEmVVCFM0GsqlmGdPp1pjZoWc9tpYanoXQDnp5IvlDSLhA== +"@swc/core-win32-ia32-msvc@1.4.8": + version "1.4.8" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.8.tgz#0f1186d2d8bf60c12cfe8ac013b8a520fd850f2e" + integrity sha512-O0wT4AGHrX8aBeH6c2ADMHgagAJc5Kf6W48U5moyYDAkkVnKvtSc4kGhjWhe1Yl0sI0cpYh2In2FxvYsb44eWw== -"@swc/core-win32-x64-msvc@1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.2.tgz#c999ca7b68124d058b40a1431cdd6f56779670d5" - integrity sha512-oV71rwiSpA5xre2C5570BhCsg1HF97SNLsZ/12xv7zayGzqr3yvFALFJN8tHKpqUdCB4FGPjoP3JFdV3i+1wUw== +"@swc/core-win32-x64-msvc@1.4.8": + version "1.4.8" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.8.tgz#0bf080132a52e332c7c221d1087a311824746d76" + integrity sha512-C2AYc3A2o+ECciqsJWRgIpp83Vk5EaRzHe7ed/xOWzVd0MsWR+fweEsyOjlmzHfpUxJSi46Ak3/BIZJlhZbXbg== -"@swc/core@^1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.4.2.tgz#310b0d5e93e47ca72f54150c8f9efcb434c39b17" - integrity sha512-vWgY07R/eqj1/a0vsRKLI9o9klGZfpLNOVEnrv4nrccxBgYPjcf22IWwAoaBJ+wpA7Q4fVjCUM8lP0m01dpxcg== +"@swc/core@^1.4.8": + version "1.4.8" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.4.8.tgz#de859373a01f499ed27744f6848b28bbb977e81c" + integrity sha512-uY2RSJcFPgNOEg12RQZL197LZX+MunGiKxsbxmh22VfVxrOYGRvh4mPANFlrD1yb38CgmW1wI6YgIi8LkIwmWg== dependencies: "@swc/counter" "^0.1.2" "@swc/types" "^0.1.5" optionalDependencies: - "@swc/core-darwin-arm64" "1.4.2" - "@swc/core-darwin-x64" "1.4.2" - "@swc/core-linux-arm-gnueabihf" "1.4.2" - "@swc/core-linux-arm64-gnu" "1.4.2" - "@swc/core-linux-arm64-musl" "1.4.2" - "@swc/core-linux-x64-gnu" "1.4.2" - "@swc/core-linux-x64-musl" "1.4.2" - "@swc/core-win32-arm64-msvc" "1.4.2" - "@swc/core-win32-ia32-msvc" "1.4.2" - "@swc/core-win32-x64-msvc" "1.4.2" + "@swc/core-darwin-arm64" "1.4.8" + "@swc/core-darwin-x64" "1.4.8" + "@swc/core-linux-arm-gnueabihf" "1.4.8" + "@swc/core-linux-arm64-gnu" "1.4.8" + "@swc/core-linux-arm64-musl" "1.4.8" + "@swc/core-linux-x64-gnu" "1.4.8" + "@swc/core-linux-x64-musl" "1.4.8" + "@swc/core-win32-arm64-msvc" "1.4.8" + "@swc/core-win32-ia32-msvc" "1.4.8" + "@swc/core-win32-x64-msvc" "1.4.8" "@swc/counter@^0.1.2": version "0.1.3" @@ -2852,10 +2857,10 @@ "@types/eslint" "*" "@types/estree" "*" -"@types/eslint@*", "@types/eslint@^8.37.0": - version "8.37.0" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.37.0.tgz#29cebc6c2a3ac7fea7113207bf5a828fdf4d7ef1" - integrity sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ== +"@types/eslint@*", "@types/eslint@^8.56.5": + version "8.56.5" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.56.5.tgz#94b88cab77588fcecdd0771a6d576fa1c0af9d02" + integrity sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -3102,10 +3107,10 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== -"@types/react-dom@^18.0.0", "@types/react-dom@^18.2.19": - version "18.2.19" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.19.tgz#b84b7c30c635a6c26c6a6dfbb599b2da9788be58" - integrity sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA== +"@types/react-dom@^18.0.0", "@types/react-dom@^18.2.22": + version "18.2.22" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.22.tgz#d332febf0815403de6da8a97e5fe282cbe609bae" + integrity sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ== dependencies: "@types/react" "*" @@ -3116,10 +3121,10 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^18.2.61": - version "18.2.61" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.61.tgz#5607308495037436779939ec0348a5816c08799d" - integrity sha512-NURTN0qNnJa7O/k4XUkEW2yfygA+NxS0V5h1+kp9jPwhzZy95q3ADoGMP0+JypMhrZBTTgjKAUlTctde1zzeQA== +"@types/react@*", "@types/react@^18.2.66": + version "18.2.66" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.66.tgz#d2eafc8c4e70939c5432221adb23d32d76bfe451" + integrity sha512-OYTmMI4UigXeFMF/j4uv0lBBEbongSgptPrHBxqME44h9+yNov+oL6Z3ocJKo0WyXR84sQUNeyIp9MRfckvZpg== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -3249,16 +3254,16 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.0.tgz#22bb999a8d59893c0ea07923e8a21f9d985ad740" - integrity sha512-j6vT/kCulhG5wBmGtstKeiVr1rdXE4nk+DT1k6trYkwlrvW9eOF5ZbgKnd/YR6PcM4uTEXa0h6Fcvf6X7Dxl0w== +"@typescript-eslint/eslint-plugin@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.2.0.tgz#5a5fcad1a7baed85c10080d71ad901f98c38d5b7" + integrity sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw== dependencies: "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "7.1.0" - "@typescript-eslint/type-utils" "7.1.0" - "@typescript-eslint/utils" "7.1.0" - "@typescript-eslint/visitor-keys" "7.1.0" + "@typescript-eslint/scope-manager" "7.2.0" + "@typescript-eslint/type-utils" "7.2.0" + "@typescript-eslint/utils" "7.2.0" + "@typescript-eslint/visitor-keys" "7.2.0" debug "^4.3.4" graphemer "^1.4.0" ignore "^5.2.4" @@ -3289,15 +3294,15 @@ dependencies: "@typescript-eslint/utils" "5.40.1" -"@typescript-eslint/parser@7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.1.0.tgz#b89dab90840f7d2a926bf4c23b519576e8c31970" - integrity sha512-V1EknKUubZ1gWFjiOZhDSNToOjs63/9O0puCgGS8aDOgpZY326fzFu15QAUjwaXzRZjf/qdsdBrckYdv9YxB8w== +"@typescript-eslint/parser@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.2.0.tgz#44356312aea8852a3a82deebdacd52ba614ec07a" + integrity sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg== dependencies: - "@typescript-eslint/scope-manager" "7.1.0" - "@typescript-eslint/types" "7.1.0" - "@typescript-eslint/typescript-estree" "7.1.0" - "@typescript-eslint/visitor-keys" "7.1.0" + "@typescript-eslint/scope-manager" "7.2.0" + "@typescript-eslint/types" "7.2.0" + "@typescript-eslint/typescript-estree" "7.2.0" + "@typescript-eslint/visitor-keys" "7.2.0" debug "^4.3.4" "@typescript-eslint/parser@^5.5.0": @@ -3326,13 +3331,13 @@ "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" -"@typescript-eslint/scope-manager@7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.1.0.tgz#e4babaa39a3d612eff0e3559f3e99c720a2b4a54" - integrity sha512-6TmN4OJiohHfoOdGZ3huuLhpiUgOGTpgXNUPJgeZOZR3DnIpdSgtt83RS35OYNNXxM4TScVlpVKC9jyQSETR1A== +"@typescript-eslint/scope-manager@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz#cfb437b09a84f95a0930a76b066e89e35d94e3da" + integrity sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg== dependencies: - "@typescript-eslint/types" "7.1.0" - "@typescript-eslint/visitor-keys" "7.1.0" + "@typescript-eslint/types" "7.2.0" + "@typescript-eslint/visitor-keys" "7.2.0" "@typescript-eslint/type-utils@5.62.0": version "5.62.0" @@ -3344,13 +3349,13 @@ debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/type-utils@7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.1.0.tgz#372dfa470df181bcee0072db464dc778b75ed722" - integrity sha512-UZIhv8G+5b5skkcuhgvxYWHjk7FW7/JP5lPASMEUoliAPwIH/rxoUSQPia2cuOj9AmDZmwUl1usKm85t5VUMew== +"@typescript-eslint/type-utils@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.2.0.tgz#7be5c30e9b4d49971b79095a1181324ef6089a19" + integrity sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA== dependencies: - "@typescript-eslint/typescript-estree" "7.1.0" - "@typescript-eslint/utils" "7.1.0" + "@typescript-eslint/typescript-estree" "7.2.0" + "@typescript-eslint/utils" "7.2.0" debug "^4.3.4" ts-api-utils "^1.0.1" @@ -3364,10 +3369,10 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/types@7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.1.0.tgz#52a86d6236fda646e7e5fe61154991dc0dc433ef" - integrity sha512-qTWjWieJ1tRJkxgZYXx6WUYtWlBc48YRxgY2JN1aGeVpkhmnopq+SUC8UEVGNXIvWH7XyuTjwALfG6bFEgCkQA== +"@typescript-eslint/types@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.2.0.tgz#0feb685f16de320e8520f13cca30779c8b7c403f" + integrity sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA== "@typescript-eslint/typescript-estree@5.40.1": version "5.40.1" @@ -3395,13 +3400,13 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.0.tgz#419b1310f061feee6df676c5bed460537310c593" - integrity sha512-k7MyrbD6E463CBbSpcOnwa8oXRdHzH1WiVzOipK3L5KSML92ZKgUBrTlehdi7PEIMT8k0bQixHUGXggPAlKnOQ== +"@typescript-eslint/typescript-estree@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz#5beda2876c4137f8440c5a84b4f0370828682556" + integrity sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA== dependencies: - "@typescript-eslint/types" "7.1.0" - "@typescript-eslint/visitor-keys" "7.1.0" + "@typescript-eslint/types" "7.2.0" + "@typescript-eslint/visitor-keys" "7.2.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -3437,17 +3442,17 @@ eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/utils@7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.1.0.tgz#710ecda62aff4a3c8140edabf3c5292d31111ddd" - integrity sha512-WUFba6PZC5OCGEmbweGpnNJytJiLG7ZvDBJJoUcX4qZYf1mGZ97mO2Mps6O2efxJcJdRNpqweCistDbZMwIVHw== +"@typescript-eslint/utils@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.2.0.tgz#fc8164be2f2a7068debb4556881acddbf0b7ce2a" + integrity sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA== dependencies: "@eslint-community/eslint-utils" "^4.4.0" "@types/json-schema" "^7.0.12" "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "7.1.0" - "@typescript-eslint/types" "7.1.0" - "@typescript-eslint/typescript-estree" "7.1.0" + "@typescript-eslint/scope-manager" "7.2.0" + "@typescript-eslint/types" "7.2.0" + "@typescript-eslint/typescript-estree" "7.2.0" semver "^7.5.4" "@typescript-eslint/visitor-keys@5.40.1": @@ -3466,12 +3471,12 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.0.tgz#576c4ad462ca1378135a55e2857d7aced96ce0a0" - integrity sha512-FhUqNWluiGNzlvnDZiXad4mZRhtghdoKW6e98GoEOYSu5cND+E39rG5KwJMUzeENwm1ztYBRqof8wMLP+wNPIA== +"@typescript-eslint/visitor-keys@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz#5035f177752538a5750cca1af6044b633610bf9e" + integrity sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A== dependencies: - "@typescript-eslint/types" "7.1.0" + "@typescript-eslint/types" "7.2.0" eslint-visitor-keys "^3.4.1" "@ungap/structured-clone@^1.0.0", "@ungap/structured-clone@^1.2.0": @@ -3629,10 +3634,10 @@ resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e" integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== -"@webref/css@^6.12.1": - version "6.12.1" - resolved "https://registry.yarnpkg.com/@webref/css/-/css-6.12.1.tgz#7aa49598a176fa7c704c23c1f7d4220f6576717f" - integrity sha512-732D63Kn6CSvfRtC00+Zb25kwTTadwTttF4rFncHx8pdz1dwXSR29rjWsDrNYOXARnZewRKRsi6LRFlh1+18Qg== +"@webref/css@^6.12.3": + version "6.12.3" + resolved "https://registry.yarnpkg.com/@webref/css/-/css-6.12.3.tgz#7cc1eb1832770ae6e175f5bcc4f2403f08410606" + integrity sha512-PC0aHmUv3iule6XmykeJwIbDlGLoM9E3eUImH1T/G9vmo6iria90/ShCdfo/FoC1KyzGvn0sftT5SLJhd+tnsQ== "@xtuc/ieee754@^1.2.0": version "1.2.0" @@ -4087,13 +4092,13 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -autoprefixer@^10.4.17: - version "10.4.17" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.17.tgz#35cd5695cbbe82f536a50fa025d561b01fdec8be" - integrity sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg== +autoprefixer@^10.4.18: + version "10.4.18" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.18.tgz#fcb171a3b017be7cb5d8b7a825f5aacbf2045163" + integrity sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g== dependencies: - browserslist "^4.22.2" - caniuse-lite "^1.0.30001578" + browserslist "^4.23.0" + caniuse-lite "^1.0.30001591" fraction.js "^4.3.7" normalize-range "^0.1.2" picocolors "^1.0.0" @@ -4670,10 +4675,10 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001587: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001587.tgz#a0bce920155fa56a1885a69c74e1163fc34b4881" integrity sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA== -caniuse-lite@^1.0.30001578: - version "1.0.30001588" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001588.tgz#07f16b65a7f95dba82377096923947fb25bce6e3" - integrity sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ== +caniuse-lite@^1.0.30001591: + version "1.0.30001596" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001596.tgz#da06b79c3d9c3d9958eb307aa832ac68ead79bee" + integrity sha512-zpkZ+kEr6We7w63ORkoJ2pOfBwBkY/bJrG/UZ90qNb45Isblu8wzDgevEOrRL1r9dWayHjYiiyCMEXPn4DweGQ== capital-case@^1.0.4: version "1.0.4" @@ -5449,10 +5454,10 @@ css-what@^6.0.1, css-what@^6.1.0: resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== -cssdb@^7.11.0: - version "7.11.0" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-7.11.0.tgz#26570bbc92251b719cd74468df710d86c554117f" - integrity sha512-YUVAJhjDcTZzVD5XE49l3PQtGE29vvhzaL1bM3BtkvSmIRJeYENdfn1dn5jauBI7BBF+IyyiBS+oSVx3Hz/Gaw== +cssdb@^7.11.1: + version "7.11.1" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-7.11.1.tgz#491841b281d337d7e5332e43b282429dd241b377" + integrity sha512-F0nEoX/Rv8ENTHsjMPGHd9opdjGfXkgRBafSUGnQKPzGZFB7Lm0BbT10x21TMOCrKLbVsJ0NoCDMk6AfKqw8/A== cssesc@^3.0.0: version "3.0.0" @@ -5870,10 +5875,10 @@ devlop@^1.0.0, devlop@^1.1.0: dependencies: dequal "^2.0.0" -dexie@^3.2.5: - version "3.2.5" - resolved "https://registry.yarnpkg.com/dexie/-/dexie-3.2.5.tgz#f68e34b98e0e5e3412cf86b540a2cc6cbf9b0266" - integrity sha512-MA7vYQvXxWN2+G50D0GLS4FqdYUyRYQsN0FikZIVebOmRoNCSCL9+eUbIF80dqrfns3kmY+83+hE2GN9CnAGyA== +dexie@^3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/dexie/-/dexie-3.2.6.tgz#c5980e4228d7e81744bb324c81459afa6604da41" + integrity sha512-R9VzQ27/cncQymoAeD1kfu66NUrdxcnMNXVfEoFLnQ+apVVbS4++veUcSGxft9V++zaeiLkMAREOMf8EwgR/Vw== dependencies: karma-safari-launcher "^1.0.0" @@ -6693,16 +6698,16 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint-webpack-plugin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-4.0.1.tgz#f0f0e9afff2801d8bd41eac88e5409821ecbaccb" - integrity sha512-fUFcXpui/FftGx3NzvWgLZXlLbu+m74sUxGEgxgoxYcUtkIQbS6SdNNZkS99m5ycb23TfoNYrDpp1k/CK5j6Hw== +eslint-webpack-plugin@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-4.1.0.tgz#83daf1e601ea57b63d7164eea0635d7b7bafe673" + integrity sha512-C3wAG2jyockIhN0YRLuKieKj2nx/gnE/VHmoHemD5ifnAtY6ZU+jNPfzPoX4Zd6RIbUyWTiZUh/ofUlBhoAX7w== dependencies: - "@types/eslint" "^8.37.0" - jest-worker "^29.5.0" + "@types/eslint" "^8.56.5" + jest-worker "^29.7.0" micromatch "^4.0.5" normalize-path "^3.0.0" - schema-utils "^4.0.0" + schema-utils "^4.2.0" eslint@^8.57.0: version "8.57.0" @@ -7321,9 +7326,9 @@ fn.name@1.x.x: integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== follow-redirects@^1.0.0: - version "1.15.4" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.4.tgz#cdc7d308bf6493126b17ea2191ea0ccf3e535adf" - integrity sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw== + version "1.15.6" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" + integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== for-each@^0.3.3: version "0.3.3" @@ -8256,10 +8261,10 @@ html-url-attributes@^3.0.0: resolved "https://registry.yarnpkg.com/html-url-attributes/-/html-url-attributes-3.0.0.tgz#fc4abf0c3fb437e2329c678b80abb3c62cff6f08" integrity sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow== -html-validate@^8.12.0: - version "8.12.0" - resolved "https://registry.yarnpkg.com/html-validate/-/html-validate-8.12.0.tgz#fae414aa5cb819990a4bd2eecaf3ab75702c3489" - integrity sha512-a3erV9NTYPDlo7mPgR5ta712UQDzRlWjw0Dhfm7ytRkgUjpWhLq6o4ulTQA8ZE8zG8ov162GCfmz5skB1yQSUw== +html-validate@^8.15.0: + version "8.15.0" + resolved "https://registry.yarnpkg.com/html-validate/-/html-validate-8.15.0.tgz#0d99c18a71b08346e0ad9debf8444bd2cb402bbf" + integrity sha512-kqRgG8IDb6rMuQkMAsH7tmzkKTU7a67c0ZZDu4JlncIhImoPFra3H4CzdtIxF7hWaFTXR//QRGEwFiidjh0wfQ== dependencies: "@babel/code-frame" "^7.10.0" "@html-validate/stylish" "^4.1.0" @@ -8656,12 +8661,12 @@ inquirer@^6.0.0: strip-ansi "^5.1.0" through "^2.3.6" -inquirer@^9.2.15: - version "9.2.15" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-9.2.15.tgz#2135a36190a6e5c92f5d205e0af1fea36b9d3492" - integrity sha512-vI2w4zl/mDluHt9YEQ/543VTCwPKWiHzKtm9dM2V0NdFcqEexDAjUHzO1oA60HRNaVifGXXM1tRRNluLVHa0Kg== +inquirer@^9.2.16: + version "9.2.16" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-9.2.16.tgz#9291fbfdf96fd793179c9575f76fa50a5ed27349" + integrity sha512-qzgbB+yNjgSzk2omeqMDtO9IgJet/UL67luT1MaaggRpGK73DBQct5Q4pipwFQcIKK1GbMODYd4UfsRCkSP1DA== dependencies: - "@ljharb/through" "^2.3.12" + "@ljharb/through" "^2.3.13" ansi-escapes "^4.3.2" chalk "^5.3.0" cli-cursor "^3.1.0" @@ -9674,7 +9679,7 @@ jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" -jest-worker@^29.5.0, jest-worker@^29.7.0: +jest-worker@^29.7.0: version "29.7.0" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== @@ -11381,10 +11386,10 @@ open-editor@^4.1.1: line-column-path "^3.0.0" open "^8.4.0" -open@^10.0.3, open@^10.0.4: - version "10.0.4" - resolved "https://registry.yarnpkg.com/open/-/open-10.0.4.tgz#4869d009dc5b706ae6585699e15d8ccc6cb73629" - integrity sha512-oujJ/FFr7ra6/7gJuQ4ZJJ8Gf2VHM0J3J/W7IvH++zaqEzacWVxzK++NiVY5NLHTTj7u/jNH5H3Ei9biL31Lng== +open@^10.0.3, open@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/open/-/open-10.1.0.tgz#a7795e6e5d519abe4286d9937bb24b51122598e1" + integrity sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw== dependencies: default-browser "^5.2.1" define-lazy-prop "^3.0.0" @@ -11408,10 +11413,10 @@ open@^8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" -openai@^4.28.4: - version "4.28.4" - resolved "https://registry.yarnpkg.com/openai/-/openai-4.28.4.tgz#d4bf1f53a89ef151bf066ef284489e12e7dd1657" - integrity sha512-RNIwx4MT/F0zyizGcwS+bXKLzJ8QE9IOyigDG/ttnwB220d58bYjYFp0qjvGwEFBO6+pvFVIDABZPGDl46RFsg== +openai@^4.29.0: + version "4.29.0" + resolved "https://registry.yarnpkg.com/openai/-/openai-4.29.0.tgz#4e69e6be5fc623d6783c1758de93126a3b27b315" + integrity sha512-ic6C681bSow1XQdKhADthM/OOKqNL05M1gCFLx1mRqLJ+yH49v6qnvaWQ76kwqI/IieCuVTXfRfTk3sz4cB45w== dependencies: "@types/node" "^18.11.18" "@types/node-fetch" "^2.6.4" @@ -11970,15 +11975,15 @@ postcss-clamp@^4.1.0: dependencies: postcss-value-parser "^4.2.0" -postcss-color-functional-notation@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-6.0.5.tgz#eca158e833b5655c5715c998e92aab9481124c18" - integrity sha512-aTFsIy89ftjyclwUHRwvz1IxucLzVrzmmcXmtbPWT9GdyYeaJEKeAwbaZzOZn7AQlXg4xfwgkYhKsofC4aLIwg== +postcss-color-functional-notation@^6.0.6: + version "6.0.6" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-6.0.6.tgz#a0b6154b1524b70f09557f3b2867a6dff4e1cbf8" + integrity sha512-2GENDVgEk1dt+OdVhPO+zO4Dzj31Xs9EuKgQLbY9RSkKS3jUqnbTAh33bUhKce5JM1ZmsXm0azCb7Bh8j6W6Nw== dependencies: - "@csstools/css-color-parser" "^1.5.2" - "@csstools/css-parser-algorithms" "^2.6.0" - "@csstools/css-tokenizer" "^2.2.3" - "@csstools/postcss-progressive-custom-properties" "^3.1.0" + "@csstools/css-color-parser" "^1.6.0" + "@csstools/css-parser-algorithms" "^2.6.1" + "@csstools/css-tokenizer" "^2.2.4" + "@csstools/postcss-progressive-custom-properties" "^3.1.1" "@csstools/utilities" "^1.0.0" postcss-color-hex-alpha@^9.0.4: @@ -12015,35 +12020,35 @@ postcss-convert-values@^6.0.2: browserslist "^4.22.2" postcss-value-parser "^4.2.0" -postcss-custom-media@^10.0.3: - version "10.0.3" - resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-10.0.3.tgz#7131ee7f6e55cbb0423dcfca37c8946539f1b214" - integrity sha512-wfJ9nKpLn/Qy7LASKu0Rj9Iq2uMzlRt27P4FAE1889IKRMdYUgy8SqvdXfAOs7LJLQX9Fjm0mZ+TSFphD/mKwA== - dependencies: - "@csstools/cascade-layer-name-parser" "^1.0.8" - "@csstools/css-parser-algorithms" "^2.6.0" - "@csstools/css-tokenizer" "^2.2.3" - "@csstools/media-query-list-parser" "^2.1.8" - -postcss-custom-properties@^13.3.5: - version "13.3.5" - resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-13.3.5.tgz#0083841407dbf93c833457ecffdf1a3d74a76d10" - integrity sha512-xHg8DTCMfN2nrqs2CQTF+0m5jgnzKL5zrW5Y05KF6xBRO0uDPxiplBm/xcr1o49SLbyJXkMuaRJKhRzkrquKnQ== - dependencies: - "@csstools/cascade-layer-name-parser" "^1.0.8" - "@csstools/css-parser-algorithms" "^2.6.0" - "@csstools/css-tokenizer" "^2.2.3" +postcss-custom-media@^10.0.4: + version "10.0.4" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-10.0.4.tgz#f40fcf05f3ee95e7a34bbdcb4dff99da41f0238f" + integrity sha512-Ubs7O3wj2prghaKRa68VHBvuy3KnTQ0zbGwqDYY1mntxJD0QL2AeiAy+AMfl3HBedTCVr2IcFNktwty9YpSskA== + dependencies: + "@csstools/cascade-layer-name-parser" "^1.0.9" + "@csstools/css-parser-algorithms" "^2.6.1" + "@csstools/css-tokenizer" "^2.2.4" + "@csstools/media-query-list-parser" "^2.1.9" + +postcss-custom-properties@^13.3.6: + version "13.3.6" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-13.3.6.tgz#f18f3105ab33b8cb2e69da38192a415f6e4c0ea8" + integrity sha512-vVVIwQbJiIz+PBLMIWA6XMi53Zg66/f474KolA7x0Das6EwkATc/9ZvM6zZx2gs7ZhcgVHjmWBbHkK9FlCgLeA== + dependencies: + "@csstools/cascade-layer-name-parser" "^1.0.9" + "@csstools/css-parser-algorithms" "^2.6.1" + "@csstools/css-tokenizer" "^2.2.4" "@csstools/utilities" "^1.0.0" postcss-value-parser "^4.2.0" -postcss-custom-selectors@^7.1.7: - version "7.1.7" - resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-7.1.7.tgz#66b7adb9a3470ba11860ad7847947c7fd29e985d" - integrity sha512-N19MpExaR+hYTXU59VO02xE42zLoAUYSVcupwkKlWWLteOb+sWCWHw5FhV7u7gVLTzaGULy7nZP3DNTHgOZAPA== +postcss-custom-selectors@^7.1.8: + version "7.1.8" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-7.1.8.tgz#600ce32a487737038831bb679e9a8011ffc62ee5" + integrity sha512-fqDkGSEsO7+oQaqdRdR8nwwqH+N2uk6LE/2g4myVJJYz/Ly418lHKEleKTdV/GzjBjFcG4n0dbfuH/Pd2BE8YA== dependencies: - "@csstools/cascade-layer-name-parser" "^1.0.8" - "@csstools/css-parser-algorithms" "^2.6.0" - "@csstools/css-tokenizer" "^2.2.3" + "@csstools/cascade-layer-name-parser" "^1.0.9" + "@csstools/css-parser-algorithms" "^2.6.1" + "@csstools/css-tokenizer" "^2.2.4" postcss-selector-parser "^6.0.13" postcss-dir-pseudo-class@^8.0.1: @@ -12073,12 +12078,12 @@ postcss-discard-overridden@^6.0.1: resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-6.0.1.tgz#c63c559237758d74bc505452393a64dda9b19ef4" integrity sha512-qs0ehZMMZpSESbRkw1+inkf51kak6OOzNRaoLd/U7Fatp0aN2HQ1rxGOrJvYcRAN9VpX8kUF13R2ofn8OlvFVA== -postcss-double-position-gradients@^5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-5.0.4.tgz#294787043e5e6187b5489ee52950ecfb303f9ea9" - integrity sha512-xOH2QhazCPeYR+ziYaDcGlpo7Bpw8PVoggOFfU/xPkmBRUQH8MR2eWoPY1CZM93CB0WKs2mxq3ORo83QGIooLw== +postcss-double-position-gradients@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-5.0.5.tgz#4baa4d3ec35ef59ddb8b7ee44fd8855cd7faeb40" + integrity sha512-26Tx4BfoxMNO9C89Nk56bfGv4jAwdDVgrQOyHZOP/6/D+xuOBf306KzTjHC2oBzaIIVtX+famOWHv4raxMjJMQ== dependencies: - "@csstools/postcss-progressive-custom-properties" "^3.1.0" + "@csstools/postcss-progressive-custom-properties" "^3.1.1" "@csstools/utilities" "^1.0.0" postcss-value-parser "^4.2.0" @@ -12135,15 +12140,15 @@ postcss-js@^4.0.1: dependencies: camelcase-css "^2.0.1" -postcss-lab-function@^6.0.10: - version "6.0.10" - resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-6.0.10.tgz#efe1bbf9fa1f1034890a0ad078286bfbace11106" - integrity sha512-Csvw/CwwuwTojK2O3Ad0SvYKrfnAKy+uvT+1Fjk6igR+n8gHuJHIwdj1A2s46EZZojg3RkibdMBuv1vMvR6Sng== +postcss-lab-function@^6.0.11: + version "6.0.11" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-6.0.11.tgz#3f5dc97ed7778ea101d6cf1c4628936d5c545139" + integrity sha512-toTAozTlBBhqSynSJ32O6ssukZFphS58AAQcVqMA8kG/E04+v+e7E5OKRqq68M/VJaWIeMdpyeBEO51buMrdvw== dependencies: - "@csstools/css-color-parser" "^1.5.2" - "@csstools/css-parser-algorithms" "^2.6.0" - "@csstools/css-tokenizer" "^2.2.3" - "@csstools/postcss-progressive-custom-properties" "^3.1.0" + "@csstools/css-color-parser" "^1.6.0" + "@csstools/css-parser-algorithms" "^2.6.1" + "@csstools/css-tokenizer" "^2.2.4" + "@csstools/postcss-progressive-custom-properties" "^3.1.1" "@csstools/utilities" "^1.0.0" postcss-load-config@^4.0.1: @@ -12260,11 +12265,12 @@ postcss-nested@^6.0.1: dependencies: postcss-selector-parser "^6.0.11" -postcss-nesting@^12.0.3: - version "12.0.3" - resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-12.0.3.tgz#ee451e5d2dc3f9f09d68434ddc7ad9d42b7f44e9" - integrity sha512-yrtMRPFNkfZMv9ikBvZ/Eh3RxhpMBKQ3KzD7LCY8+jYVlgju/Mdcxi4JY8bW2Y7ISXw8GTLuF/o+kFtp+yaVfQ== +postcss-nesting@^12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-12.1.0.tgz#9ecca8da9d0bbfdaa47d3608ccf5ac48bfdfc0d2" + integrity sha512-QOYnosaZ+mlP6plQrAxFw09UUp2Sgtxj1BVHN+rSVbtV0Yx48zRt9/9F/ZOoxOKBBEsaJk2MYhhVRjeRRw5yuw== dependencies: + "@csstools/selector-resolve-nested" "^1.1.0" "@csstools/selector-specificity" "^3.0.2" postcss-selector-parser "^6.0.13" @@ -12371,64 +12377,64 @@ postcss-place@^9.0.1: dependencies: postcss-value-parser "^4.2.0" -postcss-preset-env@^9.4.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-9.4.0.tgz#9896efc0e9896d68316adcf2d314d36f38f04bba" - integrity sha512-5X2UA4Dn4xo7sJFCxlzW/dAGo71Oxh/K5DVls33hd2e3j06OKnW5FJQTw2hB0wTnGv0f6WcMaVBGFqcEfAgwlw== +postcss-preset-env@^9.5.1: + version "9.5.1" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-9.5.1.tgz#ebf5806af1050e603e2ffa3281bfb4ca0af346bc" + integrity sha512-m2biepZ2amqH/ygGRV+lQxnT9+AsYG2OScMwBRLa9YefDOXaCVKzsPtmnvdUG7QENdhAl9tE9nsHbYHVYsqJmQ== dependencies: "@csstools/postcss-cascade-layers" "^4.0.3" - "@csstools/postcss-color-function" "^3.0.10" - "@csstools/postcss-color-mix-function" "^2.0.10" - "@csstools/postcss-exponential-functions" "^1.0.4" + "@csstools/postcss-color-function" "^3.0.11" + "@csstools/postcss-color-mix-function" "^2.0.11" + "@csstools/postcss-exponential-functions" "^1.0.5" "@csstools/postcss-font-format-keywords" "^3.0.2" - "@csstools/postcss-gamut-mapping" "^1.0.3" - "@csstools/postcss-gradients-interpolation-method" "^4.0.10" - "@csstools/postcss-hwb-function" "^3.0.9" - "@csstools/postcss-ic-unit" "^3.0.4" + "@csstools/postcss-gamut-mapping" "^1.0.4" + "@csstools/postcss-gradients-interpolation-method" "^4.0.12" + "@csstools/postcss-hwb-function" "^3.0.10" + "@csstools/postcss-ic-unit" "^3.0.5" "@csstools/postcss-initial" "^1.0.1" "@csstools/postcss-is-pseudo-class" "^4.0.5" - "@csstools/postcss-light-dark-function" "^1.0.0" + "@csstools/postcss-light-dark-function" "^1.0.1" "@csstools/postcss-logical-float-and-clear" "^2.0.1" "@csstools/postcss-logical-overflow" "^1.0.1" "@csstools/postcss-logical-overscroll-behavior" "^1.0.1" "@csstools/postcss-logical-resize" "^2.0.1" - "@csstools/postcss-logical-viewport-units" "^2.0.6" - "@csstools/postcss-media-minmax" "^1.1.3" - "@csstools/postcss-media-queries-aspect-ratio-number-values" "^2.0.6" + "@csstools/postcss-logical-viewport-units" "^2.0.7" + "@csstools/postcss-media-minmax" "^1.1.4" + "@csstools/postcss-media-queries-aspect-ratio-number-values" "^2.0.7" "@csstools/postcss-nested-calc" "^3.0.2" "@csstools/postcss-normalize-display-values" "^3.0.2" - "@csstools/postcss-oklab-function" "^3.0.10" - "@csstools/postcss-progressive-custom-properties" "^3.1.0" - "@csstools/postcss-relative-color-syntax" "^2.0.10" + "@csstools/postcss-oklab-function" "^3.0.11" + "@csstools/postcss-progressive-custom-properties" "^3.1.1" + "@csstools/postcss-relative-color-syntax" "^2.0.11" "@csstools/postcss-scope-pseudo-class" "^3.0.1" - "@csstools/postcss-stepped-value-functions" "^3.0.5" + "@csstools/postcss-stepped-value-functions" "^3.0.6" "@csstools/postcss-text-decoration-shorthand" "^3.0.4" - "@csstools/postcss-trigonometric-functions" "^3.0.5" + "@csstools/postcss-trigonometric-functions" "^3.0.6" "@csstools/postcss-unset-value" "^3.0.1" - autoprefixer "^10.4.17" + autoprefixer "^10.4.18" browserslist "^4.22.3" css-blank-pseudo "^6.0.1" css-has-pseudo "^6.0.2" css-prefers-color-scheme "^9.0.1" - cssdb "^7.11.0" + cssdb "^7.11.1" postcss-attribute-case-insensitive "^6.0.3" postcss-clamp "^4.1.0" - postcss-color-functional-notation "^6.0.5" + postcss-color-functional-notation "^6.0.6" postcss-color-hex-alpha "^9.0.4" postcss-color-rebeccapurple "^9.0.3" - postcss-custom-media "^10.0.3" - postcss-custom-properties "^13.3.5" - postcss-custom-selectors "^7.1.7" + postcss-custom-media "^10.0.4" + postcss-custom-properties "^13.3.6" + postcss-custom-selectors "^7.1.8" postcss-dir-pseudo-class "^8.0.1" - postcss-double-position-gradients "^5.0.4" + postcss-double-position-gradients "^5.0.5" postcss-focus-visible "^9.0.1" postcss-focus-within "^8.0.1" postcss-font-variant "^5.0.0" postcss-gap-properties "^5.0.1" postcss-image-set-function "^6.0.3" - postcss-lab-function "^6.0.10" + postcss-lab-function "^6.0.11" postcss-logical "^7.0.1" - postcss-nesting "^12.0.3" + postcss-nesting "^12.1.0" postcss-opacity-percentage "^2.0.0" postcss-overflow-shorthand "^5.0.1" postcss-page-break "^3.0.4" @@ -13579,10 +13585,10 @@ sass-loader@^14.1.1: dependencies: neo-async "^2.6.2" -sass@^1.71.1: - version "1.71.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.71.1.tgz#dfb09c63ce63f89353777bbd4a88c0a38386ee54" - integrity sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg== +sass@^1.72.0: + version "1.72.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.72.0.tgz#5b9978943fcfb32b25a6a5acb102fc9dabbbf41c" + integrity sha512-Gpczt3WA56Ly0Mn8Sl21Vj94s1axi9hDIzDFn9Ph9x3C3p4nNyvsqJoQyVXKou6cBlfFWEgRW4rT8Tb4i3XnVA== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -14117,10 +14123,10 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -sse.js@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/sse.js/-/sse.js-2.3.0.tgz#2afc3758958e5a6859b47275df233a09cffb5ec8" - integrity sha512-DuvzoKO5DBdiGvvtSA+9UbwtEN3KuGAFB67Miwfx8eAn7hnnskT9SGPReLMKo6IjksB6oeYkkL8jf1cV0SmJww== +sse.js@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/sse.js/-/sse.js-2.4.1.tgz#1d0cb4507b814bf27cddaf4407b94945d3df30ac" + integrity sha512-0qXPFZCClp+RPWtldNTYUjDWDlStZq1nyRF7at8WDFotHEyCivEBlR7Z5ftcJnt9KpouRg+NdzGFvPTB2gHl8Q== stable@^0.1.8: version "0.1.8" @@ -15252,18 +15258,18 @@ typed-array-length@^1.0.4: for-each "^0.3.3" is-typed-array "^1.1.9" -typescript-eslint@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-7.1.0.tgz#e98e26ea2346e7058c025a1545522bdfa8fcd30f" - integrity sha512-GfAALH4zoqae5mIfHr7WU3BsULHP73hjwF8vCmyTkH3IXHXjqg3JNWwUcd8CwOTLIr4tjRTZQWpToyESPnpOhg== +typescript-eslint@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-7.2.0.tgz#4cb084a74cbfc73085c8f98f1025203721ca2a98" + integrity sha512-VqXEBqzPxJlR8Lfg2Dywe4XpIk637kwp2sfMQ+vudNHo48TUvnlHzAyFMQknv0AdhvZFXQN0a0t9SPI3rsAYew== dependencies: - "@typescript-eslint/eslint-plugin" "7.1.0" - "@typescript-eslint/parser" "7.1.0" + "@typescript-eslint/eslint-plugin" "7.2.0" + "@typescript-eslint/parser" "7.2.0" -typescript@^5.3.3: - version "5.3.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" - integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== +typescript@^5.4.2: + version "5.4.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.2.tgz#0ae9cebcfae970718474fe0da2c090cad6577372" + integrity sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ== unbox-primitive@^1.0.2: version "1.0.2" @@ -15684,20 +15690,20 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" -web-features@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/web-features/-/web-features-0.5.1.tgz#edf75127605fe80e19451d7092a760445d9d8309" - integrity sha512-2ZB/vJdyeJod7qUD6gupETkbjyzPkIlyx3InCwLkauJYXVwCaTkM24qenZbTmoFXwSqIOlK4wO7HKv4ZXHmXkg== +web-features@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/web-features/-/web-features-0.6.0.tgz#cbe504453875e6f6c5d62071b48fa00180999091" + integrity sha512-BX9YIeAR7lDJaqdj1275qFWg6SOfJR3lbG9AMlWcn8Yc98aE/+9qmLH1CqWVcze+Wkg+itwEowLfsYf6KiNO9w== web-namespaces@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-2.0.1.tgz#1010ff7c650eccb2592cebeeaf9a1b253fd40692" integrity sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ== -web-specs@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/web-specs/-/web-specs-3.4.0.tgz#f5b7e221d33ff4de322af2c914f8a8e7190e1db7" - integrity sha512-DHtdKODxx86bnuCbrmV2ie1W5ku1npI4URGfyNIZO1F3Taaw9ivNhvrVJMaoIBUaxfWCRwvmLUf7uZSBIteQfw== +web-specs@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/web-specs/-/web-specs-3.5.0.tgz#a8ba6625964fb99396016ad36dd0680c4d8cd6ba" + integrity sha512-8PrlDmVTMuoz0LcidzsK8PsdzBtzmKUxqrfrgY5tCmEL2+A28LYJpUTeM0SUm2tKIly9TOxAP3YQMYz4oSKABw== web-streams-polyfill@4.0.0-beta.3: version "4.0.0-beta.3" @@ -15754,10 +15760,10 @@ webpack-dev-middleware@^7.0.0: range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-server@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-5.0.2.tgz#3035972dae4b768de020f91418de471e4ef12b6c" - integrity sha512-IVj3qsQhiLJR82zVg3QdPtngMD05CYP/Am+9NG5QSl+XwUR/UPtFwllRBKrMwM9ttzFsC6Zj3DMgniPyn/Z0hQ== +webpack-dev-server@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-5.0.3.tgz#694bf56308b9c5568c9026302bb1fe2f6130804c" + integrity sha512-4aj4I8FJLsFbd4Vt6YBXC8CWrOOwviEI9DdVTu9hrgIBGWs4oKOVfDnaRc+vgf1JUSir1psph1ChPFDkTGHR2Q== dependencies: "@types/bonjour" "^3.5.13" "@types/connect-history-api-fallback" "^1.5.4"