diff --git a/testing/.env b/.env.testing similarity index 100% rename from testing/.env rename to .env.testing diff --git a/.github/workflows/pr-commit-signatures.yml b/.github/workflows/pr-commit-signatures.yml index 22741582b2a5..e031fcb6d045 100644 --- a/.github/workflows/pr-commit-signatures.yml +++ b/.github/workflows/pr-commit-signatures.yml @@ -9,10 +9,12 @@ jobs: steps: - name: Fetch commits - run: curl -s "${{ github.event.pull_request._links.commits.href }}" > commits.json + run: gh api "${{ github.event.pull_request._links.commits.href }}" | tee commits.json + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Filter unverified commits - run: jq '[.[].commit | select(.verification.verified == false)]' < commits.json > unverified-commits.json + run: jq '[.[].commit | select(.verification.verified == false)]' < commits.json | tee unverified-commits.json - name: List unverified commits run: jq '.[] | [{message, tree, author, committer, verification}]' < unverified-commits.json diff --git a/.github/workflows/prod-build.yml b/.github/workflows/prod-build.yml index 02dbd71cf9ca..9ebbe26a8171 100644 --- a/.github/workflows/prod-build.yml +++ b/.github/workflows/prod-build.yml @@ -167,18 +167,18 @@ jobs: REACT_APP_MDN_PLUS_10Y_PLAN: price_1KeG02JNcmPzuWtRlrSiLTI6 # Surveys. - REACT_APP_SURVEY_START_INTEROP_2023: 1667217600000 # (new Date("2022-10-31 12:00:00Z")).getTime() - REACT_APP_SURVEY_END_INTEROP_2023: 1667822400000 # (new Date("2022-11-07 12:00:00Z")).getTime() - - REACT_APP_SURVEY_RATE_FROM_INTEROP_2023_CSS_HTML: 0.0 - REACT_APP_SURVEY_RATE_TILL_INTEROP_2023_CSS_HTML: 0.10 # 10 % - REACT_APP_SURVEY_RATE_FROM_INTEROP_2023_API_JS: 0.10 - REACT_APP_SURVEY_RATE_TILL_INTEROP_2023_API_JS: 0.15 # 5 % + REACT_APP_SURVEY_START_FIREFOX_WEB_COMPAT_2023: 1675252800000 # (new Date("2023-02-01 12:00:00Z")).getTime() + REACT_APP_SURVEY_END_FIREFOX_WEB_COMPAT_2023: 1675684800000 # (new Date("2023-02-06 12:00:00Z")).getTime() + REACT_APP_SURVEY_RATE_FROM_FIREFOX_WEB_COMPAT_2023: 0.0 + REACT_APP_SURVEY_RATE_TILL_FIREFOX_WEB_COMPAT_2023: 0.10 # 10% # Telemetry. REACT_APP_GLEAN_CHANNEL: prod REACT_APP_GLEAN_ENABLED: true + # Newsletter + REACT_APP_NEWSLETTER_ENABLED: true + run: | # Info about which CONTENT_* environment variables were set and to what. diff --git a/.github/workflows/stage-build.yml b/.github/workflows/stage-build.yml index 2857d0587896..0953fb811ee9 100644 --- a/.github/workflows/stage-build.yml +++ b/.github/workflows/stage-build.yml @@ -164,18 +164,18 @@ jobs: REACT_APP_MDN_PLUS_10Y_PLAN: price_1K6X8VKb9q6OnNsLFlUcEiu4 # Surveys. - REACT_APP_SURVEY_START_INTEROP_2023: 0 # stage - REACT_APP_SURVEY_END_INTEROP_2023: 1667822400000 # (new Date("2022-11-07 12:00:00Z")).getTime() - - REACT_APP_SURVEY_RATE_FROM_INTEROP_2023_CSS_HTML: 0.0 - REACT_APP_SURVEY_RATE_TILL_INTEROP_2023_CSS_HTML: 0.10 # 10 % - REACT_APP_SURVEY_RATE_FROM_INTEROP_2023_API_JS: 0.10 - REACT_APP_SURVEY_RATE_TILL_INTEROP_2023_API_JS: 0.15 # 5 % + REACT_APP_SURVEY_START_FIREFOX_WEB_COMPAT_2023: 0 # stage + REACT_APP_SURVEY_END_FIREFOX_WEB_COMPAT_2023: 1675771200000 # (new Date("2023-02-07 12:00:00Z")).getTime() + REACT_APP_SURVEY_RATE_FROM_FIREFOX_WEB_COMPAT_2023: 0.0 + REACT_APP_SURVEY_RATE_TILL_FIREFOX_WEB_COMPAT_2023: 0.10 # 10% # Telemetry. REACT_APP_GLEAN_CHANNEL: stage REACT_APP_GLEAN_ENABLED: true + # Newsletter + REACT_APP_NEWSLETTER_ENABLED: true + run: | # Info about which CONTENT_* environment variables were set and to what. diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml index 7d3364b306ef..c3f8e46b13a3 100644 --- a/.github/workflows/testing.yml +++ b/.github/workflows/testing.yml @@ -23,6 +23,7 @@ jobs: cache: yarn cache-dependency-path: | yarn.lock + client/pwa/yarn.lock deployer/aws-lambda/content-origin-request/yarn.lock deployer/aws-lambda/content-origin-response/yarn.lock deployer/aws-lambda/tests/yarn.lock @@ -31,6 +32,10 @@ jobs: - name: Install all yarn packages (ROOT) run: yarn --frozen-lockfile + - name: Install all yarn packages (pwa) + working-directory: client/pwa + run: yarn --frozen-lockfile + - name: Install all yarn packages (aws-lambda/content-origin-request) working-directory: deployer/aws-lambda/content-origin-request run: yarn --frozen-lockfile @@ -52,6 +57,9 @@ jobs: - name: Lint stylelint run: yarn stylelint + - name: Check TypeScript + run: yarn check:tsc + test: runs-on: ubuntu-latest @@ -73,17 +81,8 @@ jobs: - name: Build and start server id: server env: - ENV_FILE: testing/.env + ENV_FILE: .env.testing run: | - - # because `yarn build:prepare` is a wrapper for `yarn build:client` and - # `yarn build:client` can't respect the `$ENV_FILE` environment variable, - # because it has to build from the `./client/` directory, we have to - # manually copy the `testing/.env` file into `client/` so that when - # `yarn build:client` runs, it gets the same environment variables - # as you'd get when doing `yarn build:ssr`. - cp testing/.env client/ - yarn build:prepare yarn build @@ -98,7 +97,7 @@ jobs: - name: Basic m2h tool testing env: - ENV_FILE: testing/.env + ENV_FILE: .env.testing run: | yarn m2h markdown/tool/m2h --locale en-US diff -s testing/content/files/en-us/markdown/tool/m2h/index.html testing/content/files/en-us/markdown/tool/m2h/expected.html diff --git a/.lintstagedrc.json b/.lintstagedrc.json deleted file mode 100644 index 2c326cd0fc71..000000000000 --- a/.lintstagedrc.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "*": "prettier --ignore-unknown --write", - "*.{js,jsx,tsx}": "eslint --fix", - "*.{css,scss}": "stylelint --fix --allow-empty-input" -} diff --git a/README.md b/README.md index 12c52cdb80c6..147187d45fe2 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Yari  - + ## Quickstart diff --git a/build/bcd-urls.ts b/build/bcd-urls.ts deleted file mode 100644 index 72455a09848f..000000000000 --- a/build/bcd-urls.ts +++ /dev/null @@ -1,155 +0,0 @@ -import { Document, Redirect } from "../content"; -import { FLAW_LEVELS } from "../libs/constants"; -import { BCDSection, CompatStatementExtended, Doc } from "../libs/types"; - -/** - * Loop over, and mutate, all 'browser_compatibility' sections. - * BCD data comes from a library with `mdn_url`'s that are absolute. - * This takes the `mdn_url` and sets it to a URI that can be used when - * rendering the BCD table to link to a relative path. - * - * Also, if enabled, check all of these inner `mdn_url` for flaws. - * - */ -export function normalizeBCDURLs(doc: Doc, options) { - const checkLinks = - options.flawLevels.get("bad_bcd_links") !== FLAW_LEVELS.IGNORE; - - function addBadBCDLinkFlaw(query, key, slug, suggestion = null) { - if (!("bad_bcd_links" in doc.flaws)) { - doc.flaws.bad_bcd_links = []; - } - doc.flaws.bad_bcd_links.push({ - id: `bad_bcd_link${doc.flaws.bad_bcd_links.length}`, - slug, - suggestion, - query, - key, - }); - } - - function getPathFromAbsoluteURL(absURL) { - // Because the compat data is mutated out of @mdn/browser-compat-data, - // through our `packageBCD` function, it's very possible that - // the `doc[i].type === 'browser_compatibility` has already been - // processed. - if (!absURL.includes("://")) { - return absURL; - } - const u = new URL(absURL); - if (u.hostname !== "developer.mozilla.org") { - // If URL is from a different host, return without modifying it - return absURL; - } - // Return the pathname without docs directory, the base path for the - // `Document` component the BCD table is within is /:locale/docs/ so it is - // not needed. - // The `mdn_url` field in BCD data is always like this: - // https://developer.mozilla.org/docs/Web/API/MediaTrackSettings/width - // So to get the appropriate slug, in Yari, we have to assume a locale. - const slug = u.pathname; - if (slug.startsWith("/docs/")) { - // Important! For now, to make this a slug we can understand we - // have to have a locale and we pick `en-US` as the default. - return `/en-US${slug}`; - } - throw new Error(`not implemented! ${slug}`); - } - - for (const section of doc.body) { - if (section.type !== "browser_compatibility") continue; - - // This happens if a query is "broken". - // E.g. <div class="bc-data" data-query="apii.TypoCatching"> - if (!section.value.data) continue; - - for (const [key, data] of Object.entries(section.value.data)) { - // First block from the BCD data does not have its name as the root key - // so mdn_url is accessible at the root. If the block has a key for - // `__compat` it is not the first block, and the information is nested - // under `__compat`. - const block = "__compat" in data ? data.__compat : data; - - const isCompatStatement = (value): value is CompatStatementExtended => - !!value.mdn_url; - if (!isCompatStatement(block)) { - continue; - } - - const url = getPathFromAbsoluteURL(block.mdn_url); - block.mdn_url = url; - - if (!(checkLinks && url.startsWith("/"))) { - continue; - } - - // Now we need to scrutinize if that's a url we can fully - // recognize. (But only if it's a relative link) - const urlLC = url.toLowerCase(); - const found = Document.findByURL(urlLC); - if (found) { - continue; - } - const query = section.value.query; - // That means trouble! - // But can it be salvaged with a redirect? - const resolved = Redirect.resolve(urlLC); - // Remember that `Redirect.resolve()` will return the input - // if it couldn't be resolved to a *different* url. - if (resolved !== urlLC) { - // Just because it's a redirect doesn't mean it ends up - // on a page we have. - // For example, there might be a redirect but where it - // goes to is not in this.allTitles. - // This can happen if it's a "fundamental redirect" for example. - const finalDocument = Document.findByURL(resolved); - const suggestion = finalDocument ? finalDocument.url : null; - addBadBCDLinkFlaw(query, key, url, suggestion); - block.mdn_url = suggestion; - } else { - addBadBCDLinkFlaw(query, key, url); - // If the url is bad, and can't be salvaged with a redirect, - // we need to pass that information on so that it can be - // leveraged in the UI that displays the BCD table. - // That way, it knows to not attempt to make a link out of it. - block.bad_url = true; - } - } - } -} - -export interface BCDData { - url: string; - data: BCDSection["value"]; -} - -/** - * Return an array of BCD data blocks like [{url: ..., data: ...},] - * for each BCD section in the doc and mutate it from the doc itself. - * @param {Doc} doc - */ -export function extractBCDData(doc: Doc) { - const data: BCDData[] = []; - let nextId = 0; - for (const section of doc.body) { - if (section.type === "browser_compatibility") { - // Most pages only have exactly 1 so no need to put the prefix on them. - - if (!section.value.data) { - // This happens if a query is "broken". - // E.g. <div class="bc-data" data-query="apii.TypoCatching"> - continue; - } - const fileName = ++nextId > 1 ? `bcd-${nextId}.json` : "bcd.json"; - const dataURL = `${doc.mdn_url}/${fileName}`; - data.push({ - url: dataURL, - data: Object.assign({}, section.value), - }); - section.value.dataURL = dataURL; - delete section.value.data; - delete section.value.browsers; - } - } - return data; -} diff --git a/build/cli.ts b/build/cli.ts index 76ac0dd6785b..7d500ab49ed5 100644 --- a/build/cli.ts +++ b/build/cli.ts @@ -12,11 +12,12 @@ import { prompt } from "inquirer"; import { Document, slugToFolder, translationsOf } from "../content"; import { CONTENT_ROOT, CONTENT_TRANSLATED_ROOT } from "../libs/env"; import { VALID_LOCALES } from "../libs/constants"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore import { renderHTML } from "../ssr/dist/main"; import options from "./build-options"; import { buildDocument, BuiltDocument, renderContributorsTxt } from "."; -import { Flaws } from "../libs/types"; -import * as bcd from "@mdn/browser-compat-data/types"; +import { DocMetadata, Flaws } from "../libs/types"; import SearchIndex from "./search-index"; import { BUILD_OUT_ROOT } from "../libs/env"; import { makeSitemapXML, makeSitemapIndexXML } from "./sitemaps"; @@ -35,6 +36,10 @@ export interface InteractiveDocumentBuild { skip: false; } +interface GlobalMetadata { + [locale: string]: Array<DocMetadata>; +} + async function buildDocumentInteractive( documentPath, interactive, @@ -116,7 +121,7 @@ async function buildDocuments( findAllOptions.files = new Set(files); } - const metadata = {}; + const metadata: GlobalMetadata = {}; const documents = Document.findAll(findAllOptions); const progressBar = new cliProgress.SingleBar( @@ -161,7 +166,7 @@ async function buildDocuments( } const { - doc: { doc: builtDocument, liveSamples, fileAttachments, bcdData }, + doc: { doc: builtDocument, liveSamples, fileAttachments }, document, } = result; @@ -190,27 +195,6 @@ async function buildDocuments( builtDocument.source.github_url.replace("/blob/", "/commits/") ) ); - for (const { url, data } of bcdData) { - fs.writeFileSync( - path.join(outPath, path.basename(url)), - JSON.stringify(data, (key, value) => { - // The BCD data object contains a bunch of data we don't need in the - // React component that loads the `bcd.json` file and displays it. - // The `.releases` block contains information about browsers (e.g - // release dates) and that part has already been extracted and put - // next to each version number where appropriate. - // Therefore, we strip out all "retired" releases. - if (key === "releases") { - return Object.fromEntries( - Object.entries(value as bcd.ReleaseStatement).filter( - ([, v]) => v.status !== "retired" - ) - ); - } - return value; - }) - ); - } for (const { id, html } of liveSamples) { const liveSamplePath = path.join(outPath, `_sample_.${id}.html`); @@ -300,6 +284,18 @@ async function buildDocuments( JSON.stringify(meta) ); } + + const allBrowserCompat = new Set<string>(); + Object.values(metadata).forEach((localeMeta) => + localeMeta.forEach((doc) => + doc.browserCompat?.forEach((query) => allBrowserCompat.add(query)) + ) + ); + fs.writeFileSync( + path.join(BUILD_OUT_ROOT, "allBrowserCompat.txt"), + [...allBrowserCompat].join(" ") + ); + return { slugPerLocale: docPerLocale, peakHeapBytes, totalFlaws }; } diff --git a/build/document-utils.ts b/build/document-utils.ts index 01a707c18cd5..e707bea61d75 100644 --- a/build/document-utils.ts +++ b/build/document-utils.ts @@ -8,7 +8,8 @@ const TRANSFORM_STRINGS = new Map( "CSS: Cascading Style Sheets": "CSS", "Graphics on the Web": "Graphics", "HTML elements reference": "Elements", - "JavaScript reference": "JavaScript", + "JavaScript reference": "Reference", + "JavaScript Guide": "Guide", "Structuring the web with HTML": "HTML", "Learn to style HTML using CSS": "CSS", "Web forms — Working with user data": "Forms", diff --git a/build/extract-bcd.ts b/build/extract-bcd.ts deleted file mode 100644 index 25decda9c7be..000000000000 --- a/build/extract-bcd.ts +++ /dev/null @@ -1,167 +0,0 @@ -import { packageBCD } from "./resolve-bcd"; -import * as bcd from "@mdn/browser-compat-data/types"; - -interface SimpleSupportStatementWithReleaseDate - extends bcd.SimpleSupportStatement { - release_date?: string; - version_last?: bcd.VersionValue; -} - -export function extractBCD(query: string): { - browsers: bcd.Browsers | null; - data: bcd.Identifier | null; -} { - const { browsers, data }: { browsers: bcd.Browsers; data: bcd.Identifier } = - packageBCD(query); - - if (data === undefined) { - return { - browsers: null, - data: null, - }; - } - - // First extract a map of all release data, keyed by (normalized) browser - // name and the versions. - // You'll have a map that looks like this: - // - // 'chrome_android': { - // '28': { - // release_date: '2012-06-01', - // release_notes: '...', - // ... - // - // The reason we extract this to a locally scoped map, is so we can - // use it to augment the `__compat` blocks for the latest version - // when (if known) it was added. - const browserReleaseData = new Map(); - for (const [name, browser] of Object.entries(browsers)) { - const releaseData = new Map(); - for (const [version, data] of Object.entries(browser.releases || [])) { - if (data) { - releaseData.set(version, data); - } - } - browserReleaseData.set(name, releaseData); - } - - for (const block of _extractCompatBlocks(data)) { - for (const [browser, originalInfo] of Object.entries(block.support)) { - // `originalInfo` here will be one of the following: - // - a single simple_support_statement: - // { version_added: 42 } - // - an array of simple_support_statements: - // [ { version_added: 42 }, { prefix: '-moz', version_added: 35 } ] - // - // Standardize the first version to an array of one, so we don't have - // to deal with two different forms below - const infos: SimpleSupportStatementWithReleaseDate[] = Array.isArray( - originalInfo - ) - ? originalInfo - : [originalInfo]; - - for (const infoEntry of infos) { - const added = _normalizeVersion(infoEntry.version_added); - const removed = _normalizeVersion(infoEntry.version_removed); - if (browserReleaseData.has(browser)) { - if (browserReleaseData.get(browser).has(added)) { - infoEntry.release_date = browserReleaseData - .get(browser) - .get(added).release_date; - infoEntry.version_last = _getPreviousVersion( - removed, - browsers[browser] - ); - } - } - } - - infos.sort((a, b) => - _compareVersions(_getFirstVersion(b), _getFirstVersion(a)) - ); - - block.support[browser] = infos; - } - } - - return { data, browsers }; -} - -function _getPreviousVersion( - version: bcd.VersionValue, - browser: bcd.BrowserStatement -): bcd.VersionValue { - if (browser && typeof version === "string") { - const browserVersions = Object.keys(browser["releases"]).sort( - _compareVersions - ); - const currentVersionIndex = browserVersions.indexOf(version); - if (currentVersionIndex > 0) { - return browserVersions[currentVersionIndex - 1]; - } - } - - return version; -} - -function _normalizeVersion(version: bcd.VersionValue): bcd.VersionValue { - return typeof version === "string" && version.startsWith("≤") - ? version.slice(1) - : version; -} - -function _getFirstVersion(support: bcd.SimpleSupportStatement): string { - if (typeof support.version_added === "string") { - return support.version_added; - } else if (typeof support.version_removed === "string") { - return support.version_removed; - } else { - return "0"; - } -} - -function _compareVersions(a: string, b: string) { - const x = _splitVersion(a); - const y = _splitVersion(b); - - return _compareNumberArray(x, y); -} - -function _compareNumberArray(a: number[], b: number[]): number { - while (a.length || b.length) { - const x = a.shift() || 0; - const y = b.shift() || 0; - if (x !== y) { - return x - y; - } - } - - return 0; -} -function _splitVersion(version: string): number[] { - if (version.startsWith("≤")) { - version = version.slice(1); - } - - return version.split(".").map(Number); -} - -/** - * Recursively extracts `__compat` objects from the `feature` and from all - * nested features at any depth. - * - * @param {bcd.Identifier} feature The feature. - * @returns {bcd.CompatStatement[]} The array of `__compat` objects. - */ -function _extractCompatBlocks(feature: bcd.Identifier): bcd.CompatStatement[] { - const blocks: bcd.CompatStatement[] = []; - for (const [key, value] of Object.entries(feature)) { - if (key === "__compat") { - blocks.push(value as bcd.CompatStatement); - } else if (typeof value === "object") { - blocks.push(..._extractCompatBlocks(value as bcd.Identifier)); - } - } - return blocks; -} diff --git a/build/extract-sections.ts b/build/extract-sections.ts index a2205f1aac2b..a24d090f133c 100644 --- a/build/extract-sections.ts +++ b/build/extract-sections.ts @@ -1,7 +1,6 @@ import * as cheerio from "cheerio"; import { ProseSection, Section } from "../libs/types"; import { extractSpecifications } from "./extract-specifications"; -import { extractBCD } from "./extract-bcd"; type SectionsAndFlaws = [Section[], string[]]; @@ -330,8 +329,6 @@ function _addSingleSpecialSection( const query = dataQuery.replace(/^bcd:/, ""); if (specialSectionType === "browser_compatibility") { - const { data, browsers } = extractBCD(query); - if (hasMultipleQueries) { title = query; id = query; @@ -345,9 +342,7 @@ function _addSingleSpecialSection( title, id, isH3, - data, query, - browsers, }, }, ]; diff --git a/build/extract-specifications.ts b/build/extract-specifications.ts index 8006c2ec7e04..3215db5f0448 100644 --- a/build/extract-specifications.ts +++ b/build/extract-specifications.ts @@ -1,7 +1,7 @@ import { packageBCD } from "./resolve-bcd"; import * as bcd from "@mdn/browser-compat-data/types"; import { Specification } from "../libs/types/document"; -import specs from "browser-specs"; +import specs from "web-specs"; import web from "../kumascript/src/api/web"; export function extractSpecifications( @@ -71,7 +71,8 @@ export function extractSpecifications( } } - if (query) { + // The `spec-url` frontmatter takes precedence over spec URLs derived from `browser-compat` frontmatter. + if (query && !specURLsString) { for (const feature of query.split(",").map((id) => id.trim())) { const { data } = packageBCD(feature); // If 'data' is non-null, we have data for one or more BCD features @@ -90,7 +91,7 @@ export function extractSpecifications( specURLs = [...new Set(specURLs)]; // Use BCD specURLs to look up more specification data - // from the browser-specs package + // from the web-specs package const specifications = specURLs .map((specURL) => { const spec = specs.find( diff --git a/build/index.ts b/build/index.ts index 49c3c7e2c098..0a7f92b61b52 100644 --- a/build/index.ts +++ b/build/index.ts @@ -20,7 +20,6 @@ import { extractSummary } from "./extract-summary"; export { default as SearchIndex } from "./search-index"; import { addBreadcrumbData } from "./document-utils"; import { fixFixableFlaws, injectFlaws, injectSectionFlaws } from "./flaws"; -import { normalizeBCDURLs, extractBCDData, BCDData } from "./bcd-urls"; import { checkImageReferences, checkImageWidths } from "./check-images"; import { getPageTitle } from "./page-title"; import { syntaxHighlight } from "./syntax-highlight"; @@ -277,7 +276,6 @@ export interface BuiltDocument { doc: Doc; liveSamples: any; fileAttachments: any; - bcdData: BCDData[]; source?: { github_url: string; }; @@ -594,12 +592,6 @@ export async function buildDocument( // section. It's always a plain text string. doc.summary = extractSummary(doc.body); - // Creates new mdn_url's for the browser-compatibility-table to link to - // pages within this project rather than use the absolute URLs - normalizeBCDURLs(doc as Doc, options); - - const bcdData = extractBCDData(doc as Doc); - // If the document has a `.popularity` make sure don't bother with too // many significant figures on it. doc.popularity = metadata.popularity @@ -644,7 +636,7 @@ export async function buildDocument( document.metadata.slug.startsWith("orphaned/") || document.metadata.slug.startsWith("conflicting/"); - return { doc: doc as Doc, liveSamples, fileAttachments, bcdData }; + return { doc: doc as Doc, liveSamples, fileAttachments }; } interface BuiltLiveSamplePage { diff --git a/build/spas.ts b/build/spas.ts index 73a409f863c1..fb28bcc34ba7 100644 --- a/build/spas.ts +++ b/build/spas.ts @@ -14,6 +14,8 @@ import { } from "../libs/env"; import { isValidLocale } from "../libs/locale-utils"; import { DocFrontmatter } from "../libs/types/document"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore import { renderHTML } from "../ssr/dist/main"; import got from "got"; import { splitSections } from "./utils"; @@ -27,7 +29,7 @@ const dirname = __dirname; const FEATURED_ARTICLES = [ "Web/API/WebGL_API/Tutorial/Getting_started_with_WebGL", "Web/CSS/CSS_Container_Queries", - "Web/API/PerformanceResourceTiming/renderBlockingStatus", + "Web/API/Performance_API", "Web/CSS/font-palette", ]; @@ -127,21 +129,6 @@ export async function buildSPAs(options) { pageTitle: `Frequently viewed articles | ${MDN_PLUS_TITLE}`, noIndexing: true, }, - { - prefix: "plus/notifications", - pageTitle: `Notifications | ${MDN_PLUS_TITLE}`, - noIndexing: true, - }, - { - prefix: "plus/notifications/starred", - pageTitle: `Starred | ${MDN_PLUS_TITLE}`, - noIndexing: true, - }, - { - prefix: "plus/notifications/watched", - pageTitle: `Watch list | ${MDN_PLUS_TITLE}`, - noIndexing: true, - }, { prefix: "plus/updates", pageTitle: `Updates | ${MDN_PLUS_TITLE}`, diff --git a/build/syntax-highlight.ts b/build/syntax-highlight.ts index a9d57e4e77e0..49b8c0f01e6a 100644 --- a/build/syntax-highlight.ts +++ b/build/syntax-highlight.ts @@ -25,7 +25,9 @@ const loadAllLanguages = lazy(() => { "cpp", "cs", "diff", + "django", "glsl", + "handlebars", "http", "ignore", "ini", @@ -59,9 +61,6 @@ const loadAllLanguages = lazy(() => { // because Prism is an implementation detail. const ALIASES = new Map([ // ["idl", "webidl"], // block list - ["css-nolint", "css"], - ["html-nolint", "html"], - ["js-nolint", "js"], ["sh", "shell"], ]); @@ -94,7 +93,10 @@ export function syntaxHighlight($, doc) { if (!match) { return; } - const name = ALIASES.get(match[1]) || match[1]; + let name = match[1].replace("-nolint", ""); + if (ALIASES.has(name)) { + name = ALIASES.get(name); + } if (IGNORE.has(name)) { // Seems to exist a couple of these in our docs. Just bail. return; diff --git a/client/config/env.js b/client/config/env.js index 556fe3e510f8..703cf6fbadf8 100644 --- a/client/config/env.js +++ b/client/config/env.js @@ -12,30 +12,13 @@ if (!NODE_ENV) { ); } -// https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use -const dotenvFiles = [ - `${paths.dotenv}.${NODE_ENV}.local`, - // Don't include `.env.local` for `test` environment - // since normally you expect tests to produce the same - // results for everyone - NODE_ENV !== "test" && `${paths.dotenv}.local`, - `${paths.dotenv}.${NODE_ENV}`, - paths.dotenv, -].filter(Boolean); +const ENV_FILE = process.env.ENV_FILE; +const dotenvFile = ENV_FILE + ? paths.dotenv.replace(".env", ENV_FILE) + : paths.dotenv; -// Load environment variables from .env* files. Suppress warnings using silent -// if this file is missing. dotenv will never modify any environment variables -// that have already been set. Variable expansion is supported in .env files. -// https://github.com/motdotla/dotenv -// https://github.com/motdotla/dotenv-expand -dotenvFiles.forEach((dotenvFile) => { - if (fs.existsSync(dotenvFile)) { - require("dotenv-expand").expand( - require("dotenv").config({ - path: dotenvFile, - }) - ); - } +require("dotenv").config({ + path: dotenvFile, }); // We support resolving modules according to `NODE_PATH`. diff --git a/client/config/paths.js b/client/config/paths.js index 10e9540f1ff7..81f9a522b13d 100644 --- a/client/config/paths.js +++ b/client/config/paths.js @@ -50,22 +50,22 @@ const resolveModule = (resolveFn, filePath) => { // config after eject: we're in ./config/ module.exports = { - dotenv: resolveApp(".env"), + dotenv: resolveApp("../.env"), appPath: resolveApp("."), appBuild: resolveApp(buildPath), appPublic: resolveApp("public"), appHtml: resolveApp("public/index.html"), appIndexJs: resolveModule(resolveApp, "src/index"), - appPackageJson: resolveApp("package.json"), + appPackageJson: resolveApp("../package.json"), appSrc: resolveApp("src"), appTsConfig: resolveApp("tsconfig.json"), appJsConfig: resolveApp("jsconfig.json"), - yarnLockFile: resolveApp("yarn.lock"), + yarnLockFile: resolveApp("../yarn.lock"), testsSetup: resolveModule(resolveApp, "src/setupTests"), proxySetup: resolveApp("src/setupProxy.js"), - appNodeModules: resolveApp("node_modules"), - appWebpackCache: resolveApp("node_modules/.cache"), - appTsBuildInfoFile: resolveApp("node_modules/.cache/tsconfig.tsbuildinfo"), + appNodeModules: resolveApp("../node_modules"), + appWebpackCache: resolveApp("../node_modules/.cache"), + appTsBuildInfoFile: resolveApp("../node_modules/.cache/tsconfig.tsbuildinfo"), swSrc: resolveModule(resolveApp, "src/service-worker"), publicUrlOrPath, libsPath: resolveApp("../libs"), diff --git a/client/public/assets/collections.png b/client/public/assets/collections.png new file mode 100644 index 000000000000..22541c5846f0 Binary files /dev/null and b/client/public/assets/collections.png differ diff --git a/client/public/assets/collections_light.png b/client/public/assets/collections_light.png deleted file mode 100644 index f4f4319673ed..000000000000 Binary files a/client/public/assets/collections_light.png and /dev/null differ diff --git a/client/public/assets/offline.png b/client/public/assets/offline.png new file mode 100644 index 000000000000..2018a855299c Binary files /dev/null and b/client/public/assets/offline.png differ diff --git a/client/public/assets/offline_settings_light.png b/client/public/assets/offline_settings_light.png deleted file mode 100644 index 2bd23ae38889..000000000000 Binary files a/client/public/assets/offline_settings_light.png and /dev/null differ diff --git a/client/public/assets/plus-docs/updates/collections.png b/client/public/assets/plus-docs/updates/collections.png new file mode 100644 index 000000000000..cb64bc807efd Binary files /dev/null and b/client/public/assets/plus-docs/updates/collections.png differ diff --git a/client/public/assets/plus-docs/updates/updates.png b/client/public/assets/plus-docs/updates/updates.png new file mode 100644 index 000000000000..744f90dfdc8c Binary files /dev/null and b/client/public/assets/plus-docs/updates/updates.png differ diff --git a/client/public/assets/plus-docs/updates/updates_bcd.png b/client/public/assets/plus-docs/updates/updates_bcd.png new file mode 100644 index 000000000000..65bf21b1dda2 Binary files /dev/null and b/client/public/assets/plus-docs/updates/updates_bcd.png differ diff --git a/client/public/assets/plus-docs/updates/updates_collection.png b/client/public/assets/plus-docs/updates/updates_collection.png new file mode 100644 index 000000000000..91c48f665669 Binary files /dev/null and b/client/public/assets/plus-docs/updates/updates_collection.png differ diff --git a/client/public/assets/plus-docs/updates/updates_filter.png b/client/public/assets/plus-docs/updates/updates_filter.png new file mode 100644 index 000000000000..9099f16eaef1 Binary files /dev/null and b/client/public/assets/plus-docs/updates/updates_filter.png differ diff --git a/client/public/assets/plus-docs/updates/updates_search.png b/client/public/assets/plus-docs/updates/updates_search.png new file mode 100644 index 000000000000..303e274a2d79 Binary files /dev/null and b/client/public/assets/plus-docs/updates/updates_search.png differ diff --git a/client/public/assets/updates.png b/client/public/assets/updates.png new file mode 100644 index 000000000000..35f39157690c Binary files /dev/null and b/client/public/assets/updates.png differ diff --git a/client/pwa/package.json b/client/pwa/package.json index a9140610a657..c05558c857fd 100644 --- a/client/pwa/package.json +++ b/client/pwa/package.json @@ -11,13 +11,13 @@ "dev": "webpack-cli --watch" }, "dependencies": { - "@zip.js/zip.js": "2.6.61", - "dexie": "3.2.2" + "@zip.js/zip.js": "2.6.62", + "dexie": "3.2.3" }, "devDependencies": { "@types/dexie": "1.3.1", "ts-loader": "^9.4.2", - "typescript": "^4.9.4", + "typescript": "^4.9.5", "webpack": "^5.75.0", "webpack-cli": "^5.0.1", "workers-preview": "^1.0.6" diff --git a/client/pwa/src/fetch-interceptors.ts b/client/pwa/src/fetch-interceptors.ts index 208f9b030275..0bc1e0a3161c 100644 --- a/client/pwa/src/fetch-interceptors.ts +++ b/client/pwa/src/fetch-interceptors.ts @@ -52,21 +52,27 @@ class DefaultApiInterceptor implements FetchInterceptor { } handles(path: string): boolean { - return path.startsWith("/api/v1/") || path.startsWith("/users/fxa/"); + return path.startsWith("/api/") || path.startsWith("/users/fxa/"); } async onGet(req: Request): Promise<Response> { try { return await fetch(req); } catch (err: any) { - return new Response(jsonBlob({ error: "offline" })); + return new Response(jsonBlob({ error: "offline" }), { + status: 418, + statusText: "You're offline", + }); } } async onPost(req: Request): Promise<Response> { try { return await fetch(req); } catch (err) { - return new Response(jsonBlob({ error: "offline" })); + return new Response(jsonBlob({ error: "offline" }), { + status: 418, + statusText: "You're offline", + }); } } } diff --git a/client/pwa/src/fetcher.ts b/client/pwa/src/fetcher.ts index 05bcb79083d0..df9b9af035ad 100644 --- a/client/pwa/src/fetcher.ts +++ b/client/pwa/src/fetcher.ts @@ -62,6 +62,8 @@ export async function respond(e): Promise<Response> { } else { return response; } + } else if (url.pathname.startsWith("/bcd/")) { + url.pathname = url.pathname.replace(/api\/v[0-9]\/[^/]+\//, ""); } else if (url.pathname.startsWith("/examples/") && url.search) { url.search = ""; } else if (!url.pathname.split("/").pop().includes(".")) { diff --git a/client/pwa/src/service-worker.ts b/client/pwa/src/service-worker.ts index 3be0b09999b7..0a8a12e890c0 100644 --- a/client/pwa/src/service-worker.ts +++ b/client/pwa/src/service-worker.ts @@ -40,7 +40,9 @@ self.addEventListener("install", (e) => { (async () => { const cache = await openCache(); const { files = {} }: { files: object } = - (await (await fetch("/asset-manifest.json")).json()) || {}; + (await ( + await fetch("/asset-manifest.json", { cache: "no-cache" }) + ).json()) || {}; const assets = [...Object.values(files)].filter( (asset) => !(asset as string).endsWith(".map") ); @@ -56,10 +58,11 @@ self.addEventListener("install", (e) => { }); self.addEventListener("fetch", async (e) => { + const url = new URL(e.request.url); if ( SW_TYPE === SwType.PreferOnline && - !e.request.url.includes("/api/v1/") && - !e.request.url.includes("/users/fxa/") + !url.pathname.startsWith("/api/") && + !url.pathname.startsWith("/users/fxa/") ) { e.respondWith( (async () => { diff --git a/client/pwa/tsconfig.json b/client/pwa/tsconfig.json index 6e4b0ead1e59..398b3c0c6da2 100644 --- a/client/pwa/tsconfig.json +++ b/client/pwa/tsconfig.json @@ -8,6 +8,7 @@ "sourceMap": true, "preserveConstEnums": true, "outDir": "../public", + "skipLibCheck": true, "moduleResolution": "node" }, "include": ["src/*.ts", "src/**/*.ts", "src/*.tsx", "src/**/*.tsx"] diff --git a/client/pwa/yarn.lock b/client/pwa/yarn.lock index 4ee0e6e7d7c8..e67cb5495377 100644 --- a/client/pwa/yarn.lock +++ b/client/pwa/yarn.lock @@ -231,10 +231,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.6.61": - version "2.6.61" - resolved "https://registry.yarnpkg.com/@zip.js/zip.js/-/zip.js-2.6.61.tgz#b7373a3b44359553bc7ca2ec9c5f047348861d81" - integrity sha512-3zBN4zSTXUTz0vFzSnVV76a1tNVBj5cH6rSRDGpYzY95P6JQkepN0puXgtUqLHMTsnfGbwnpG1yVO93RH3xQ1g== +"@zip.js/zip.js@2.6.62": + version "2.6.62" + resolved "https://registry.yarnpkg.com/@zip.js/zip.js/-/zip.js-2.6.62.tgz#f4a6adad7099c7d92b0577e7bcefaacca42679fc" + integrity sha512-wpMgpdtGuWLAmJIcbEv2L5kAqV8JP8ICrLbmxGNERNerVkkVe4+pTzf8TkhU8HxnYfsXqWTBI1wzD409LhdVYw== acorn-import-assertions@^1.7.6: version "1.8.0" @@ -354,10 +354,10 @@ cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" -dexie@*, dexie@3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/dexie/-/dexie-3.2.2.tgz#fa6f2a3c0d6ed0766f8d97a03720056f88fe0e01" - integrity sha512-q5dC3HPmir2DERlX+toCBbHQXW5MsyrFqPFcovkH9N2S/UW/H3H5AWAB6iEOExeraAu+j+zRDG+zg/D7YhH0qg== +dexie@*, dexie@3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/dexie/-/dexie-3.2.3.tgz#f35c91ca797599df8e771b998e9ae9669c877f8c" + integrity sha512-iHayBd4UYryDCVUNa3PMsJMEnd8yjyh5p7a+RFeC8i8n476BC9wMhVvqiImq5zJZJf5Tuer+s4SSj+AA3x+ZbQ== electron-to-chromium@^1.4.76: version "1.4.80" @@ -819,10 +819,10 @@ ts-loader@^9.4.2: micromatch "^4.0.0" semver "^7.3.4" -typescript@^4.9.4: - version "4.9.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" - integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== +typescript@^4.9.5: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== uri-js@^4.2.2: version "4.4.1" diff --git a/client/src/app.tsx b/client/src/app.tsx index da0e938a43b2..794b5bbe281b 100644 --- a/client/src/app.tsx +++ b/client/src/app.tsx @@ -18,7 +18,7 @@ import { About } from "./about"; import { getCategoryByPathname } from "./utils"; import { Contribute } from "./community"; import { ContributorSpotlight } from "./contributor-spotlight"; -import { useIsServer } from "./hooks"; +import { useIsServer, usePing } from "./hooks"; import { Banner } from "./banners"; import { useGleanPage } from "./telemetry/glean-context"; @@ -108,6 +108,7 @@ function PageOrPageNotFound({ pageNotFound, children }) { } export function App(appProps) { + usePing(); useGleanPage(); const localeMatch = useMatch("/:locale/*"); diff --git a/client/src/banners/active-banner.tsx b/client/src/banners/active-banner.tsx index e31a3a4824c1..4e525c80d072 100644 --- a/client/src/banners/active-banner.tsx +++ b/client/src/banners/active-banner.tsx @@ -8,6 +8,8 @@ import { useGleanClick } from "../telemetry/glean-context"; import { BANNER_MULTIPLE_COLLECTIONS_DISMISSED, BANNER_MULTIPLE_COLLECTIONS_LINK, + BANNER_NEWSLETTER_DISMISSED, + BANNER_NEWSLETTER_LINK, BANNER_PREVIEW_FEATURES_DISMISSED, BANNER_PREVIEW_FEATURES_SETTINGS_LINK, } from "../telemetry/constants"; @@ -170,6 +172,33 @@ function MultipleCollectionsBanner({ ); } +function NewsletterBanner({ onDismissed }: { onDismissed: () => void }) { + const bannerId = BannerId.NEWSLETTER_ANNOUNCEMENT; + const sendCTAEventToGA = useSendCTAEventToGA(); + const gleanClick = useGleanClick(); + const onDismissedWithGlean = () => { + gleanClick(BANNER_NEWSLETTER_DISMISSED); + onDismissed(); + }; + return ( + <Banner id={bannerId} onDismissed={onDismissedWithGlean}> + <p className="mdn-cta-copy"> + You can now sign up to the MDN Plus Newsletter via the{" "} + <a + href="/en-US/plus/settings" + onClick={() => { + gleanClick(BANNER_NEWSLETTER_LINK); + sendCTAEventToGA(bannerId); + }} + > + Settings Page + </a> + . + </p> + </Banner> + ); +} + // The reason we're not just exporting each individual banner is because to // be able to lazy-load the contents of this file it needs to export a // default function. This one function is the link between the <App> @@ -203,6 +232,13 @@ export default function ActiveBanner({ </> ); + case BannerId.NEWSLETTER_ANNOUNCEMENT: + return ( + <> + <NewsletterBanner onDismissed={onDismissed} /> + </> + ); + default: throw new Error(`Unrecognized banner to display (${id})`); } diff --git a/client/src/banners/ids.ts b/client/src/banners/ids.ts index b17ab3b2b4b1..17ba44df3185 100644 --- a/client/src/banners/ids.ts +++ b/client/src/banners/ids.ts @@ -8,4 +8,5 @@ export enum BannerId { PRIDE_DAY_2022 = "pride_day_2022", PREVIEW_FEATURES = "preview_features", MULTIPLE_COLLECTIONS = "multiple_collections", + NEWSLETTER_ANNOUNCEMENT = "newsletter_announcement", } diff --git a/client/src/banners/index.tsx b/client/src/banners/index.tsx index 59e041e2c090..7f74abb53468 100644 --- a/client/src/banners/index.tsx +++ b/client/src/banners/index.tsx @@ -1,7 +1,7 @@ import * as React from "react"; import { setEmbargoed, isEmbargoed } from "./banner-utils"; -import { CRUD_MODE } from "../env"; +import { CRUD_MODE, NEWSLETTER_ENABLED } from "../env"; // We may or may not load any active banner. But if there's a small chance // that we might, it's best practice to not have to lazy-load the CSS @@ -20,7 +20,11 @@ const daysToEmbargo = 30; export function Banner() { const userData = useUserData(); const currentBannerId: BannerId | null = userData?.isAuthenticated - ? BannerId.MULTIPLE_COLLECTIONS + ? NEWSLETTER_ENABLED && + userData?.isSubscriber && + !userData?.settings?.mdnplusNewsletter + ? BannerId.NEWSLETTER_ANNOUNCEMENT + : BannerId.MULTIPLE_COLLECTIONS : BannerId.PLUS_LAUNCH_ANNOUNCEMENT; if (currentBannerId && (CRUD_MODE || !isEmbargoed(currentBannerId))) { return ( diff --git a/client/src/constants.ts b/client/src/constants.ts index 08c66f02fd14..6e57adc8d2ee 100644 --- a/client/src/constants.ts +++ b/client/src/constants.ts @@ -2,9 +2,7 @@ export { MDN_PLUS_TITLE, VALID_LOCALES } from "../../libs/constants"; // Constants that are NOT used outside of the client. -export const HEADER_NOTIFICATIONS_MENU_API_URL = - "/api/v1/plus/notifications/?limit=1&unread=true"; - export enum FeatureId { PLUS_UPDATES_V2 = "plus_updates_v2", + PLUS_NEWSLETTER = "plus_newsletter", } 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 e7e74eb2c413..3058a0f6e194 100644 --- a/client/src/document/ingredients/browser-compatibility-table/feature-row.tsx +++ b/client/src/document/ingredients/browser-compatibility-table/feature-row.tsx @@ -13,7 +13,6 @@ import { SupportStatementExtended, } from "./utils"; import { LEGEND_LABELS } from "./legend"; -import { CompatStatementExtended } from "../../../../../libs/types"; function getSupportClassName( support: SupportStatementExtended | undefined, @@ -207,7 +206,11 @@ const CellText = React.memo( } return ( - <div className="bcd-cell-text-wrapper"> + <div + className={ + timeline ? "bcd-timeline-cell-text-wrapper" : "bcd-cell-text-wrapper" + } + > <div className="bcd-cell-icons"> <span className="icon-wrap"> <abbr @@ -226,10 +229,15 @@ const CellText = React.memo( <span className="bc-version-label" title={ - browserReleaseDate ? `Released ${browserReleaseDate}` : undefined + browserReleaseDate && !timeline + ? `Released ${browserReleaseDate}` + : undefined } > {label} + {browserReleaseDate && timeline + ? ` (Released ${browserReleaseDate})` + : ""} </span> </div> <CellIcons support={support} /> @@ -492,7 +500,7 @@ export const FeatureRow = React.memo( index: number; feature: { name: string; - compat: CompatStatementExtended; + compat: BCD.CompatStatement; depth: number; }; browsers: BCD.BrowserName[]; @@ -516,16 +524,7 @@ export const FeatureRow = React.memo( let titleNode: string | React.ReactNode; - if (compat.bad_url && compat.mdn_url) { - titleNode = ( - <div className="bc-table-row-header"> - <abbr className="new" title={`${compat.mdn_url} does not exist`}> - {title} - </abbr> - {compat.status && <StatusIcons status={compat.status} />} - </div> - ); - } else if (compat.mdn_url && depth > 0) { + if (compat.mdn_url && depth > 0) { titleNode = ( <a href={compat.mdn_url} className="bc-table-row-header"> {title} diff --git a/client/src/document/ingredients/browser-compatibility-table/headers.tsx b/client/src/document/ingredients/browser-compatibility-table/headers.tsx index b39b230ca08d..33ffb8b6302d 100644 --- a/client/src/document/ingredients/browser-compatibility-table/headers.tsx +++ b/client/src/document/ingredients/browser-compatibility-table/headers.tsx @@ -1,7 +1,15 @@ -import bcd from "@mdn/browser-compat-data"; +import type BCD from "@mdn/browser-compat-data/types"; import { BrowserName } from "./browser-info"; -function PlatformHeaders({ platforms, browsers }) { +function PlatformHeaders({ + platforms, + browsers, + browserInfo, +}: { + platforms: string[]; + browsers: BCD.BrowserName[]; + browserInfo: BCD.Browsers; +}) { return ( <tr className="bc-platforms"> <td /> @@ -9,7 +17,7 @@ function PlatformHeaders({ platforms, browsers }) { // Get the intersection of browsers in the `browsers` array and the // `PLATFORM_BROWSERS[platform]`. const browsersInPlatform = browsers.filter( - (browser) => bcd.browsers[browser].type === platform + (browser) => browserInfo[browser].type === platform ); const browserCount = browsersInPlatform.length; return ( @@ -28,7 +36,7 @@ function PlatformHeaders({ platforms, browsers }) { ); } -function BrowserHeaders({ browsers }: { browsers }) { +function BrowserHeaders({ browsers }: { browsers: BCD.BrowserName[] }) { return ( <tr className="bc-browsers"> <td /> @@ -55,10 +63,22 @@ export function browserToIconName(browser: string) { return browserStart === "firefox" ? "simple-firefox" : browserStart; } -export function Headers({ platforms, browsers }) { +export function Headers({ + platforms, + browsers, + browserInfo, +}: { + platforms: string[]; + browsers: BCD.BrowserName[]; + browserInfo: BCD.Browsers; +}) { return ( <thead> - <PlatformHeaders platforms={platforms} browsers={browsers} /> + <PlatformHeaders + platforms={platforms} + browsers={browsers} + browserInfo={browserInfo} + /> <BrowserHeaders browsers={browsers} /> </thead> ); diff --git a/client/src/document/ingredients/browser-compatibility-table/index.scss b/client/src/document/ingredients/browser-compatibility-table/index.scss index 3d46b1d17646..82241659a1cc 100644 --- a/client/src/document/ingredients/browser-compatibility-table/index.scss +++ b/client/src/document/ingredients/browser-compatibility-table/index.scss @@ -398,6 +398,12 @@ dl.bc-notes-list { } } +.bcd-timeline-cell-text-wrapper { + display: flex; + flex-direction: row; + gap: 0.5rem; +} + .bcd-cell-text-copy { color: var(--text-primary); display: flex; diff --git a/client/src/document/ingredients/browser-compatibility-table/index.tsx b/client/src/document/ingredients/browser-compatibility-table/index.tsx index 2fd09e518061..b1abf0bb7716 100644 --- a/client/src/document/ingredients/browser-compatibility-table/index.tsx +++ b/client/src/document/ingredients/browser-compatibility-table/index.tsx @@ -1,6 +1,5 @@ import React, { useReducer } from "react"; import { useLocation } from "react-router-dom"; -import bcd from "@mdn/browser-compat-data"; import type BCD from "@mdn/browser-compat-data/types"; import { BrowserInfoContext } from "./browser-info"; import { BrowserCompatibilityErrorBoundary } from "./error-boundary"; @@ -39,7 +38,8 @@ export const HIDDEN_BROWSERS = ["ie"]; */ function gatherPlatformsAndBrowsers( category: string, - data: BCD.Identifier + data: BCD.Identifier, + browserInfo: BCD.Browsers ): [string[], BCD.BrowserName[]] { const hasNodeJSData = data.__compat && "nodejs" in data.__compat.support; const hasDenoData = data.__compat && "deno" in data.__compat.support; @@ -54,8 +54,8 @@ function gatherPlatformsAndBrowsers( // Add browsers in platform order to align table cells for (const platform of platforms) { browsers.push( - ...(Object.keys(bcd.browsers).filter( - (browser) => bcd.browsers[browser].type === platform + ...(Object.keys(browserInfo).filter( + (browser) => browserInfo[browser].type === platform ) as BCD.BrowserName[]) ); } @@ -63,7 +63,7 @@ function gatherPlatformsAndBrowsers( // Filter WebExtension browsers in corresponding tables. if (category === "webextensions") { browsers = browsers.filter( - (browser) => bcd.browsers[browser].accepts_webextensions + (browser) => browserInfo[browser].accepts_webextensions ); } @@ -141,7 +141,11 @@ export default function BrowserCompatibilityTable({ const category = breadcrumbs[0]; const name = breadcrumbs[breadcrumbs.length - 1]; - const [platforms, browsers] = gatherPlatformsAndBrowsers(category, data); + const [platforms, browsers] = gatherPlatformsAndBrowsers( + category, + data, + browserInfo + ); function getNewIssueURL() { const url = "https://github.com/mdn/browser-compat-data/issues/new"; @@ -174,7 +178,11 @@ export default function BrowserCompatibilityTable({ <figure className="table-container"> <figure className="table-container-inner"> <table key="bc-table" className="bc-table bc-table-web"> - <Headers {...{ platforms, browsers }} /> + <Headers + platforms={platforms} + browsers={browsers} + browserInfo={browserInfo} + /> <tbody> <FeatureListAccordion browsers={browsers} diff --git a/client/src/document/lazy-bcd-table.tsx b/client/src/document/lazy-bcd-table.tsx index f1dd3d4261ab..3f8a97b09bd7 100644 --- a/client/src/document/lazy-bcd-table.tsx +++ b/client/src/document/lazy-bcd-table.tsx @@ -1,4 +1,4 @@ -import React, { lazy, Suspense, useEffect, useState } from "react"; +import React, { lazy, Suspense } from "react"; import useSWR from "swr"; import { DisplayH2, DisplayH3 } from "./ingredients/utils"; @@ -13,6 +13,13 @@ import { Loading } from "../ui/atoms/loading"; import "./ingredients/browser-compatibility-table/index.scss"; import { useLocale, useIsServer } from "../hooks"; import NoteCard from "../ui/molecules/notecards"; +import type BCD from "@mdn/browser-compat-data/types"; + +interface QueryJson { + query: string; + data: BCD.Identifier; + browsers: BCD.Browsers; +} const BrowserCompatibilityTable = lazy( () => @@ -26,58 +33,37 @@ export function LazyBrowserCompatibilityTable({ title, isH3, query, - dataURL, }: { id: string; title: string; isH3: boolean; query: string; - dataURL: string | null; }) { return ( <> {title && !isH3 && <DisplayH2 id={id} title={title} />} {title && isH3 && <DisplayH3 id={id} title={title} />} - {dataURL ? ( - <LazyBrowserCompatibilityTableInner dataURL={dataURL} /> - ) : ( - <NoteCard type="warning"> - <p> - No compatibility data found for <code>{query}</code>.<br /> - <a href="#on-github">Check for problems with this page</a> or - contribute missing data to{" "} - <a href="https://github.com/mdn/browser-compat-data"> - mdn/browser-compat-data - </a> - . - </p> - </NoteCard> - )} + <LazyBrowserCompatibilityTableInner query={query} /> </> ); } -function LazyBrowserCompatibilityTableInner({ dataURL }: { dataURL: string }) { +function LazyBrowserCompatibilityTableInner({ query }: { query: string }) { const locale = useLocale(); - const [bcdDataURL, setBCDDataURL] = useState(""); const isServer = useIsServer(); const { error, data } = useSWR( - bcdDataURL ? bcdDataURL : null, - async (url) => { - const response = await fetch(url); + query, + async (query) => { + const response = await fetch(`/bcd/api/v0/current/${query}.json`); if (!response.ok) { - throw new Error(await response.text()); + throw new Error(response.status.toString()); } - return await response.json(); + return (await response.json()) as QueryJson; }, { revalidateOnFocus: false } ); - useEffect(() => { - setBCDDataURL(dataURL); - }, [dataURL]); - if (isServer) { return ( <p> @@ -89,17 +75,37 @@ function LazyBrowserCompatibilityTableInner({ dataURL }: { dataURL: string }) { </p> ); } - if (!data && !error) { - return <Loading />; - } if (error) { + if (error.message === "404") { + return ( + <NoteCard type="warning"> + <p> + No compatibility data found for <code>{query}</code>.<br /> + <a href="#on-github">Check for problems with this page</a> or + contribute missing data to{" "} + <a href="https://github.com/mdn/browser-compat-data"> + mdn/browser-compat-data + </a> + . + </p> + </NoteCard> + ); + } return <p>Error loading BCD data</p>; } + if (!data) { + return <Loading />; + } return ( <ErrorBoundary> <Suspense fallback={<Loading message="Loading BCD table" />}> - <BrowserCompatibilityTable locale={locale} {...data} /> + <BrowserCompatibilityTable + locale={locale} + query={data.query} + data={data.data} + browsers={data.browsers} + /> </Suspense> </ErrorBoundary> ); diff --git a/client/src/document/mathml-polyfill/mathml-font.scss b/client/src/document/mathml-polyfill/mathml-font.scss index adc61a1731ca..bec15ac71eb6 100644 --- a/client/src/document/mathml-polyfill/mathml-font.scss +++ b/client/src/document/mathml-polyfill/mathml-font.scss @@ -1,8 +1,8 @@ @font-face { font-family: "STIXTwoMath-Regular"; font-weight: normal; - src: local("STIXTwoMath-Regular") url("./font/STIXTwoMath-Regular.woff2") - format("woff2"); + src: local("STIXTwoMath-Regular"), + url("./font/STIXTwoMath-Regular.woff2") format("woff2"); } math { diff --git a/client/src/document/on-github.tsx b/client/src/document/on-github.tsx index fba5cc6e3e3f..c17fb23a1a5f 100644 --- a/client/src/document/on-github.tsx +++ b/client/src/document/on-github.tsx @@ -3,57 +3,42 @@ import { Doc } from "../../../libs/types/document"; export function OnGitHubLink({ doc }: { doc: Doc }) { return ( <div id="on-github" className="on-github"> - <h3>Found a problem with this page?</h3> + <h3>Found a content problem with this page?</h3> <ul> <li> - <EditOnGitHubLink doc={doc} /> + Edit the page <EditOnGitHubLink doc={doc} />. </li> <li> - <SourceOnGitHubLink doc={doc} /> + Report the <NewIssueOnGitHubLink doc={doc} />. </li> <li> - <NewIssueOnGitHubLink doc={doc} /> - </li> - <li> - Want to fix the problem yourself? Learn{" "} - <a - href="https://github.com/mdn/content/blob/main/CONTRIBUTING.md" - target="_blank" - rel="noopener noreferrer" - > - how to contribute - </a> - ! + View the source <SourceOnGitHubLink doc={doc} />. </li> </ul> + Want to get more involved? Learn{" "} + <a + href="https://github.com/mdn/content/blob/main/CONTRIBUTING.md" + title={`This will take you to our contribution guidelines on GitHub.`} + target="_blank" + rel="noopener noreferrer" + > + how to contribute + </a> + . </div> ); } -function SourceOnGitHubLink({ doc }: { doc: Doc }) { - const { github_url, folder } = doc.source; - return ( - <a - href={`${github_url}?plain=1`} - title={`Folder: ${folder} (Opens in a new tab)`} - target="_blank" - rel="noopener noreferrer" - > - Source on <b>GitHub</b> - </a> - ); -} - function EditOnGitHubLink({ doc }: { doc: Doc }) { const { github_url } = doc.source; return ( <a href={github_url.replace("/blob/", "/edit/")} - title={`You're going to need to sign in to GitHub first (Opens in a new tab)`} + title={`This will take you to GitHub, where you'll need to sign in first.`} target="_blank" rel="noopener noreferrer" > - Edit on <b>GitHub</b> + on GitHub </a> ); } @@ -109,11 +94,25 @@ function NewIssueOnGitHubLink({ doc }: { doc: Doc }) { return ( <a href={url.href} - title="This will take you to GitHub to file a new issue" + title="This will take you to GitHub to file a new issue." + target="_blank" + rel="noopener noreferrer" + > + content issue + </a> + ); +} + +function SourceOnGitHubLink({ doc }: { doc: Doc }) { + const { github_url, folder } = doc.source; + return ( + <a + href={`${github_url}?plain=1`} + title={`Folder: ${folder} (Opens in a new tab)`} target="_blank" rel="noopener noreferrer" > - Report a problem with this content on <b>GitHub</b> + on GitHub </a> ); } diff --git a/client/src/document/organisms/metadata/index.tsx b/client/src/document/organisms/metadata/index.tsx index 27dea318ea48..fe9ec531cf38 100644 --- a/client/src/document/organisms/metadata/index.tsx +++ b/client/src/document/organisms/metadata/index.tsx @@ -15,7 +15,7 @@ export function LastModified({ value, locale }) { }; return ( <> - <b>Last modified:</b>{" "} + This page was last modified on{" "} <time dateTime={value}> {date.toLocaleString(locale, dateStringOptions)} </time> @@ -24,7 +24,7 @@ export function LastModified({ value, locale }) { } export function Authors({ url }) { - return <a href={`${url}/contributors.txt`}>by MDN contributors</a>; + return <a href={`${url}/contributors.txt`}>MDN contributors</a>; } export function Metadata({ doc, locale }) { @@ -33,8 +33,8 @@ export function Metadata({ doc, locale }) { <div className="metadata-content-container"> {doc.isActive && <OnGitHubLink doc={doc} />} <p className="last-modified-date"> - <LastModified value={doc.modified} locale={locale} />,{" "} - <Authors url={doc.mdn_url} /> + <LastModified value={doc.modified} locale={locale} /> by{" "} + <Authors url={doc.mdn_url} />. </p> </div> </aside> diff --git a/client/src/document/organisms/sidebar/index.scss b/client/src/document/organisms/sidebar/index.scss index 4fb8bcedbc82..88f57a733c29 100644 --- a/client/src/document/organisms/sidebar/index.scss +++ b/client/src/document/organisms/sidebar/index.scss @@ -123,6 +123,10 @@ margin-top: 1rem; } + li:first-of-type strong { + margin-top: unset; + } + ol { font-size: var(--type-smaller-font-size); diff --git a/client/src/document/organisms/sidebar/index.tsx b/client/src/document/organisms/sidebar/index.tsx index f61ed6ceee05..a11c51f7b8ee 100644 --- a/client/src/document/organisms/sidebar/index.tsx +++ b/client/src/document/organisms/sidebar/index.tsx @@ -1,5 +1,5 @@ import { Link } from "react-router-dom"; -import React, { useEffect, useState } from "react"; +import { useEffect, useState } from "react"; import { Button } from "../../../ui/atoms/button"; import { useUIStatus } from "../../../ui-context"; @@ -7,7 +7,15 @@ import { useUIStatus } from "../../../ui-context"; import "./index.scss"; import { TOC } from "../toc"; -export function SidebarContainer({ doc, children }) { +export function SidebarContainer({ + doc, + label, + children, +}: { + doc: any; + label?: string; + children: React.ReactNode; +}) { const { isSidebarOpen, setIsSidebarOpen } = useUIStatus(); const [classes, setClasses] = useState<string>("sidebar"); @@ -49,7 +57,7 @@ export function SidebarContainer({ doc, children }) { onClickHandler={() => setIsSidebarOpen(!isSidebarOpen)} aria-label="Collapse sidebar" /> - <nav className="sidebar-inner"> + <nav aria-label={label} className="sidebar-inner"> <div className="in-nav-toc"> {doc.toc && !!doc.toc.length && <TOC toc={doc.toc} />} </div> @@ -63,10 +71,9 @@ export function SidebarContainer({ doc, children }) { export function RenderSideBar({ doc }) { if (!doc.related_content) { return ( - <SidebarContainer doc={doc}> + <SidebarContainer doc={doc} label="Related Topics"> {doc.sidebarHTML && ( <> - <h4 className="sidebar-heading">Related Topics</h4> <div dangerouslySetInnerHTML={{ __html: `${doc.sidebarHTML}`, diff --git a/client/src/document/toolbar/flaws.tsx b/client/src/document/toolbar/flaws.tsx index 0747f7f103ec..70ffa5fd6aee 100644 --- a/client/src/document/toolbar/flaws.tsx +++ b/client/src/document/toolbar/flaws.tsx @@ -11,7 +11,6 @@ import { Doc, BrokenLink, MacroErrorMessage, - BadBCDLinkFlaw, ImageReferenceFlaw, ImageWidthFlaw, GenericFlaw, @@ -255,13 +254,6 @@ function Flaws({ isReadOnly={isReadOnly} /> ); - case "bad_bcd_links": - return ( - <BadBCDLinks - key="bad_bcd_links" - links={doc.flaws.bad_bcd_links as BadBCDLinkFlaw[]} - /> - ); case "bad_bcd_queries": return ( <BadBCDQueries @@ -554,22 +546,6 @@ function BadBCDQueries({ flaws }: { flaws: BadBCDQueryFlaw[] }) { ); } -function BadBCDLinks({ links }: { links: BadBCDLinkFlaw[] }) { - return ( - <div className="flaw flaw__bad_bcd_links"> - <h3>{humanizeFlawName("bad_bcd_links")}</h3> - <ul> - {links.map((link) => ( - <li key={link.slug}> - In <code>{link.query}</code> under key <code>{link.key}</code> can't - find document: <code>{link.slug}</code> - </li> - ))} - </ul> - </div> - ); -} - function Sectioning({ flaws }: { flaws: SectioningFlaw[] }) { return ( <div className="flaw flaw__sectioning"> diff --git a/client/src/env.ts b/client/src/env.ts index 03da3a21ba14..51a6a90a6cf0 100644 --- a/client/src/env.ts +++ b/client/src/env.ts @@ -27,7 +27,11 @@ export const KUMA_HOST = process.env.REACT_APP_KUMA_HOST || "developer.mozilla.org"; export const PLUS_IS_ENABLED = Boolean( - process.env.REACT_APP_ENABLE_PLUS || "false" + JSON.parse(process.env.REACT_APP_ENABLE_PLUS || "false") +); + +export const NEWSLETTER_ENABLED = Boolean( + JSON.parse(process.env.REACT_APP_NEWSLETTER_ENABLED || "false") ); export const MDN_PLUS_SUBSCRIBE_5M_URL = `${process.env.REACT_APP_MDN_PLUS_SUBSCRIBE_URL}?plan=${process.env.REACT_APP_MDN_PLUS_5M_PLAN}`; diff --git a/client/src/flaw-utils.js b/client/src/flaw-utils.js index 15b7a9996df6..5b1d254cf86b 100644 --- a/client/src/flaw-utils.js +++ b/client/src/flaw-utils.js @@ -9,7 +9,6 @@ export function humanizeFlawName(name) { // List all the names that can't be nicely computed by the fallback() // function. bad_bcd_queries: "Bad BCD queries", - bad_bcd_links: "Bad BCD links", bad_pre_tags: "Bad <pre> tags", unsafe_html: "Unsafe HTML", }; diff --git a/client/src/homepage/homepage-hero/index.scss b/client/src/homepage/homepage-hero/index.scss index abe398101161..a859c3f1dc51 100644 --- a/client/src/homepage/homepage-hero/index.scss +++ b/client/src/homepage/homepage-hero/index.scss @@ -79,6 +79,7 @@ background-color: rgba(1, 1, 1, 0.5); border-radius: 10rem; padding: 2rem; + width: 100%; &:focus { border-color: var(--field-focus-border); @@ -93,6 +94,7 @@ .search-widget { display: flex; gap: 0; + width: 100%; } .search-results { diff --git a/client/src/hooks.ts b/client/src/hooks.ts index 186db06241c7..bf02f7e25674 100644 --- a/client/src/hooks.ts +++ b/client/src/hooks.ts @@ -3,6 +3,7 @@ import { useLocation, useNavigationType, useParams } from "react-router-dom"; import { DEFAULT_LOCALE } from "../../libs/constants"; import { isValidLocale } from "../../libs/locale-utils"; import { FeatureId } from "./constants"; +import { OFFLINE_SETTINGS_KEY, useUserData } from "./user-context"; // This is a bit of a necessary hack! // The only reason this list is needed is because of the PageNotFound rendering. @@ -53,8 +54,18 @@ export function useOnClickOutside(ref, handler) { } export function useOnlineStatus(): { isOnline: boolean; isOffline: boolean } { + const isServer = useIsServer(); + const trueStatus = useTrueOnlineStatus(); + // ensure we don't get a hydration error due to mismatched markup: + return isServer ? { isOnline: true, isOffline: false } : trueStatus; +} + +export function useTrueOnlineStatus(): { + isOnline: boolean; + isOffline: boolean; +} { const [isOnline, setIsOnline] = useState<boolean>( - window?.navigator.onLine ?? true + typeof window === "undefined" ? false : window.navigator.onLine ); const isOffline = useMemo(() => !isOnline, [isOnline]); @@ -122,3 +133,41 @@ export function useViewedState() { }, }; } + +export function usePing() { + const { isOnline } = useTrueOnlineStatus(); + const user = useUserData(); + + React.useEffect(() => { + try { + const nextPing = new Date(localStorage.getItem("next-ping") || 0); + if ( + navigator.sendBeacon && + isOnline && + user?.isAuthenticated && + nextPing < new Date() + ) { + const params = new URLSearchParams(); + + // fetch offline settings from local storage as its + // values are very inconsistent in the user context + const offlineSettings = JSON.parse( + localStorage.getItem(OFFLINE_SETTINGS_KEY) || "{}" + ); + if (offlineSettings?.offline) params.set("offline", "true"); + + navigator.sendBeacon("/api/v1/ping", params); + + const newNextPing = new Date(); + newNextPing.setUTCDate(newNextPing.getUTCDate() + 1); + newNextPing.setUTCHours(0); + newNextPing.setUTCMinutes(0); + newNextPing.setUTCSeconds(0); + newNextPing.setUTCMilliseconds(0); + localStorage.setItem("next-ping", newNextPing.toISOString()); + } + } catch (e) { + console.error("Failed to send ping", e); + } + }, [isOnline, user]); +} diff --git a/client/src/plus/collections-quicksearch.ts b/client/src/plus/collections-quicksearch.ts deleted file mode 100644 index 93d16d08ad48..000000000000 --- a/client/src/plus/collections-quicksearch.ts +++ /dev/null @@ -1,78 +0,0 @@ -const COLLECTION_ITEMS_KEY = "collection-items"; -const COLLECTION_ITEMS_UPDATED_DATE_KEY = "collection-items-updated-date"; - -let collectionItems: CollectionItem[] | null = null; - -type CollectionItem = { - id: number; - title: string; - url: string; -}; - -function getCollectionItemsUpdatedDate(): Date | null { - try { - let dateString = window?.localStorage?.getItem( - COLLECTION_ITEMS_UPDATED_DATE_KEY - ); - if (dateString) { - return new Date(dateString); - } - } catch (err) { - console.warn( - "Unable to read collection items update date from localStorage", - err - ); - } - return null; -} - -function setCollectionItemsUpdatedDate(updated: Date) { - try { - window?.localStorage?.setItem( - COLLECTION_ITEMS_UPDATED_DATE_KEY, - updated.toISOString() - ); - } catch (err) { - console.warn( - "Unable to write collection items update date to localStorage", - err - ); - } -} - -export async function getCollectionItems( - remoteUpdated?: null | Date -): Promise<CollectionItem[]> { - remoteUpdated && (await fetchAllCollectionsItems(remoteUpdated)); - if (collectionItems) { - return collectionItems; - } - - let collectionItemString; - try { - collectionItemString = window?.localStorage?.getItem(COLLECTION_ITEMS_KEY); - } catch (err) { - console.warn("Unable to read collection items from localStorage", err); - } - collectionItems = JSON.parse(collectionItemString || "[]"); - return collectionItems || []; -} - -function setCollectionItems(items: CollectionItem[]) { - try { - window?.localStorage?.setItem(COLLECTION_ITEMS_KEY, JSON.stringify(items)); - } catch (err) { - console.warn("Unable to write collection items to localStorage", err); - } -} - -export async function fetchAllCollectionsItems(remoteUpdated: null | Date) { - const localUpdated = getCollectionItemsUpdatedDate(); - if (!localUpdated || !remoteUpdated || remoteUpdated > localUpdated) { - const res = await fetch("/api/v1/plus/collection/?limit=999"); - const { items = [] } = await res.json(); - setCollectionItems(items); - setCollectionItemsUpdatedDate(remoteUpdated || new Date()); - collectionItems = items; - } -} diff --git a/client/src/plus/collections/index.tsx b/client/src/plus/collections/index.tsx index 8b80dc3ebf9f..d348ad2232ec 100644 --- a/client/src/plus/collections/index.tsx +++ b/client/src/plus/collections/index.tsx @@ -163,9 +163,9 @@ function CollectionCard({ collection }: { collection: Collection }) { <Button type="action" icon="ellipses" - ariaControls="collection-dropdown" - ariaHasPopup="menu" - ariaExpanded={showDropdown || undefined} + aria-controls="collection-dropdown" + aria-haspopup="menu" + aria-expanded={showDropdown || undefined} onClickHandler={() => { setShowDropdown(!showDropdown); }} diff --git a/client/src/plus/common/api.tsx b/client/src/plus/common/api.tsx index a9b868046562..5a3e5dce2841 100644 --- a/client/src/plus/common/api.tsx +++ b/client/src/plus/common/api.tsx @@ -1,162 +1,36 @@ -import { useEffect, useState } from "react"; -import { useSearchParams } from "react-router-dom"; - -export const NOTIFICATIONS_BASE_PATH = "/api/v1/plus/notifications"; -export const WATCHED_BASE_PATH = "/api/v1/plus/watching"; export const STRIPE_PLANS_PATH = "/api/v1/stripe/plans"; export const SETTINGS_BASE_PATH = "/api/v1/plus/settings/"; - -export const NOTIFICATIONS_MARK_ALL_AS_READ_PATH = `${NOTIFICATIONS_BASE_PATH}/all/mark-as-read/`; -const DEFAULT_LIMIT = 20; +export const NEWSLETTER_BASE_PATH = "/api/v1/plus/newsletter/"; export type PLUS_SETTINGS = { col_in_search: boolean; }; -export async function toggleCollectionsInQuickSearch(enabled: boolean) { - return await fetch(SETTINGS_BASE_PATH, { - body: JSON.stringify({ col_in_search: enabled }), - method: "POST", - headers: { - "content-type": "application/json", - }, - }); -} - -export async function markNotificationsAsRead() { - return fetch(NOTIFICATIONS_MARK_ALL_AS_READ_PATH, { - method: "POST", - }); -} -export const starItem = async (id: number) => { - await post(`${NOTIFICATIONS_BASE_PATH}/${id}/toggle-starred/`); -}; - -export async function starItemsById(ids: number[]) { - return await post(`${NOTIFICATIONS_BASE_PATH}/star-ids/`, { - ids, - }); -} - -export async function unstarItemsById(ids: number[]) { - return await post(`${NOTIFICATIONS_BASE_PATH}/unstar-ids/`, { - ids, - }); -} - -export async function deleteItemsById(ids: number[]) { - return await post(`${NOTIFICATIONS_BASE_PATH}/delete-ids/`, { - ids, - }); -} - -export async function deleteItemById(id: number) { - return await post(`${NOTIFICATIONS_BASE_PATH}/${id}/delete/`); -} - -export async function unwatchItemsByUrls(data: any[]) { - const payload = { unwatch: data.map((val) => val.url) }; - return await post(`/api/v1/plus/unwatch-many/`, payload); -} - -export async function undoDeleteItemById(id: number) { - return await post(`${NOTIFICATIONS_BASE_PATH}/${id}/undo-deletion/`); -} - -export function useNotificationsApiEndpoint(offset: number, starred: boolean) { - const [data, setData] = useState<any>({}); - const [error, setError] = useState<Error | null>(); - const [isLoading, setIsLoading] = useState(true); - const [hasMore, setHasMore] = useState(false); - - const [searchParams] = useSearchParams(); - - useEffect(() => { - (async () => { - setIsLoading(true); - const sp = new URLSearchParams(searchParams); - - starred!! && sp.append("starred", "true"); - - sp.append("limit", DEFAULT_LIMIT.toString()); - offset!! && sp.append("offset", offset.toString()); - - const response = await fetch( - `${NOTIFICATIONS_BASE_PATH}/?${sp.toString()}` - ); - - if (!response.ok) { - setError( - new Error( - `${response.status} - There was a problem fetching your Notifications. Please try again later` - ) - ); - setIsLoading(false); - return; - } else { - let newData = await response.json(); - if (newData.items.length < DEFAULT_LIMIT) { - setHasMore(false); - } else { - setHasMore(true); - } - setData({ - ...newData, - offset, - starred, - }); - setIsLoading(false); - setError(null); - } - })(); - }, [searchParams, offset, starred]); - return { data, error, isLoading, hasMore }; +export async function toggleNewsletterSubscription( + subscribed: boolean +): Promise<boolean | null> { + try { + const res = await fetch(NEWSLETTER_BASE_PATH, { + method: subscribed ? "POST" : "DELETE", + headers: { + "content-type": "application/json", + }, + }); + const { subscribed: subscribedUpdated } = await res.json(); + return subscribedUpdated; + } catch { + return null; + } } -export function useWatchedItemsApiEndpoint(offset: number) { - const [data, setData] = useState<any>({}); - const [error, setError] = useState<Error | null>(); - const [isLoading, setIsLoading] = useState(true); - const [hasMore, setHasMore] = useState(false); - const [searchParams] = useSearchParams(); - - useEffect(() => { - (async () => { - const sp = new URLSearchParams(searchParams); - - sp.append("limit", DEFAULT_LIMIT.toString()); - offset!! && sp.append("offset", offset.toString()); - const response = await fetch(`${WATCHED_BASE_PATH}/?${sp.toString()}`); - - if (!response.ok) { - setError( - new Error( - `${response.status} - There was a problem fetching your watched items. Please try again later` - ) - ); - setIsLoading(false); - return; - } else { - let newData = await response.json(); - //We'll set an artificial id field here to make it share interface with notifications - newData.items = newData.items.map((item) => { - return { ...item, id: item.url }; - }); - if (newData.items.length < DEFAULT_LIMIT) { - setHasMore(false); - } else { - setHasMore(true); - } - setData({ - ...newData, - offset, - }); - setIsLoading(false); - setError(null); - } - })(); - }, [searchParams, offset]); - return { data, error, isLoading, hasMore }; +export async function getNewsletterSubscription(): Promise<boolean | null> { + try { + const res = await fetch(NEWSLETTER_BASE_PATH); + const { subscribed } = await res.json(); + return subscribed; + } catch { + return null; + } } export async function getStripePlans() { @@ -170,20 +44,3 @@ export async function getStripePlans() { return await res.json(); } - -async function post(url: string, data?: object) { - const fetchData: { method: string; headers: HeadersInit; body?: string } = { - method: "POST", - headers: { - "content-type": "application/json", - }, - }; - if (data) fetchData.body = JSON.stringify(data); - - const response = await fetch(url, fetchData); - - if (!response.ok) { - throw new Error(`${response.status} on ${response.url}`); - } - return response; -} diff --git a/client/src/plus/common/tabs.tsx b/client/src/plus/common/tabs.tsx index 28b887e31677..9c1780ae8457 100644 --- a/client/src/plus/common/tabs.tsx +++ b/client/src/plus/common/tabs.tsx @@ -4,16 +4,10 @@ import { MDN_PLUS_TITLE } from "../../constants"; import { AnyFilter } from "../search-filter"; export enum TabVariant { - NOTIFICATIONS, - STARRED, - WATCHING, COLLECTIONS, FREQUENTLY_VIEWED, } -const NOTIFICATIONS_URL = "/plus/notifications"; -const STARRED_URL = "/plus/notifications/starred"; -const WATCHING_URL = "/plus/notifications/watching"; const COLLECTIONS_URL = "/plus/collections"; const FREQUENTLY_VIEWED_URL = "/plus/collections/frequently_viewed"; @@ -53,23 +47,6 @@ interface TabDefinition { } export const TAB_INFO: Record<TabVariant, TabDefinition> = { - [TabVariant.NOTIFICATIONS]: { - pageTitle: `Notifications | ${MDN_PLUS_TITLE}`, - label: "All notifications", - path: NOTIFICATIONS_URL, - }, - - [TabVariant.STARRED]: { - label: "Starred", - pageTitle: `Starred | ${MDN_PLUS_TITLE}`, - path: STARRED_URL, - }, - [TabVariant.WATCHING]: { - label: "Watch list", - pageTitle: `Watch list | ${MDN_PLUS_TITLE}`, - path: WATCHING_URL, - }, - [TabVariant.COLLECTIONS]: { label: "Collection", pageTitle: `Collections | ${MDN_PLUS_TITLE}`, @@ -90,16 +67,10 @@ export function useCurrentTab(locale): TabVariant { const [currentTab, setTab] = useState<TabVariant>(initialTab); useEffect(() => { - if (pathname === `/${locale}${STARRED_URL}`) { - setTab(TabVariant.STARRED); - } else if (pathname === `/${locale}${WATCHING_URL}`) { - setTab(TabVariant.WATCHING); - } else if (pathname === `/${locale}${COLLECTIONS_URL}`) { - setTab(TabVariant.COLLECTIONS); - } else if (pathname === `/${locale}${FREQUENTLY_VIEWED_URL}`) { + if (pathname === `/${locale}${FREQUENTLY_VIEWED_URL}`) { setTab(TabVariant.FREQUENTLY_VIEWED); } else { - setTab(TabVariant.NOTIFICATIONS); + setTab(TabVariant.COLLECTIONS); } }, [pathname, currentTab, locale]); @@ -107,17 +78,8 @@ export function useCurrentTab(locale): TabVariant { } function getInitialTab() { - if (window.location.pathname.endsWith(STARRED_URL)) { - return TabVariant.STARRED; - } - if (window.location.pathname.endsWith(COLLECTIONS_URL)) { - return TabVariant.COLLECTIONS; - } if (window.location.pathname.endsWith(FREQUENTLY_VIEWED_URL)) { return TabVariant.FREQUENTLY_VIEWED; } - if (window.location.pathname.endsWith(WATCHING_URL)) { - return TabVariant.WATCHING; - } - return TabVariant.NOTIFICATIONS; + return TabVariant.COLLECTIONS; } diff --git a/client/src/plus/icon-card/index.tsx b/client/src/plus/icon-card/index.tsx index a550fe2b7f3d..e6f5baec4796 100644 --- a/client/src/plus/icon-card/index.tsx +++ b/client/src/plus/icon-card/index.tsx @@ -50,9 +50,9 @@ export default function WatchedCardListItem({ <Button type="action" icon="ellipses" - ariaControls="watch-card-dropdown" - ariaHasPopup={"menu"} - ariaExpanded={show || undefined} + aria-controls="watch-card-dropdown" + aria-haspopup={"menu"} + aria-expanded={show || undefined} onClickHandler={() => { setShow(!show); }} diff --git a/client/src/plus/index.tsx b/client/src/plus/index.tsx index a0c1cf82a82d..5593bd8af416 100644 --- a/client/src/plus/index.tsx +++ b/client/src/plus/index.tsx @@ -5,7 +5,6 @@ import { useIsServer } from "../hooks"; import { Loading } from "../ui/atoms/loading"; import { MainContentContainer } from "../ui/atoms/page-content"; import { PageNotFound } from "../page-not-found"; -import Notifications from "./notifications"; import { MDN_PLUS_TITLE } from "../constants"; import { Settings } from "../settings"; import PlusDocs from "./plus-docs"; @@ -94,18 +93,6 @@ export function Plus({ pageTitle, ...props }: { pageTitle?: string }) { </Layout> } /> - <Route - path="notifications/*" - element={ - <Layout - parents={[...parents, { uri: pathname, title: "Notifications" }]} - > - <div className="notifications girdle"> - <Notifications /> - </div> - </Layout> - } - /> <Route path="/settings" element={ diff --git a/client/src/plus/notifications/index.scss b/client/src/plus/notifications/index.scss deleted file mode 100644 index f46b773b4bb1..000000000000 --- a/client/src/plus/notifications/index.scss +++ /dev/null @@ -1,136 +0,0 @@ -@use "../../ui/vars" as *; -@use "../../ui/mixins" as *; - -.plus-header { - padding-top: 2rem; -} - -.plus-header h1 { - font: var(--type-heading-h4-font-size-mobile); - margin-bottom: 1rem; - - @media screen and (min-width: $screen-md) { - font: var(--type-heading-h4-font-size); - } -} - -.notification-list { - display: flex; - flex-direction: column; -} - -.notification-card { - align-items: center; - animation: fade-in 0.2s; - background-color: var(--background-primary); - border: 1px solid var(--border-secondary); - display: flex; - justify-content: space-between; - - padding: 0.5rem; - - > div { - align-items: center; - display: flex; - } - - .desktop-only { - display: hidden; - } - - @media screen and (min-width: $screen-md) { - .desktop-only { - display: inherit; - } - } - - &.no-star { - grid-template-columns: 1fr auto; - } - - .icon { - background-color: var(--icon-secondary); - } - - & + & { - border-top: none; - } - - &-description { - display: flex; - flex-direction: column; - gap: 0.5rem; - } - - &-title { - color: var(--text-primary); - font-family: var(--font-body); - font-size: var(--type-smaller-font-size); - font-weight: var(--font-body-strong-weight); - margin: 0; - word-wrap: anywhere; - } - - &-text { - color: var(--text-primary); - font-size: var(--type-smaller-font-size); - margin: 0; - } - - &-created { - color: var(--text-secondary); - - display: none; - font-size: var(--type-tiny-font-size); - text-align: right; - @media screen and (min-width: $screen-md) { - display: inherit; - } - } - - &:first-child { - border-top-left-radius: var(--elem-radius); - border-top-right-radius: var(--elem-radius); - margin-top: 1rem; - } - - &:last-child { - border-bottom-left-radius: var(--elem-radius); - border-bottom-right-radius: var(--elem-radius); - } - - &.unread { - background-color: var(--accent-tertiary); - } - - @media screen and (min-width: $screen-md) { - &-description { - align-items: center; - flex-direction: row; - } - } -} - -.select-all-toolbar { - align-items: center; - background-color: var(--background-primary); - border: 1px solid var(--border-primary); - border-radius: var(--elem-radius); - display: flex; - gap: 1rem; - padding: 0.5rem; -} - -.empty-card { - align-items: center; - background-color: var(--background-primary); - border: 1px solid var(--border-secondary); - margin-top: 0.5rem; - padding: 0.5rem; - - p { - font: var(--type-article-p); - letter-spacing: 0.5px; - line-height: 1.5; - } -} diff --git a/client/src/plus/notifications/index.tsx b/client/src/plus/notifications/index.tsx deleted file mode 100644 index 479bb3b3cf6d..000000000000 --- a/client/src/plus/notifications/index.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { useLocale } from "../../hooks"; -import Container from "../../ui/atoms/container"; -import Tabs from "../../ui/molecules/tabs"; - -import "./index.scss"; - -import { useUserData } from "../../user-context"; -import { TabVariant, TAB_INFO, useCurrentTab } from "../common/tabs"; -import { NotSignedIn } from "../common"; -import { NotificationsTab, StarredNotificationsTab } from "./notifications-tab"; -import { WatchedTab } from "./watched-items-tab"; - -function NotificationsLayout() { - const locale = useLocale(); - const userData = useUserData(); - - const currentTab = useCurrentTab(locale); - - const showTabs = userData && userData.isAuthenticated; - const isAuthed = userData?.isAuthenticated; - - const tabsForRoute = [ - TAB_INFO[TabVariant.NOTIFICATIONS], - TAB_INFO[TabVariant.STARRED], - TAB_INFO[TabVariant.WATCHING], - ].map((val) => { - return { ...val, path: `/${locale}${val?.path}` }; - }); - - return ( - <> - <header className="plus-header"> - <Container> - <h1>Notifications</h1> - </Container> - <Tabs tabs={tabsForRoute} /> - </header> - {showTabs && ( - <Container> - {currentTab === TabVariant.NOTIFICATIONS && <NotificationsTab />} - {currentTab === TabVariant.STARRED && <StarredNotificationsTab />} - {currentTab === TabVariant.WATCHING && <WatchedTab />} - </Container> - )} - {!userData && !isAuthed && <NotSignedIn />} - </> - ); -} - -export default function Notifications() { - return <NotificationsLayout />; -} diff --git a/client/src/plus/notifications/notification-card-list-item.tsx b/client/src/plus/notifications/notification-card-list-item.tsx deleted file mode 100644 index dface1f90e60..000000000000 --- a/client/src/plus/notifications/notification-card-list-item.tsx +++ /dev/null @@ -1,109 +0,0 @@ -import dayjs from "dayjs"; -import React from "react"; -import { useOnlineStatus } from "../../hooks"; -import { Button } from "../../ui/atoms/button"; -import { DropdownMenu, DropdownMenuWrapper } from "../../ui/molecules/dropdown"; -import { Checkbox } from "../../ui/atoms/checkbox"; -import parse from "html-react-parser"; - -const regex = /PR!(?<repo>.+\/.+)!(?<pr>\d+)!!/; - -export default function NotificationCardListItem({ - toggleSelected, - toggleStarred, - item, - handleDelete, -}) { - const [show, setShow] = React.useState(false); - let textWithPr; - const { isOnline } = useOnlineStatus(); - - const groups = item.text.match(regex)?.groups; - if (groups !== undefined) { - const content = item.text.replace( - regex, - `<a href="https://github.com/${groups.repo}/pull/${groups.pr}" - target="_blank" - rel="noreferrer noopener" - className="external" - >#${groups.pr}</a>` - ); - textWithPr = content; - } - - return ( - <li - className={`notification-card ${!item.read ? "unread" : ""}`} - key={item.id} - > - <div> - {isOnline && ( - <> - <Checkbox - name="selected" - checked={item.checked} - onChange={(e) => toggleSelected(item, e.target.value)} - /> - <Button - type="action" - extraClasses="notification-card-star" - icon={item.starred ? "star-filled" : "star"} - onClickHandler={() => toggleStarred(item)} - > - <span className="visually-hidden">Toggle Starring</span> - </Button> - </> - )} - - <a href={item.url} className="notification-card-description"> - <h2 className="notification-card-title">{item.title}</h2> - {textWithPr ? ( - <p className="notification-card-text">{parse(textWithPr)}</p> - ) : ( - <p className="notification-card-text">{item.text}</p> - )} - </a> - </div> - - <div> - <time - className="notification-card-created desktop-only" - dateTime={dayjs(item.created).toISOString()} - > - {dayjs(item.created).fromNow().toString()} - </time> - - {isOnline && ( - <DropdownMenuWrapper - className="dropdown is-flush-right" - isOpen={show} - setIsOpen={setShow} - > - <Button - type="action" - icon="ellipses" - ariaControls="watch-card-dropdown" - ariaHasPopup={"menu"} - ariaExpanded={show || undefined} - onClickHandler={() => { - setShow(!show); - }} - /> - <DropdownMenu> - <ul className="dropdown-list" id="watch-card-dropdown"> - <li className="dropdown-item"> - <Button - type="action" - onClickHandler={() => handleDelete(item)} - > - Delete - </Button> - </li> - </ul> - </DropdownMenu> - </DropdownMenuWrapper> - )} - </div> - </li> - ); -} diff --git a/client/src/plus/notifications/notification-card.tsx b/client/src/plus/notifications/notification-card.tsx deleted file mode 100644 index 60a6781cf037..000000000000 --- a/client/src/plus/notifications/notification-card.tsx +++ /dev/null @@ -1,107 +0,0 @@ -import React from "react"; -import { Button } from "../../ui/atoms/button"; -import { post } from "./utils"; -import dayjs from "dayjs"; -import relativeTime from "dayjs/plugin/relativeTime"; -import { DropdownMenu, DropdownMenuWrapper } from "../../ui/molecules/dropdown"; -import { useUIStatus } from "../../ui-context"; -import parse from "html-react-parser"; - -dayjs.extend(relativeTime); - -export default function NotificationCard({ item, changedCallback }) { - const toggleStarUrl = `/api/v1/plus/notifications/${item.id}/toggle-starred/`; - const deleteUrl = `/api/v1/plus/notifications/${item.id}/delete/`; - const undoUrl = `/api/v1/plus/notifications/${item.id}/undo-deletion/`; - const [show, setShow] = React.useState(false); - const [dynamicContent, setDynamicContent] = React.useState(null); - const { setToastData } = useUIStatus(); - - React.useEffect(() => { - const regex = /PR!(?<repo>.+\/.+)!(?<pr>\d+)!!/; - const groups = item.text.match(regex)?.groups; - if (groups !== undefined) { - const content = item.text.replace( - regex, - `<a href="https://github.com/${groups.repo}/pull/${groups.pr}">#${groups.pr}</a>` - ); - setDynamicContent(content); - } - }, [item.text]); - - return ( - <article className={`notification-card ${!item.read ? "unread" : ""}`}> - <Button - type="action" - extraClasses="notification-card-star" - icon={item.starred ? "star-filled" : "star"} - onClickHandler={async () => { - await post(toggleStarUrl); - changedCallback && changedCallback(); - }} - > - <span className="visually-hidden">Toggle Starring</span> - </Button> - - <a href={item.url}> - <div className="notification-card-description"> - <h2 className="notification-card-title">{item.title}</h2> - {dynamicContent ? ( - <p className="notification-card-text">{parse(dynamicContent)}</p> - ) : ( - <p className="notification-card-text">{item.text}</p> - )} - </div> - </a> - - <time - className="notification-card-created" - dateTime={dayjs(item.created).toISOString()} - > - {dayjs(item.created).fromNow().toString()} - </time> - - <DropdownMenuWrapper - className="dropdown is-flush-right" - isOpen={show} - setIsOpen={setShow} - > - <Button - type="action" - icon="ellipses" - ariaControls="watch-card-dropdown" - ariaHasPopup={"menu"} - ariaExpanded={show || undefined} - onClickHandler={() => { - setShow(!show); - }} - /> - <DropdownMenu> - <ul className="dropdown-list" id="watch-card-dropdown"> - <li className="dropdown-item"> - <Button - type="action" - onClickHandler={async () => { - await post(deleteUrl); - setToastData({ - mainText: "The page has been removed from your Watch list.", - shortText: "Article removed", - buttonText: "UNDO", - buttonHandler: async () => { - await post(undoUrl); - changedCallback && changedCallback(); - setToastData(null); - }, - }); - changedCallback && changedCallback(); - }} - > - Delete - </Button> - </li> - </ul> - </DropdownMenu> - </DropdownMenuWrapper> - </article> - ); -} diff --git a/client/src/plus/notifications/notification-select.tsx b/client/src/plus/notifications/notification-select.tsx deleted file mode 100644 index a563dde1b4ab..000000000000 --- a/client/src/plus/notifications/notification-select.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { useOnlineStatus } from "../../hooks"; -import { Button } from "../../ui/atoms/button"; -import { Checkbox } from "../../ui/atoms/checkbox"; - -export default function SelectedNotificationsBar({ - isChecked, - onSelectAll, - onStarSelected, - onDeleteSelected, - onUnstarSelected, - buttonStates, - onUnwatchSelected, - watchedTab, -}) { - const { isOnline } = useOnlineStatus(); - - return ( - <> - {isOnline && ( - <form className="select-all-toolbar"> - <Checkbox - name="select-all" - onChange={onSelectAll} - checked={isChecked} - /> - {!watchedTab && ( - <> - <Button - type="secondary" - isDisabled={!buttonStates.starEnabled} - onClickHandler={onStarSelected} - > - Star - </Button> - <Button - type="secondary" - isDisabled={!buttonStates.unstarEnabled} - onClickHandler={onUnstarSelected} - > - Unstar - </Button> - <Button - type="secondary" - isDisabled={!buttonStates.deleteEnabled} - onClickHandler={onDeleteSelected} - > - Delete - </Button> - </> - )} - {watchedTab && ( - <Button - type="secondary" - isDisabled={!buttonStates.unwatchEnabled} - onClickHandler={onUnwatchSelected} - > - Unwatch - </Button> - )} - </form> - )} - </> - ); -} diff --git a/client/src/plus/notifications/notifications-tab.tsx b/client/src/plus/notifications/notifications-tab.tsx deleted file mode 100644 index 19c6da211be2..000000000000 --- a/client/src/plus/notifications/notifications-tab.tsx +++ /dev/null @@ -1,233 +0,0 @@ -import { useState, useRef, useEffect, useMemo } from "react"; -import { useUIStatus } from "../../ui-context"; -import { - useNotificationsApiEndpoint, - starItemsById, - unstarItemsById, - deleteItemById, - undoDeleteItemById, - starItem, - deleteItemsById, -} from "../common/api"; -import { showMoreButton } from "../common/plus-tabs"; -import SearchFilter from "../search-filter"; -import NotificationCardListItem from "./notification-card-list-item"; -import SelectedNotificationsBar from "./notification-select"; -import { TAB_INFO, FILTERS, SORTS, useCurrentTab } from "../common/tabs"; -import { useVisibilityChangeListener } from "./utils"; -import { DataError } from "../common"; -import { Loading } from "../../ui/atoms/loading"; -import { useLocale } from "../../hooks"; -import { useSearchParams } from "react-router-dom"; - -export function NotificationsTab({ starred = false }) { - const [offset, setOffset] = useState(0); - const { setToastData } = useUIStatus(); - const [selectAllChecked, setSelectAllChecked] = useState(false); - const [list, setList] = useState<Array<any>>([]); - const locale = useLocale(); - const currentTab = useCurrentTab(locale); - const [searchParams] = useSearchParams(); - - const [editOptions, setEditOptions] = useState({ - starEnabled: false, - unstarEnabled: false, - deleteEnabled: false, - unwatchEnabled: false, - }); - - const { data, error, isLoading, hasMore } = useNotificationsApiEndpoint( - offset, - starred - ); - - useVisibilityChangeListener(); - - const unreadCount = useMemo( - () => data?.items?.filter((v) => v.read === false).length ?? 0, - [data] - ); - - document.title = TAB_INFO[currentTab].pageTitle; - useEffect(() => { - document.title = - TAB_INFO[currentTab].pageTitle + (unreadCount ? ` (${unreadCount})` : ""); - }, [currentTab, unreadCount]); - - const listRef = useRef<Array<any>>([]); - - listRef.current = list; - - // Uncheck and clear list on filter change - useEffect(() => { - setSelectAllChecked(false); - setList([]); - setOffset(0); - }, [searchParams]); - - const calculateBulkEditOptions = (items: any[]) => { - editOptions.starEnabled = false; - editOptions.unstarEnabled = false; - editOptions.deleteEnabled = false; - editOptions.unwatchEnabled = false; - - items.forEach((val) => { - if (val.checked) { - !val.starred && (editOptions.starEnabled = true); - val.starred && (editOptions.unstarEnabled = true); - editOptions.deleteEnabled = true; - editOptions.unwatchEnabled = true; - } - }); - setEditOptions({ ...editOptions }); - }; - - useEffect(() => { - if (data && !!data.items) { - setList([ - ...(data?.offset === 0 ? [] : listRef.current), - ...data.items.map((item) => { - return { ...item, checked: false }; - }), - ]); - } - }, [data]); - - const starMany = async () => { - const toStar = list.filter((v) => v.checked).map((i) => i.id); - await starItemsById(toStar); - const updated = list.map((v) => { - if (v.checked) { - v.starred = true; - } - return v; - }); - setList(updated); - }; - - const unstarMany = async () => { - const toUnstar = list.filter((v) => v.checked).map((i) => i.id); - await unstarItemsById(toUnstar); - const updated = list.map((v) => { - if (v.checked) { - v.starred = false; - } - return v; - }); - setList(updated); - }; - - const deleteItem = async (item) => { - await deleteItemById(item.id); - const listWithDelete = list.filter((v) => v.id !== item.id); - setList(listWithDelete); - setToastData({ - mainText: "The notification has been removed from your list.", - shortText: "Article removed", - buttonText: "Undo", - buttonHandler: async () => { - await undoDeleteItemById(item.id); - setToastData(null); - }, - }); - }; - - const toggleItemChecked = (item) => { - const newList = list.map((v) => { - if (v.id === item.id) { - v.checked = !v.checked; - } - return v; - }); - calculateBulkEditOptions(newList); - setList(newList); - }; - - const toggleStarItem = async (item) => { - await starItem(item.id); - //Local updates - const updated = list.map((v) => { - if (v.id === item.id) { - v.starred = !v.starred; - } - return v; - }); - setList(updated); - }; - - const deleteMany = async () => { - const toDelete = list.filter((v) => v.checked).map((i) => i.id); - await deleteItemsById(toDelete); - const updated = list.filter((v) => !v.checked); - setList(updated); - }; - const empty_text = !starred ? ( - <> - <p>You have no more notifications to review! ✨</p>{" "} - <p> - {" "} - Want more? Try watching one of these pages to receive notifications for - content and/or compatibility updates:{" "} - <a href="/en-US/docs/Web/CSS/overscroll-behavior"> - <code>overscroll-behavior</code> - </a> - ,{" "} - <a href="/en-US/docs/Web/API/MIDIPort"> - <code>MIDIPort</code> - </a> - , or{" "} - <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/groupBy"> - <code>Array.prototype.groupBy()</code> - </a> - </p> - </> - ) : ( - <p>You have no starred notifications ✨</p> - ); - - return ( - <> - <SearchFilter filters={FILTERS} sorts={SORTS} /> - <SelectedNotificationsBar - isChecked={selectAllChecked} - onStarSelected={starMany} - onSelectAll={(e) => { - const newList = list.map((item) => { - return { ...item, checked: e.target.checked }; - }); - setList(newList); - setSelectAllChecked(!selectAllChecked); - calculateBulkEditOptions(newList); - }} - onUnstarSelected={unstarMany} - onDeleteSelected={deleteMany} - buttonStates={editOptions} - onUnwatchSelected={null} - watchedTab={false} - /> - {isLoading && <Loading message="Waiting for data" />} - {error && <DataError error={error} />} - {!isLoading && !list.length && ( - <div className="empty-card">{empty_text}</div> - )} - <ul className="notification-list"> - <div className="icon-card-list"> - {list.map((item) => ( - <NotificationCardListItem - handleDelete={deleteItem} - item={item} - toggleSelected={toggleItemChecked} - toggleStarred={toggleStarItem} - key={item.id} - /> - ))} - </div> - </ul> - {hasMore && showMoreButton(setSelectAllChecked, setOffset, list)} - </> - ); -} - -export function StarredNotificationsTab() { - return <NotificationsTab starred={true} />; -} diff --git a/client/src/plus/notifications/utils.ts b/client/src/plus/notifications/utils.ts deleted file mode 100644 index b1323a51d24a..000000000000 --- a/client/src/plus/notifications/utils.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { useEffect } from "react"; -import { mutate } from "swr"; -import { HEADER_NOTIFICATIONS_MENU_API_URL } from "../../constants"; -import { - markNotificationsAsRead, - NOTIFICATIONS_MARK_ALL_AS_READ_PATH, -} from "../common/api"; - -export async function post(url: string, data?: object) { - const fetchData: { method: string; headers: HeadersInit; body?: string } = { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - }; - if (data) fetchData.body = JSON.stringify(data); - - const response = await fetch(url, fetchData); - - if (!response.ok) { - throw new Error(`${response.status} on ${response.url}`); - } - return true; -} - -export function getCookie(name) { - const value = `; ${document.cookie}`; - const parts = value.split(`; ${name}=`); - if (parts.length === 2) return parts.pop()?.split(";").shift(); -} - -function registerSendBeaconHandler() { - // if the user clicks a hard link, we set notifications as read using a sendBeacon request - const handler = () => { - if (document.visibilityState === "hidden") { - navigator.sendBeacon(NOTIFICATIONS_MARK_ALL_AS_READ_PATH); - } - }; - document.addEventListener("visibilitychange", handler); - return handler; -} - -export function useVisibilityChangeListener() { - return useEffect(() => { - const visibilityChangeHandler = registerSendBeaconHandler(); - - return () => { - // if the user clicks a react-router Link, we remove the sendBeacon handler - // and send a fetch request to mark notifications as read - document.removeEventListener("visibilitychange", visibilityChangeHandler); - markNotificationsAsRead().then(async () => { - // await mutate(apiUrl); - await mutate(HEADER_NOTIFICATIONS_MENU_API_URL); - }); - }; - }, []); -} diff --git a/client/src/plus/notifications/watched-items-tab.tsx b/client/src/plus/notifications/watched-items-tab.tsx deleted file mode 100644 index 4cc15550f4b6..000000000000 --- a/client/src/plus/notifications/watched-items-tab.tsx +++ /dev/null @@ -1,159 +0,0 @@ -import { useState, useRef, useEffect } from "react"; -import LimitBanner from "../../ui/atoms/limit-banner"; -import { Loading } from "../../ui/atoms/loading"; -import { DataError } from "../common"; -import { useWatchedItemsApiEndpoint, unwatchItemsByUrls } from "../common/api"; -import { showMoreButton } from "../common/plus-tabs"; -import { TabVariant, TAB_INFO } from "../common/tabs"; -import WatchedCardListItem from "../icon-card"; -import SearchFilter from "../search-filter"; -import SelectedNotificationsBar from "./notification-select"; -import { useSearchParams } from "react-router-dom"; - -export function WatchedTab() { - const [offset, setOffset] = useState(0); - const [selectAllChecked, setSelectAllChecked] = useState(false); - const [subscriptionLimitReached, setSubscriptionLimitReached] = - useState(false); - const [list, setList] = useState<Array<any>>([]); - const listRef = useRef<Array<any>>([]); - const [searchParams] = useSearchParams(); - - document.title = TAB_INFO[TabVariant.WATCHING].pageTitle; - - const { data, error, isLoading, hasMore } = - useWatchedItemsApiEndpoint(offset); - - listRef.current = list; - - useEffect(() => { - if (data && !!data.items) { - setSubscriptionLimitReached(data.subscription_limit_reached); - setList([ - ...(data?.offset === 0 ? [] : listRef.current), - ...data.items.map((item) => { - return { ...item, checked: false }; - }), - ]); - } - }, [data]); - - useEffect(() => { - setSelectAllChecked(false); - setList([]); - setOffset(0); - }, [searchParams]); - - const [editOptions, setEditOptions] = useState({ - starEnabled: false, - unstarEnabled: false, - deleteEnabled: false, - unwatchEnabled: false, - }); - - const calculateBulkEditOptions = (items: any[]) => { - editOptions.starEnabled = false; - editOptions.unstarEnabled = false; - editOptions.deleteEnabled = false; - editOptions.unwatchEnabled = false; - - items.forEach((val) => { - if (val.checked) { - !val.starred && (editOptions.starEnabled = true); - val.starred && (editOptions.unstarEnabled = true); - editOptions.deleteEnabled = true; - editOptions.unwatchEnabled = true; - } - }); - setEditOptions({ ...editOptions }); - }; - - const toggleItemChecked = (item) => { - const newList = list.map((v) => { - if (v.id === item.id) { - v.checked = !v.checked; - } - return v; - }); - calculateBulkEditOptions(newList); - setList(newList); - }; - const unwatchMany = async () => { - const toUnWatch = list.filter((v) => v.checked); - const res = await unwatchItemsByUrls(toUnWatch); - const limitReached = - (await res.json())?.subscription_limit_reached || false; - const updated = list.filter((v) => !v.checked); - setSubscriptionLimitReached(limitReached); - setList(updated); - }; - - const unwatchItem = async (toUnWatch) => { - const res = await unwatchItemsByUrls([toUnWatch]); - const limitReached = - (await res.json())?.subscription_limit_reached || false; - const updated = list.filter((v) => v.id !== toUnWatch.id); - setSubscriptionLimitReached(limitReached); - setList(updated); - }; - - return ( - <> - <SearchFilter filters={[]} sorts={[]} /> - <SelectedNotificationsBar - isChecked={selectAllChecked} - onStarSelected={null} - onSelectAll={(e) => { - const newList = list.map((item) => { - return { ...item, checked: e.target.checked }; - }); - setList(newList); - setSelectAllChecked(!selectAllChecked); - calculateBulkEditOptions(newList); - }} - onUnstarSelected={null} - onDeleteSelected={null} - buttonStates={editOptions} - onUnwatchSelected={unwatchMany} - watchedTab={true} - /> - - {isLoading && <Loading message="Fetching your notifications..." />} - {error && <DataError error={error} />} - <ul className="notification-list"> - <div className="icon-card-list"> - {!isLoading && !list.length && ( - <div className="empty-card"> - <p>You're not watching any pages.</p>{" "} - <p> - {" "} - Try watching one of these pages:{" "} - <a href="/en-US/docs/Web/CSS/overscroll-behavior"> - <code>overscroll-behavior</code> - </a> - ,{" "} - <a href="/en-US/docs/Web/API/MIDIPort"> - <code>MIDIPort</code> - </a> - , or{" "} - <a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/groupBy"> - <code>Array.prototype.groupBy()</code> - </a> - </p> - </div> - )} - {list.map((item) => ( - <WatchedCardListItem - onUnwatched={unwatchItem} - item={item} - toggleSelected={toggleItemChecked} - key={item.id} - /> - ))} - </div> - </ul> - {subscriptionLimitReached && <LimitBanner type="watched" />} - {hasMore && showMoreButton(setSelectAllChecked, setOffset, list)} - </> - ); -} diff --git a/client/src/plus/offer-overview/offer-overview-feature/index.tsx b/client/src/plus/offer-overview/offer-overview-feature/index.tsx index 2b6410b1e11e..03abe6ff54bf 100644 --- a/client/src/plus/offer-overview/offer-overview-feature/index.tsx +++ b/client/src/plus/offer-overview/offer-overview-feature/index.tsx @@ -3,7 +3,7 @@ import "./index.scss"; function OfferOverviewFeature({ id, img, imgAlt, children }) { return ( - <div className={`offer-overview-feature ${id}`}> + <div className={`offer-overview-feature`}> <div className="container"> <div className="wrapper" id={id}> <img @@ -23,31 +23,28 @@ function OfferOverviewFeature({ id, img, imgAlt, children }) { export default function OfferOverviewFeatures() { return ( <section id="features"> - <OfferOverviewFeature - id="notifications" - img="/assets/notifications_light.png" - imgAlt="" - > - <section aria-labelledby="notifications-section-title"> - <h2 id="notifications-section-title">Notifications</h2> + <OfferOverviewFeature id="updates" img="/assets/updates.png" imgAlt=""> + <section aria-labelledby="updates-section-title"> + <h2 id="updates-section-title">Updates</h2> <h3> - Development in real time: + Compatibility changes at a glance. <br /> - Get custom alerts + Filter and sort updates that matter most to build your project </h3> <p> - The Web doesn't have a changelog, but MDN can help. Follow pages and - get customizable notifications when documentation changes, CSS - features launch, and APIs ship. + The Web doesn't have a changelog, but MDN can help. You can + personalize and filter compatibility changes based on browsers or + the tech category you are interested in whether that is JavaScript, + CSS, etc. </p> - <Button href="/en-US/plus/docs/features/notifications"> + <Button href="/en-US/plus/docs/features/updates" target="_self"> Learn more → </Button> </section> </OfferOverviewFeature> <OfferOverviewFeature id="collections" - img="/assets/collections_light.png" + img="/assets/collections.png" imgAlt="" > <section aria-labelledby="collections-section-title"> @@ -61,16 +58,12 @@ export default function OfferOverviewFeatures() { your inner curator and collect your favorite articles in one place for convenient consultation. </p> - <Button href="/en-US/plus/docs/features/collections"> + <Button href="/en-US/plus/docs/features/collections" target="_self"> Learn more → </Button> </section> </OfferOverviewFeature> - <OfferOverviewFeature - id="offline" - img="/assets/offline_settings_light.png" - imgAlt="" - > + <OfferOverviewFeature id="offline" img="/assets/offline.png" imgAlt=""> <section aria-labelledby="offline-section-title"> <h2 id="offline-section-title">MDN Offline</h2> <h3>MDN's entire library at your fingertips: offline</h3> @@ -79,7 +72,9 @@ export default function OfferOverviewFeatures() { inaccessible pages or cluttered tabs. With MDN Plus, have the fully navigable resources of MDN at your disposal even when offline. </p> - <Button href="/en-US/plus/docs/features/offline">Learn more →</Button> + <Button href="/en-US/plus/docs/features/offline" target="_self"> + Learn more → + </Button> </section> </OfferOverviewFeature> </section> diff --git a/client/src/plus/offer-overview/offer-overview-subscribe/index.tsx b/client/src/plus/offer-overview/offer-overview-subscribe/index.tsx index 6f58c09b7f79..28cf71deca9f 100644 --- a/client/src/plus/offer-overview/offer-overview-subscribe/index.tsx +++ b/client/src/plus/offer-overview/offer-overview-subscribe/index.tsx @@ -70,7 +70,7 @@ export type OfferDetailsProps = { }; const PLUS_FEATURES = [ - ["notifications", "Page notifications"], + ["updates", "Filter and sort updates"], ["collections", "Collections of articles"], ["offline", "MDN Offline"], ]; @@ -79,7 +79,7 @@ const CORE: OfferDetailsProps = { id: "core", name: "Core", features: [ - ["notifications", "Notifications for up to 3 pages"], + ["updates", "Filter and sort updates"], ["collections", "Up to 3 collections"], ], includes: "Includes:", diff --git a/client/src/plus/plus-docs/index.tsx b/client/src/plus/plus-docs/index.tsx index bf5604a88c86..6e218298a7f0 100644 --- a/client/src/plus/plus-docs/index.tsx +++ b/client/src/plus/plus-docs/index.tsx @@ -15,8 +15,8 @@ function PlusDocsNav() { title: "Overview", }, { - slug: "plus/docs/features/notifications", - title: "Notifications", + slug: "plus/docs/features/updates", + title: "Updates", }, { slug: "plus/docs/features/collections", diff --git a/client/src/plus/search-filter/index.tsx b/client/src/plus/search-filter/index.tsx index 4d2431d35edc..19fe7c7e9d4a 100644 --- a/client/src/plus/search-filter/index.tsx +++ b/client/src/plus/search-filter/index.tsx @@ -81,7 +81,7 @@ export default function SearchFilter({ const isDefaultFilter = (key: string, value: string) => { const filter = filters.find((filter) => filter.key === key) as AnyFilter; const option = filter.options.find((option) => option.value === value); - return option.isDefault ?? false; + return option?.isDefault ?? false; }; const isCurrentFilter = (key: string, value: string) => { @@ -103,7 +103,7 @@ export default function SearchFilter({ const isDefaultSort = (param: string) => { const sort = sorts.find((sort) => sort.param === param); - return sort.isDefault ?? false; + return sort?.isDefault ?? false; }; const isCurrentSort = (param: string) => { @@ -212,9 +212,9 @@ export default function SearchFilter({ > <Button type="select" - ariaControls={filterMenu.id} - ariaHasPopup={"menu"} - ariaExpanded={openFilter === filterMenu.key} + aria-controls={filterMenu.id} + aria-haspopup={"menu"} + aria-expanded={openFilter === filterMenu.key} extraClasses={`${ searchParams.get(filterMenu.key) ? "active" : "" } ${isDisabled ? "inactive" : ""}`} @@ -223,6 +223,7 @@ export default function SearchFilter({ openFilter === filterMenu.key ? null : filterMenu.key ) } + isDisabled={filterMenu.items.length === 0} > {filterMenu.label} </Button> @@ -248,6 +249,10 @@ export default function SearchFilter({ setSelectedTerms(camelUnwrap(terms)) } onChangeHandler={(e) => setTerms(e.target.value)} + onResetHandler={() => { + setTerms(""); + setSelectedTerms(""); + }} /> {sorts.length ? ( @@ -258,9 +263,9 @@ export default function SearchFilter({ > <Button type="select" - ariaControls={sortMenu.id} - ariaHasPopup={"menu"} - ariaExpanded={isSortingOpen || undefined} + aria-controls={sortMenu.id} + aria-haspopup={"menu"} + aria-expanded={isSortingOpen || undefined} extraClasses={`${searchParams.get("sort") ? "active" : ""} ${ isDisabled ? "inactive" : "" }`} diff --git a/client/src/plus/updates/api.ts b/client/src/plus/updates/api.ts index 6562abb6b097..529291c38c38 100644 --- a/client/src/plus/updates/api.ts +++ b/client/src/plus/updates/api.ts @@ -53,10 +53,11 @@ function composeUrl({ params.set(key, value); break; - case "show": + case "collections": if (isAuthenticated) { // Different endpoint for uncached personalized data. - url += "watched/"; + url += "collections/"; + params.set(key, value); } break; @@ -80,7 +81,7 @@ export function useUpdates() { const [searchParams] = useSearchParams(); const url = composeUrl({ - isAuthenticated: user && user.isAuthenticated, + isAuthenticated: user?.isAuthenticated || false, searchParams, }); diff --git a/client/src/plus/updates/index.tsx b/client/src/plus/updates/index.tsx index d15f87b8851a..863800bfdf8a 100644 --- a/client/src/plus/updates/index.tsx +++ b/client/src/plus/updates/index.tsx @@ -12,7 +12,6 @@ import { Loading } from "../../ui/atoms/loading"; import Mandala from "../../ui/molecules/mandala"; import { Paginator } from "../../ui/molecules/paginator"; import BookmarkMenu from "../../ui/organisms/article-actions/bookmark-menu"; -import { NotificationsWatchMenu } from "../../ui/organisms/article-actions/notifications-watch-menu"; import { useUserData } from "../../user-context"; import { camelWrap, range } from "../../utils"; import { Event, Group, useBCD, useUpdates } from "./api"; @@ -24,6 +23,7 @@ import { LoginBanner } from "./login-banner"; import { useEffect, useState } from "react"; import { useSearchParams } from "react-router-dom"; import { DataError } from "../common"; +import { useCollections } from "../collections/api"; type EventWithStatus = Event & { status: Status }; type Status = "added" | "removed"; @@ -90,19 +90,13 @@ const FILTERS: AnyFilter[] = [ }, { type: "select", - label: "Show", - key: "show", - options: [ - { - label: "All pages", - value: "all", - isDefault: true, - }, - { - label: "Pages I'm watching", - value: "watched", - }, - ], + label: "Collections", + key: "collections", + multiple: { + encode: (...values: string[]) => values.join(","), + decode: (value: string) => value.split(","), + }, + options: [], }, ]; @@ -122,6 +116,37 @@ export default function Updates() { return <UpdatesLayout />; } +const useFilters = (canFilter: boolean) => { + const [filters, setFilters] = useState(FILTERS); + const { data, isLoading, error } = useCollections(); + useEffect(() => { + if (!isLoading && data?.length && !error) { + setFilters((old) => + old.map((val) => { + if (val.key === "collections") { + return { + ...val, + options: data + ?.filter((collection) => collection.article_count > 0) + .map((info) => { + const label = + info.name === "Default" ? "Saved Articles" : info.name; + return { + label, + value: info.id, + }; + }), + }; + } else { + return val; + } + }) + ); + } + }, [isLoading, canFilter, data, error]); + return filters; +}; + function UpdatesLayout() { document.title = `Updates | ${MDN_PLUS_TITLE}`; useScrollToTop(); @@ -129,13 +154,13 @@ function UpdatesLayout() { const { data, error } = useUpdates(); const gleanClick = useGleanClick(); const [searchParams, setSearchParams] = useSearchParams(); - const { setViewed } = useViewedState(); useEffect(() => setViewed(FeatureId.PLUS_UPDATES_V2)); const hasFilters = [...searchParams.keys()].some((key) => key !== "page"); const canFilter = user?.isAuthenticated === true; + const filters = useFilters(canFilter); return ( <div className="updates"> @@ -164,7 +189,7 @@ function UpdatesLayout() { </header> <Container> <SearchFilter - filters={FILTERS} + filters={filters} sorts={SORTS} isDisabled={!canFilter} onChange={(key, newValue, oldValue) => @@ -377,7 +402,6 @@ function ArticleActions({ path, mdn_url }: { path: string; mdn_url?: string }) { </Button> {url && ( <> - <NotificationsWatchMenu doc={doc} /> <BookmarkMenu doc={doc} /> </> )} diff --git a/client/src/search.tsx b/client/src/search.tsx index 94680a26a502..457afe05563e 100644 --- a/client/src/search.tsx +++ b/client/src/search.tsx @@ -9,8 +9,6 @@ import { Button } from "./ui/atoms/button"; import { useLocale } from "./hooks"; import { SearchProps, useFocusViaKeyboard } from "./search-utils"; -import { useUserData } from "./user-context"; -import { getCollectionItems } from "./plus/collections-quicksearch"; import { useGleanClick } from "./telemetry/glean-context"; const PRELOAD_WAIT_MS = 500; @@ -19,11 +17,12 @@ const SHOW_INDEXING_AFTER_MS = 500; type Item = { url: string; title: string; - collection: boolean; }; +type FlexItem = [index: number, title: string, slugTail: string]; + type SearchIndex = { - flex: any; + flex: FlexItem[]; items: null | Item[]; }; @@ -31,13 +30,20 @@ type ResultItem = { title: string; url: string; positions: Set<number>; - collection: boolean; }; function quicksearchPing(input) { return `quick-search: ${input}`; } +function splitQuery(term: string): string[] { + return term + .trim() + .toLowerCase() + .replace(".", " .") // Allows to find `Map.prototype.get()` via `Map.get`. + .split(/[ ,]+/); +} + function useSearchIndex(): readonly [ null | SearchIndex, null | Error, @@ -47,7 +53,6 @@ function useSearchIndex(): readonly [ const [searchIndex, setSearchIndex] = useState<null | SearchIndex>(null); // Default to 'en-US' if you're on the home page without the locale prefix. const { locale = "en-US" } = useParams(); - const user = useUserData(); const url = `/${locale}/search-index.json`; @@ -68,41 +73,21 @@ function useSearchIndex(): readonly [ return; } const gather = async () => { - const collection: Item[] = []; - if (user?.settings?.colInSearch) { - const all = await getCollectionItems( - user?.settings?.collectionLastModified - ); - collection.push( - ...all.map((item) => { - return { ...item, collection: true }; - }) - ); - } - const collectionSet = new Set(collection.map(({ url }) => url)); - const mixed = [ - ...collection, - ...data - .filter(({ url }) => !collectionSet.has(url)) - .map((item) => { - return { ...item, collection: false }; - }), - ]; - - const flex = mixed.map(({ title }, i) => [i, title.toLowerCase()]); + const flex = data.map( + ({ title, url }, i): FlexItem => [ + i, + title.toLowerCase(), + (url.split("/").pop() as string).toLowerCase(), + ] + ); setSearchIndex({ flex, - items: mixed!, + items: data, }); }; gather(); - }, [ - shouldInitialize, - data, - user?.settings?.colInSearch, - user?.settings?.collectionLastModified, - ]); + }, [shouldInitialize, data]); return useMemo( () => [searchIndex, error || null, () => setShouldInitialize(true)], @@ -112,7 +97,7 @@ function useSearchIndex(): readonly [ function HighlightMatch({ title, q }: { title: string; q: string }) { // Split on highlight term and include term into parts, ignore case. - const words = q.trim().toLowerCase().split(/[ ,]+/); + const words = splitQuery(q); // $& means the whole matched string const regexWords = words.map((s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")); const regex = regexWords.map((word) => `(${word})`).join("|"); @@ -236,14 +221,18 @@ function InnerSearchNavigateWidget(props: InnerSearchNavigateWidgetProps) { // overlaying search results don't trigger a scroll. const limit = window.innerHeight < 850 ? 5 : 10; - const q: string[] = inputValue - .toLowerCase() - .split(" ") - .map((s) => s.trim()); - const indexResults: number[] = searchIndex.flex + const inputValueLC = inputValue.toLowerCase().trim(); + const q = splitQuery(inputValue); + const indexResults = searchIndex.flex .filter(([_, title]) => q.every((q) => title.includes(q))) - .map(([i]) => i) + .map(([index, title, slugTail]) => { + const exact = Number([title, slugTail].includes(inputValueLC)); + return [exact, index]; + }) + .sort(([aExact], [bExact]) => bExact - aExact) // Boost exact matches. + .map(([_, i]) => i) .slice(0, limit); + return indexResults.map( (index: number) => (searchIndex.items || [])[index] as ResultItem ); @@ -354,14 +343,16 @@ function InnerSearchNavigateWidget(props: InnerSearchNavigateWidgetProps) { if (searchIndexError) { return ( - <div className="searchindex-error">Error initializing search index</div> + <div className="searchindex-error result-item"> + <span>Failed to load search index!</span> + </div> ); } if (!searchIndex) { return showIndexing ? ( - <div className="indexing-warning"> - <em>Initializing index</em> + <div className="indexing-warning result-item"> + <em>Loading search index...</em> </div> ) : null; } @@ -401,10 +392,9 @@ function InnerSearchNavigateWidget(props: InnerSearchNavigateWidgetProps) { <div {...getItemProps({ key: item.url, - className: - "result-item " + - (i === highlightedIndex ? "highlight " : " ") + - (item.collection ? "qs-collection " : " "), + className: `result-item ${ + i === highlightedIndex ? "highlight " : "" + }`, item, index: i, })} diff --git a/client/src/settings/feature-preview.tsx b/client/src/settings/feature-preview.tsx deleted file mode 100644 index 3c92de182a76..000000000000 --- a/client/src/settings/feature-preview.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import { useState } from "react"; -import { toggleCollectionsInQuickSearch } from "../plus/common/api"; -import { Spinner } from "../ui/atoms/spinner"; -import { Switch } from "../ui/atoms/switch"; -import { SubscriptionType, useUserData } from "../user-context"; - -export default function FeaturePreview() { - const serviceWorkerAvailable = window?.navigator?.serviceWorker; - - const [saving, setSaving] = useState<boolean>(false); - const user = useUserData(); - - return ( - <section className="field-group"> - <h2>Feature preview</h2> - {user?.subscriptionType && - [SubscriptionType.MDN_PLUS_10M, SubscriptionType.MDN_PLUS_10Y].includes( - user?.subscriptionType - ) ? ( - serviceWorkerAvailable ? ( - <ul> - <li> - <h3>Collections in quick search</h3> - <span> - Prioritizes items from your collection when using quick search. - <br /> - <a - rel="noreferrer noopener" - target="_blank" - href="https://survey.alchemer.com/s3/6918430/Feature-Preview-User-Feedback-Collections-in-Quicksearch" - > - Give us some feedback. - </a> - </span> - {saving ? ( - <Spinner extraClasses="loading" /> - ) : ( - <Switch - name="col_in_search" - checked={Boolean(user?.settings?.colInSearch)} - toggle={async (e) => { - setSaving(true); - await toggleCollectionsInQuickSearch( - Boolean(e.target.checked) - ); - user?.mutate(); - setSaving(false); - }} - ></Switch> - )} - </li> - </ul> - ) : ( - <> - <h3>Collections in quick search is unavailable</h3>{" "} - <p> - Please make sure that you are not using a private or incognito - window. - </p> - </> - ) - ) : ( - <> - Feature preview is only available to MDN Supporter 10 subscribers.{" "} - <a href={`/en-US/plus#subscribe`}>Learn more</a> about our plans. - </> - )} - </section> - ); -} diff --git a/client/src/settings/index.tsx b/client/src/settings/index.tsx index 03647dd8476f..37e632227eb1 100644 --- a/client/src/settings/index.tsx +++ b/client/src/settings/index.tsx @@ -1,12 +1,13 @@ import React from "react"; +import { NEWSLETTER_ENABLED } from "../env"; import { OfflineStatusBar } from "../ui/molecules/offline-status-bar"; import "./index.scss"; import { Manage } from "./manage"; +import Newsletter from "./newsletter"; const OfflineSettings = React.lazy(() => import("./offline-settings")); -const FeaturePreview = React.lazy(() => import("./feature-preview")); export function Settings() { const pageTitle = "My Settings"; @@ -15,8 +16,8 @@ export function Settings() { <OfflineStatusBar /> <article className="settings"> <h1 className="slab-highlight _ify">{pageTitle} </h1> + {NEWSLETTER_ENABLED && <Newsletter />} <Manage /> - <FeaturePreview /> <OfflineSettings /> </article> </> diff --git a/client/src/settings/newsletter.tsx b/client/src/settings/newsletter.tsx new file mode 100644 index 000000000000..2d3b604df030 --- /dev/null +++ b/client/src/settings/newsletter.tsx @@ -0,0 +1,67 @@ +import { useEffect, useState } from "react"; +import { FeatureId } from "../constants"; +import { useViewedState } from "../hooks"; +import { + getNewsletterSubscription, + toggleNewsletterSubscription, +} from "../plus/common/api"; +import { Spinner } from "../ui/atoms/spinner"; +import { Switch } from "../ui/atoms/switch"; +import { SubscriptionType, useUserData } from "../user-context"; + +export default function Newsletter() { + const [loading, setLoading] = useState<boolean>(true); + const user = useUserData(); + const [enabled, setEnabled] = useState<boolean | null>(null); + useEffect(() => { + (async () => { + setEnabled(await getNewsletterSubscription()); + setLoading(false); + })(); + }, []); + const { isViewed, setViewed } = useViewedState(); + if (!isViewed(FeatureId.PLUS_NEWSLETTER)) { + setViewed(FeatureId.PLUS_NEWSLETTER); + } + + return ( + <section className="field-group"> + <h2>Newsletter</h2> + {user?.subscriptionType && + user?.subscriptionType !== SubscriptionType.MDN_CORE ? ( + <ul> + <li> + <h3>Receive updates from MDN Plus</h3> + <span> + Activating this switch will allow us to email you product updates, + news about our latest features, tips to get the most out of MDN + Plus, and more. + </span> + {loading ? ( + <Spinner extraClasses="loading" /> + ) : ( + <Switch + name="mdn_plus_newsletter" + checked={Boolean(enabled)} + toggle={async (e) => { + setLoading(true); + setEnabled( + await toggleNewsletterSubscription( + Boolean(e.target.checked) + ) + ); + setLoading(false); + }} + ></Switch> + )} + </li> + </ul> + ) : ( + <> + The MDN Plus newsletter is only available to MDN Plus subscribers.{" "} + <a href={`/en-US/plus#subscribe`}>Learn more</a> about our plans. + </> + )} + </section> + ); +} diff --git a/client/src/site-search/search-results.scss b/client/src/site-search/search-results.scss index 8afed4c1d73a..3bbfaa169d8d 100644 --- a/client/src/site-search/search-results.scss +++ b/client/src/site-search/search-results.scss @@ -44,6 +44,7 @@ margin: 0; margin-bottom: 0.25rem; padding: 0; + word-break: break-word; a { &:link, diff --git a/client/src/telemetry/constants.ts b/client/src/telemetry/constants.ts index a3578449247b..2a323e10e759 100644 --- a/client/src/telemetry/constants.ts +++ b/client/src/telemetry/constants.ts @@ -13,6 +13,8 @@ export const BANNER_MULTIPLE_COLLECTIONS_DISMISSED = "banner_multiple_collections_dismissed"; export const BANNER_MULTIPLE_COLLECTIONS_LINK = "banner_multiple_collections_link"; +export const BANNER_NEWSLETTER_DISMISSED = "banner_newsletter_dismissed"; +export const BANNER_NEWSLETTER_LINK = "banner_newsletter_link"; export const NEW_COLLECTION_MODAL_SUBMIT_ARTICLE_ACTIONS = "new_collection_modal_submit_article_actions"; export const NEW_COLLECTION_MODAL_SUBMIT_COLLECTIONS_PAGE = diff --git a/client/src/ui/atoms/button/index.tsx b/client/src/ui/atoms/button/index.tsx index af2dce0ec993..e67916f72e34 100644 --- a/client/src/ui/atoms/button/index.tsx +++ b/client/src/ui/atoms/button/index.tsx @@ -5,10 +5,6 @@ import InternalLink from "../internal-link"; import "./index.scss"; type ButtonProps = { - ariaControls?: string; - ariaExpanded?: boolean; - ariaHasPopup?: "true" | "false" | "menu" | "dialog" | "listbox"; - ariaLabel?: string; title?: string; type?: "primary" | "secondary" | "action" | "select" | "link"; @@ -40,10 +36,6 @@ type ButtonProps = { }; export const Button = ({ - ariaControls, - ariaExpanded, - ariaHasPopup, - ariaLabel, title, name, type = "primary", @@ -61,6 +53,7 @@ export const Button = ({ state, value, children, + ...passthroughAttrs }: ButtonProps) => { let buttonClasses = "button"; [type, size, state].forEach((attr) => { @@ -96,8 +89,8 @@ export const Button = ({ id={id} onClick={onClickHandler} onFocus={onFocusHandler} - aria-label={ariaLabel} title={title} + {...passthroughAttrs} > <span className="button-wrap">{renderContent()}</span> </a> @@ -111,8 +104,8 @@ export const Button = ({ id={id} onClick={onClickHandler} onFocus={onFocusHandler} - aria-label={ariaLabel} title={title} + {...passthroughAttrs} > <span className="button-wrap">{renderContent()}</span> </InternalLink> @@ -120,10 +113,6 @@ export const Button = ({ } return ( <button - aria-controls={ariaControls} - aria-expanded={ariaExpanded} - aria-haspopup={ariaHasPopup} - aria-label={ariaLabel} title={title} disabled={isDisabled} id={id} @@ -133,6 +122,7 @@ export const Button = ({ onFocus={onFocusHandler} value={value} name={name} + {...passthroughAttrs} > <span className="button-wrap">{renderContent()}</span> </button> diff --git a/client/src/ui/atoms/limit-banner/index.tsx b/client/src/ui/atoms/limit-banner/index.tsx index 9ed9007d479a..bb8cb971e59f 100644 --- a/client/src/ui/atoms/limit-banner/index.tsx +++ b/client/src/ui/atoms/limit-banner/index.tsx @@ -7,12 +7,9 @@ export default function LimitBanner({ type = "collections" }) { "You have 0 free saves remaining", "and unlock unlimited collections", ]; - const notifications = [ - "You have reached the limit of articles you can watch", - "and watch unlimited articles!", - ]; const locale = useLocale(); - const text = type === "collections" ? collections : notifications; + const text = + type === "collections" ? collections : ["This should not happen!", "🤷♂️"]; return ( <div className="limit-banner"> diff --git a/client/src/ui/atoms/search/index.scss b/client/src/ui/atoms/search/index.scss index 58315dd40620..7c13b61dab1d 100644 --- a/client/src/ui/atoms/search/index.scss +++ b/client/src/ui/atoms/search/index.scss @@ -31,7 +31,18 @@ outline: var(--border-primary); } + &:not([value=""]) { + ~ .button.clear-search-button { + display: block; + right: 2.1rem; + } + } + &::placeholder { color: var(--text-inactive); } + + .button.clear-search-button { + display: none; + } } diff --git a/client/src/ui/atoms/search/index.tsx b/client/src/ui/atoms/search/index.tsx index fb22a4ef360b..f2709a81b062 100644 --- a/client/src/ui/atoms/search/index.tsx +++ b/client/src/ui/atoms/search/index.tsx @@ -11,6 +11,7 @@ type SearchProps = { onChangeHandler?: (event: React.ChangeEvent<HTMLInputElement>) => void; onClickHandler?: (event: React.MouseEvent<Element>) => void; onFocusHandler?: (event: React.FocusEvent<Element>) => void; + onResetHandler?: () => void; }; export const Search = ({ @@ -20,6 +21,7 @@ export const Search = ({ onChangeHandler, onClickHandler, onFocusHandler, + onResetHandler, placeholder, value, }: SearchProps) => { @@ -32,18 +34,36 @@ export const Search = ({ placeholder={placeholder} value={value} disabled={isDisabled} - onBlur={onBlurHandler} + onBlur={(e) => + onBlurHandler && + !e.currentTarget.parentElement?.contains(e.relatedTarget) && + onBlurHandler(e) + } onFocus={onFocusHandler} onChange={onChangeHandler} onClick={onClickHandler} /> + + {onResetHandler && ( + <button + type="button" + className="button action has-icon clear-search-button" + onClick={onResetHandler} + > + <span className="button-wrap"> + <span className="icon icon-cancel"></span> + <span className="visually-hidden">Clear search input</span> + </span> + </button> + )} + <button type="submit" disabled={isDisabled} className="button action has-icon search-button search-filter-button" > <span className="button-wrap"> - <span className="icon icon-search undefined"></span> + <span className="icon icon-search"></span> <span className="visually-hidden">Search</span> </span> </button> diff --git a/client/src/ui/molecules/document-survey/surveys.ts b/client/src/ui/molecules/document-survey/surveys.ts index 4bc32ecb99f7..a116482d6c20 100644 --- a/client/src/ui/molecules/document-survey/surveys.ts +++ b/client/src/ui/molecules/document-survey/surveys.ts @@ -20,6 +20,7 @@ export interface Survey { enum SurveyBucket { BROWSER_SURVEY_OCT_2022 = "BROWSER_SURVEY_OCT_2022", CSS_CASCADE_2022 = "CSS_CASCADE_2022", + FIREFOX_WEB_COMPAT_2023 = "FIREFOX_WEB_COMPAT_2023", INTEROP_2023 = "INTEROP_2023", } @@ -27,34 +28,22 @@ enum SurveyKey { BROWSER_SURVEY_OCT_2022 = "BROWSER_SURVEY_OCT_2022", CSS_CASCADE_2022_A = "CSS_CASCADE_2022_A", CSS_CASCADE_2022_B = "CSS_CASCADE_2022_B", + FIREFOX_WEB_COMPAT_2023 = "FIREFOX_WEB_COMPAT_2023", INTEROP_2023_CSS_HTML = "INTEROP_2023_CSS_HTML", INTEROP_2023_API_JS = "INTEROP_2023_API_JS", } export const SURVEYS: Survey[] = [ { - key: SurveyKey.INTEROP_2023_CSS_HTML, - bucket: SurveyBucket.INTEROP_2023, - show: (doc: Doc) => /en-US\/docs\/Web\/(CSS|HTML)(\/|$)/i.test(doc.mdn_url), - src: "https://survey.alchemer.com/s3/7081564/MDN-Interop-2023-CSS-HTML", - teaser: - "Browser vendors are working together to improve feature support across browsers. Shape the future of the web by taking this 1-question survey!", - question: - "Which features should be improved across browsers in the coming year?", - ...survey_duration(SurveyBucket.INTEROP_2023), - ...survey_rates(SurveyKey.INTEROP_2023_CSS_HTML), - }, - { - key: SurveyKey.INTEROP_2023_API_JS, - bucket: SurveyBucket.INTEROP_2023, + key: SurveyKey.FIREFOX_WEB_COMPAT_2023, + bucket: SurveyBucket.FIREFOX_WEB_COMPAT_2023, show: (doc: Doc) => - /en-US\/docs\/Web\/(API|JavaScript)(\/|$)/i.test(doc.mdn_url), - src: "https://survey.alchemer.com/s3/7081727/MDN-Interop-2023-APIs-JavaScript", + /en-US\/docs\/Web\/(JavaScript|API)(\/|$)/i.test(doc.mdn_url), + src: "https://survey.alchemer.com/s3/7195211/Help-prioritize-cross-browser-web-platform-features", teaser: - "Browser vendors are working together to improve feature support across browsers. Shape the future of the web by taking this 1-question survey!", - question: - "Which features should be improved across browsers in the coming year?", - ...survey_duration(SurveyBucket.INTEROP_2023), - ...survey_rates(SurveyKey.INTEROP_2023_API_JS), + "Ensuring the web is open and accessible to all is central to Mozilla’s mission. The Firefox product team is interested in learning which features are most important to support across all major browsers.", + question: "Let us know what you think.", + ...survey_duration(SurveyBucket.FIREFOX_WEB_COMPAT_2023), + ...survey_rates(SurveyKey.FIREFOX_WEB_COMPAT_2023), }, ]; diff --git a/client/src/ui/molecules/menu/index.tsx b/client/src/ui/molecules/menu/index.tsx index d7d66b09e09a..4105d9bf3da2 100644 --- a/client/src/ui/molecules/menu/index.tsx +++ b/client/src/ui/molecules/menu/index.tsx @@ -1,4 +1,3 @@ -import InternalLink from "../../atoms/internal-link"; import { MenuEntry, Submenu } from "../submenu"; import "./index.scss"; @@ -33,14 +32,14 @@ export const Menu = ({ menu, isOpen, toggle }: MenuProps) => { </button> {menu.to && ( - <InternalLink - to={menu.to} + <a + href={menu.to} className="top-level-entry" // @ts-ignore onClick={() => document?.activeElement?.blur()} > {menu.label} - </InternalLink> + </a> )} <Submenu diff --git a/client/src/ui/molecules/paginator/index.tsx b/client/src/ui/molecules/paginator/index.tsx index a55b4bb5f7c3..0bf24c687e9b 100644 --- a/client/src/ui/molecules/paginator/index.tsx +++ b/client/src/ui/molecules/paginator/index.tsx @@ -47,7 +47,7 @@ export function Paginator({ onChange?: (page: number, oldPage: number) => unknown; }) { const [searchParams] = useSearchParams(); - const current = parseInt(searchParams.get(PARAM), 10) || first; + const current = parseInt(searchParams.get(PARAM) || "", 10) || first; const middleFirst = Math.max(current - middlePadding, first); const middleLast = Math.min(middleFirst + middlePadding * 2 + 1, last + 1); const left = range(first, Math.min(endPadding, middleFirst)); diff --git a/client/src/ui/molecules/plus-menu/index.tsx b/client/src/ui/molecules/plus-menu/index.tsx index 569b244fdff6..846726001476 100644 --- a/client/src/ui/molecules/plus-menu/index.tsx +++ b/client/src/ui/molecules/plus-menu/index.tsx @@ -36,13 +36,6 @@ export const PlusMenu = ({ visibleSubMenuId, toggleMenu }) => { label: "Collections", url: `/${locale}/plus/collections`, }, - { - description: "Updates from the pages you’re watching", - hasIcon: true, - iconClasses: "submenu-icon", - label: "Notifications", - url: `/${locale}/plus/notifications`, - }, ] : []), { diff --git a/client/src/ui/molecules/search/index.scss b/client/src/ui/molecules/search/index.scss index d445a657304e..c79f794b69db 100644 --- a/client/src/ui/molecules/search/index.scss +++ b/client/src/ui/molecules/search/index.scss @@ -159,7 +159,7 @@ } } - a { + > * { display: block; padding: 0.5rem; } diff --git a/client/src/ui/molecules/theme-switcher/index.tsx b/client/src/ui/molecules/theme-switcher/index.tsx index 4c3aac1eb29e..bb2e2c4747d0 100644 --- a/client/src/ui/molecules/theme-switcher/index.tsx +++ b/client/src/ui/molecules/theme-switcher/index.tsx @@ -67,8 +67,8 @@ export const ThemeSwitcher = () => { > <Button type="action" - ariaHasPopup={"menu"} - ariaExpanded={isOpen || undefined} + aria-haspopup={"menu"} + aria-expanded={isOpen || undefined} icon={`theme-${activeTheme}`} extraClasses="theme-switcher-menu small" onClickHandler={() => { diff --git a/client/src/ui/molecules/user-menu/index.scss b/client/src/ui/molecules/user-menu/index.scss index 8aa6a7f5a930..f3bf16f5d07b 100644 --- a/client/src/ui/molecules/user-menu/index.scss +++ b/client/src/ui/molecules/user-menu/index.scss @@ -8,15 +8,15 @@ } .button.user-menu-toggle { - .notification-dot ~ .avatar-wrap::after { + .dot ~ .avatar-wrap::after { background: var(--text-primary-blue); border: 1px solid var(--background-primary); border-radius: 2rem; - bottom: 0; content: ""; height: 0.5rem; position: absolute; right: 0; + top: 0; width: 0.5rem; } } diff --git a/client/src/ui/molecules/user-menu/index.tsx b/client/src/ui/molecules/user-menu/index.tsx index 9f0d386eb8eb..08b0c406e9bd 100644 --- a/client/src/ui/molecules/user-menu/index.tsx +++ b/client/src/ui/molecules/user-menu/index.tsx @@ -1,42 +1,23 @@ -import { useEffect, useState } from "react"; +import { useState } from "react"; import { Avatar } from "../../atoms/avatar"; import { Button } from "../../atoms/button"; import { Submenu } from "../submenu"; import SignOut from "../../atoms/signout"; import { useUserData } from "../../../user-context"; -import { useIsServer, useLocale } from "../../../hooks"; -import { HEADER_NOTIFICATIONS_MENU_API_URL } from "../../../constants"; +import { useIsServer, useLocale, useViewedState } from "../../../hooks"; +import { FeatureId } from "../../../constants"; import "./index.scss"; import { DropdownMenu, DropdownMenuWrapper } from "../dropdown"; -import { NotificationData } from "../../../types/notifications"; -import useSWR from "swr"; +import { NEWSLETTER_ENABLED } from "../../../env"; export const UserMenu = () => { const userData = useUserData(); const locale = useLocale(); const isServer = useIsServer(); + const { isViewed } = useViewedState(); const [isOpen, setIsOpen] = useState<boolean>(false); - const [newNotifications, setNewNotifications] = useState<boolean>(false); - const { data } = useSWR<NotificationData>( - HEADER_NOTIFICATIONS_MENU_API_URL, - async (url) => { - const response = await fetch(url); - if (!response.ok) { - const text = await response.text(); - throw new Error(`${response.status} on ${url}: ${text}`); - } - return await response.json(); - }, - { - revalidateOnFocus: false, - } - ); - - useEffect(() => { - setNewNotifications(Boolean(data?.items?.length)); - }, [data]); // if we don't have the user data yet, don't render anything if (!userData || isServer) { @@ -51,11 +32,6 @@ export const UserMenu = () => { label: userData.email || "", extraClasses: "submenu-header", }, - { - label: "Notifications", - url: `/${locale}/plus/notifications`, - dot: newNotifications ? "New notifications" : undefined, - }, { label: "Collections", url: `/${locale}/plus/collections`, @@ -67,6 +43,14 @@ export const UserMenu = () => { { label: "My Settings", url: "/en-US/plus/settings", + dot: + NEWSLETTER_ENABLED && + userData?.isSubscriber && + Date.now() < 1677628799000 && // new Date("2023-02-28 23:59:59Z").getTime() + !userData?.settings?.mdnplusNewsletter && + !isViewed(FeatureId.PLUS_NEWSLETTER) + ? "New feature" + : undefined, }, { url: "https://support.mozilla.org/products/mdn-plus", @@ -83,6 +67,8 @@ export const UserMenu = () => { ], }; + const hasAnyDot = userMenuItems.items.some((item) => item.dot); + return ( <DropdownMenuWrapper className="top-level-entry-container user-menu" @@ -93,18 +79,14 @@ export const UserMenu = () => { type="action" id={`${userMenuItems.id}-button`} extraClasses="top-level-entry menu-toggle user-menu-toggle" - ariaControls={userMenuItems.id} - ariaHasPopup="menu" - ariaExpanded={isOpen || undefined} + aria-controls={userMenuItems.id} + aria-haspopup="menu" + aria-expanded={isOpen || undefined} onClickHandler={() => { setIsOpen(!isOpen); }} > - {newNotifications && ( - <span className="visually-hidden notification-dot"> - New notifications received. - </span> - )} + {hasAnyDot && <span className="visually-hidden dot">New feature</span>} <Avatar userData={userData} /> <span className="user-menu-id">{userData.email}</span> </Button> diff --git a/client/src/ui/organisms/article-actions-container/index.tsx b/client/src/ui/organisms/article-actions-container/index.tsx index 113c4019e25f..064055033f79 100644 --- a/client/src/ui/organisms/article-actions-container/index.tsx +++ b/client/src/ui/organisms/article-actions-container/index.tsx @@ -26,7 +26,9 @@ export const ArticleActionsContainer = ({ extraClasses="sidebar-button" icon="sidebar" type="action" - aria-label="Expand sidebar" + aria-label={isSidebarOpen ? "Collapse sidebar" : "Expand sidebar"} + aria-expanded={isSidebarOpen} + aria-controls="sidebar-quicklinks" onClickHandler={() => setIsSidebarOpen(!isSidebarOpen)} /> diff --git a/client/src/ui/organisms/article-actions/bookmark-menu/index.tsx b/client/src/ui/organisms/article-actions/bookmark-menu/index.tsx index 02ae8b606bbd..ee410b057a8b 100644 --- a/client/src/ui/organisms/article-actions/bookmark-menu/index.tsx +++ b/client/src/ui/organisms/article-actions/bookmark-menu/index.tsx @@ -144,6 +144,8 @@ function BookmarkMenuDropdown({ else if (savedItems?.length) { setFormItem(savedItems[0]); setSaved(true); + } else { + setSaved(false); } }, [item, savedItems, setSaved]); diff --git a/client/src/ui/organisms/article-actions/index.tsx b/client/src/ui/organisms/article-actions/index.tsx index 306432bb90f1..541c7646a059 100644 --- a/client/src/ui/organisms/article-actions/index.tsx +++ b/client/src/ui/organisms/article-actions/index.tsx @@ -1,5 +1,4 @@ import { Button } from "../../atoms/button"; -import { NotificationsWatchMenu } from "./notifications-watch-menu"; import { LanguageMenu } from "./language-menu"; import { useIsServer } from "../../../hooks"; @@ -68,11 +67,6 @@ export const ArticleActions = ({ </Button> <ul className="article-actions-entries"> <> - {!isServer && isAuthenticated && ( - <li className="article-actions-entry"> - <NotificationsWatchMenu doc={doc} /> - </li> - )} {!isServer && isAuthenticated && ( <li className="article-actions-entry"> <BookmarkMenu 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 7f0021ddb591..d5b68528f39b 100644 --- a/client/src/ui/organisms/article-actions/language-menu/index.tsx +++ b/client/src/ui/organisms/article-actions/language-menu/index.tsx @@ -104,8 +104,8 @@ export function LanguageMenu({ <Button id="languages-switcher-button" type="action" - ariaHasPopup={"menu"} - ariaExpanded={isOpen || undefined} + aria-haspopup={"menu"} + aria-expanded={isOpen || undefined} icon="language" size="small" extraClasses="languages-switcher-menu" diff --git a/client/src/ui/organisms/article-actions/manage-upgrade-dialog/index.tsx b/client/src/ui/organisms/article-actions/manage-upgrade-dialog/index.tsx index 41a257ee5515..7e08b7c91753 100644 --- a/client/src/ui/organisms/article-actions/manage-upgrade-dialog/index.tsx +++ b/client/src/ui/organisms/article-actions/manage-upgrade-dialog/index.tsx @@ -2,39 +2,6 @@ import { useLocale } from "../../../../hooks"; import { Button } from "../../../atoms/button"; import { Icon } from "../../../atoms/icon"; -export function ManageOrUpgradeDialogNotifications({ setShow }) { - const locale = useLocale(); - - return ( - <div - className="article-actions-submenu manage-upgrade-dialog show" - role="menu" - aria-labelledby={`manage-upgrade-dialog-button`} - > - <button onClick={() => setShow(false)} className="header mobile-only"> - <span className="header-inner"> - <Icon name="chevron" /> - Back - </span> - </button> - <p>You've reached the limit of articles you can watch!</p> - <p> - Manage your notifications settings or upgrade to MDN Plus to unlock - unlimited subscriptions - </p> - <div className="mdn-form-item is-button-row"> - <Button - type="secondary" - href={`/${locale}/plus/notifications/watching`} - > - Manage - </Button> - <Button href={`/${locale}/plus`}>Upgrade</Button> - </div> - </div> - ); -} - export function ManageOrUpgradeDialogCollections({ setShow }) { const locale = useLocale(); diff --git a/client/src/ui/organisms/article-actions/notifications-watch-menu/index.tsx b/client/src/ui/organisms/article-actions/notifications-watch-menu/index.tsx deleted file mode 100644 index 4a67b202d519..000000000000 --- a/client/src/ui/organisms/article-actions/notifications-watch-menu/index.tsx +++ /dev/null @@ -1,150 +0,0 @@ -import React, { useEffect } from "react"; - -import { Button } from "../../../atoms/button"; -import { NotificationsWatchMenuStart } from "./menu-start"; - -import useSWR from "swr"; -import { useOnlineStatus } from "../../../../hooks"; -import { DropdownMenu, DropdownMenuWrapper } from "../../../molecules/dropdown"; -import { ManageOrUpgradeDialogNotifications } from "../manage-upgrade-dialog"; -import { Overlay, useUIStatus } from "../../../../ui-context"; -import { Doc, DocMetadata } from "../../../../../../libs/types/document"; - -interface WatchModeData { - status: string; - subscription_limit_reached: boolean; -} - -export const NotificationsWatchMenu = ({ - doc, -}: { - doc?: Doc | DocMetadata; -}) => { - const path = doc?.browserCompat?.[0] || doc?.mdn_url; - const title = doc?.title; - - const menuId = "watch-submenu"; - const [show, setShow] = React.useState(false); - const closeDropdown = () => setShow(false); - - const slug = doc?.mdn_url; // Unique ID for the page - const apiURL = `/api/v1/plus/watching/?url=${slug}`; - const { isOffline } = useOnlineStatus(); - const { setToastData, toggleMobileOverlay } = useUIStatus(); - - useEffect(() => { - toggleMobileOverlay(Overlay.WatchMenu, show); - }, [show, toggleMobileOverlay]); - - const { data, mutate } = useSWR<WatchModeData>( - () => slug && apiURL, - async (url) => { - const response = await fetch(url); - if (!response.ok) { - const text = await response.text(); - throw new Error(`${response.status} on ${url}: ${text}`); - } - return await response.json(); - }, - { - revalidateOnFocus: true, - } - ); - const watching = data?.status && data.status !== "unwatched"; - const canWatchMore = !Boolean(data?.subscription_limit_reached); - - async function handleWatchSubmit({ unwatch }: { unwatch?: boolean }) { - if (!data) { - return null; - } - - if (!path || !title) { - console.log( - "this page is missing a path or a title from browser compat", - path, - title - ); - console.log(doc); - return; - } - - let postData: { - path: string; - title: string; - unwatch?: boolean; - } = { - path, - title, - unwatch, - }; - - const response = await fetch(apiURL, { - method: "POST", - body: JSON.stringify(postData), - headers: { - "Content-Type": "application/json", - }, - }); - - if (!response.ok) { - const json = await response.json(); - if (json?.error === "max_subscriptions") { - setToastData({ - mainText: "Couldn't watch article - Max subscriptions reached!", - isImportant: false, - }); - return; - } - - throw new Error(`${response.status} on ${slug}`); - } - await mutate(); - return true; - } - - const watchIcon = watching ? "eye-filled" : canWatchMore ? "eye" : "padlock"; - return ( - <DropdownMenuWrapper isOpen={show} setIsOpen={setShow}> - <React.Suspense fallback={null}> - <Button - type="action" - id="watch-menu-button" - isDisabled={isOffline || !doc} - icon={watchIcon} - extraClasses={`small ${watching ? "highlight" : ""}`} - ariaHasPopup={"menu"} - aria-label="Watch this page for updates" - ariaExpanded={show} - onClickHandler={() => { - if (show || data) setShow(!show); - }} - > - {watching ? "Watching" : "Watch"} - </Button> - </React.Suspense> - {!canWatchMore && !watching ? ( - <DropdownMenu> - <ManageOrUpgradeDialogNotifications setShow={setShow} /> - </DropdownMenu> - ) : ( - <DropdownMenu> - <div - className="article-actions-submenu show" - role="menu" - aria-labelledby={`${menuId}-button`} - > - <NotificationsWatchMenuStart - closeDropdown={closeDropdown} - data={data} - handleSelection={(unwatch: boolean) => { - if (!watching || unwatch) { - handleWatchSubmit({ unwatch }); - } - }} - /> - </div> - </DropdownMenu> - )} - </DropdownMenuWrapper> - ); -}; diff --git a/client/src/ui/organisms/article-actions/notifications-watch-menu/menu-item.scss b/client/src/ui/organisms/article-actions/notifications-watch-menu/menu-item.scss deleted file mode 100644 index dcfc474240c5..000000000000 --- a/client/src/ui/organisms/article-actions/notifications-watch-menu/menu-item.scss +++ /dev/null @@ -1,47 +0,0 @@ -.watch-menu-item { - background-color: transparent; - border-bottom: 1px solid var(--border-primary); - color: var(--text-primary); - cursor: pointer; - padding: 0; - - &:first-of-type { - border-top-width: 0; - } - - &-inner { - display: grid; - gap: 0.5rem; - grid-template-areas: - "status label" - "status text"; - grid-template-columns: 16px 1fr; - padding: 0.8125rem var(--gutter-padding); - text-align: left; - } - - &:focus &-inner { - box-shadow: var(--focus-effect); - outline: 1px solid var(--button-secondary-border-focus); - } - - &:hover &-inner { - background-color: var(--border-secondary); - } - - &-status { - grid-area: status; - } - - &-label { - font-family: var(--font-body); - font-size: var(--type-smaller-font-size); - font-weight: var(--font-body-strong-weight); - grid-area: label; - } - - &-text { - font-size: var(--type-smaller-font-size); - grid-area: text; - } -} diff --git a/client/src/ui/organisms/article-actions/notifications-watch-menu/menu-item.tsx b/client/src/ui/organisms/article-actions/notifications-watch-menu/menu-item.tsx deleted file mode 100644 index 8f5a3076bd15..000000000000 --- a/client/src/ui/organisms/article-actions/notifications-watch-menu/menu-item.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import React from "react"; -import { Icon } from "../../../atoms/icon"; - -import "./menu-item.scss"; - -type WatchMenuItemProps = { - value: string; - checked: boolean; - label: string; - text?: string; - onClickHandler?: React.MouseEventHandler; -}; - -export function WatchMenuItem({ - value, - onClickHandler, - checked, - label, - text, -}: WatchMenuItemProps) { - return ( - <button - role="menuitemradio" - aria-checked={checked} - className="watch-menu-item" - value={value} - onClick={onClickHandler} - > - <span className="watch-menu-item-inner"> - {checked && ( - <span className="watch-menu-item-status"> - <Icon name="checkmark" /> - </span> - )} - - <span className="watch-menu-item-label">{label}</span> - {text && <span className="watch-menu-item-text">{text}</span>} - </span> - </button> - ); -} diff --git a/client/src/ui/organisms/article-actions/notifications-watch-menu/menu-start.tsx b/client/src/ui/organisms/article-actions/notifications-watch-menu/menu-start.tsx deleted file mode 100644 index a33017cabdff..000000000000 --- a/client/src/ui/organisms/article-actions/notifications-watch-menu/menu-start.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { WatchMenuItem } from "./menu-item"; -import { Icon } from "../../../atoms/icon"; - -export function NotificationsWatchMenuStart({ - data, - handleSelection, - closeDropdown, -}) { - const selected: { [x: string]: boolean } = { [data.status]: true }; - const majorText = "Receive notifications of revisions to this article."; - - return ( - <> - <div> - <button onClick={closeDropdown} className="header mobile-only"> - <span className="header-inner"> - <Icon name="chevron" /> - Notifications - </span> - </button> - <h2 className="header desktop-only">Notifications</h2> - </div> - - <WatchMenuItem - value="major" - label={selected.major ? "Watching page" : "Watch page"} - text={majorText} - checked={selected.major} - onClickHandler={() => { - handleSelection(); - }} - /> - <WatchMenuItem - value="unwatch" - label={selected.unwatched ? "Not watching" : "Unwatch"} - text={ - selected.unwatched - ? "Not receiving notifications about this article." - : "Stop receiving notifications about this article." - } - checked={selected.unwatched} - onClickHandler={() => { - handleSelection(true); - }} - /> - </> - ); -} diff --git a/client/src/ui/organisms/top-navigation-main/index.scss b/client/src/ui/organisms/top-navigation-main/index.scss index a6e8a089ccd7..392e7b668dec 100644 --- a/client/src/ui/organisms/top-navigation-main/index.scss +++ b/client/src/ui/organisms/top-navigation-main/index.scss @@ -23,12 +23,8 @@ order: 2; } - .notifications-menu { - order: 3; - } - .user-menu { - order: 4; + order: 3; } .top-level-entry-container { @@ -180,16 +176,12 @@ order: 1; } - .notifications-menu { - order: 2; - } - .auth-container { - order: 3; + order: 2; } .user-menu { - order: 4; + order: 3; } .menu-toggle + .top-level-entry { diff --git a/client/src/ui/organisms/top-navigation/index.tsx b/client/src/ui/organisms/top-navigation/index.tsx index fe9160c7f9db..2a80b4d35816 100644 --- a/client/src/ui/organisms/top-navigation/index.tsx +++ b/client/src/ui/organisms/top-navigation/index.tsx @@ -41,9 +41,9 @@ export function TopNavigation() { <Logo /> <Button type="action" - ariaHasPopup={"menu"} - ariaLabel={assistiveText} - ariaExpanded={showMainMenu} + aria-haspopup={"menu"} + aria-label={assistiveText} + aria-expanded={showMainMenu} title={assistiveText} icon={showMainMenu ? "cancel" : "menu"} onClickHandler={toggleMainMenu} diff --git a/client/src/user-context.tsx b/client/src/user-context.tsx index 68c15c232499..18399adbfb59 100644 --- a/client/src/user-context.tsx +++ b/client/src/user-context.tsx @@ -2,9 +2,15 @@ import * as React from "react"; import useSWR from "swr"; import { DISABLE_AUTH, DEFAULT_GEO_COUNTRY } from "./env"; -import { fetchAllCollectionsItems } from "./plus/collections-quicksearch"; import { FREQUENTLY_VIEWED_STORAGE_KEY } from "./plus/collections/frequently-viewed"; +const DEPRECATED_LOCAL_STORAGE_KEYS = [ + "collection-items", + "collection-items-updated-date", +]; + +export const OFFLINE_SETTINGS_KEY = "MDNSettings"; + export enum SubscriptionType { MDN_CORE = "core", MDN_PLUS_5M = "mdn_plus_5m", @@ -14,8 +20,8 @@ export enum SubscriptionType { } export type UserPlusSettings = { - colInSearch: boolean; collectionLastModified: Date | null; + mdnplusNewsletter: boolean | null; }; export class OfflineSettingsData { @@ -37,7 +43,7 @@ export class OfflineSettingsData { let settingsData: OfflineSettingsData | undefined; try { settingsData = JSON.parse( - window.localStorage.getItem("MDNSettings") || "{}" + window.localStorage.getItem(OFFLINE_SETTINGS_KEY) || "{}" ); } catch (err) { console.warn("Unable to read settings from localStorage", err); @@ -48,7 +54,7 @@ export class OfflineSettingsData { write() { try { - window.localStorage.setItem("MDNSettings", JSON.stringify(this)); + window.localStorage.setItem(OFFLINE_SETTINGS_KEY, JSON.stringify(this)); } catch (err) { console.warn("Unable to write settings to localStorage", err); } @@ -109,7 +115,7 @@ function getSessionStorageData() { export function cleanupUserData() { removeSessionStorageData(); - removeLocalStorageData(); + removeLocalStorageData(FREQUENTLY_VIEWED_STORAGE_KEY); if (window.mdnWorker) { window.mdnWorker.cleanDb(); window.mdnWorker.disableServiceWorker(); @@ -127,14 +133,17 @@ function removeSessionStorageData() { } } -function removeLocalStorageData() { +function removeLocalStorageData(key: string) { try { - localStorage.removeItem(FREQUENTLY_VIEWED_STORAGE_KEY); + localStorage.removeItem(key); } catch (e) { - console.warn( - "Unable to delete frequently viewed items from localStorage", - e - ); + console.warn(`Unable to delete ${key} from localStorage`, e); + } +} + +function removeDeprecatedLocalStorageData() { + for (const key of DEPRECATED_LOCAL_STORAGE_KEYS) { + removeLocalStorageData(key); } } @@ -160,10 +169,10 @@ export function UserDataProvider(props: { children: React.ReactNode }) { data?.settings?.collections_last_modified_time; const settings: UserPlusSettings | null = data?.settings ? { - colInSearch: data?.settings?.col_in_search || false, collectionLastModified: (collectionLastModified && new Date(collectionLastModified)) || null, + mdnplusNewsletter: data?.settings?.mdnplus_newsletter || null, } : null; @@ -192,6 +201,10 @@ export function UserDataProvider(props: { children: React.ReactNode }) { } ); + React.useEffect(() => { + removeDeprecatedLocalStorageData(); + }, []); + React.useEffect(() => { if (data) { // At this point, the XHR request has set `data` to be an object. @@ -199,9 +212,6 @@ export function UserDataProvider(props: { children: React.ReactNode }) { data.offlineSettings = OfflineSettingsData.read(); setSessionStorageData(data); - if (data.settings?.colInSearch) { - fetchAllCollectionsItems(data.settings?.collectionLastModified || null); - } // Let's initialize the MDN Worker if applicable. if (!window.mdnWorker && data?.offlineSettings?.offline) { import("./settings/mdn-worker").then(({ getMDNWorker }) => { diff --git a/client/tsconfig.json b/client/tsconfig.json index d9c48abe5bd4..14c196eeb146 100644 --- a/client/tsconfig.json +++ b/client/tsconfig.json @@ -7,7 +7,8 @@ "isolatedModules": true, "noEmit": true, "noFallthroughCasesInSwitch": true, - "jsx": "react-jsx" + "jsx": "react-jsx", + "strictNullChecks": true }, "include": ["src"] } diff --git a/content/document.ts b/content/document.ts index c41e2d93821c..9f8a42ff05b0 100644 --- a/content/document.ts +++ b/content/document.ts @@ -242,14 +242,14 @@ export const read = memoize((folderOrFilePath: string, ...roots: string[]) => { locale = extractLocale(folder); } - if (filePath.includes(" ")) { + if (folder.includes(" ")) { throw new Error( `Folder contains whitespace which is not allowed (${util.inspect( filePath )})` ); } - if (filePath.includes("\u200b")) { + if (folder.includes("\u200b")) { throw new Error( `Folder contains zero width whitespace which is not allowed (${filePath})` ); diff --git a/content/translation.ts b/content/translation.ts index e2246945a9ec..e97b6dd0c34d 100644 --- a/content/translation.ts +++ b/content/translation.ts @@ -58,13 +58,10 @@ const IMPORTANT_MACROS = new Map( "MDNSidebar", "SVGRef", "SeeCompatTable", - "ServiceWorkerSidebar", "Specifications", - "ToolsSidebar", "WebAssemblySidebar", "WebExtAPISidebar", "WebGLSidebar", - "WebRTCSidebar", "languages", "page", ].map((name) => [name.toLowerCase(), name]) diff --git a/copy/plus/faq.md b/copy/plus/faq.md index 2c1e9e2ab9cd..3afb52ce160d 100644 --- a/copy/plus/faq.md +++ b/copy/plus/faq.md @@ -8,8 +8,7 @@ title: FAQ MDN Plus is a premium subscription service launched in March 2022 by Mozilla. The service allows users to customize their MDN Web Docs experience through -premium features such as -[Notifications](/en-US/plus/docs/features/notifications), +premium features such as [Updates](/en-US/plus/docs/features/updates), [Collections](/en-US/plus/docs/features/collections) and [MDN Offline](/en-US/plus/docs/features/offline). @@ -56,7 +55,7 @@ as the overall user experience on the website. MDN content is made available under a CC BY-SA 2.5 license. That license doesn't preclude Mozilla (or other users of MDN content) from having a paid product. MDN -Plus adds premium features like notifications and collections on top of the free +Plus adds premium features like updates and collections on top of the free content. Regular users can still access and reuse MDN content under the Creative Commons license. diff --git a/copy/plus/features/notifications.md b/copy/plus/features/notifications.md deleted file mode 100644 index 81f5f9e5285d..000000000000 --- a/copy/plus/features/notifications.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -title: Notifications ---- - -# Notifications - -> No more surprises: _watch specific pages_ for changes that impact your -> projects -> -> From tutorial pages to API references, get notifications for the latest -> developments on MDN. - -When you watch a page, MDN Plus sends you notifications for significant events -relating to that page. For example, you’ll receive a notification when there’s a -major update to the content of the page. - -If a page has a browser compatibility table, then you can subscribe to -notifications for web platform feature events such as: - -- New and upcoming browser support -- Removed browser support -- New subfeatures -- Fixes to missing support data - -## Getting started - -To start getting notifications, **watch** your first page. To do this, visit a -page, then click **Watch → Watch page**. - - - -When there are notifications, an indicator appears in the user menu on any MDN -page or in the notifications list. - -## See what pages you’re watching - -1. Click on your profile photo in the right corner of your screen and select - **Notifications** from the drop-down list. -  -2. On the notifications dashboard, click on **Watch list** -  - -## Star a notification and review it - -If you want to save a notification for later, go to the **Notifications page** -and click the **Star** icon next to the notification you want to save. To see a -list of starred notifications, go to the **Notifications** page and click -**Starred**. - - - -## Stop watching a page - -You can **stop watching a page** in two ways: - -1. Visit the page you want to stop watching, then click **Watching → Unwatch**. -  -2. Go to **Notifications -> Watch list**, and use the **⋮ menu** to the right of - the watched page and select **Unwatch**. Your watched page has now been - removed. Select Undo in the notification at the bottom of the screen to - revert this action. -  - -You can also **Bulk unwatch** by checking the box on top of your **Watched -list** and then clicking **Unwatch** - - - -## About your notifications inbox - -The user menu on MDN pages shows a dot when you have notifications. You can -review all of your read, unread, and starred notifications from the -notifications list. Only the most-recent 5,000 notifications are kept in your -inbox. Older notifications may be deleted. diff --git a/copy/plus/features/offline.md b/copy/plus/features/offline.md index a218593d289e..9a42178d726c 100644 --- a/copy/plus/features/offline.md +++ b/copy/plus/features/offline.md @@ -58,15 +58,3 @@ examples and large video files. You can also indicate you prefer offline content even when online. > NOTE: MDN Offline cannot be used while in a private or incognito window. - -### Collections - -Previously saved pages will appear as such, and you will be able to browse your -**Collections**. However, editing a saved page (adding/removing) does not work -without an active internet connection. - -### Notifications - -Previously received notifications will be displayed and can be read. However, -notifications read while in offline mode will not be marked as read for later, -and cannot be starred or deleted without an active internet connection. diff --git a/copy/plus/features/overview.md b/copy/plus/features/overview.md index b2291fc292ee..a6d91f6c9fa3 100644 --- a/copy/plus/features/overview.md +++ b/copy/plus/features/overview.md @@ -10,7 +10,7 @@ title: Feature Overview MDN Plus is a premium subscription service launched by Mozilla. The service allows users to customize their MDN Web Docs experience through premium features -such as Notifications, Collections and MDN Offline. +such as Collections, filtering Updates and MDN Offline. Learn more about MDN Plus on our [website](/) or in this [blogpost](https://hacks.mozilla.org/2022/03/introducing-mdn-plus-make-mdn-your-own/). diff --git a/copy/plus/features/updates.md b/copy/plus/features/updates.md new file mode 100644 index 000000000000..5c23532a8469 --- /dev/null +++ b/copy/plus/features/updates.md @@ -0,0 +1,83 @@ +--- +title: Updates +--- + +# Updates + +> Stay _up to date_ with MDN Updates +> +> Whether Web APIs, JavaScript, CSS, HTTP, or HTML, MDN Web Docs reflects the +> ever-changing landscape for features across the most popular browsers and +> devices with detailed documentation and guidance geared towards developers. + +When you're developing for the Web, you need to make sure you're building +applications with well-supported features to give your users the best +experience. Choosing new Web features means that you need to keep an eye on +compatibility changes as vendors frequently add, update, or remove support for +Web platform technologies. + +MDN Updates is a feature that helps you navigate and curate Web platform +technology support via a stream of updates. The results organized in the stream +of updates show compatibility by feature across fourteen different browser +engines, from iOS and Android to desktop and server platforms. + +Features are categorized by technology like CSS, HTML, JavaScript, HTTP, and +others to let you focus on the technologies that impact your development +projects. + +MDN Plus Updates lets you quickly get an overview of new, experimental, and +upcoming browser support, new sub-features under a major feature, deprecated or +removed support, and changes to existing browser compatibility data entries. + +## Using MDN Plus Updates + +To use Updates, navigate to the [MDN Plus Updates](/en-US/plus/updates) page, +where you can see a list of all changes in browser support for features on MDN +Web Docs listed by date. + + + +For each feature, updates display the release version and the date when browser +support changed. Expanding the update shows Browser Compatibility Tables to +indicate support across all browsers and devices. The feature update includes +links to MDN Web Docs pages with clear documentation and guidance on how to use +it. + + + +## Filtering and searching web platform updates + +By default, the list of updates shows all changes grouped by browser release +version and date. Selecting a browser from the dropdown menu will filter the +list of changes to only show changes for that browser. You can select a category +from the dropdown menu to only show changes for that technology category or +combine that with a browser filter to show only changes for a specific browser +and technology category. + + + +You can also search for a specific feature by name or keyword to find the +functionality you're looking for. + + + +## Curating your own collection of updates + +Aside from Browser Compatibility Tables and links to the MDN Web Docs pages, +expanding feature details provides an additional option to **Save** the feature. +Saving a feature will add it to a curated collection of features you want to +track. You can create multiple collections to organize and group features that +matter most for your applications and projects. + +Saving a feature to a collection allows you to add the feature to a collection +of saved features. You can create multiple collections to organize and group +features you want to track. + + + +To view your collection of saved features, click the **Saved** tab at the top of +the Updates page. + + + +Visit the [MDN Plus Updates](/en-US/plus/updates) page and give us feedback. diff --git a/deployer/README.md b/deployer/README.md index 38ed77028b45..8aa8e967a355 100644 --- a/deployer/README.md +++ b/deployer/README.md @@ -316,5 +316,5 @@ And to format all files with `black` run: ```sh cd deployer -poetry run black deployer +poetry run black . ``` diff --git a/deployer/aws-lambda/content-origin-request/index.js b/deployer/aws-lambda/content-origin-request/index.js index b86e94d53fb2..06144c9b675c 100644 --- a/deployer/aws-lambda/content-origin-request/index.js +++ b/deployer/aws-lambda/content-origin-request/index.js @@ -1,5 +1,5 @@ import { createRequire } from "node:module"; -/* eslint-disable n/no-missing-import */ + import { resolveFundamental } from "@yari-internal/fundamental-redirects"; import { getLocale } from "@yari-internal/locale-utils"; import { @@ -241,9 +241,13 @@ export async function handler(event) { // considered a "custom" origin because we're using S3 as a website. request.headers.host[0].value = request.origin.custom.domainName; // Conditionally rewrite the path (prefix) of the origin. - if (host.endsWith(CONTENT_DEVELOPMENT_DOMAIN)) { + if ( + host.endsWith(CONTENT_DEVELOPMENT_DOMAIN) && + !decodedUri.startsWith("/bcd/") + ) { // When reviewing PR's, each PR gets its own subdomain, and - // all of its content is prefixed with that subdomain in S3. + // all of its content is prefixed with that subdomain in S3, + // apart from the bcd data request.origin.custom.path = `/${host.split(".")[0]}`; } else { request.origin.custom.path = "/main"; diff --git a/deployer/aws-lambda/mdn-stripe-price-ids/package.json b/deployer/aws-lambda/mdn-stripe-price-ids/package.json index 490d2de54cc8..4ceb06c93156 100644 --- a/deployer/aws-lambda/mdn-stripe-price-ids/package.json +++ b/deployer/aws-lambda/mdn-stripe-price-ids/package.json @@ -14,7 +14,7 @@ "accept-language-parser": "1.5.0" }, "devDependencies": { - "jest": "29.3.1" + "jest": "29.4.1" }, "engines": { "node": ">=16.x" diff --git a/deployer/aws-lambda/mdn-stripe-price-ids/yarn.lock b/deployer/aws-lambda/mdn-stripe-price-ids/yarn.lock index bad98829d578..c180e07cb5cc 100644 --- a/deployer/aws-lambda/mdn-stripe-price-ids/yarn.lock +++ b/deployer/aws-lambda/mdn-stripe-price-ids/yarn.lock @@ -493,109 +493,109 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.3.1.tgz#3e3f876e4e47616ea3b1464b9fbda981872e9583" - integrity sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg== +"@jest/console@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.4.1.tgz#cbc31d73f6329f693b3d34b365124de797704fff" + integrity sha512-m+XpwKSi3PPM9znm5NGS8bBReeAJJpSkL1OuFCqaMaJL2YX9YXLkkI+MBchMPwu+ZuM2rynL51sgfkQteQ1CKQ== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.4.1" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^29.3.1" - jest-util "^29.3.1" + jest-message-util "^29.4.1" + jest-util "^29.4.1" slash "^3.0.0" -"@jest/core@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.3.1.tgz#bff00f413ff0128f4debec1099ba7dcd649774a1" - integrity sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw== - dependencies: - "@jest/console" "^29.3.1" - "@jest/reporters" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" +"@jest/core@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.4.1.tgz#91371179b5959951e211dfaeea4277a01dcca14f" + integrity sha512-RXFTohpBqpaTebNdg5l3I5yadnKo9zLBajMT0I38D0tDhreVBYv3fA8kywthI00sWxPztWLD3yjiUkewwu/wKA== + dependencies: + "@jest/console" "^29.4.1" + "@jest/reporters" "^29.4.1" + "@jest/test-result" "^29.4.1" + "@jest/transform" "^29.4.1" + "@jest/types" "^29.4.1" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" ci-info "^3.2.0" exit "^0.1.2" graceful-fs "^4.2.9" - jest-changed-files "^29.2.0" - jest-config "^29.3.1" - jest-haste-map "^29.3.1" - jest-message-util "^29.3.1" + jest-changed-files "^29.4.0" + jest-config "^29.4.1" + jest-haste-map "^29.4.1" + jest-message-util "^29.4.1" jest-regex-util "^29.2.0" - jest-resolve "^29.3.1" - jest-resolve-dependencies "^29.3.1" - jest-runner "^29.3.1" - jest-runtime "^29.3.1" - jest-snapshot "^29.3.1" - jest-util "^29.3.1" - jest-validate "^29.3.1" - jest-watcher "^29.3.1" + jest-resolve "^29.4.1" + jest-resolve-dependencies "^29.4.1" + jest-runner "^29.4.1" + jest-runtime "^29.4.1" + jest-snapshot "^29.4.1" + jest-util "^29.4.1" + jest-validate "^29.4.1" + jest-watcher "^29.4.1" micromatch "^4.0.4" - pretty-format "^29.3.1" + pretty-format "^29.4.1" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.3.1.tgz#eb039f726d5fcd14698acd072ac6576d41cfcaa6" - integrity sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag== +"@jest/environment@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.4.1.tgz#52d232a85cdc995b407a940c89c86568f5a88ffe" + integrity sha512-pJ14dHGSQke7Q3mkL/UZR9ZtTOxqskZaC91NzamEH4dlKRt42W+maRBXiw/LWkdJe+P0f/zDR37+SPMplMRlPg== dependencies: - "@jest/fake-timers" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/fake-timers" "^29.4.1" + "@jest/types" "^29.4.1" "@types/node" "*" - jest-mock "^29.3.1" + jest-mock "^29.4.1" -"@jest/expect-utils@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.3.1.tgz#531f737039e9b9e27c42449798acb5bba01935b6" - integrity sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g== +"@jest/expect-utils@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.4.1.tgz#105b9f3e2c48101f09cae2f0a4d79a1b3a419cbb" + integrity sha512-w6YJMn5DlzmxjO00i9wu2YSozUYRBhIoJ6nQwpMYcBMtiqMGJm1QBzOf6DDgRao8dbtpDoaqLg6iiQTvv0UHhQ== dependencies: jest-get-type "^29.2.0" -"@jest/expect@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.3.1.tgz#456385b62894349c1d196f2d183e3716d4c6a6cd" - integrity sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg== +"@jest/expect@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.4.1.tgz#3338fa20f547bb6e550c4be37d6f82711cc13c38" + integrity sha512-ZxKJP5DTUNF2XkpJeZIzvnzF1KkfrhEF6Rz0HGG69fHl6Bgx5/GoU3XyaeFYEjuuKSOOsbqD/k72wFvFxc3iTw== dependencies: - expect "^29.3.1" - jest-snapshot "^29.3.1" + expect "^29.4.1" + jest-snapshot "^29.4.1" -"@jest/fake-timers@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.3.1.tgz#b140625095b60a44de820876d4c14da1aa963f67" - integrity sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A== +"@jest/fake-timers@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.4.1.tgz#7b673131e8ea2a2045858f08241cace5d518b42b" + integrity sha512-/1joI6rfHFmmm39JxNfmNAO3Nwm6Y0VoL5fJDy7H1AtWrD1CgRtqJbN9Ld6rhAkGO76qqp4cwhhxJ9o9kYjQMw== dependencies: - "@jest/types" "^29.3.1" - "@sinonjs/fake-timers" "^9.1.2" + "@jest/types" "^29.4.1" + "@sinonjs/fake-timers" "^10.0.2" "@types/node" "*" - jest-message-util "^29.3.1" - jest-mock "^29.3.1" - jest-util "^29.3.1" + jest-message-util "^29.4.1" + jest-mock "^29.4.1" + jest-util "^29.4.1" -"@jest/globals@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.3.1.tgz#92be078228e82d629df40c3656d45328f134a0c6" - integrity sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q== +"@jest/globals@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.4.1.tgz#3cd78c5567ab0249f09fbd81bf9f37a7328f4713" + integrity sha512-znoK2EuFytbHH0ZSf2mQK2K1xtIgmaw4Da21R2C/NE/+NnItm5mPEFQmn8gmF3f0rfOlmZ3Y3bIf7bFj7DHxAA== dependencies: - "@jest/environment" "^29.3.1" - "@jest/expect" "^29.3.1" - "@jest/types" "^29.3.1" - jest-mock "^29.3.1" + "@jest/environment" "^29.4.1" + "@jest/expect" "^29.4.1" + "@jest/types" "^29.4.1" + jest-mock "^29.4.1" -"@jest/reporters@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.3.1.tgz#9a6d78c109608e677c25ddb34f907b90e07b4310" - integrity sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA== +"@jest/reporters@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.4.1.tgz#50d509c08575c75e3cd2176d72ec3786419d5e04" + integrity sha512-AISY5xpt2Xpxj9R6y0RF1+O6GRy9JsGa8+vK23Lmzdy1AYcpQn5ItX79wJSsTmfzPKSAcsY1LNt/8Y5Xe5LOSg== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/console" "^29.4.1" + "@jest/test-result" "^29.4.1" + "@jest/transform" "^29.4.1" + "@jest/types" "^29.4.1" "@jridgewell/trace-mapping" "^0.3.15" "@types/node" "*" chalk "^4.0.0" @@ -608,20 +608,20 @@ istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-message-util "^29.3.1" - jest-util "^29.3.1" - jest-worker "^29.3.1" + jest-message-util "^29.4.1" + jest-util "^29.4.1" + jest-worker "^29.4.1" slash "^3.0.0" string-length "^4.0.1" strip-ansi "^6.0.0" v8-to-istanbul "^9.0.1" -"@jest/schemas@^29.0.0": - version "29.0.0" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.0.0.tgz#5f47f5994dd4ef067fb7b4188ceac45f77fe952a" - integrity sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA== +"@jest/schemas@^29.4.0": + version "29.4.0" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.0.tgz#0d6ad358f295cc1deca0b643e6b4c86ebd539f17" + integrity sha512-0E01f/gOZeNTG76i5eWWSupvSHaIINrTie7vCyjiYFKgzNdyEGd12BUv4oNBFHOqlHDbtoJi3HrQ38KCC90NsQ== dependencies: - "@sinclair/typebox" "^0.24.1" + "@sinclair/typebox" "^0.25.16" "@jest/source-map@^29.2.0": version "29.2.0" @@ -632,53 +632,53 @@ callsites "^3.0.0" graceful-fs "^4.2.9" -"@jest/test-result@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.3.1.tgz#92cd5099aa94be947560a24610aa76606de78f50" - integrity sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw== +"@jest/test-result@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.4.1.tgz#997f19695e13b34779ceb3c288a416bd26c3238d" + integrity sha512-WRt29Lwt+hEgfN8QDrXqXGgCTidq1rLyFqmZ4lmJOpVArC8daXrZWkWjiaijQvgd3aOUj2fM8INclKHsQW9YyQ== dependencies: - "@jest/console" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/console" "^29.4.1" + "@jest/types" "^29.4.1" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz#fa24b3b050f7a59d48f7ef9e0b782ab65123090d" - integrity sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA== +"@jest/test-sequencer@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.4.1.tgz#f7a006ec7058b194a10cf833c88282ef86d578fd" + integrity sha512-v5qLBNSsM0eHzWLXsQ5fiB65xi49A3ILPSFQKPXzGL4Vyux0DPZAIN7NAFJa9b4BiTDP9MBF/Zqc/QA1vuiJ0w== dependencies: - "@jest/test-result" "^29.3.1" + "@jest/test-result" "^29.4.1" graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" + jest-haste-map "^29.4.1" slash "^3.0.0" -"@jest/transform@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.3.1.tgz#1e6bd3da4af50b5c82a539b7b1f3770568d6e36d" - integrity sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug== +"@jest/transform@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.4.1.tgz#e4f517841bb795c7dcdee1ba896275e2c2d26d4a" + integrity sha512-5w6YJrVAtiAgr0phzKjYd83UPbCXsBRTeYI4BXokv9Er9CcrH9hfXL/crCvP2d2nGOcovPUnlYiLPFLZrkG5Hg== dependencies: "@babel/core" "^7.11.6" - "@jest/types" "^29.3.1" + "@jest/types" "^29.4.1" "@jridgewell/trace-mapping" "^0.3.15" babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" convert-source-map "^2.0.0" fast-json-stable-stringify "^2.1.0" graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" + jest-haste-map "^29.4.1" jest-regex-util "^29.2.0" - jest-util "^29.3.1" + jest-util "^29.4.1" micromatch "^4.0.4" pirates "^4.0.4" slash "^3.0.0" - write-file-atomic "^4.0.1" + write-file-atomic "^5.0.0" -"@jest/types@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.3.1.tgz#7c5a80777cb13e703aeec6788d044150341147e3" - integrity sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA== +"@jest/types@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.4.1.tgz#f9f83d0916f50696661da72766132729dcb82ecb" + integrity sha512-zbrAXDUOnpJ+FMST2rV7QZOgec8rskg2zv8g2ajeqitp4tvZiyqTCYXANrKsM+ryj5o+LI+ZN2EgU9drrkiwSA== dependencies: - "@jest/schemas" "^29.0.0" + "@jest/schemas" "^29.4.0" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" @@ -757,24 +757,24 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@sinclair/typebox@^0.24.1": - version "0.24.47" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.47.tgz#530b67163714356f93e82bdb871e7db4b7bc564e" - integrity sha512-J4Xw0xYK4h7eC34MNOPQi6IkNxGRck6n4VJpWDzXIFVTW8I/D43Gf+NfWz/v/7NHlzWOPd3+T4PJ4OqklQ2u7A== +"@sinclair/typebox@^0.25.16": + version "0.25.21" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.21.tgz#763b05a4b472c93a8db29b2c3e359d55b29ce272" + integrity sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g== -"@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== +"@sinonjs/commons@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" + integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== +"@sinonjs/fake-timers@^10.0.2": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz#d10549ed1f423d80639c528b6c7f5a1017747d0c" + integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== dependencies: - "@sinonjs/commons" "^1.7.0" + "@sinonjs/commons" "^2.0.0" "@types/babel__core@^7.1.14": version "7.1.19" @@ -913,15 +913,15 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -babel-jest@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.3.1.tgz#05c83e0d128cd48c453eea851482a38782249f44" - integrity sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA== +babel-jest@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.4.1.tgz#01fa167e27470b35c2d4a1b841d9586b1764da19" + integrity sha512-xBZa/pLSsF/1sNpkgsiT3CmY7zV1kAsZ9OxxtrFqYucnOuRftXAfcJqcDVyOPeN4lttWTwhLdu0T9f8uvoPEUg== dependencies: - "@jest/transform" "^29.3.1" + "@jest/transform" "^29.4.1" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.2.0" + babel-preset-jest "^29.4.0" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" @@ -937,10 +937,10 @@ babel-plugin-istanbul@^6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz#23ee99c37390a98cfddf3ef4a78674180d823094" - integrity sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA== +babel-plugin-jest-hoist@^29.4.0: + version "29.4.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.4.0.tgz#3fd3dfcedf645932df6d0c9fc3d9a704dd860248" + integrity sha512-a/sZRLQJEmsmejQ2rPEUe35nO1+C9dc9O1gplH1SXmJxveQSRUYdBk8yGZG/VOUuZs1u2aHZJusEGoRMbhhwCg== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -965,12 +965,12 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz#3048bea3a1af222e3505e4a767a974c95a7620dc" - integrity sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA== +babel-preset-jest@^29.4.0: + version "29.4.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.4.0.tgz#c2b03c548b02dea0a18ae21d5759c136f9251ee4" + integrity sha512-fUB9vZflUSM3dO/6M2TCAepTzvA4VkOvl67PjErcrQMGt9Eve7uazaeyCZ2th3UtI7ljpiBJES0F7A1vBRsLZA== dependencies: - babel-plugin-jest-hoist "^29.2.0" + babel-plugin-jest-hoist "^29.4.0" babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: @@ -1246,16 +1246,16 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= -expect@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.3.1.tgz#92877aad3f7deefc2e3f6430dd195b92295554a6" - integrity sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA== +expect@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.4.1.tgz#58cfeea9cbf479b64ed081fd1e074ac8beb5a1fe" + integrity sha512-OKrGESHOaMxK3b6zxIq9SOW8kEXztKff/Dvg88j4xIJxur1hspEbedVkR3GpHe5LO+WB2Qw7OWN0RMTdp6as5A== dependencies: - "@jest/expect-utils" "^29.3.1" + "@jest/expect-utils" "^29.4.1" jest-get-type "^29.2.0" - jest-matcher-utils "^29.3.1" - jest-message-util "^29.3.1" - jest-util "^29.3.1" + jest-matcher-utils "^29.4.1" + jest-message-util "^29.4.1" + jest-util "^29.4.1" fast-json-stable-stringify@^2.1.0: version "2.1.0" @@ -1473,94 +1473,94 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jest-changed-files@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.2.0.tgz#b6598daa9803ea6a4dce7968e20ab380ddbee289" - integrity sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA== +jest-changed-files@^29.4.0: + version "29.4.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.4.0.tgz#ac2498bcd394228f7eddcadcf928b3583bf2779d" + integrity sha512-rnI1oPxgFghoz32Y8eZsGJMjW54UlqT17ycQeCEktcxxwqqKdlj9afl8LNeO0Pbu+h2JQHThQP0BzS67eTRx4w== dependencies: execa "^5.0.0" p-limit "^3.1.0" -jest-circus@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.3.1.tgz#177d07c5c0beae8ef2937a67de68f1e17bbf1b4a" - integrity sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg== +jest-circus@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.4.1.tgz#ff1b63eb04c3b111cefea9489e8dbadd23ce49bd" + integrity sha512-v02NuL5crMNY4CGPHBEflLzl4v91NFb85a+dH9a1pUNx6Xjggrd8l9pPy4LZ1VYNRXlb+f65+7O/MSIbLir6pA== dependencies: - "@jest/environment" "^29.3.1" - "@jest/expect" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/environment" "^29.4.1" + "@jest/expect" "^29.4.1" + "@jest/test-result" "^29.4.1" + "@jest/types" "^29.4.1" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^0.7.0" is-generator-fn "^2.0.0" - jest-each "^29.3.1" - jest-matcher-utils "^29.3.1" - jest-message-util "^29.3.1" - jest-runtime "^29.3.1" - jest-snapshot "^29.3.1" - jest-util "^29.3.1" + jest-each "^29.4.1" + jest-matcher-utils "^29.4.1" + jest-message-util "^29.4.1" + jest-runtime "^29.4.1" + jest-snapshot "^29.4.1" + jest-util "^29.4.1" p-limit "^3.1.0" - pretty-format "^29.3.1" + pretty-format "^29.4.1" slash "^3.0.0" stack-utils "^2.0.3" -jest-cli@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.3.1.tgz#e89dff427db3b1df50cea9a393ebd8640790416d" - integrity sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ== +jest-cli@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.4.1.tgz#7abef96944f300feb9b76f68b1eb2d68774fe553" + integrity sha512-jz7GDIhtxQ37M+9dlbv5K+/FVcIo1O/b1sX3cJgzlQUf/3VG25nvuWzlDC4F1FLLzUThJeWLu8I7JF9eWpuURQ== dependencies: - "@jest/core" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/core" "^29.4.1" + "@jest/test-result" "^29.4.1" + "@jest/types" "^29.4.1" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^29.3.1" - jest-util "^29.3.1" - jest-validate "^29.3.1" + jest-config "^29.4.1" + jest-util "^29.4.1" + jest-validate "^29.4.1" prompts "^2.0.1" yargs "^17.3.1" -jest-config@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.3.1.tgz#0bc3dcb0959ff8662957f1259947aedaefb7f3c6" - integrity sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg== +jest-config@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.4.1.tgz#e62670c6c980ec21d75941806ec4d0c0c6402728" + integrity sha512-g7p3q4NuXiM4hrS4XFATTkd+2z0Ml2RhFmFPM8c3WyKwVDNszbl4E7cV7WIx1YZeqqCtqbtTtZhGZWJlJqngzg== dependencies: "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.3.1" - "@jest/types" "^29.3.1" - babel-jest "^29.3.1" + "@jest/test-sequencer" "^29.4.1" + "@jest/types" "^29.4.1" + babel-jest "^29.4.1" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.3" graceful-fs "^4.2.9" - jest-circus "^29.3.1" - jest-environment-node "^29.3.1" + jest-circus "^29.4.1" + jest-environment-node "^29.4.1" jest-get-type "^29.2.0" jest-regex-util "^29.2.0" - jest-resolve "^29.3.1" - jest-runner "^29.3.1" - jest-util "^29.3.1" - jest-validate "^29.3.1" + jest-resolve "^29.4.1" + jest-runner "^29.4.1" + jest-util "^29.4.1" + jest-validate "^29.4.1" micromatch "^4.0.4" parse-json "^5.2.0" - pretty-format "^29.3.1" + pretty-format "^29.4.1" slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.3.1.tgz#d8215b72fed8f1e647aed2cae6c752a89e757527" - integrity sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw== +jest-diff@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.4.1.tgz#9a6dc715037e1fa7a8a44554e7d272088c4029bd" + integrity sha512-uazdl2g331iY56CEyfbNA0Ut7Mn2ulAG5vUaEHXycf1L6IPyuImIxSz4F0VYBKi7LYIuxOwTZzK3wh5jHzASMw== dependencies: chalk "^4.0.0" diff-sequences "^29.3.1" jest-get-type "^29.2.0" - pretty-format "^29.3.1" + pretty-format "^29.4.1" jest-docblock@^29.2.0: version "29.2.0" @@ -1569,94 +1569,94 @@ jest-docblock@^29.2.0: dependencies: detect-newline "^3.0.0" -jest-each@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.3.1.tgz#bc375c8734f1bb96625d83d1ca03ef508379e132" - integrity sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA== +jest-each@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.4.1.tgz#05ce9979e7486dbd0f5d41895f49ccfdd0afce01" + integrity sha512-QlYFiX3llJMWUV0BtWht/esGEz9w+0i7BHwODKCze7YzZzizgExB9MOfiivF/vVT0GSQ8wXLhvHXh3x2fVD4QQ== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.4.1" chalk "^4.0.0" jest-get-type "^29.2.0" - jest-util "^29.3.1" - pretty-format "^29.3.1" + jest-util "^29.4.1" + pretty-format "^29.4.1" -jest-environment-node@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.3.1.tgz#5023b32472b3fba91db5c799a0d5624ad4803e74" - integrity sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag== +jest-environment-node@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.4.1.tgz#22550b7d0f8f0b16228639c9f88ca04bbf3c1974" + integrity sha512-x/H2kdVgxSkxWAIlIh9MfMuBa0hZySmfsC5lCsWmWr6tZySP44ediRKDUiNggX/eHLH7Cd5ZN10Rw+XF5tXsqg== dependencies: - "@jest/environment" "^29.3.1" - "@jest/fake-timers" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/environment" "^29.4.1" + "@jest/fake-timers" "^29.4.1" + "@jest/types" "^29.4.1" "@types/node" "*" - jest-mock "^29.3.1" - jest-util "^29.3.1" + jest-mock "^29.4.1" + jest-util "^29.4.1" jest-get-type@^29.2.0: version "29.2.0" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.2.0.tgz#726646f927ef61d583a3b3adb1ab13f3a5036408" integrity sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA== -jest-haste-map@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.3.1.tgz#af83b4347f1dae5ee8c2fb57368dc0bb3e5af843" - integrity sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A== +jest-haste-map@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.4.1.tgz#b0579dc82d94b40ed9041af56ad25c2f80bedaeb" + integrity sha512-imTjcgfVVTvg02khXL11NNLTx9ZaofbAWhilrMg/G8dIkp+HYCswhxf0xxJwBkfhWb3e8dwbjuWburvxmcr58w== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.4.1" "@types/graceful-fs" "^4.1.3" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.9" jest-regex-util "^29.2.0" - jest-util "^29.3.1" - jest-worker "^29.3.1" + jest-util "^29.4.1" + jest-worker "^29.4.1" micromatch "^4.0.4" walker "^1.0.8" optionalDependencies: fsevents "^2.3.2" -jest-leak-detector@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz#95336d020170671db0ee166b75cd8ef647265518" - integrity sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA== +jest-leak-detector@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.4.1.tgz#632186c546e084da2b490b7496fee1a1c9929637" + integrity sha512-akpZv7TPyGMnH2RimOCgy+hPmWZf55EyFUvymQ4LMsQP8xSPlZumCPtXGoDhFNhUE2039RApZkTQDKU79p/FiQ== dependencies: jest-get-type "^29.2.0" - pretty-format "^29.3.1" + pretty-format "^29.4.1" -jest-matcher-utils@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz#6e7f53512f80e817dfa148672bd2d5d04914a572" - integrity sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ== +jest-matcher-utils@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.4.1.tgz#73d834e305909c3b43285fbc76f78bf0ad7e1954" + integrity sha512-k5h0u8V4nAEy6lSACepxL/rw78FLDkBnXhZVgFneVpnJONhb2DhZj/Gv4eNe+1XqQ5IhgUcqj745UwH0HJmMnA== dependencies: chalk "^4.0.0" - jest-diff "^29.3.1" + jest-diff "^29.4.1" jest-get-type "^29.2.0" - pretty-format "^29.3.1" + pretty-format "^29.4.1" -jest-message-util@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.3.1.tgz#37bc5c468dfe5120712053dd03faf0f053bd6adb" - integrity sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA== +jest-message-util@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.4.1.tgz#522623aa1df9a36ebfdffb06495c7d9d19e8a845" + integrity sha512-H4/I0cXUaLeCw6FM+i4AwCnOwHRgitdaUFOdm49022YD5nfyr8C/DrbXOBEyJaj+w/y0gGJ57klssOaUiLLQGQ== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.3.1" + "@jest/types" "^29.4.1" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^29.3.1" + pretty-format "^29.4.1" slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.3.1.tgz#60287d92e5010979d01f218c6b215b688e0f313e" - integrity sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA== +jest-mock@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.4.1.tgz#a218a2abf45c99c501d4665207748a6b9e29afbd" + integrity sha512-MwA4hQ7zBOcgVCVnsM8TzaFLVUD/pFWTfbkY953Y81L5ret3GFRZtmPmRFAjKQSdCKoJvvqOu6Bvfpqlwwb0dQ== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.4.1" "@types/node" "*" - jest-util "^29.3.1" + jest-util "^29.4.1" jest-pnp-resolver@^1.2.2: version "1.2.2" @@ -1668,88 +1668,89 @@ jest-regex-util@^29.2.0: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.2.0.tgz#82ef3b587e8c303357728d0322d48bbfd2971f7b" integrity sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA== -jest-resolve-dependencies@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz#a6a329708a128e68d67c49f38678a4a4a914c3bf" - integrity sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA== +jest-resolve-dependencies@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.4.1.tgz#02420a2e055da105e5fca8218c471d8b9553c904" + integrity sha512-Y3QG3M1ncAMxfjbYgtqNXC5B595zmB6e//p/qpA/58JkQXu/IpLDoLeOa8YoYfsSglBKQQzNUqtfGJJT/qLmJg== dependencies: jest-regex-util "^29.2.0" - jest-snapshot "^29.3.1" + jest-snapshot "^29.4.1" -jest-resolve@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.3.1.tgz#9a4b6b65387a3141e4a40815535c7f196f1a68a7" - integrity sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw== +jest-resolve@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.4.1.tgz#4c6bf71a07b8f0b79c5fdf4f2a2cf47317694c5e" + integrity sha512-j/ZFNV2lm9IJ2wmlq1uYK0Y/1PiyDq9g4HEGsNTNr3viRbJdV+8Lf1SXIiLZXFvyiisu0qUyIXGBnw+OKWkJwQ== dependencies: chalk "^4.0.0" graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" + jest-haste-map "^29.4.1" jest-pnp-resolver "^1.2.2" - jest-util "^29.3.1" - jest-validate "^29.3.1" + jest-util "^29.4.1" + jest-validate "^29.4.1" resolve "^1.20.0" - resolve.exports "^1.1.0" + resolve.exports "^2.0.0" slash "^3.0.0" -jest-runner@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.3.1.tgz#a92a879a47dd096fea46bb1517b0a99418ee9e2d" - integrity sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA== - dependencies: - "@jest/console" "^29.3.1" - "@jest/environment" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" +jest-runner@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.4.1.tgz#57460d9ebb0eea2e27eeddca1816cf8537469661" + integrity sha512-8d6XXXi7GtHmsHrnaqBKWxjKb166Eyj/ksSaUYdcBK09VbjPwIgWov1VwSmtupCIz8q1Xv4Qkzt/BTo3ZqiCeg== + dependencies: + "@jest/console" "^29.4.1" + "@jest/environment" "^29.4.1" + "@jest/test-result" "^29.4.1" + "@jest/transform" "^29.4.1" + "@jest/types" "^29.4.1" "@types/node" "*" chalk "^4.0.0" emittery "^0.13.1" graceful-fs "^4.2.9" jest-docblock "^29.2.0" - jest-environment-node "^29.3.1" - jest-haste-map "^29.3.1" - jest-leak-detector "^29.3.1" - jest-message-util "^29.3.1" - jest-resolve "^29.3.1" - jest-runtime "^29.3.1" - jest-util "^29.3.1" - jest-watcher "^29.3.1" - jest-worker "^29.3.1" + jest-environment-node "^29.4.1" + jest-haste-map "^29.4.1" + jest-leak-detector "^29.4.1" + jest-message-util "^29.4.1" + jest-resolve "^29.4.1" + jest-runtime "^29.4.1" + jest-util "^29.4.1" + jest-watcher "^29.4.1" + jest-worker "^29.4.1" p-limit "^3.1.0" source-map-support "0.5.13" -jest-runtime@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.3.1.tgz#21efccb1a66911d6d8591276a6182f520b86737a" - integrity sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A== +jest-runtime@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.4.1.tgz#9a50f9c69d3a391690897c01b0bfa8dc5dd45808" + integrity sha512-UXTMU9uKu2GjYwTtoAw5rn4STxWw/nadOfW7v1sx6LaJYa3V/iymdCLQM6xy3+7C6mY8GfX22vKpgxY171UIoA== dependencies: - "@jest/environment" "^29.3.1" - "@jest/fake-timers" "^29.3.1" - "@jest/globals" "^29.3.1" + "@jest/environment" "^29.4.1" + "@jest/fake-timers" "^29.4.1" + "@jest/globals" "^29.4.1" "@jest/source-map" "^29.2.0" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/test-result" "^29.4.1" + "@jest/transform" "^29.4.1" + "@jest/types" "^29.4.1" "@types/node" "*" chalk "^4.0.0" cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" glob "^7.1.3" graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" - jest-message-util "^29.3.1" - jest-mock "^29.3.1" + jest-haste-map "^29.4.1" + jest-message-util "^29.4.1" + jest-mock "^29.4.1" jest-regex-util "^29.2.0" - jest-resolve "^29.3.1" - jest-snapshot "^29.3.1" - jest-util "^29.3.1" + jest-resolve "^29.4.1" + jest-snapshot "^29.4.1" + jest-util "^29.4.1" + semver "^7.3.5" slash "^3.0.0" strip-bom "^4.0.0" -jest-snapshot@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.3.1.tgz#17bcef71a453adc059a18a32ccbd594b8cc4e45e" - integrity sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA== +jest-snapshot@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.4.1.tgz#5692210b3690c94f19317913d4082b123bd83dd9" + integrity sha512-l4iV8EjGgQWVz3ee/LR9sULDk2pCkqb71bjvlqn+qp90lFwpnulHj4ZBT8nm1hA1C5wowXLc7MGnw321u0tsYA== dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" @@ -1757,82 +1758,82 @@ jest-snapshot@^29.3.1: "@babel/plugin-syntax-typescript" "^7.7.2" "@babel/traverse" "^7.7.2" "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/expect-utils" "^29.4.1" + "@jest/transform" "^29.4.1" + "@jest/types" "^29.4.1" "@types/babel__traverse" "^7.0.6" "@types/prettier" "^2.1.5" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^29.3.1" + expect "^29.4.1" graceful-fs "^4.2.9" - jest-diff "^29.3.1" + jest-diff "^29.4.1" jest-get-type "^29.2.0" - jest-haste-map "^29.3.1" - jest-matcher-utils "^29.3.1" - jest-message-util "^29.3.1" - jest-util "^29.3.1" + jest-haste-map "^29.4.1" + jest-matcher-utils "^29.4.1" + jest-message-util "^29.4.1" + jest-util "^29.4.1" natural-compare "^1.4.0" - pretty-format "^29.3.1" + pretty-format "^29.4.1" semver "^7.3.5" -jest-util@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.3.1.tgz#1dda51e378bbcb7e3bc9d8ab651445591ed373e1" - integrity sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ== +jest-util@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.4.1.tgz#2eeed98ff4563b441b5a656ed1a786e3abc3e4c4" + integrity sha512-bQy9FPGxVutgpN4VRc0hk6w7Hx/m6L53QxpDreTZgJd9gfx/AV2MjyPde9tGyZRINAUrSv57p2inGBu2dRLmkQ== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.4.1" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.3.1.tgz#d56fefaa2e7d1fde3ecdc973c7f7f8f25eea704a" - integrity sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g== +jest-validate@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.4.1.tgz#0d5174510415083ec329d4f981bf6779211f17e9" + integrity sha512-qNZXcZQdIQx4SfUB/atWnI4/I2HUvhz8ajOSYUu40CSmf9U5emil8EDHgE7M+3j9/pavtk3knlZBDsgFvv/SWw== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.4.1" camelcase "^6.2.0" chalk "^4.0.0" jest-get-type "^29.2.0" leven "^3.1.0" - pretty-format "^29.3.1" + pretty-format "^29.4.1" -jest-watcher@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.3.1.tgz#3341547e14fe3c0f79f9c3a4c62dbc3fc977fd4a" - integrity sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg== +jest-watcher@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.4.1.tgz#6e3e2486918bd778849d4d6e67fd77b814f3e6ed" + integrity sha512-vFOzflGFs27nU6h8dpnVRER3O2rFtL+VMEwnG0H3KLHcllLsU8y9DchSh0AL/Rg5nN1/wSiQ+P4ByMGpuybaVw== dependencies: - "@jest/test-result" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/test-result" "^29.4.1" + "@jest/types" "^29.4.1" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" emittery "^0.13.1" - jest-util "^29.3.1" + jest-util "^29.4.1" string-length "^4.0.1" -jest-worker@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.3.1.tgz#e9462161017a9bb176380d721cab022661da3d6b" - integrity sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw== +jest-worker@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.4.1.tgz#7cb4a99a38975679600305650f86f4807460aab1" + integrity sha512-O9doU/S1EBe+yp/mstQ0VpPwpv0Clgn68TkNwGxL6/usX/KUW9Arnn4ag8C3jc6qHcXznhsT5Na1liYzAsuAbQ== dependencies: "@types/node" "*" - jest-util "^29.3.1" + jest-util "^29.4.1" merge-stream "^2.0.0" supports-color "^8.0.0" -jest@29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.3.1.tgz#c130c0d551ae6b5459b8963747fed392ddbde122" - integrity sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA== +jest@29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.4.1.tgz#bb34baca8e05901b49c02c62f1183a6182ea1785" + integrity sha512-cknimw7gAXPDOmj0QqztlxVtBVCw2lYY9CeIE5N6kD+kET1H4H79HSNISJmijb1HF+qk+G+ploJgiDi5k/fRlg== dependencies: - "@jest/core" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/core" "^29.4.1" + "@jest/types" "^29.4.1" import-local "^3.0.2" - jest-cli "^29.3.1" + jest-cli "^29.4.1" js-tokens@^4.0.0: version "4.0.0" @@ -1858,9 +1859,9 @@ json-parse-even-better-errors@^2.3.0: integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== kleur@^3.0.3: version "3.0.3" @@ -2059,12 +2060,12 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -pretty-format@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.3.1.tgz#1841cac822b02b4da8971dacb03e8a871b4722da" - integrity sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg== +pretty-format@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.4.1.tgz#0da99b532559097b8254298da7c75a0785b1751c" + integrity sha512-dt/Z761JUVsrIKaY215o1xQJBGlSmTx/h4cSqXqjHLnU1+Kt+mavVE7UgqJJO5ukx5HjSswHfmXz4LjS2oIJfg== dependencies: - "@jest/schemas" "^29.0.0" + "@jest/schemas" "^29.4.0" ansi-styles "^5.0.0" react-is "^18.0.0" @@ -2098,10 +2099,10 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve.exports@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== +resolve.exports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.0.tgz#c1a0028c2d166ec2fbf7d0644584927e76e7400e" + integrity sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg== resolve@^1.20.0: version "1.22.0" @@ -2327,10 +2328,10 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write-file-atomic@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== +write-file-atomic@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.0.tgz#54303f117e109bf3d540261125c8ea5a7320fab0" + integrity sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w== dependencies: imurmurhash "^0.1.4" signal-exit "^3.0.7" diff --git a/deployer/aws-lambda/tests/package.json b/deployer/aws-lambda/tests/package.json index c6dc8335da79..ef2501b0fd72 100644 --- a/deployer/aws-lambda/tests/package.json +++ b/deployer/aws-lambda/tests/package.json @@ -15,9 +15,9 @@ "devDependencies": { "cross-env": "^7.0.3", "got": "11.8.6", - "jest": "29.3.1", + "jest": "29.4.1", "kleur": "4.1.5", - "node-dev": "7.4.3", + "node-dev": "8.0.0", "polka": "0.5.2" }, "engines": { diff --git a/deployer/aws-lambda/tests/yarn.lock b/deployer/aws-lambda/tests/yarn.lock index 257b05d0b6df..a4783af5da12 100644 --- a/deployer/aws-lambda/tests/yarn.lock +++ b/deployer/aws-lambda/tests/yarn.lock @@ -498,109 +498,109 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.3.1.tgz#3e3f876e4e47616ea3b1464b9fbda981872e9583" - integrity sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg== +"@jest/console@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.4.1.tgz#cbc31d73f6329f693b3d34b365124de797704fff" + integrity sha512-m+XpwKSi3PPM9znm5NGS8bBReeAJJpSkL1OuFCqaMaJL2YX9YXLkkI+MBchMPwu+ZuM2rynL51sgfkQteQ1CKQ== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.4.1" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^29.3.1" - jest-util "^29.3.1" + jest-message-util "^29.4.1" + jest-util "^29.4.1" slash "^3.0.0" -"@jest/core@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.3.1.tgz#bff00f413ff0128f4debec1099ba7dcd649774a1" - integrity sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw== - dependencies: - "@jest/console" "^29.3.1" - "@jest/reporters" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" +"@jest/core@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.4.1.tgz#91371179b5959951e211dfaeea4277a01dcca14f" + integrity sha512-RXFTohpBqpaTebNdg5l3I5yadnKo9zLBajMT0I38D0tDhreVBYv3fA8kywthI00sWxPztWLD3yjiUkewwu/wKA== + dependencies: + "@jest/console" "^29.4.1" + "@jest/reporters" "^29.4.1" + "@jest/test-result" "^29.4.1" + "@jest/transform" "^29.4.1" + "@jest/types" "^29.4.1" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" ci-info "^3.2.0" exit "^0.1.2" graceful-fs "^4.2.9" - jest-changed-files "^29.2.0" - jest-config "^29.3.1" - jest-haste-map "^29.3.1" - jest-message-util "^29.3.1" + jest-changed-files "^29.4.0" + jest-config "^29.4.1" + jest-haste-map "^29.4.1" + jest-message-util "^29.4.1" jest-regex-util "^29.2.0" - jest-resolve "^29.3.1" - jest-resolve-dependencies "^29.3.1" - jest-runner "^29.3.1" - jest-runtime "^29.3.1" - jest-snapshot "^29.3.1" - jest-util "^29.3.1" - jest-validate "^29.3.1" - jest-watcher "^29.3.1" + jest-resolve "^29.4.1" + jest-resolve-dependencies "^29.4.1" + jest-runner "^29.4.1" + jest-runtime "^29.4.1" + jest-snapshot "^29.4.1" + jest-util "^29.4.1" + jest-validate "^29.4.1" + jest-watcher "^29.4.1" micromatch "^4.0.4" - pretty-format "^29.3.1" + pretty-format "^29.4.1" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.3.1.tgz#eb039f726d5fcd14698acd072ac6576d41cfcaa6" - integrity sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag== +"@jest/environment@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.4.1.tgz#52d232a85cdc995b407a940c89c86568f5a88ffe" + integrity sha512-pJ14dHGSQke7Q3mkL/UZR9ZtTOxqskZaC91NzamEH4dlKRt42W+maRBXiw/LWkdJe+P0f/zDR37+SPMplMRlPg== dependencies: - "@jest/fake-timers" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/fake-timers" "^29.4.1" + "@jest/types" "^29.4.1" "@types/node" "*" - jest-mock "^29.3.1" + jest-mock "^29.4.1" -"@jest/expect-utils@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.3.1.tgz#531f737039e9b9e27c42449798acb5bba01935b6" - integrity sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g== +"@jest/expect-utils@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.4.1.tgz#105b9f3e2c48101f09cae2f0a4d79a1b3a419cbb" + integrity sha512-w6YJMn5DlzmxjO00i9wu2YSozUYRBhIoJ6nQwpMYcBMtiqMGJm1QBzOf6DDgRao8dbtpDoaqLg6iiQTvv0UHhQ== dependencies: jest-get-type "^29.2.0" -"@jest/expect@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.3.1.tgz#456385b62894349c1d196f2d183e3716d4c6a6cd" - integrity sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg== +"@jest/expect@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.4.1.tgz#3338fa20f547bb6e550c4be37d6f82711cc13c38" + integrity sha512-ZxKJP5DTUNF2XkpJeZIzvnzF1KkfrhEF6Rz0HGG69fHl6Bgx5/GoU3XyaeFYEjuuKSOOsbqD/k72wFvFxc3iTw== dependencies: - expect "^29.3.1" - jest-snapshot "^29.3.1" + expect "^29.4.1" + jest-snapshot "^29.4.1" -"@jest/fake-timers@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.3.1.tgz#b140625095b60a44de820876d4c14da1aa963f67" - integrity sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A== +"@jest/fake-timers@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.4.1.tgz#7b673131e8ea2a2045858f08241cace5d518b42b" + integrity sha512-/1joI6rfHFmmm39JxNfmNAO3Nwm6Y0VoL5fJDy7H1AtWrD1CgRtqJbN9Ld6rhAkGO76qqp4cwhhxJ9o9kYjQMw== dependencies: - "@jest/types" "^29.3.1" - "@sinonjs/fake-timers" "^9.1.2" + "@jest/types" "^29.4.1" + "@sinonjs/fake-timers" "^10.0.2" "@types/node" "*" - jest-message-util "^29.3.1" - jest-mock "^29.3.1" - jest-util "^29.3.1" + jest-message-util "^29.4.1" + jest-mock "^29.4.1" + jest-util "^29.4.1" -"@jest/globals@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.3.1.tgz#92be078228e82d629df40c3656d45328f134a0c6" - integrity sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q== +"@jest/globals@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.4.1.tgz#3cd78c5567ab0249f09fbd81bf9f37a7328f4713" + integrity sha512-znoK2EuFytbHH0ZSf2mQK2K1xtIgmaw4Da21R2C/NE/+NnItm5mPEFQmn8gmF3f0rfOlmZ3Y3bIf7bFj7DHxAA== dependencies: - "@jest/environment" "^29.3.1" - "@jest/expect" "^29.3.1" - "@jest/types" "^29.3.1" - jest-mock "^29.3.1" + "@jest/environment" "^29.4.1" + "@jest/expect" "^29.4.1" + "@jest/types" "^29.4.1" + jest-mock "^29.4.1" -"@jest/reporters@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.3.1.tgz#9a6d78c109608e677c25ddb34f907b90e07b4310" - integrity sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA== +"@jest/reporters@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.4.1.tgz#50d509c08575c75e3cd2176d72ec3786419d5e04" + integrity sha512-AISY5xpt2Xpxj9R6y0RF1+O6GRy9JsGa8+vK23Lmzdy1AYcpQn5ItX79wJSsTmfzPKSAcsY1LNt/8Y5Xe5LOSg== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/console" "^29.4.1" + "@jest/test-result" "^29.4.1" + "@jest/transform" "^29.4.1" + "@jest/types" "^29.4.1" "@jridgewell/trace-mapping" "^0.3.15" "@types/node" "*" chalk "^4.0.0" @@ -613,20 +613,20 @@ istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-message-util "^29.3.1" - jest-util "^29.3.1" - jest-worker "^29.3.1" + jest-message-util "^29.4.1" + jest-util "^29.4.1" + jest-worker "^29.4.1" slash "^3.0.0" string-length "^4.0.1" strip-ansi "^6.0.0" v8-to-istanbul "^9.0.1" -"@jest/schemas@^29.0.0": - version "29.0.0" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.0.0.tgz#5f47f5994dd4ef067fb7b4188ceac45f77fe952a" - integrity sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA== +"@jest/schemas@^29.4.0": + version "29.4.0" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.0.tgz#0d6ad358f295cc1deca0b643e6b4c86ebd539f17" + integrity sha512-0E01f/gOZeNTG76i5eWWSupvSHaIINrTie7vCyjiYFKgzNdyEGd12BUv4oNBFHOqlHDbtoJi3HrQ38KCC90NsQ== dependencies: - "@sinclair/typebox" "^0.24.1" + "@sinclair/typebox" "^0.25.16" "@jest/source-map@^29.2.0": version "29.2.0" @@ -637,53 +637,53 @@ callsites "^3.0.0" graceful-fs "^4.2.9" -"@jest/test-result@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.3.1.tgz#92cd5099aa94be947560a24610aa76606de78f50" - integrity sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw== +"@jest/test-result@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.4.1.tgz#997f19695e13b34779ceb3c288a416bd26c3238d" + integrity sha512-WRt29Lwt+hEgfN8QDrXqXGgCTidq1rLyFqmZ4lmJOpVArC8daXrZWkWjiaijQvgd3aOUj2fM8INclKHsQW9YyQ== dependencies: - "@jest/console" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/console" "^29.4.1" + "@jest/types" "^29.4.1" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz#fa24b3b050f7a59d48f7ef9e0b782ab65123090d" - integrity sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA== +"@jest/test-sequencer@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.4.1.tgz#f7a006ec7058b194a10cf833c88282ef86d578fd" + integrity sha512-v5qLBNSsM0eHzWLXsQ5fiB65xi49A3ILPSFQKPXzGL4Vyux0DPZAIN7NAFJa9b4BiTDP9MBF/Zqc/QA1vuiJ0w== dependencies: - "@jest/test-result" "^29.3.1" + "@jest/test-result" "^29.4.1" graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" + jest-haste-map "^29.4.1" slash "^3.0.0" -"@jest/transform@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.3.1.tgz#1e6bd3da4af50b5c82a539b7b1f3770568d6e36d" - integrity sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug== +"@jest/transform@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.4.1.tgz#e4f517841bb795c7dcdee1ba896275e2c2d26d4a" + integrity sha512-5w6YJrVAtiAgr0phzKjYd83UPbCXsBRTeYI4BXokv9Er9CcrH9hfXL/crCvP2d2nGOcovPUnlYiLPFLZrkG5Hg== dependencies: "@babel/core" "^7.11.6" - "@jest/types" "^29.3.1" + "@jest/types" "^29.4.1" "@jridgewell/trace-mapping" "^0.3.15" babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" convert-source-map "^2.0.0" fast-json-stable-stringify "^2.1.0" graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" + jest-haste-map "^29.4.1" jest-regex-util "^29.2.0" - jest-util "^29.3.1" + jest-util "^29.4.1" micromatch "^4.0.4" pirates "^4.0.4" slash "^3.0.0" - write-file-atomic "^4.0.1" + write-file-atomic "^5.0.0" -"@jest/types@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.3.1.tgz#7c5a80777cb13e703aeec6788d044150341147e3" - integrity sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA== +"@jest/types@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.4.1.tgz#f9f83d0916f50696661da72766132729dcb82ecb" + integrity sha512-zbrAXDUOnpJ+FMST2rV7QZOgec8rskg2zv8g2ajeqitp4tvZiyqTCYXANrKsM+ryj5o+LI+ZN2EgU9drrkiwSA== dependencies: - "@jest/schemas" "^29.0.0" + "@jest/schemas" "^29.4.0" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" @@ -767,29 +767,29 @@ resolved "https://registry.yarnpkg.com/@polka/url/-/url-0.5.0.tgz#b21510597fd601e5d7c95008b76bf0d254ebfd31" integrity sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw== -"@sinclair/typebox@^0.24.1": - version "0.24.47" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.47.tgz#530b67163714356f93e82bdb871e7db4b7bc564e" - integrity sha512-J4Xw0xYK4h7eC34MNOPQi6IkNxGRck6n4VJpWDzXIFVTW8I/D43Gf+NfWz/v/7NHlzWOPd3+T4PJ4OqklQ2u7A== +"@sinclair/typebox@^0.25.16": + version "0.25.21" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.21.tgz#763b05a4b472c93a8db29b2c3e359d55b29ce272" + integrity sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g== "@sindresorhus/is@^4.0.0": version "4.6.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== -"@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== +"@sinonjs/commons@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" + integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== +"@sinonjs/fake-timers@^10.0.2": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz#d10549ed1f423d80639c528b6c7f5a1017747d0c" + integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== dependencies: - "@sinonjs/commons" "^1.7.0" + "@sinonjs/commons" "^2.0.0" "@szmarczak/http-timer@^4.0.5": version "4.0.6" @@ -999,15 +999,15 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -babel-jest@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.3.1.tgz#05c83e0d128cd48c453eea851482a38782249f44" - integrity sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA== +babel-jest@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.4.1.tgz#01fa167e27470b35c2d4a1b841d9586b1764da19" + integrity sha512-xBZa/pLSsF/1sNpkgsiT3CmY7zV1kAsZ9OxxtrFqYucnOuRftXAfcJqcDVyOPeN4lttWTwhLdu0T9f8uvoPEUg== dependencies: - "@jest/transform" "^29.3.1" + "@jest/transform" "^29.4.1" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.2.0" + babel-preset-jest "^29.4.0" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" @@ -1023,10 +1023,10 @@ babel-plugin-istanbul@^6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz#23ee99c37390a98cfddf3ef4a78674180d823094" - integrity sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA== +babel-plugin-jest-hoist@^29.4.0: + version "29.4.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.4.0.tgz#3fd3dfcedf645932df6d0c9fc3d9a704dd860248" + integrity sha512-a/sZRLQJEmsmejQ2rPEUe35nO1+C9dc9O1gplH1SXmJxveQSRUYdBk8yGZG/VOUuZs1u2aHZJusEGoRMbhhwCg== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -1051,12 +1051,12 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz#3048bea3a1af222e3505e4a767a974c95a7620dc" - integrity sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA== +babel-preset-jest@^29.4.0: + version "29.4.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.4.0.tgz#c2b03c548b02dea0a18ae21d5759c136f9251ee4" + integrity sha512-fUB9vZflUSM3dO/6M2TCAepTzvA4VkOvl67PjErcrQMGt9Eve7uazaeyCZ2th3UtI7ljpiBJES0F7A1vBRsLZA== dependencies: - babel-plugin-jest-hoist "^29.2.0" + babel-plugin-jest-hoist "^29.4.0" babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: @@ -1413,16 +1413,16 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= -expect@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.3.1.tgz#92877aad3f7deefc2e3f6430dd195b92295554a6" - integrity sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA== +expect@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.4.1.tgz#58cfeea9cbf479b64ed081fd1e074ac8beb5a1fe" + integrity sha512-OKrGESHOaMxK3b6zxIq9SOW8kEXztKff/Dvg88j4xIJxur1hspEbedVkR3GpHe5LO+WB2Qw7OWN0RMTdp6as5A== dependencies: - "@jest/expect-utils" "^29.3.1" + "@jest/expect-utils" "^29.4.1" jest-get-type "^29.2.0" - jest-matcher-utils "^29.3.1" - jest-message-util "^29.3.1" - jest-util "^29.3.1" + jest-matcher-utils "^29.4.1" + jest-message-util "^29.4.1" + jest-util "^29.4.1" fast-json-stable-stringify@^2.1.0: version "2.1.0" @@ -1567,9 +1567,9 @@ html-escaper@^2.0.0: integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== http-cache-semantics@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== http2-wrapper@^1.0.0-beta.5.2: version "1.0.3" @@ -1712,94 +1712,94 @@ istanbul-reports@^3.1.3: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" -jest-changed-files@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.2.0.tgz#b6598daa9803ea6a4dce7968e20ab380ddbee289" - integrity sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA== +jest-changed-files@^29.4.0: + version "29.4.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.4.0.tgz#ac2498bcd394228f7eddcadcf928b3583bf2779d" + integrity sha512-rnI1oPxgFghoz32Y8eZsGJMjW54UlqT17ycQeCEktcxxwqqKdlj9afl8LNeO0Pbu+h2JQHThQP0BzS67eTRx4w== dependencies: execa "^5.0.0" p-limit "^3.1.0" -jest-circus@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.3.1.tgz#177d07c5c0beae8ef2937a67de68f1e17bbf1b4a" - integrity sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg== +jest-circus@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.4.1.tgz#ff1b63eb04c3b111cefea9489e8dbadd23ce49bd" + integrity sha512-v02NuL5crMNY4CGPHBEflLzl4v91NFb85a+dH9a1pUNx6Xjggrd8l9pPy4LZ1VYNRXlb+f65+7O/MSIbLir6pA== dependencies: - "@jest/environment" "^29.3.1" - "@jest/expect" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/environment" "^29.4.1" + "@jest/expect" "^29.4.1" + "@jest/test-result" "^29.4.1" + "@jest/types" "^29.4.1" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^0.7.0" is-generator-fn "^2.0.0" - jest-each "^29.3.1" - jest-matcher-utils "^29.3.1" - jest-message-util "^29.3.1" - jest-runtime "^29.3.1" - jest-snapshot "^29.3.1" - jest-util "^29.3.1" + jest-each "^29.4.1" + jest-matcher-utils "^29.4.1" + jest-message-util "^29.4.1" + jest-runtime "^29.4.1" + jest-snapshot "^29.4.1" + jest-util "^29.4.1" p-limit "^3.1.0" - pretty-format "^29.3.1" + pretty-format "^29.4.1" slash "^3.0.0" stack-utils "^2.0.3" -jest-cli@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.3.1.tgz#e89dff427db3b1df50cea9a393ebd8640790416d" - integrity sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ== +jest-cli@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.4.1.tgz#7abef96944f300feb9b76f68b1eb2d68774fe553" + integrity sha512-jz7GDIhtxQ37M+9dlbv5K+/FVcIo1O/b1sX3cJgzlQUf/3VG25nvuWzlDC4F1FLLzUThJeWLu8I7JF9eWpuURQ== dependencies: - "@jest/core" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/core" "^29.4.1" + "@jest/test-result" "^29.4.1" + "@jest/types" "^29.4.1" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^29.3.1" - jest-util "^29.3.1" - jest-validate "^29.3.1" + jest-config "^29.4.1" + jest-util "^29.4.1" + jest-validate "^29.4.1" prompts "^2.0.1" yargs "^17.3.1" -jest-config@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.3.1.tgz#0bc3dcb0959ff8662957f1259947aedaefb7f3c6" - integrity sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg== +jest-config@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.4.1.tgz#e62670c6c980ec21d75941806ec4d0c0c6402728" + integrity sha512-g7p3q4NuXiM4hrS4XFATTkd+2z0Ml2RhFmFPM8c3WyKwVDNszbl4E7cV7WIx1YZeqqCtqbtTtZhGZWJlJqngzg== dependencies: "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.3.1" - "@jest/types" "^29.3.1" - babel-jest "^29.3.1" + "@jest/test-sequencer" "^29.4.1" + "@jest/types" "^29.4.1" + babel-jest "^29.4.1" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.3" graceful-fs "^4.2.9" - jest-circus "^29.3.1" - jest-environment-node "^29.3.1" + jest-circus "^29.4.1" + jest-environment-node "^29.4.1" jest-get-type "^29.2.0" jest-regex-util "^29.2.0" - jest-resolve "^29.3.1" - jest-runner "^29.3.1" - jest-util "^29.3.1" - jest-validate "^29.3.1" + jest-resolve "^29.4.1" + jest-runner "^29.4.1" + jest-util "^29.4.1" + jest-validate "^29.4.1" micromatch "^4.0.4" parse-json "^5.2.0" - pretty-format "^29.3.1" + pretty-format "^29.4.1" slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.3.1.tgz#d8215b72fed8f1e647aed2cae6c752a89e757527" - integrity sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw== +jest-diff@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.4.1.tgz#9a6dc715037e1fa7a8a44554e7d272088c4029bd" + integrity sha512-uazdl2g331iY56CEyfbNA0Ut7Mn2ulAG5vUaEHXycf1L6IPyuImIxSz4F0VYBKi7LYIuxOwTZzK3wh5jHzASMw== dependencies: chalk "^4.0.0" diff-sequences "^29.3.1" jest-get-type "^29.2.0" - pretty-format "^29.3.1" + pretty-format "^29.4.1" jest-docblock@^29.2.0: version "29.2.0" @@ -1808,94 +1808,94 @@ jest-docblock@^29.2.0: dependencies: detect-newline "^3.0.0" -jest-each@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.3.1.tgz#bc375c8734f1bb96625d83d1ca03ef508379e132" - integrity sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA== +jest-each@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.4.1.tgz#05ce9979e7486dbd0f5d41895f49ccfdd0afce01" + integrity sha512-QlYFiX3llJMWUV0BtWht/esGEz9w+0i7BHwODKCze7YzZzizgExB9MOfiivF/vVT0GSQ8wXLhvHXh3x2fVD4QQ== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.4.1" chalk "^4.0.0" jest-get-type "^29.2.0" - jest-util "^29.3.1" - pretty-format "^29.3.1" + jest-util "^29.4.1" + pretty-format "^29.4.1" -jest-environment-node@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.3.1.tgz#5023b32472b3fba91db5c799a0d5624ad4803e74" - integrity sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag== +jest-environment-node@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.4.1.tgz#22550b7d0f8f0b16228639c9f88ca04bbf3c1974" + integrity sha512-x/H2kdVgxSkxWAIlIh9MfMuBa0hZySmfsC5lCsWmWr6tZySP44ediRKDUiNggX/eHLH7Cd5ZN10Rw+XF5tXsqg== dependencies: - "@jest/environment" "^29.3.1" - "@jest/fake-timers" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/environment" "^29.4.1" + "@jest/fake-timers" "^29.4.1" + "@jest/types" "^29.4.1" "@types/node" "*" - jest-mock "^29.3.1" - jest-util "^29.3.1" + jest-mock "^29.4.1" + jest-util "^29.4.1" jest-get-type@^29.2.0: version "29.2.0" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.2.0.tgz#726646f927ef61d583a3b3adb1ab13f3a5036408" integrity sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA== -jest-haste-map@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.3.1.tgz#af83b4347f1dae5ee8c2fb57368dc0bb3e5af843" - integrity sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A== +jest-haste-map@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.4.1.tgz#b0579dc82d94b40ed9041af56ad25c2f80bedaeb" + integrity sha512-imTjcgfVVTvg02khXL11NNLTx9ZaofbAWhilrMg/G8dIkp+HYCswhxf0xxJwBkfhWb3e8dwbjuWburvxmcr58w== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.4.1" "@types/graceful-fs" "^4.1.3" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.9" jest-regex-util "^29.2.0" - jest-util "^29.3.1" - jest-worker "^29.3.1" + jest-util "^29.4.1" + jest-worker "^29.4.1" micromatch "^4.0.4" walker "^1.0.8" optionalDependencies: fsevents "^2.3.2" -jest-leak-detector@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz#95336d020170671db0ee166b75cd8ef647265518" - integrity sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA== +jest-leak-detector@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.4.1.tgz#632186c546e084da2b490b7496fee1a1c9929637" + integrity sha512-akpZv7TPyGMnH2RimOCgy+hPmWZf55EyFUvymQ4LMsQP8xSPlZumCPtXGoDhFNhUE2039RApZkTQDKU79p/FiQ== dependencies: jest-get-type "^29.2.0" - pretty-format "^29.3.1" + pretty-format "^29.4.1" -jest-matcher-utils@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz#6e7f53512f80e817dfa148672bd2d5d04914a572" - integrity sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ== +jest-matcher-utils@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.4.1.tgz#73d834e305909c3b43285fbc76f78bf0ad7e1954" + integrity sha512-k5h0u8V4nAEy6lSACepxL/rw78FLDkBnXhZVgFneVpnJONhb2DhZj/Gv4eNe+1XqQ5IhgUcqj745UwH0HJmMnA== dependencies: chalk "^4.0.0" - jest-diff "^29.3.1" + jest-diff "^29.4.1" jest-get-type "^29.2.0" - pretty-format "^29.3.1" + pretty-format "^29.4.1" -jest-message-util@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.3.1.tgz#37bc5c468dfe5120712053dd03faf0f053bd6adb" - integrity sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA== +jest-message-util@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.4.1.tgz#522623aa1df9a36ebfdffb06495c7d9d19e8a845" + integrity sha512-H4/I0cXUaLeCw6FM+i4AwCnOwHRgitdaUFOdm49022YD5nfyr8C/DrbXOBEyJaj+w/y0gGJ57klssOaUiLLQGQ== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.3.1" + "@jest/types" "^29.4.1" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^29.3.1" + pretty-format "^29.4.1" slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.3.1.tgz#60287d92e5010979d01f218c6b215b688e0f313e" - integrity sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA== +jest-mock@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.4.1.tgz#a218a2abf45c99c501d4665207748a6b9e29afbd" + integrity sha512-MwA4hQ7zBOcgVCVnsM8TzaFLVUD/pFWTfbkY953Y81L5ret3GFRZtmPmRFAjKQSdCKoJvvqOu6Bvfpqlwwb0dQ== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.4.1" "@types/node" "*" - jest-util "^29.3.1" + jest-util "^29.4.1" jest-pnp-resolver@^1.2.2: version "1.2.2" @@ -1907,88 +1907,89 @@ jest-regex-util@^29.2.0: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.2.0.tgz#82ef3b587e8c303357728d0322d48bbfd2971f7b" integrity sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA== -jest-resolve-dependencies@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz#a6a329708a128e68d67c49f38678a4a4a914c3bf" - integrity sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA== +jest-resolve-dependencies@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.4.1.tgz#02420a2e055da105e5fca8218c471d8b9553c904" + integrity sha512-Y3QG3M1ncAMxfjbYgtqNXC5B595zmB6e//p/qpA/58JkQXu/IpLDoLeOa8YoYfsSglBKQQzNUqtfGJJT/qLmJg== dependencies: jest-regex-util "^29.2.0" - jest-snapshot "^29.3.1" + jest-snapshot "^29.4.1" -jest-resolve@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.3.1.tgz#9a4b6b65387a3141e4a40815535c7f196f1a68a7" - integrity sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw== +jest-resolve@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.4.1.tgz#4c6bf71a07b8f0b79c5fdf4f2a2cf47317694c5e" + integrity sha512-j/ZFNV2lm9IJ2wmlq1uYK0Y/1PiyDq9g4HEGsNTNr3viRbJdV+8Lf1SXIiLZXFvyiisu0qUyIXGBnw+OKWkJwQ== dependencies: chalk "^4.0.0" graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" + jest-haste-map "^29.4.1" jest-pnp-resolver "^1.2.2" - jest-util "^29.3.1" - jest-validate "^29.3.1" + jest-util "^29.4.1" + jest-validate "^29.4.1" resolve "^1.20.0" - resolve.exports "^1.1.0" + resolve.exports "^2.0.0" slash "^3.0.0" -jest-runner@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.3.1.tgz#a92a879a47dd096fea46bb1517b0a99418ee9e2d" - integrity sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA== - dependencies: - "@jest/console" "^29.3.1" - "@jest/environment" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" +jest-runner@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.4.1.tgz#57460d9ebb0eea2e27eeddca1816cf8537469661" + integrity sha512-8d6XXXi7GtHmsHrnaqBKWxjKb166Eyj/ksSaUYdcBK09VbjPwIgWov1VwSmtupCIz8q1Xv4Qkzt/BTo3ZqiCeg== + dependencies: + "@jest/console" "^29.4.1" + "@jest/environment" "^29.4.1" + "@jest/test-result" "^29.4.1" + "@jest/transform" "^29.4.1" + "@jest/types" "^29.4.1" "@types/node" "*" chalk "^4.0.0" emittery "^0.13.1" graceful-fs "^4.2.9" jest-docblock "^29.2.0" - jest-environment-node "^29.3.1" - jest-haste-map "^29.3.1" - jest-leak-detector "^29.3.1" - jest-message-util "^29.3.1" - jest-resolve "^29.3.1" - jest-runtime "^29.3.1" - jest-util "^29.3.1" - jest-watcher "^29.3.1" - jest-worker "^29.3.1" + jest-environment-node "^29.4.1" + jest-haste-map "^29.4.1" + jest-leak-detector "^29.4.1" + jest-message-util "^29.4.1" + jest-resolve "^29.4.1" + jest-runtime "^29.4.1" + jest-util "^29.4.1" + jest-watcher "^29.4.1" + jest-worker "^29.4.1" p-limit "^3.1.0" source-map-support "0.5.13" -jest-runtime@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.3.1.tgz#21efccb1a66911d6d8591276a6182f520b86737a" - integrity sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A== +jest-runtime@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.4.1.tgz#9a50f9c69d3a391690897c01b0bfa8dc5dd45808" + integrity sha512-UXTMU9uKu2GjYwTtoAw5rn4STxWw/nadOfW7v1sx6LaJYa3V/iymdCLQM6xy3+7C6mY8GfX22vKpgxY171UIoA== dependencies: - "@jest/environment" "^29.3.1" - "@jest/fake-timers" "^29.3.1" - "@jest/globals" "^29.3.1" + "@jest/environment" "^29.4.1" + "@jest/fake-timers" "^29.4.1" + "@jest/globals" "^29.4.1" "@jest/source-map" "^29.2.0" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/test-result" "^29.4.1" + "@jest/transform" "^29.4.1" + "@jest/types" "^29.4.1" "@types/node" "*" chalk "^4.0.0" cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" glob "^7.1.3" graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" - jest-message-util "^29.3.1" - jest-mock "^29.3.1" + jest-haste-map "^29.4.1" + jest-message-util "^29.4.1" + jest-mock "^29.4.1" jest-regex-util "^29.2.0" - jest-resolve "^29.3.1" - jest-snapshot "^29.3.1" - jest-util "^29.3.1" + jest-resolve "^29.4.1" + jest-snapshot "^29.4.1" + jest-util "^29.4.1" + semver "^7.3.5" slash "^3.0.0" strip-bom "^4.0.0" -jest-snapshot@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.3.1.tgz#17bcef71a453adc059a18a32ccbd594b8cc4e45e" - integrity sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA== +jest-snapshot@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.4.1.tgz#5692210b3690c94f19317913d4082b123bd83dd9" + integrity sha512-l4iV8EjGgQWVz3ee/LR9sULDk2pCkqb71bjvlqn+qp90lFwpnulHj4ZBT8nm1hA1C5wowXLc7MGnw321u0tsYA== dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" @@ -1996,82 +1997,82 @@ jest-snapshot@^29.3.1: "@babel/plugin-syntax-typescript" "^7.7.2" "@babel/traverse" "^7.7.2" "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/expect-utils" "^29.4.1" + "@jest/transform" "^29.4.1" + "@jest/types" "^29.4.1" "@types/babel__traverse" "^7.0.6" "@types/prettier" "^2.1.5" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^29.3.1" + expect "^29.4.1" graceful-fs "^4.2.9" - jest-diff "^29.3.1" + jest-diff "^29.4.1" jest-get-type "^29.2.0" - jest-haste-map "^29.3.1" - jest-matcher-utils "^29.3.1" - jest-message-util "^29.3.1" - jest-util "^29.3.1" + jest-haste-map "^29.4.1" + jest-matcher-utils "^29.4.1" + jest-message-util "^29.4.1" + jest-util "^29.4.1" natural-compare "^1.4.0" - pretty-format "^29.3.1" + pretty-format "^29.4.1" semver "^7.3.5" -jest-util@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.3.1.tgz#1dda51e378bbcb7e3bc9d8ab651445591ed373e1" - integrity sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ== +jest-util@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.4.1.tgz#2eeed98ff4563b441b5a656ed1a786e3abc3e4c4" + integrity sha512-bQy9FPGxVutgpN4VRc0hk6w7Hx/m6L53QxpDreTZgJd9gfx/AV2MjyPde9tGyZRINAUrSv57p2inGBu2dRLmkQ== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.4.1" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.3.1.tgz#d56fefaa2e7d1fde3ecdc973c7f7f8f25eea704a" - integrity sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g== +jest-validate@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.4.1.tgz#0d5174510415083ec329d4f981bf6779211f17e9" + integrity sha512-qNZXcZQdIQx4SfUB/atWnI4/I2HUvhz8ajOSYUu40CSmf9U5emil8EDHgE7M+3j9/pavtk3knlZBDsgFvv/SWw== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.4.1" camelcase "^6.2.0" chalk "^4.0.0" jest-get-type "^29.2.0" leven "^3.1.0" - pretty-format "^29.3.1" + pretty-format "^29.4.1" -jest-watcher@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.3.1.tgz#3341547e14fe3c0f79f9c3a4c62dbc3fc977fd4a" - integrity sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg== +jest-watcher@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.4.1.tgz#6e3e2486918bd778849d4d6e67fd77b814f3e6ed" + integrity sha512-vFOzflGFs27nU6h8dpnVRER3O2rFtL+VMEwnG0H3KLHcllLsU8y9DchSh0AL/Rg5nN1/wSiQ+P4ByMGpuybaVw== dependencies: - "@jest/test-result" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/test-result" "^29.4.1" + "@jest/types" "^29.4.1" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" emittery "^0.13.1" - jest-util "^29.3.1" + jest-util "^29.4.1" string-length "^4.0.1" -jest-worker@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.3.1.tgz#e9462161017a9bb176380d721cab022661da3d6b" - integrity sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw== +jest-worker@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.4.1.tgz#7cb4a99a38975679600305650f86f4807460aab1" + integrity sha512-O9doU/S1EBe+yp/mstQ0VpPwpv0Clgn68TkNwGxL6/usX/KUW9Arnn4ag8C3jc6qHcXznhsT5Na1liYzAsuAbQ== dependencies: "@types/node" "*" - jest-util "^29.3.1" + jest-util "^29.4.1" merge-stream "^2.0.0" supports-color "^8.0.0" -jest@29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.3.1.tgz#c130c0d551ae6b5459b8963747fed392ddbde122" - integrity sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA== +jest@29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.4.1.tgz#bb34baca8e05901b49c02c62f1183a6182ea1785" + integrity sha512-cknimw7gAXPDOmj0QqztlxVtBVCw2lYY9CeIE5N6kD+kET1H4H79HSNISJmijb1HF+qk+G+ploJgiDi5k/fRlg== dependencies: - "@jest/core" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/core" "^29.4.1" + "@jest/types" "^29.4.1" import-local "^3.0.2" - jest-cli "^29.3.1" + jest-cli "^29.4.1" js-tokens@^4.0.0: version "4.0.0" @@ -2102,9 +2103,9 @@ json-parse-even-better-errors@^2.3.0: integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== keyv@^4.0.0: version "4.2.9" @@ -2224,10 +2225,10 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -node-dev@7.4.3: - version "7.4.3" - resolved "https://registry.yarnpkg.com/node-dev/-/node-dev-7.4.3.tgz#b30eb365f8e2fa7ce489efb2d597fae1c1aae3ae" - integrity sha512-o8aYipN28xY+WEunMHHiNc3hpPSkGG8ulHyYBapNbkg4dQxohmhx6jiRbiFhTF6zy+5IwljUGv1EcuxsaWI4Bw== +node-dev@8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/node-dev/-/node-dev-8.0.0.tgz#856cb5d80394d301d675a9e90cc3f0dfba065f2c" + integrity sha512-GXc0KxmBXfQxMPdymOui40yvC5W/RXFwmuUDT65wvTAO/o9wAsddYC8q4EHKxq3Qqt+uLS/g7XKdgVcsjyk9lw== dependencies: dateformat "^3.0.3" dynamic-dedupe "^0.3.0" @@ -2387,12 +2388,12 @@ polka@0.5.2: "@polka/url" "^0.5.0" trouter "^2.0.1" -pretty-format@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.3.1.tgz#1841cac822b02b4da8971dacb03e8a871b4722da" - integrity sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg== +pretty-format@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.4.1.tgz#0da99b532559097b8254298da7c75a0785b1751c" + integrity sha512-dt/Z761JUVsrIKaY215o1xQJBGlSmTx/h4cSqXqjHLnU1+Kt+mavVE7UgqJJO5ukx5HjSswHfmXz4LjS2oIJfg== dependencies: - "@jest/schemas" "^29.0.0" + "@jest/schemas" "^29.4.0" ansi-styles "^5.0.0" react-is "^18.0.0" @@ -2444,10 +2445,10 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve.exports@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== +resolve.exports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.0.tgz#c1a0028c2d166ec2fbf7d0644584927e76e7400e" + integrity sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg== resolve@^1.20.0, resolve@^1.22.0: version "1.22.1" @@ -2716,10 +2717,10 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -write-file-atomic@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== +write-file-atomic@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.0.tgz#54303f117e109bf3d540261125c8ea5a7320fab0" + integrity sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w== dependencies: imurmurhash "^0.1.4" signal-exit "^3.0.7" diff --git a/deployer/poetry.lock b/deployer/poetry.lock index 45c689d90eec..311b7e90595e 100644 --- a/deployer/poetry.lock +++ b/deployer/poetry.lock @@ -1,3 +1,5 @@ +# This file is automatically @generated by Poetry and should not be changed by hand. + [[package]] name = "attrs" version = "20.3.0" @@ -5,6 +7,10 @@ description = "Classes Without Boilerplate" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"}, + {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, +] [package.extras] dev = ["coverage[toml] (>=5.0.2)", "furo", "hypothesis", "pre-commit", "pympler", "pytest (>=4.3.0)", "six", "sphinx", "zope.interface"] @@ -14,18 +20,46 @@ tests-no-zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "black" -version = "22.12.0" +version = "23.1.0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "black-23.1.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:b6a92a41ee34b883b359998f0c8e6eb8e99803aa8bf3123bf2b2e6fec505a221"}, + {file = "black-23.1.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:57c18c5165c1dbe291d5306e53fb3988122890e57bd9b3dcb75f967f13411a26"}, + {file = "black-23.1.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:9880d7d419bb7e709b37e28deb5e68a49227713b623c72b2b931028ea65f619b"}, + {file = "black-23.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6663f91b6feca5d06f2ccd49a10f254f9298cc1f7f49c46e498a0771b507104"}, + {file = "black-23.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:9afd3f493666a0cd8f8df9a0200c6359ac53940cbde049dcb1a7eb6ee2dd7074"}, + {file = "black-23.1.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:bfffba28dc52a58f04492181392ee380e95262af14ee01d4bc7bb1b1c6ca8d27"}, + {file = "black-23.1.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c1c476bc7b7d021321e7d93dc2cbd78ce103b84d5a4cf97ed535fbc0d6660648"}, + {file = "black-23.1.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:382998821f58e5c8238d3166c492139573325287820963d2f7de4d518bd76958"}, + {file = "black-23.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bf649fda611c8550ca9d7592b69f0637218c2369b7744694c5e4902873b2f3a"}, + {file = "black-23.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:121ca7f10b4a01fd99951234abdbd97728e1240be89fde18480ffac16503d481"}, + {file = "black-23.1.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:a8471939da5e824b891b25751955be52ee7f8a30a916d570a5ba8e0f2eb2ecad"}, + {file = "black-23.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8178318cb74f98bc571eef19068f6ab5613b3e59d4f47771582f04e175570ed8"}, + {file = "black-23.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:a436e7881d33acaf2536c46a454bb964a50eff59b21b51c6ccf5a40601fbef24"}, + {file = "black-23.1.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:a59db0a2094d2259c554676403fa2fac3473ccf1354c1c63eccf7ae65aac8ab6"}, + {file = "black-23.1.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:0052dba51dec07ed029ed61b18183942043e00008ec65d5028814afaab9a22fd"}, + {file = "black-23.1.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:49f7b39e30f326a34b5c9a4213213a6b221d7ae9d58ec70df1c4a307cf2a1580"}, + {file = "black-23.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:162e37d49e93bd6eb6f1afc3e17a3d23a823042530c37c3c42eeeaf026f38468"}, + {file = "black-23.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b70eb40a78dfac24842458476135f9b99ab952dd3f2dab738c1881a9b38b753"}, + {file = "black-23.1.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:a29650759a6a0944e7cca036674655c2f0f63806ddecc45ed40b7b8aa314b651"}, + {file = "black-23.1.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:bb460c8561c8c1bec7824ecbc3ce085eb50005883a6203dcfb0122e95797ee06"}, + {file = "black-23.1.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:c91dfc2c2a4e50df0026f88d2215e166616e0c80e86004d0003ece0488db2739"}, + {file = "black-23.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a951cc83ab535d248c89f300eccbd625e80ab880fbcfb5ac8afb5f01a258ac9"}, + {file = "black-23.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0680d4380db3719ebcfb2613f34e86c8e6d15ffeabcf8ec59355c5e7b85bb555"}, + {file = "black-23.1.0-py3-none-any.whl", hash = "sha256:7a0f701d314cfa0896b9001df70a530eb2472babb76086344e688829efd97d32"}, + {file = "black-23.1.0.tar.gz", hash = "sha256:b0bd97bea8903f5a2ba7219257a44e3f1f9d00073d6cc1add68f0beec69692ac"}, +] [package.dependencies] click = ">=8.0.0" mypy-extensions = ">=0.4.3" +packaging = ">=22.0" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} @@ -37,14 +71,18 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "boto3" -version = "1.26.37" +version = "1.26.64" description = "The AWS SDK for Python" category = "main" optional = false python-versions = ">= 3.7" +files = [ + {file = "boto3-1.26.64-py3-none-any.whl", hash = "sha256:777b00e17eddeb92cf5d4674d61453d9bbaeb5bfde4485cb55995bfd07aeefce"}, + {file = "boto3-1.26.64.tar.gz", hash = "sha256:b0e3d078ec56bc858cc5edae4cda3eed2b1872055828cf5f22d83fc6f79a6d40"}, +] [package.dependencies] -botocore = ">=1.29.37,<1.30.0" +botocore = ">=1.29.64,<1.30.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.6.0,<0.7.0" @@ -53,11 +91,15 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.29.37" +version = "1.29.64" description = "Low-level, data-driven core of boto 3." category = "main" optional = false python-versions = ">= 3.7" +files = [ + {file = "botocore-1.29.64-py3-none-any.whl", hash = "sha256:a1e06b8d6cb65bb8bade392bbc8d11f4431a1658f61c1ff7db5008ac20558862"}, + {file = "botocore-1.29.64.tar.gz", hash = "sha256:2424c96547eeb9b76eb5bcee5b5bc01741834f525ecc4d538d71d269c7ba6662"}, +] [package.dependencies] jmespath = ">=0.7.1,<2.0.0" @@ -65,7 +107,7 @@ python-dateutil = ">=2.1,<3.0.0" urllib3 = ">=1.25.4,<1.27" [package.extras] -crt = ["awscrt (==0.15.3)"] +crt = ["awscrt (==0.16.9)"] [[package]] name = "certifi" @@ -74,6 +116,10 @@ description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, + {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, +] [[package]] name = "cffi" @@ -82,6 +128,57 @@ description = "Foreign Function Interface for Python calling C code." category = "main" optional = false python-versions = "*" +files = [ + {file = "cffi-1.14.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991"}, + {file = "cffi-1.14.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1"}, + {file = "cffi-1.14.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa"}, + {file = "cffi-1.14.5-cp27-cp27m-win32.whl", hash = "sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3"}, + {file = "cffi-1.14.5-cp27-cp27m-win_amd64.whl", hash = "sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5"}, + {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482"}, + {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6"}, + {file = "cffi-1.14.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045"}, + {file = "cffi-1.14.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa"}, + {file = "cffi-1.14.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406"}, + {file = "cffi-1.14.5-cp35-cp35m-win32.whl", hash = "sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369"}, + {file = "cffi-1.14.5-cp35-cp35m-win_amd64.whl", hash = "sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315"}, + {file = "cffi-1.14.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24ec4ff2c5c0c8f9c6b87d5bb53555bf267e1e6f70e52e5a9740d32861d36b6f"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c3f39fa737542161d8b0d680df2ec249334cd70a8f420f71c9304bd83c3cbed"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:681d07b0d1e3c462dd15585ef5e33cb021321588bebd910124ef4f4fb71aef55"}, + {file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"}, + {file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"}, + {file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06d7cd1abac2ffd92e65c0609661866709b4b2d82dd15f611e602b9b188b0b69"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f861a89e0043afec2a51fd177a567005847973be86f709bbb044d7f42fc4e05"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc5a8e069b9ebfa22e26d0e6b97d6f9781302fe7f4f2b8776c3e1daea35f1adc"}, + {file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"}, + {file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"}, + {file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04c468b622ed31d408fea2346bec5bbffba2cc44226302a0de1ade9f5ea3d373"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06db6321b7a68b2bd6df96d08a5adadc1fa0e8f419226e25b2a5fbf6ccc7350f"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:293e7ea41280cb28c6fcaaa0b1aa1f533b8ce060b9e701d78511e1e6c4a1de76"}, + {file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"}, + {file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"}, + {file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bf1ac1984eaa7675ca8d5745a8cb87ef7abecb5592178406e55858d411eadc0"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df5052c5d867c1ea0b311fb7c3cd28b19df469c056f7fdcfe88c7473aa63e333"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a570cd11895b60829e941f2613a4f79df1a27344cbbb82164ef2e0116f09c7"}, + {file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"}, + {file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"}, + {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"}, +] [package.dependencies] pycparser = "*" @@ -93,6 +190,10 @@ description = "The Real First Universal Charset Detector. Open, modern and activ category = "main" optional = false python-versions = ">=3.5.0" +files = [ + {file = "charset-normalizer-2.0.3.tar.gz", hash = "sha256:c46c3ace2d744cfbdebceaa3c19ae691f53ae621b39fd7570f59d14fb7f2fd12"}, + {file = "charset_normalizer-2.0.3-py3-none-any.whl", hash = "sha256:88fce3fa5b1a84fdcb3f603d889f723d1dd89b26059d0123ca435570e848d5e1"}, +] [package.extras] unicode-backport = ["unicodedata2"] @@ -104,6 +205,10 @@ description = "Composable command line interface toolkit" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -116,6 +221,10 @@ description = "Cross-platform colored terminal text." category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, +] [[package]] name = "cython" @@ -124,6 +233,48 @@ description = "The Cython compiler for writing C extensions for the Python langu category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "Cython-0.29.23-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff885f18d169759b57f116d3956e45cd2b9cba989fde348bba091544c668dc11"}, + {file = "Cython-0.29.23-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:3b29224eb62309a10819d923dc6262f769e4f3facfee3cd06372c355e5b38b33"}, + {file = "Cython-0.29.23-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:355a6e768d91e21fbf477b61881bab64b7a2da386a166898997bccefd532cf5d"}, + {file = "Cython-0.29.23-cp27-cp27m-win32.whl", hash = "sha256:2af52d312e96b38ded38b34d06e22685c226b1b0e58278bd27209f5d2385d115"}, + {file = "Cython-0.29.23-cp27-cp27m-win_amd64.whl", hash = "sha256:519fccf526d26b377e1db22f22aa44889b28bc5833ec106588cb13557e8ba2da"}, + {file = "Cython-0.29.23-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:625a16103770fd92b487b701fb0c07e5790b080f40fa11ce572a2d56d9e9fcca"}, + {file = "Cython-0.29.23-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:7b7a766726d207d7cd57aff0fcb4b35ce042d3cc88a421fcdb45eeb61a5b9d12"}, + {file = "Cython-0.29.23-cp34-cp34m-win32.whl", hash = "sha256:474c1a29ab43e29d990df279e2cf6aa96baa9208f5cd4bc76ac87ffcdf1e2945"}, + {file = "Cython-0.29.23-cp34-cp34m-win_amd64.whl", hash = "sha256:f4aca6bffb1c1c3c4ada3347d0b162a699c18a66e097ee08b63b3a35118fdfcc"}, + {file = "Cython-0.29.23-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:58dc06871bfdb0592542d779714fe9f918e11ba20ac07757dd63b198bdc704fe"}, + {file = "Cython-0.29.23-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:2a3bbce689a2fddb85aa66712d93875c99bf7f64ac82b1d149ecce522a7a4e0c"}, + {file = "Cython-0.29.23-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:8b8a02883ef75f21472205e8db2e471efb142729030fedb8c4e59a06866682ee"}, + {file = "Cython-0.29.23-cp35-cp35m-win32.whl", hash = "sha256:3ef530f975e3a760e7282fce2a25f900fa63f96d17321b4aa5f5542eb9859cdf"}, + {file = "Cython-0.29.23-cp35-cp35m-win_amd64.whl", hash = "sha256:ef21c51350462160456eb71df31b0869e5141e940f22c61c358bdb6e3ebc3388"}, + {file = "Cython-0.29.23-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:20402ef316393168909926ab21848aa6e08e39bed5003b657139774e66166cd0"}, + {file = "Cython-0.29.23-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:4858043ac5f96a8f0277cf63760bb39b9521c1f897678cf1d22423f3e758f4ed"}, + {file = "Cython-0.29.23-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4d7c3b0882d8757c601eaf288fc0d321d5c7ac6c3afb8c42eddf9325a3419cf5"}, + {file = "Cython-0.29.23-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:b05f365329e8ad44ff492408265841c83a43b83e430286490791a1f4bdaa0bef"}, + {file = "Cython-0.29.23-cp36-cp36m-win32.whl", hash = "sha256:37ff66039e3d138ec968ee1d1e12441fa5fb4e6a9c5458bc3c3a232f01be4a7d"}, + {file = "Cython-0.29.23-cp36-cp36m-win_amd64.whl", hash = "sha256:5be3ae3189cf7d0e9bbeafb854496dc7030c6f6a5602d809435fab8223543a41"}, + {file = "Cython-0.29.23-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b0699f0dc90181f2458fdb8170455e7798a309e18f41379eda7a2dc8c7aadee0"}, + {file = "Cython-0.29.23-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:41cd0dd2ff5d78466e73409db509887a84449b400074d4f217980cedbb18e4be"}, + {file = "Cython-0.29.23-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:aa3bb0928fb2aa3a8828801eb8b29af2261c199f805ae835467489e2bdd00372"}, + {file = "Cython-0.29.23-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:a6b02900d80c6f1ad4fc2060563922b4f031505c69ceeceba112d8971aacbcc3"}, + {file = "Cython-0.29.23-cp37-cp37m-win32.whl", hash = "sha256:20cb50d9fede8029bdb50875458f07a27f909289aeed4cdb9c19544dd9a9bc45"}, + {file = "Cython-0.29.23-cp37-cp37m-win_amd64.whl", hash = "sha256:c4b82461edbbcf90f19b319006345b77474a2d7514e1476d49a14bbd55d6b797"}, + {file = "Cython-0.29.23-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:794e3df0b57e16bce7583ac909126f4cb381fe566adadb20484d89095855eedb"}, + {file = "Cython-0.29.23-cp38-cp38-manylinux1_i686.whl", hash = "sha256:0c4b9f7e3aa004cf3f364e3e772f55fec5740485bafea99d1f13bdc9bbd8a545"}, + {file = "Cython-0.29.23-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:ceccc03b633113ede1f14ad914a6db5c278ce108c8ddb308a5c01c1567d8a02a"}, + {file = "Cython-0.29.23-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:06317468cfbf6f77f8c5b71cec76a565bd8c01432914d2d6338a298bab86f9f7"}, + {file = "Cython-0.29.23-cp38-cp38-win32.whl", hash = "sha256:4b0bcf2e06a9063fc78c3243ed4003228375d532ef13b9e5d7183be8f0a52cf5"}, + {file = "Cython-0.29.23-cp38-cp38-win_amd64.whl", hash = "sha256:5a6792153b728a0240e55bbb5b643f4f7e45c76319e03abf15bf367471ea1d1a"}, + {file = "Cython-0.29.23-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a8eed9c82e8fe07b8a8ffbd36018871a17458903fc25c9d015f37b54513a3efd"}, + {file = "Cython-0.29.23-cp39-cp39-manylinux1_i686.whl", hash = "sha256:266459c7e48fe3c6c492b297e4033e42d4c6863cc1a1ff7cc4034949fc574fa6"}, + {file = "Cython-0.29.23-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:4b6824b58d4373224fc76ee8bee6b35c2d17c91a1ed0fa67b88440f63daebe50"}, + {file = "Cython-0.29.23-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5baab5e14dd1fda34044aebf5303c69c4ce88ba7082e0b77b7a25bd09bfc39df"}, + {file = "Cython-0.29.23-cp39-cp39-win32.whl", hash = "sha256:7d6a33c8a11f05f698e215bfdb837f32c27f63c20f3af863557ed91c748dc2be"}, + {file = "Cython-0.29.23-cp39-cp39-win_amd64.whl", hash = "sha256:2365f3b5e6451b6bc6dcd262230656f4ade1d862ec2f6c22154deebef37c08b6"}, + {file = "Cython-0.29.23-py2.py3-none-any.whl", hash = "sha256:282263628c5d601b313d5920f7b6d7e08c7fedbddacd080c4858aa04d86b6b4b"}, + {file = "Cython-0.29.23.tar.gz", hash = "sha256:6a0d31452f0245daacb14c979c77e093eb1a546c760816b5eed0047686baad8e"}, +] [[package]] name = "deprecated" @@ -132,6 +283,10 @@ description = "Python @deprecated decorator to deprecate old python classes, fun category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "Deprecated-1.2.12-py2.py3-none-any.whl", hash = "sha256:08452d69b6b5bc66e8330adde0a4f8642e969b9e1702904d137eeb29c8ffc771"}, + {file = "Deprecated-1.2.12.tar.gz", hash = "sha256:6d2de2de7931a968874481ef30208fd4e08da39177d61d3d4ebdf4366e7dbca1"}, +] [package.dependencies] wrapt = ">=1.10,<2" @@ -146,6 +301,10 @@ description = "Python client for Elasticsearch" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4" +files = [ + {file = "elasticsearch-7.11.0-py2.py3-none-any.whl", hash = "sha256:a113cfcee9ba8565cd48a67b60e9903b67a81b3b80ddc6d3fb2c16789a58b763"}, + {file = "elasticsearch-7.11.0.tar.gz", hash = "sha256:1e24b33a82bf381b42d3b0d390f76fdb9d6a9d47b310dea8eaeb0a5933c394c0"}, +] [package.dependencies] certifi = "*" @@ -164,6 +323,10 @@ description = "Python client for Elasticsearch" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "elasticsearch-dsl-7.4.0.tar.gz", hash = "sha256:c4a7b93882918a413b63bed54018a1685d7410ffd8facbc860ee7fd57f214a6d"}, + {file = "elasticsearch_dsl-7.4.0-py2.py3-none-any.whl", hash = "sha256:046ea10820b94c075081b528b4526c5bc776bda4226d702f269a5f203232064b"}, +] [package.dependencies] elasticsearch = ">=7.0.0,<8.0.0" @@ -180,6 +343,10 @@ description = "Backport of PEP 654 (exception groups)" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.0.0-py3-none-any.whl", hash = "sha256:2ac84b496be68464a2da60da518af3785fff8b7ec0d090a581604bc870bdee41"}, + {file = "exceptiongroup-1.0.0.tar.gz", hash = "sha256:affbabf13fb6e98988c38d9c5650e701569fe3c1de3233cfb61c5f33774690ad"}, +] [package.extras] test = ["pytest (>=6)"] @@ -191,6 +358,10 @@ description = "the modular source code checker: pep8 pyflakes and co" category = "dev" optional = false python-versions = ">=3.6.1" +files = [ + {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, + {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, +] [package.dependencies] importlib-metadata = {version = ">=1.1.0,<4.3", markers = "python_version < \"3.8\""} @@ -205,6 +376,10 @@ description = "Internationalized Domain Names in Applications (IDNA)" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, + {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, +] [[package]] name = "importlib-metadata" @@ -213,6 +388,10 @@ description = "Read metadata from Python packages" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "importlib_metadata-3.7.3-py3-none-any.whl", hash = "sha256:b74159469b464a99cb8cc3e21973e4d96e05d3024d337313fedb618a6e86e6f4"}, + {file = "importlib_metadata-3.7.3.tar.gz", hash = "sha256:742add720a20d0467df2f444ae41704000f50e1234f46174b51f9c6031a1bd71"}, +] [package.dependencies] typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} @@ -229,6 +408,10 @@ description = "iniconfig: brain-dead simple config-ini parsing" category = "dev" optional = false python-versions = "*" +files = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] [[package]] name = "jmespath" @@ -237,6 +420,10 @@ description = "JSON Matching Expressions" category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f"}, + {file = "jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9"}, +] [[package]] name = "mccabe" @@ -245,6 +432,10 @@ description = "McCabe checker, plugin for flake8" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] [[package]] name = "mypy-extensions" @@ -253,17 +444,22 @@ description = "Experimental type system extensions for programs checked with the category = "dev" optional = false python-versions = "*" +files = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] [[package]] name = "packaging" -version = "20.9" +version = "23.0" description = "Core utilities for Python packages" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -pyparsing = ">=2.0.2" +python-versions = ">=3.7" +files = [ + {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, + {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, +] [[package]] name = "pathspec" @@ -272,6 +468,10 @@ description = "Utility library for gitignore style pattern matching of file path category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, + {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, +] [[package]] name = "platformdirs" @@ -280,6 +480,10 @@ description = "A small Python module for determining appropriate platform-specif category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "platformdirs-2.2.0-py3-none-any.whl", hash = "sha256:4666d822218db6a262bdfdc9c39d21f23b4cfdb08af331a81e92751daf6c866c"}, + {file = "platformdirs-2.2.0.tar.gz", hash = "sha256:632daad3ab546bd8e6af0537d09805cec458dce201bccfe23012df73332e181e"}, +] [package.extras] docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] @@ -292,6 +496,10 @@ description = "plugin and hook calling mechanisms for python" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, + {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, +] [package.dependencies] importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} @@ -306,6 +514,10 @@ description = "Python style guide checker" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, + {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, +] [[package]] name = "pycparser" @@ -314,6 +526,10 @@ description = "C parser in Python" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, + {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, +] [[package]] name = "pyflakes" @@ -322,6 +538,10 @@ description = "passive checker of Python programs" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, + {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, +] [[package]] name = "pygithub" @@ -330,6 +550,10 @@ description = "Use the full Github API v3" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "PyGithub-1.57-py3-none-any.whl", hash = "sha256:5822febeac2391f1306c55a99af2bc8f86c8bf82ded000030cd02c18f31b731f"}, + {file = "PyGithub-1.57.tar.gz", hash = "sha256:c273f252b278fb81f1769505cc6921bdb6791e1cebd6ac850cc97dad13c31ff3"}, +] [package.dependencies] deprecated = "*" @@ -347,6 +571,10 @@ description = "JSON Web Token implementation in Python" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "PyJWT-2.4.0-py3-none-any.whl", hash = "sha256:72d1d253f32dbd4f5c88eaf1fdc62f3a19f676ccbadb9dbc5d07e951b2b26daf"}, + {file = "PyJWT-2.4.0.tar.gz", hash = "sha256:d42908208c699b3b973cbeb01a969ba6a96c821eefb1c5bfe4c390c01d67abba"}, +] [package.extras] crypto = ["cryptography (>=3.3.1)"] @@ -361,30 +589,46 @@ description = "Python binding to the Networking and Cryptography (NaCl) library" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "PyNaCl-1.4.0-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:ea6841bc3a76fa4942ce00f3bda7d436fda21e2d91602b9e21b7ca9ecab8f3ff"}, + {file = "PyNaCl-1.4.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:d452a6746f0a7e11121e64625109bc4468fc3100452817001dbe018bb8b08514"}, + {file = "PyNaCl-1.4.0-cp27-cp27m-win32.whl", hash = "sha256:2fe0fc5a2480361dcaf4e6e7cea00e078fcda07ba45f811b167e3f99e8cff574"}, + {file = "PyNaCl-1.4.0-cp27-cp27m-win_amd64.whl", hash = "sha256:f8851ab9041756003119368c1e6cd0b9c631f46d686b3904b18c0139f4419f80"}, + {file = "PyNaCl-1.4.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:7757ae33dae81c300487591c68790dfb5145c7d03324000433d9a2c141f82af7"}, + {file = "PyNaCl-1.4.0-cp35-abi3-macosx_10_10_x86_64.whl", hash = "sha256:757250ddb3bff1eecd7e41e65f7f833a8405fede0194319f87899690624f2122"}, + {file = "PyNaCl-1.4.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:30f9b96db44e09b3304f9ea95079b1b7316b2b4f3744fe3aaecccd95d547063d"}, + {file = "PyNaCl-1.4.0-cp35-abi3-win32.whl", hash = "sha256:4e10569f8cbed81cb7526ae137049759d2a8d57726d52c1a000a3ce366779634"}, + {file = "PyNaCl-1.4.0-cp35-abi3-win_amd64.whl", hash = "sha256:c914f78da4953b33d4685e3cdc7ce63401247a21425c16a39760e282075ac4a6"}, + {file = "PyNaCl-1.4.0-cp35-cp35m-win32.whl", hash = "sha256:06cbb4d9b2c4bd3c8dc0d267416aaed79906e7b33f114ddbf0911969794b1cc4"}, + {file = "PyNaCl-1.4.0-cp35-cp35m-win_amd64.whl", hash = "sha256:511d269ee845037b95c9781aa702f90ccc36036f95d0f31373a6a79bd8242e25"}, + {file = "PyNaCl-1.4.0-cp36-cp36m-win32.whl", hash = "sha256:11335f09060af52c97137d4ac54285bcb7df0cef29014a1a4efe64ac065434c4"}, + {file = "PyNaCl-1.4.0-cp36-cp36m-win_amd64.whl", hash = "sha256:cd401ccbc2a249a47a3a1724c2918fcd04be1f7b54eb2a5a71ff915db0ac51c6"}, + {file = "PyNaCl-1.4.0-cp37-cp37m-win32.whl", hash = "sha256:8122ba5f2a2169ca5da936b2e5a511740ffb73979381b4229d9188f6dcb22f1f"}, + {file = "PyNaCl-1.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:537a7ccbea22905a0ab36ea58577b39d1fa9b1884869d173b5cf111f006f689f"}, + {file = "PyNaCl-1.4.0-cp38-cp38-win32.whl", hash = "sha256:9c4a7ea4fb81536c1b1f5cc44d54a296f96ae78c1ebd2311bd0b60be45a48d96"}, + {file = "PyNaCl-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:7c6092102219f59ff29788860ccb021e80fffd953920c4a8653889c029b2d420"}, + {file = "PyNaCl-1.4.0.tar.gz", hash = "sha256:54e9a2c849c742006516ad56a88f5c74bf2ce92c9f67435187c3c5953b346505"}, +] [package.dependencies] cffi = ">=1.4.1" six = "*" [package.extras] -docs = ["sphinx (>=1.6.5)", "sphinx_rtd_theme"] +docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] -[[package]] -name = "pyparsing" -version = "2.4.7" -description = "Python parsing module" -category = "dev" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - [[package]] name = "pytest" -version = "7.2.0" +version = "7.2.1" description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pytest-7.2.1-py3-none-any.whl", hash = "sha256:c7c6ca206e93355074ae32f7403e8ea12163b1163c976fee7d4d84027c162be5"}, + {file = "pytest-7.2.1.tar.gz", hash = "sha256:d45e0952f3727241918b8fd0f376f5ff6b301cc0777c6f9a556935c92d8a7d42"}, +] [package.dependencies] attrs = ">=19.2.0" @@ -406,29 +650,41 @@ description = "Extensions to the standard Python datetime module" category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"}, + {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, +] [package.dependencies] six = ">=1.5" [[package]] name = "python-decouple" -version = "3.6" +version = "3.7" description = "Strict separation of settings from code." category = "main" optional = false python-versions = "*" +files = [ + {file = "python-decouple-3.7.tar.gz", hash = "sha256:e88a8d6bdf3b07d471a854099e455e20a6fa7a4d6ecf8631b250e3db654336e6"}, + {file = "python_decouple-3.7-py3-none-any.whl", hash = "sha256:1596dad2670cca5b1f87d087d9adb6a1958c590df346b85d4b19a9d6f0d52cef"}, +] [[package]] name = "requests" -version = "2.28.1" +version = "2.28.2" description = "Python HTTP for Humans." category = "main" optional = false python-versions = ">=3.7, <4" +files = [ + {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, + {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, +] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<3" +charset-normalizer = ">=2,<4" idna = ">=2.5,<4" urllib3 = ">=1.21.1,<1.27" @@ -443,6 +699,10 @@ description = "An Amazon S3 Transfer Manager" category = "main" optional = false python-versions = ">= 3.7" +files = [ + {file = "s3transfer-0.6.0-py3-none-any.whl", hash = "sha256:06176b74f3a15f61f1b4f25a1fc29a4429040b7647133a463da8fa5bd28d5ecd"}, + {file = "s3transfer-0.6.0.tar.gz", hash = "sha256:2ed07d3866f523cc561bf4a00fc5535827981b117dd7876f036b0c1aca42c947"}, +] [package.dependencies] botocore = ">=1.12.36,<2.0a.0" @@ -452,11 +712,70 @@ crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"] [[package]] name = "selectolax" -version = "0.3.11" +version = "0.3.12" description = "Fast HTML5 parser with CSS selectors." category = "main" optional = false python-versions = "*" +files = [ + {file = "selectolax-0.3.12-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a08e3ef499df78b144f4d8541850b7c8e7f1acec15df648a132583ec9e3b225c"}, + {file = "selectolax-0.3.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e91751c0c190200fbace6a38160137e04b016430136e147da099cae7bab92385"}, + {file = "selectolax-0.3.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1484f660a9628d7d8680d90795f9301753a4a5cef1ac4cbd34db474c3727e966"}, + {file = "selectolax-0.3.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f56c662cae6623fc7777551a34a2c781ab71b6afce8b2c208d489aa891c94b3"}, + {file = "selectolax-0.3.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a0dac1324a5932e1dfd0f4bf800f01b4d54a5a0203b3dd65382766aee3db943"}, + {file = "selectolax-0.3.12-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:537face22108b79dd438589bb50a27a218a805999de4b4c7d001e4ee19b5df26"}, + {file = "selectolax-0.3.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ac5010c33537c07994251ebe5a88b85915d754209d924a994bb3449e0ef329ed"}, + {file = "selectolax-0.3.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:244ec7f522c4523bc897f5debcf0debb48029de73c33ee67510268ec9eec34d2"}, + {file = "selectolax-0.3.12-cp310-cp310-win32.whl", hash = "sha256:92bbd24d6da21fca34cd313236fb33596fe7ef79210300028b28b6dbead627a4"}, + {file = "selectolax-0.3.12-cp310-cp310-win_amd64.whl", hash = "sha256:fb76d19c972d380df04101527be14fce26d1417a0d41b36685659e444650f3a3"}, + {file = "selectolax-0.3.12-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:700bbeb7ae14ed9d8bb715e629fd6ee2cb6177205b09358ceebd0dd18282e6f5"}, + {file = "selectolax-0.3.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a7fe25271482f5294d28a1f9307cf5263f12da937a2c88cf5e1bb259770990e"}, + {file = "selectolax-0.3.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d7cad29ecd151a8336dbb6ae9f6d73eca36cafa7039c6a821ec18c831e60670"}, + {file = "selectolax-0.3.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f97e6b88d802fe893870b83ad5130f08915565296ed2963d6243ecc0e28aadd4"}, + {file = "selectolax-0.3.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:194dbe888661fff64fd6815159ecbd6f9ce6f97b6a2930935613d0a0b13f7987"}, + {file = "selectolax-0.3.12-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:04ce4ee60c59c53003231a944db403f98b63211502aae8096bc0d1cdbb551663"}, + {file = "selectolax-0.3.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:da43c6b585ebbb20f878b8eb8530a13e1661ba4956c038c85331a754b50ecd37"}, + {file = "selectolax-0.3.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ff60b4dd044f9b938f2406241f4932d6b5de3fa2bde128ecf2da3cc92a741723"}, + {file = "selectolax-0.3.12-cp311-cp311-win32.whl", hash = "sha256:591cce89614d1fd2db940e3433c2f5b887ba0d0769bf1f24b65e69914f4a6b66"}, + {file = "selectolax-0.3.12-cp311-cp311-win_amd64.whl", hash = "sha256:02ef4bb5f95d44a54183a3a27795b83dc6a52fbd0ee74a75955eb9262de69c4c"}, + {file = "selectolax-0.3.12-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:93bc23d45b69d4129fcf826c529ca3fe2f9ed5c0070c34f5d9cdc620157fe2ba"}, + {file = "selectolax-0.3.12-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ba1766f00d53c5362c2726d760cf69e64e1668e5c974a005783842d0f0329b9"}, + {file = "selectolax-0.3.12-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:205fe9b510d332b8974a2e2e71d6293263a51cde9b58026032513b2024a78824"}, + {file = "selectolax-0.3.12-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:f170ac2110d5c7d7731cc9e9b2b284a7ae1e06338d2bf94042c44b2d3c5661a8"}, + {file = "selectolax-0.3.12-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d14ab9cb663bb25bb2be0ef9b1c7e0b19470c5dc02849073ac58a58638242248"}, + {file = "selectolax-0.3.12-cp36-cp36m-win32.whl", hash = "sha256:ec7bfa0619a8051ff0fb3ed708530aab12bcbf60bc335cd6d5d9974ec2b8b797"}, + {file = "selectolax-0.3.12-cp36-cp36m-win_amd64.whl", hash = "sha256:b0f9985edde8811f3d97c9e7486bc3d5a8f0c33febd855037ef7f01e94412aed"}, + {file = "selectolax-0.3.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3e00759da8d2e4e360c18e98de78a778286002d19606abf4909990b5495e3f5a"}, + {file = "selectolax-0.3.12-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:454c64eb8b3517bb71ea784ea0e8ed1ecd46745a07b33a9f2b625f065140d1f1"}, + {file = "selectolax-0.3.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:daee5a35b8444877b220f913a6f4aad427013bde2b2d46d90523d13925ec3dcd"}, + {file = "selectolax-0.3.12-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4ccd966a58048bba257077220dbb4901031462479c713ce04ddece7da3a14610"}, + {file = "selectolax-0.3.12-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cfa0952aec7fe84e7a569c09039f354c90b23307a3c7bb66c15293c94f4b68b4"}, + {file = "selectolax-0.3.12-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7e5082fc58351125463d130ec7300718f54509357804c04b3b1e3a3c43a5e660"}, + {file = "selectolax-0.3.12-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4d6d8f7cf305c526adf3a8e646b7de1610af8c145be59d1e41c05ac606af4b28"}, + {file = "selectolax-0.3.12-cp37-cp37m-win32.whl", hash = "sha256:3c2f9fbec34723b1a4f21e69afb73c1029cf76d200c2d2b6f3ba2bd6e0dc7ef3"}, + {file = "selectolax-0.3.12-cp37-cp37m-win_amd64.whl", hash = "sha256:8bdc3b28a03e0bf9ee355ec527a2df87a14d7011e650353cd6010e8cac569927"}, + {file = "selectolax-0.3.12-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:acdb5bd9ae59bd135b892105c7595f85a6720e47248b499d71df15c981ac2769"}, + {file = "selectolax-0.3.12-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25a29b44fcc52f0373df7f9c9e327aafa56b0d75a7ca0a4724ffb2f9559e79c9"}, + {file = "selectolax-0.3.12-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88d7808349565018977797ba37bd34a063525b1691b0ecdb05b95c95347588e1"}, + {file = "selectolax-0.3.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99bb2121e059d53ff3b6d4befa45466165c667fe1065d34ee5531cf76aef780f"}, + {file = "selectolax-0.3.12-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:45317a7f8a856d3f3647ae1ec9d0541972c605f2f1d54d6a09176738459abf9e"}, + {file = "selectolax-0.3.12-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0a63532b2654574a1cde150cb376dda5474538b54ff3bec5f2a5d8180123df2b"}, + {file = "selectolax-0.3.12-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d8cdea81e6e57c1f593a337195eb166b297670757dd3531d3522c880f5ce9c5f"}, + {file = "selectolax-0.3.12-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c95637d060e8acf5116e2658079e49c603e48614bbd94a5f48da73ce07e0feb4"}, + {file = "selectolax-0.3.12-cp38-cp38-win32.whl", hash = "sha256:7198a8f55451c8fbb0609ab0fd6bb941040c30e69bc71c3549c22771f290c2cf"}, + {file = "selectolax-0.3.12-cp38-cp38-win_amd64.whl", hash = "sha256:477e32be8c03c468d381c46c9b0ca2b4e81928588362ea3ec94fdb49d3777900"}, + {file = "selectolax-0.3.12-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:32ef00778a4c619302667642b3280641f6a492b099cb3720a5af605f3818b76f"}, + {file = "selectolax-0.3.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c1a8085d87278beef55f37c9ffb881a0a5cae0e2eb95573858e78468277f032e"}, + {file = "selectolax-0.3.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31131796446bbb2f7e9a23d1335ac887b01ceb20b751b0522c146463ef973550"}, + {file = "selectolax-0.3.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fac8d4f0c54fe0d6cecde1f74ddae0ee8af018a4dd10ac03da2102b8d8aadc1e"}, + {file = "selectolax-0.3.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:976b8c139c44d38786ecb03f42588b011cab13d91bda854d8ec1ae6559a2a9eb"}, + {file = "selectolax-0.3.12-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:516dad82c402533b82a536889ec076c1eefdcf9972f8e038b2d5b6bff76891c0"}, + {file = "selectolax-0.3.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b657502ee6339a30986fe19da7e41d1afbef7046de2003091a11c84352dbf829"}, + {file = "selectolax-0.3.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:df29602de7e49adbb218a026e25a0dd650a0a536a7a7bcf3f0850e8e537877ad"}, + {file = "selectolax-0.3.12-cp39-cp39-win32.whl", hash = "sha256:a6779dfdb3171e496eac015908e0d7ef9b41cc9a1942a04e1a0156b0a1a8d4fa"}, + {file = "selectolax-0.3.12-cp39-cp39-win_amd64.whl", hash = "sha256:3ed77586c29b6974e913646e191b7964e8b64d573407ec18bb3ba4c595fba5b1"}, + {file = "selectolax-0.3.12.tar.gz", hash = "sha256:e90473656f9c0e3f760712b965e1f2398109afd0faf416be52d2afbad3fe5791"}, +] [package.dependencies] Cython = ">=0.29.23" @@ -468,6 +787,10 @@ description = "Python 2 and 3 compatibility utilities" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, + {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, +] [[package]] name = "tomli" @@ -476,6 +799,10 @@ description = "A lil' TOML parser" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "tomli-1.2.0-py3-none-any.whl", hash = "sha256:056f0376bf5a6b182c513f9582c1e5b0487265eb6c48842b69aa9ca1cd5f640a"}, + {file = "tomli-1.2.0.tar.gz", hash = "sha256:d60e681734099207a6add7a10326bc2ddd1fdc36c1b0f547d00ef73ac63739c2"}, +] [[package]] name = "typed-ast" @@ -484,6 +811,38 @@ description = "a fork of Python 2 and 3 ast modules with type comment support" category = "dev" optional = false python-versions = "*" +files = [ + {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:7703620125e4fb79b64aa52427ec192822e9f45d37d4b6625ab37ef403e1df70"}, + {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c9aadc4924d4b5799112837b226160428524a9a45f830e0d0f184b19e4090487"}, + {file = "typed_ast-1.4.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:9ec45db0c766f196ae629e509f059ff05fc3148f9ffd28f3cfe75d4afb485412"}, + {file = "typed_ast-1.4.2-cp35-cp35m-win32.whl", hash = "sha256:85f95aa97a35bdb2f2f7d10ec5bbdac0aeb9dafdaf88e17492da0504de2e6400"}, + {file = "typed_ast-1.4.2-cp35-cp35m-win_amd64.whl", hash = "sha256:9044ef2df88d7f33692ae3f18d3be63dec69c4fb1b5a4a9ac950f9b4ba571606"}, + {file = "typed_ast-1.4.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c1c876fd795b36126f773db9cbb393f19808edd2637e00fd6caba0e25f2c7b64"}, + {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5dcfc2e264bd8a1db8b11a892bd1647154ce03eeba94b461effe68790d8b8e07"}, + {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8db0e856712f79c45956da0c9a40ca4246abc3485ae0d7ecc86a20f5e4c09abc"}, + {file = "typed_ast-1.4.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:d003156bb6a59cda9050e983441b7fa2487f7800d76bdc065566b7d728b4581a"}, + {file = "typed_ast-1.4.2-cp36-cp36m-win32.whl", hash = "sha256:4c790331247081ea7c632a76d5b2a265e6d325ecd3179d06e9cf8d46d90dd151"}, + {file = "typed_ast-1.4.2-cp36-cp36m-win_amd64.whl", hash = "sha256:d175297e9533d8d37437abc14e8a83cbc68af93cc9c1c59c2c292ec59a0697a3"}, + {file = "typed_ast-1.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf54cfa843f297991b7388c281cb3855d911137223c6b6d2dd82a47ae5125a41"}, + {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:b4fcdcfa302538f70929eb7b392f536a237cbe2ed9cba88e3bf5027b39f5f77f"}, + {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:987f15737aba2ab5f3928c617ccf1ce412e2e321c77ab16ca5a293e7bbffd581"}, + {file = "typed_ast-1.4.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:37f48d46d733d57cc70fd5f30572d11ab8ed92da6e6b28e024e4a3edfb456e37"}, + {file = "typed_ast-1.4.2-cp37-cp37m-win32.whl", hash = "sha256:36d829b31ab67d6fcb30e185ec996e1f72b892255a745d3a82138c97d21ed1cd"}, + {file = "typed_ast-1.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8368f83e93c7156ccd40e49a783a6a6850ca25b556c0fa0240ed0f659d2fe496"}, + {file = "typed_ast-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:963c80b583b0661918718b095e02303d8078950b26cc00b5e5ea9ababe0de1fc"}, + {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e683e409e5c45d5c9082dc1daf13f6374300806240719f95dc783d1fc942af10"}, + {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:84aa6223d71012c68d577c83f4e7db50d11d6b1399a9c779046d75e24bed74ea"}, + {file = "typed_ast-1.4.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:a38878a223bdd37c9709d07cd357bb79f4c760b29210e14ad0fb395294583787"}, + {file = "typed_ast-1.4.2-cp38-cp38-win32.whl", hash = "sha256:a2c927c49f2029291fbabd673d51a2180038f8cd5a5b2f290f78c4516be48be2"}, + {file = "typed_ast-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:c0c74e5579af4b977c8b932f40a5464764b2f86681327410aa028a22d2f54937"}, + {file = "typed_ast-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:07d49388d5bf7e863f7fa2f124b1b1d89d8aa0e2f7812faff0a5658c01c59aa1"}, + {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:240296b27397e4e37874abb1df2a608a92df85cf3e2a04d0d4d61055c8305ba6"}, + {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:d746a437cdbca200622385305aedd9aef68e8a645e385cc483bdc5e488f07166"}, + {file = "typed_ast-1.4.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:14bf1522cdee369e8f5581238edac09150c765ec1cb33615855889cf33dcb92d"}, + {file = "typed_ast-1.4.2-cp39-cp39-win32.whl", hash = "sha256:cc7b98bf58167b7f2db91a4327da24fb93368838eb84a44c472283778fc2446b"}, + {file = "typed_ast-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:7147e2a76c75f0f64c4319886e7639e490fee87c9d25cb1d4faef1d8cf83a440"}, + {file = "typed_ast-1.4.2.tar.gz", hash = "sha256:9fc0b3cb5d1720e7141d103cf4819aea239f7d136acf9ee4a69b047b7986175a"}, +] [[package]] name = "typing-extensions" @@ -492,6 +851,11 @@ description = "Backported and Experimental Type Hints for Python 3.5+" category = "main" optional = false python-versions = "*" +files = [ + {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, + {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, + {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, +] [[package]] name = "unidiff" @@ -500,6 +864,10 @@ description = "Unified diff parsing/metadata extraction library." category = "main" optional = false python-versions = "*" +files = [ + {file = "unidiff-0.7.4-py2.py3-none-any.whl", hash = "sha256:688622add422f84a873498cc4ff9bf50da5ea6c23dea908f19d2190fa39a8e39"}, + {file = "unidiff-0.7.4.tar.gz", hash = "sha256:2bbcbc986e1fb97f04b1d7b864aa6002ab02f4d8a996bf03aa6e5a81447d1fc5"}, +] [[package]] name = "urllib3" @@ -508,6 +876,10 @@ description = "HTTP library with thread-safe connection pooling, file post, and category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +files = [ + {file = "urllib3-1.26.5-py2.py3-none-any.whl", hash = "sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c"}, + {file = "urllib3-1.26.5.tar.gz", hash = "sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098"}, +] [package.extras] brotli = ["brotlipy (>=0.6.0)"] @@ -521,6 +893,9 @@ description = "Module for decorators, wrappers and monkey patching." category = "main" optional = false python-versions = "*" +files = [ + {file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"}, +] [[package]] name = "zipp" @@ -529,392 +904,16 @@ description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "zipp-3.4.1-py3-none-any.whl", hash = "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098"}, + {file = "zipp-3.4.1.tar.gz", hash = "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76"}, +] [package.extras] docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] testing = ["func-timeout", "jaraco.itertools", "pytest (>=4.6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=1.2.3)", "pytest-cov", "pytest-enabler", "pytest-flake8", "pytest-mypy"] [metadata] -lock-version = "1.1" +lock-version = "2.0" python-versions = "^3.7" -content-hash = "ed15fc3a37f9747fcbe2a9e816ecb5bd952e8cac4a6521f617cbf0cbdfd38884" - -[metadata.files] -attrs = [ - {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"}, - {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, -] -black = [ - {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, - {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, - {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, - {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, - {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, - {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, - {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, - {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, - {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, - {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, - {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, - {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, -] -boto3 = [ - {file = "boto3-1.26.37-py3-none-any.whl", hash = "sha256:7a6766c7177a9c6f85365e02aabd96ca4d72e08bc5cb127cb51b0a97ac9b9d1b"}, - {file = "boto3-1.26.37.tar.gz", hash = "sha256:82b790b1dabd0746b028d2013b5d4d636a41f3aaf25520081f4c173cb6eb395d"}, -] -botocore = [ - {file = "botocore-1.29.37-py3-none-any.whl", hash = "sha256:18ab8e95345a6d0d2653ce65d261a0aef6fef8a57a35a89e3cea6ffe315e92fc"}, - {file = "botocore-1.29.37.tar.gz", hash = "sha256:3afa4fec9f7713caa05116563b38f81bec7bd20585d517155484d3f25efab5aa"}, -] -certifi = [ - {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, - {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, -] -cffi = [ - {file = "cffi-1.14.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991"}, - {file = "cffi-1.14.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1"}, - {file = "cffi-1.14.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa"}, - {file = "cffi-1.14.5-cp27-cp27m-win32.whl", hash = "sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3"}, - {file = "cffi-1.14.5-cp27-cp27m-win_amd64.whl", hash = "sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5"}, - {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482"}, - {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6"}, - {file = "cffi-1.14.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045"}, - {file = "cffi-1.14.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa"}, - {file = "cffi-1.14.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406"}, - {file = "cffi-1.14.5-cp35-cp35m-win32.whl", hash = "sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369"}, - {file = "cffi-1.14.5-cp35-cp35m-win_amd64.whl", hash = "sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315"}, - {file = "cffi-1.14.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24ec4ff2c5c0c8f9c6b87d5bb53555bf267e1e6f70e52e5a9740d32861d36b6f"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c3f39fa737542161d8b0d680df2ec249334cd70a8f420f71c9304bd83c3cbed"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:681d07b0d1e3c462dd15585ef5e33cb021321588bebd910124ef4f4fb71aef55"}, - {file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"}, - {file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"}, - {file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06d7cd1abac2ffd92e65c0609661866709b4b2d82dd15f611e602b9b188b0b69"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f861a89e0043afec2a51fd177a567005847973be86f709bbb044d7f42fc4e05"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc5a8e069b9ebfa22e26d0e6b97d6f9781302fe7f4f2b8776c3e1daea35f1adc"}, - {file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"}, - {file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"}, - {file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04c468b622ed31d408fea2346bec5bbffba2cc44226302a0de1ade9f5ea3d373"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06db6321b7a68b2bd6df96d08a5adadc1fa0e8f419226e25b2a5fbf6ccc7350f"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:293e7ea41280cb28c6fcaaa0b1aa1f533b8ce060b9e701d78511e1e6c4a1de76"}, - {file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"}, - {file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"}, - {file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bf1ac1984eaa7675ca8d5745a8cb87ef7abecb5592178406e55858d411eadc0"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df5052c5d867c1ea0b311fb7c3cd28b19df469c056f7fdcfe88c7473aa63e333"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a570cd11895b60829e941f2613a4f79df1a27344cbbb82164ef2e0116f09c7"}, - {file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"}, - {file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"}, - {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.0.3.tar.gz", hash = "sha256:c46c3ace2d744cfbdebceaa3c19ae691f53ae621b39fd7570f59d14fb7f2fd12"}, - {file = "charset_normalizer-2.0.3-py3-none-any.whl", hash = "sha256:88fce3fa5b1a84fdcb3f603d889f723d1dd89b26059d0123ca435570e848d5e1"}, -] -click = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, -] -colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, -] -cython = [ - {file = "Cython-0.29.23-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff885f18d169759b57f116d3956e45cd2b9cba989fde348bba091544c668dc11"}, - {file = "Cython-0.29.23-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:3b29224eb62309a10819d923dc6262f769e4f3facfee3cd06372c355e5b38b33"}, - {file = "Cython-0.29.23-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:355a6e768d91e21fbf477b61881bab64b7a2da386a166898997bccefd532cf5d"}, - {file = "Cython-0.29.23-cp27-cp27m-win32.whl", hash = "sha256:2af52d312e96b38ded38b34d06e22685c226b1b0e58278bd27209f5d2385d115"}, - {file = "Cython-0.29.23-cp27-cp27m-win_amd64.whl", hash = "sha256:519fccf526d26b377e1db22f22aa44889b28bc5833ec106588cb13557e8ba2da"}, - {file = "Cython-0.29.23-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:625a16103770fd92b487b701fb0c07e5790b080f40fa11ce572a2d56d9e9fcca"}, - {file = "Cython-0.29.23-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:7b7a766726d207d7cd57aff0fcb4b35ce042d3cc88a421fcdb45eeb61a5b9d12"}, - {file = "Cython-0.29.23-cp34-cp34m-win32.whl", hash = "sha256:474c1a29ab43e29d990df279e2cf6aa96baa9208f5cd4bc76ac87ffcdf1e2945"}, - {file = "Cython-0.29.23-cp34-cp34m-win_amd64.whl", hash = "sha256:f4aca6bffb1c1c3c4ada3347d0b162a699c18a66e097ee08b63b3a35118fdfcc"}, - {file = "Cython-0.29.23-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:58dc06871bfdb0592542d779714fe9f918e11ba20ac07757dd63b198bdc704fe"}, - {file = "Cython-0.29.23-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:2a3bbce689a2fddb85aa66712d93875c99bf7f64ac82b1d149ecce522a7a4e0c"}, - {file = "Cython-0.29.23-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:8b8a02883ef75f21472205e8db2e471efb142729030fedb8c4e59a06866682ee"}, - {file = "Cython-0.29.23-cp35-cp35m-win32.whl", hash = "sha256:3ef530f975e3a760e7282fce2a25f900fa63f96d17321b4aa5f5542eb9859cdf"}, - {file = "Cython-0.29.23-cp35-cp35m-win_amd64.whl", hash = "sha256:ef21c51350462160456eb71df31b0869e5141e940f22c61c358bdb6e3ebc3388"}, - {file = "Cython-0.29.23-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:20402ef316393168909926ab21848aa6e08e39bed5003b657139774e66166cd0"}, - {file = "Cython-0.29.23-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:4858043ac5f96a8f0277cf63760bb39b9521c1f897678cf1d22423f3e758f4ed"}, - {file = "Cython-0.29.23-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4d7c3b0882d8757c601eaf288fc0d321d5c7ac6c3afb8c42eddf9325a3419cf5"}, - {file = "Cython-0.29.23-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:b05f365329e8ad44ff492408265841c83a43b83e430286490791a1f4bdaa0bef"}, - {file = "Cython-0.29.23-cp36-cp36m-win32.whl", hash = "sha256:37ff66039e3d138ec968ee1d1e12441fa5fb4e6a9c5458bc3c3a232f01be4a7d"}, - {file = "Cython-0.29.23-cp36-cp36m-win_amd64.whl", hash = "sha256:5be3ae3189cf7d0e9bbeafb854496dc7030c6f6a5602d809435fab8223543a41"}, - {file = "Cython-0.29.23-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b0699f0dc90181f2458fdb8170455e7798a309e18f41379eda7a2dc8c7aadee0"}, - {file = "Cython-0.29.23-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:41cd0dd2ff5d78466e73409db509887a84449b400074d4f217980cedbb18e4be"}, - {file = "Cython-0.29.23-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:aa3bb0928fb2aa3a8828801eb8b29af2261c199f805ae835467489e2bdd00372"}, - {file = "Cython-0.29.23-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:a6b02900d80c6f1ad4fc2060563922b4f031505c69ceeceba112d8971aacbcc3"}, - {file = "Cython-0.29.23-cp37-cp37m-win32.whl", hash = "sha256:20cb50d9fede8029bdb50875458f07a27f909289aeed4cdb9c19544dd9a9bc45"}, - {file = "Cython-0.29.23-cp37-cp37m-win_amd64.whl", hash = "sha256:c4b82461edbbcf90f19b319006345b77474a2d7514e1476d49a14bbd55d6b797"}, - {file = "Cython-0.29.23-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:794e3df0b57e16bce7583ac909126f4cb381fe566adadb20484d89095855eedb"}, - {file = "Cython-0.29.23-cp38-cp38-manylinux1_i686.whl", hash = "sha256:0c4b9f7e3aa004cf3f364e3e772f55fec5740485bafea99d1f13bdc9bbd8a545"}, - {file = "Cython-0.29.23-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:ceccc03b633113ede1f14ad914a6db5c278ce108c8ddb308a5c01c1567d8a02a"}, - {file = "Cython-0.29.23-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:06317468cfbf6f77f8c5b71cec76a565bd8c01432914d2d6338a298bab86f9f7"}, - {file = "Cython-0.29.23-cp38-cp38-win32.whl", hash = "sha256:4b0bcf2e06a9063fc78c3243ed4003228375d532ef13b9e5d7183be8f0a52cf5"}, - {file = "Cython-0.29.23-cp38-cp38-win_amd64.whl", hash = "sha256:5a6792153b728a0240e55bbb5b643f4f7e45c76319e03abf15bf367471ea1d1a"}, - {file = "Cython-0.29.23-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a8eed9c82e8fe07b8a8ffbd36018871a17458903fc25c9d015f37b54513a3efd"}, - {file = "Cython-0.29.23-cp39-cp39-manylinux1_i686.whl", hash = "sha256:266459c7e48fe3c6c492b297e4033e42d4c6863cc1a1ff7cc4034949fc574fa6"}, - {file = "Cython-0.29.23-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:4b6824b58d4373224fc76ee8bee6b35c2d17c91a1ed0fa67b88440f63daebe50"}, - {file = "Cython-0.29.23-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5baab5e14dd1fda34044aebf5303c69c4ce88ba7082e0b77b7a25bd09bfc39df"}, - {file = "Cython-0.29.23-cp39-cp39-win32.whl", hash = "sha256:7d6a33c8a11f05f698e215bfdb837f32c27f63c20f3af863557ed91c748dc2be"}, - {file = "Cython-0.29.23-cp39-cp39-win_amd64.whl", hash = "sha256:2365f3b5e6451b6bc6dcd262230656f4ade1d862ec2f6c22154deebef37c08b6"}, - {file = "Cython-0.29.23-py2.py3-none-any.whl", hash = "sha256:282263628c5d601b313d5920f7b6d7e08c7fedbddacd080c4858aa04d86b6b4b"}, - {file = "Cython-0.29.23.tar.gz", hash = "sha256:6a0d31452f0245daacb14c979c77e093eb1a546c760816b5eed0047686baad8e"}, -] -deprecated = [ - {file = "Deprecated-1.2.12-py2.py3-none-any.whl", hash = "sha256:08452d69b6b5bc66e8330adde0a4f8642e969b9e1702904d137eeb29c8ffc771"}, - {file = "Deprecated-1.2.12.tar.gz", hash = "sha256:6d2de2de7931a968874481ef30208fd4e08da39177d61d3d4ebdf4366e7dbca1"}, -] -elasticsearch = [ - {file = "elasticsearch-7.11.0-py2.py3-none-any.whl", hash = "sha256:a113cfcee9ba8565cd48a67b60e9903b67a81b3b80ddc6d3fb2c16789a58b763"}, - {file = "elasticsearch-7.11.0.tar.gz", hash = "sha256:1e24b33a82bf381b42d3b0d390f76fdb9d6a9d47b310dea8eaeb0a5933c394c0"}, -] -elasticsearch-dsl = [ - {file = "elasticsearch-dsl-7.4.0.tar.gz", hash = "sha256:c4a7b93882918a413b63bed54018a1685d7410ffd8facbc860ee7fd57f214a6d"}, - {file = "elasticsearch_dsl-7.4.0-py2.py3-none-any.whl", hash = "sha256:046ea10820b94c075081b528b4526c5bc776bda4226d702f269a5f203232064b"}, -] -exceptiongroup = [ - {file = "exceptiongroup-1.0.0-py3-none-any.whl", hash = "sha256:2ac84b496be68464a2da60da518af3785fff8b7ec0d090a581604bc870bdee41"}, - {file = "exceptiongroup-1.0.0.tar.gz", hash = "sha256:affbabf13fb6e98988c38d9c5650e701569fe3c1de3233cfb61c5f33774690ad"}, -] -flake8 = [ - {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, - {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, -] -idna = [ - {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, - {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, -] -importlib-metadata = [ - {file = "importlib_metadata-3.7.3-py3-none-any.whl", hash = "sha256:b74159469b464a99cb8cc3e21973e4d96e05d3024d337313fedb618a6e86e6f4"}, - {file = "importlib_metadata-3.7.3.tar.gz", hash = "sha256:742add720a20d0467df2f444ae41704000f50e1234f46174b51f9c6031a1bd71"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -jmespath = [ - {file = "jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f"}, - {file = "jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9"}, -] -mccabe = [ - {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, - {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, -] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, -] -packaging = [ - {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, - {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, -] -pathspec = [ - {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, - {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, -] -platformdirs = [ - {file = "platformdirs-2.2.0-py3-none-any.whl", hash = "sha256:4666d822218db6a262bdfdc9c39d21f23b4cfdb08af331a81e92751daf6c866c"}, - {file = "platformdirs-2.2.0.tar.gz", hash = "sha256:632daad3ab546bd8e6af0537d09805cec458dce201bccfe23012df73332e181e"}, -] -pluggy = [ - {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, - {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, -] -pycodestyle = [ - {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, - {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, -] -pycparser = [ - {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, - {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, -] -pyflakes = [ - {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, - {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, -] -pygithub = [ - {file = "PyGithub-1.57-py3-none-any.whl", hash = "sha256:5822febeac2391f1306c55a99af2bc8f86c8bf82ded000030cd02c18f31b731f"}, - {file = "PyGithub-1.57.tar.gz", hash = "sha256:c273f252b278fb81f1769505cc6921bdb6791e1cebd6ac850cc97dad13c31ff3"}, -] -pyjwt = [ - {file = "PyJWT-2.4.0-py3-none-any.whl", hash = "sha256:72d1d253f32dbd4f5c88eaf1fdc62f3a19f676ccbadb9dbc5d07e951b2b26daf"}, - {file = "PyJWT-2.4.0.tar.gz", hash = "sha256:d42908208c699b3b973cbeb01a969ba6a96c821eefb1c5bfe4c390c01d67abba"}, -] -pynacl = [ - {file = "PyNaCl-1.4.0-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:ea6841bc3a76fa4942ce00f3bda7d436fda21e2d91602b9e21b7ca9ecab8f3ff"}, - {file = "PyNaCl-1.4.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:d452a6746f0a7e11121e64625109bc4468fc3100452817001dbe018bb8b08514"}, - {file = "PyNaCl-1.4.0-cp27-cp27m-win32.whl", hash = "sha256:2fe0fc5a2480361dcaf4e6e7cea00e078fcda07ba45f811b167e3f99e8cff574"}, - {file = "PyNaCl-1.4.0-cp27-cp27m-win_amd64.whl", hash = "sha256:f8851ab9041756003119368c1e6cd0b9c631f46d686b3904b18c0139f4419f80"}, - {file = "PyNaCl-1.4.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:7757ae33dae81c300487591c68790dfb5145c7d03324000433d9a2c141f82af7"}, - {file = "PyNaCl-1.4.0-cp35-abi3-macosx_10_10_x86_64.whl", hash = "sha256:757250ddb3bff1eecd7e41e65f7f833a8405fede0194319f87899690624f2122"}, - {file = "PyNaCl-1.4.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:30f9b96db44e09b3304f9ea95079b1b7316b2b4f3744fe3aaecccd95d547063d"}, - {file = "PyNaCl-1.4.0-cp35-abi3-win32.whl", hash = "sha256:4e10569f8cbed81cb7526ae137049759d2a8d57726d52c1a000a3ce366779634"}, - {file = "PyNaCl-1.4.0-cp35-abi3-win_amd64.whl", hash = "sha256:c914f78da4953b33d4685e3cdc7ce63401247a21425c16a39760e282075ac4a6"}, - {file = "PyNaCl-1.4.0-cp35-cp35m-win32.whl", hash = "sha256:06cbb4d9b2c4bd3c8dc0d267416aaed79906e7b33f114ddbf0911969794b1cc4"}, - {file = "PyNaCl-1.4.0-cp35-cp35m-win_amd64.whl", hash = "sha256:511d269ee845037b95c9781aa702f90ccc36036f95d0f31373a6a79bd8242e25"}, - {file = "PyNaCl-1.4.0-cp36-cp36m-win32.whl", hash = "sha256:11335f09060af52c97137d4ac54285bcb7df0cef29014a1a4efe64ac065434c4"}, - {file = "PyNaCl-1.4.0-cp36-cp36m-win_amd64.whl", hash = "sha256:cd401ccbc2a249a47a3a1724c2918fcd04be1f7b54eb2a5a71ff915db0ac51c6"}, - {file = "PyNaCl-1.4.0-cp37-cp37m-win32.whl", hash = "sha256:8122ba5f2a2169ca5da936b2e5a511740ffb73979381b4229d9188f6dcb22f1f"}, - {file = "PyNaCl-1.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:537a7ccbea22905a0ab36ea58577b39d1fa9b1884869d173b5cf111f006f689f"}, - {file = "PyNaCl-1.4.0-cp38-cp38-win32.whl", hash = "sha256:9c4a7ea4fb81536c1b1f5cc44d54a296f96ae78c1ebd2311bd0b60be45a48d96"}, - {file = "PyNaCl-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:7c6092102219f59ff29788860ccb021e80fffd953920c4a8653889c029b2d420"}, - {file = "PyNaCl-1.4.0.tar.gz", hash = "sha256:54e9a2c849c742006516ad56a88f5c74bf2ce92c9f67435187c3c5953b346505"}, -] -pyparsing = [ - {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, - {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, -] -pytest = [ - {file = "pytest-7.2.0-py3-none-any.whl", hash = "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71"}, - {file = "pytest-7.2.0.tar.gz", hash = "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"}, -] -python-dateutil = [ - {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"}, - {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, -] -python-decouple = [ - {file = "python-decouple-3.6.tar.gz", hash = "sha256:2838cdf77a5cf127d7e8b339ce14c25bceb3af3e674e039d4901ba16359968c7"}, - {file = "python_decouple-3.6-py3-none-any.whl", hash = "sha256:6cf502dc963a5c642ea5ead069847df3d916a6420cad5599185de6bab11d8c2e"}, -] -requests = [ - {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, - {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, -] -s3transfer = [ - {file = "s3transfer-0.6.0-py3-none-any.whl", hash = "sha256:06176b74f3a15f61f1b4f25a1fc29a4429040b7647133a463da8fa5bd28d5ecd"}, - {file = "s3transfer-0.6.0.tar.gz", hash = "sha256:2ed07d3866f523cc561bf4a00fc5535827981b117dd7876f036b0c1aca42c947"}, -] -selectolax = [ - {file = "selectolax-0.3.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ad0cfc7f66a2863d199af819c79bfa160bcc830e0f83fd5391cdd80e545af758"}, - {file = "selectolax-0.3.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5acbe02c26b43428c2f49e8f09a81bd47be7ea969c6798cde1a23c2b33d25c79"}, - {file = "selectolax-0.3.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9246bf586afaacfdc0e6fb17806ee0d3e1736d3d13a87c8e96214596d50576b7"}, - {file = "selectolax-0.3.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31fb0fbc88674b3346e379664c5837070e79b2f65eab3e29b7c43e1b4fc1137c"}, - {file = "selectolax-0.3.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc53731aa81617694667d4c56d21a9e26df840a219f4b62588af80c6781ba613"}, - {file = "selectolax-0.3.11-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:eb86cacac6ed203c386afe6704732fb05d831006c65869f15f41d15e9e72973b"}, - {file = "selectolax-0.3.11-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:d13904fc037bcebc6d79e83c0a19e64cc9d4771cd7f27b325c63d1071ec0d0f0"}, - {file = "selectolax-0.3.11-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d809fbf258c28190160b3fe5d34adddb1da44ed7a2f800b7125e0fac6e940016"}, - {file = "selectolax-0.3.11-cp310-cp310-win32.whl", hash = "sha256:0878aa1ab3906831b20ad9e316a77c8401030dd388f3c1c72ba51bc08d497584"}, - {file = "selectolax-0.3.11-cp310-cp310-win_amd64.whl", hash = "sha256:a7fa03253260c3351f61cef36865b27ad4585516e9ac4a77244d237bfaf37f13"}, - {file = "selectolax-0.3.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d65d0c57cfa1b05beb5c72d3cb566f4fdaf16e5112082f300cfa6bd94836aff"}, - {file = "selectolax-0.3.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:17ac0b2b4222ba2c16852c0035dcd31d9e100544e6a5138f6e01f6b1648691b5"}, - {file = "selectolax-0.3.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6111ac9e5ca02b13d8e3057c1e20d6608435c64a11f92460a59951a7209c2cf3"}, - {file = "selectolax-0.3.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46bacca9e9f077ff2c5a973c05b8862425f077c58f2dca8059b992ceaca6b6de"}, - {file = "selectolax-0.3.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68c42af2cabecf04528dff2d0bbebbecfbafc394a5192b6a5b3e1dcd19eeb766"}, - {file = "selectolax-0.3.11-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:709b1680a16f210c43e4f3240dfc15e3312ccd43c9ea20c8e20c81470214cfc6"}, - {file = "selectolax-0.3.11-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:fad7fb68e929082e6474e1392dd433d465b06b59e26158ef67813c0c8e5b7f66"}, - {file = "selectolax-0.3.11-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3daaf7ec54565d3f15f9ce046f6a8e469d966dc4fc879af8c7f753d37994f70e"}, - {file = "selectolax-0.3.11-cp311-cp311-win32.whl", hash = "sha256:9baff22ae7015e8f2697d5db0804ee379d53fa6e54f1dc7e9f61ee8ccb1bdb2e"}, - {file = "selectolax-0.3.11-cp311-cp311-win_amd64.whl", hash = "sha256:0a8dddd34dea642429629aae21cf940668eaa1c66ab0bcf9970d72f38676697d"}, - {file = "selectolax-0.3.11-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:264918c1e9e6f6657f47116e4dbd74b57c660d3e86f9cc78209f132c56c8e9e5"}, - {file = "selectolax-0.3.11-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d47e489a8b0181992a3384987c854bd88211685e1c32dcdcb8746ec98dbcf7e"}, - {file = "selectolax-0.3.11-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:adabfb5635d00da49bddef3844dc65ca3da81acd889ea7be2a74ef9456558f36"}, - {file = "selectolax-0.3.11-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:a4634d7c7e9d2eb65d0fc7fe0d88641eb413cb7250fbfc66b3b4d88d49e4c724"}, - {file = "selectolax-0.3.11-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:3600747c5072725580f8dc249a40ae123840f22edab950f43b349d356f44268b"}, - {file = "selectolax-0.3.11-cp36-cp36m-win32.whl", hash = "sha256:1f1ec20cc75e1866f7758e543907da222c5d8072e580cf6814f2f142036c695f"}, - {file = "selectolax-0.3.11-cp36-cp36m-win_amd64.whl", hash = "sha256:d3506e831b972c1eb22538b25e7c991289b72b2e028bd27b633dfbd21c1a511a"}, - {file = "selectolax-0.3.11-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f5cef3310fc41f71e8fc19d05534d100f6c02789d46041777b0bbd70961a94ec"}, - {file = "selectolax-0.3.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fa1737b7031b467d8613919503c85482a59c65ac91fe60074180e625e2533c6"}, - {file = "selectolax-0.3.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:762e91a0ac0caa2d8731568e5b2ad0cec6fc06465a9dd89280118ced4b7e0849"}, - {file = "selectolax-0.3.11-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b48e4c8df2c226552ac18636c2ebe9d100ff3daa8742616687bd2cbf74a81e2f"}, - {file = "selectolax-0.3.11-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7ebe824763782f0e6ad2accd57d0cef3a61922b72be99ccafebe0154e9b8aef6"}, - {file = "selectolax-0.3.11-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:010b008aca04be6cf9727d6f206a583d79a82d397126a101f57f117113a082bb"}, - {file = "selectolax-0.3.11-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c5c68f0139d0928298ef5e95137996e0efb6f8db364b1470221e8710834a0ab"}, - {file = "selectolax-0.3.11-cp37-cp37m-win32.whl", hash = "sha256:1d38157e2358dacf55e782d332b41391821b2ef237e34e47ff276b2184c96542"}, - {file = "selectolax-0.3.11-cp37-cp37m-win_amd64.whl", hash = "sha256:585a75f4aff85b48d0fc8f3e9afbd1e2c05902a332982d04bab93e8e1db2e4a4"}, - {file = "selectolax-0.3.11-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:46776ca482a76b3f522e4d8f90474716e4da51dc2823f3ecc6a2ff38ef0663b7"}, - {file = "selectolax-0.3.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:abac4b7afe430dd135f148d4001b593b09c8f64fccd63b15fbb03b77735e3405"}, - {file = "selectolax-0.3.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb3b3425ee21f5098531ce80dc48d99a555b8b2300deb0ddf84b6bc503f0a848"}, - {file = "selectolax-0.3.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e805b106edac716047afc6e9e49953242207909bfbb70bf47c53f231e2d27d74"}, - {file = "selectolax-0.3.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81c7847ff0f3561559bd98015aa3fe0a2dfb26966156f7704f7f65339d48e81c"}, - {file = "selectolax-0.3.11-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1ba1cd707a0d0090cffb2851ec6ccfdc334ed0c2ea08ae8705a9f6c97a997f77"}, - {file = "selectolax-0.3.11-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:67c32c29bc9011ed1b6fd67a961073e69d67bf60bf09f3db54d6240c034719f4"}, - {file = "selectolax-0.3.11-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:418738a2f46beea2444a1587adb4f509bdd8e7ddffac071dba097c1a3ddb8cfc"}, - {file = "selectolax-0.3.11-cp38-cp38-win32.whl", hash = "sha256:087e663c0ba6d9d79294508b0a3145079e838950a0e2fc7b8b1485da3fe24254"}, - {file = "selectolax-0.3.11-cp38-cp38-win_amd64.whl", hash = "sha256:221051ffe8c2950e9ebe41e08103397a7b287dca05a9e8084bb9e925f2d9c556"}, - {file = "selectolax-0.3.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b348074bc3a0e16e9af1a2f57e0da18f5def97e415c6435dadc68aead7ccf060"}, - {file = "selectolax-0.3.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c23d9f82aea887347151538a58b15a8dbee4261e4114705c0974dee81eb796e0"}, - {file = "selectolax-0.3.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f1a35be9413bcd56f225b1509740ea8999a6f7558e0f0a50a4ca80b91bf11be"}, - {file = "selectolax-0.3.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51c33d33e4e4eec0d9c1b6accdda5c93f4e3a00b28e99fc4ebb2b95d1d4ef885"}, - {file = "selectolax-0.3.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae58e7cc282a768a68abbfa39eff895788a39658c5a235524c21b09d182b3d3a"}, - {file = "selectolax-0.3.11-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2d8c7ce06bdf83d3cd2a617211eec48c875826bae54c74e56aec2635daac2f31"}, - {file = "selectolax-0.3.11-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c2b589be0dd45d62ec43a6446f09919b5be809c708d8ff6a7cb86acd9150091b"}, - {file = "selectolax-0.3.11-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e001a40b25e478f8390c3898c5852cf9a226668ba02fdc4d8e3a4788ce64207a"}, - {file = "selectolax-0.3.11-cp39-cp39-win32.whl", hash = "sha256:f76b0ad63b55e45d3c02e50ca8b8ef64a500aed9a5f50818173b66949470f8e4"}, - {file = "selectolax-0.3.11-cp39-cp39-win_amd64.whl", hash = "sha256:14c9368f9dd224f895ef1431b1961d6e9a56fb26a95b5c04900def7b8961744c"}, - {file = "selectolax-0.3.11.tar.gz", hash = "sha256:da688ca957d68b8072dc9658506c07326f6332ff3fe03214fec375a4ccc67f8a"}, -] -six = [ - {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, - {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, -] -tomli = [ - {file = "tomli-1.2.0-py3-none-any.whl", hash = "sha256:056f0376bf5a6b182c513f9582c1e5b0487265eb6c48842b69aa9ca1cd5f640a"}, - {file = "tomli-1.2.0.tar.gz", hash = "sha256:d60e681734099207a6add7a10326bc2ddd1fdc36c1b0f547d00ef73ac63739c2"}, -] -typed-ast = [ - {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:7703620125e4fb79b64aa52427ec192822e9f45d37d4b6625ab37ef403e1df70"}, - {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c9aadc4924d4b5799112837b226160428524a9a45f830e0d0f184b19e4090487"}, - {file = "typed_ast-1.4.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:9ec45db0c766f196ae629e509f059ff05fc3148f9ffd28f3cfe75d4afb485412"}, - {file = "typed_ast-1.4.2-cp35-cp35m-win32.whl", hash = "sha256:85f95aa97a35bdb2f2f7d10ec5bbdac0aeb9dafdaf88e17492da0504de2e6400"}, - {file = "typed_ast-1.4.2-cp35-cp35m-win_amd64.whl", hash = "sha256:9044ef2df88d7f33692ae3f18d3be63dec69c4fb1b5a4a9ac950f9b4ba571606"}, - {file = "typed_ast-1.4.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c1c876fd795b36126f773db9cbb393f19808edd2637e00fd6caba0e25f2c7b64"}, - {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5dcfc2e264bd8a1db8b11a892bd1647154ce03eeba94b461effe68790d8b8e07"}, - {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8db0e856712f79c45956da0c9a40ca4246abc3485ae0d7ecc86a20f5e4c09abc"}, - {file = "typed_ast-1.4.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:d003156bb6a59cda9050e983441b7fa2487f7800d76bdc065566b7d728b4581a"}, - {file = "typed_ast-1.4.2-cp36-cp36m-win32.whl", hash = "sha256:4c790331247081ea7c632a76d5b2a265e6d325ecd3179d06e9cf8d46d90dd151"}, - {file = "typed_ast-1.4.2-cp36-cp36m-win_amd64.whl", hash = "sha256:d175297e9533d8d37437abc14e8a83cbc68af93cc9c1c59c2c292ec59a0697a3"}, - {file = "typed_ast-1.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf54cfa843f297991b7388c281cb3855d911137223c6b6d2dd82a47ae5125a41"}, - {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:b4fcdcfa302538f70929eb7b392f536a237cbe2ed9cba88e3bf5027b39f5f77f"}, - {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:987f15737aba2ab5f3928c617ccf1ce412e2e321c77ab16ca5a293e7bbffd581"}, - {file = "typed_ast-1.4.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:37f48d46d733d57cc70fd5f30572d11ab8ed92da6e6b28e024e4a3edfb456e37"}, - {file = "typed_ast-1.4.2-cp37-cp37m-win32.whl", hash = "sha256:36d829b31ab67d6fcb30e185ec996e1f72b892255a745d3a82138c97d21ed1cd"}, - {file = "typed_ast-1.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8368f83e93c7156ccd40e49a783a6a6850ca25b556c0fa0240ed0f659d2fe496"}, - {file = "typed_ast-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:963c80b583b0661918718b095e02303d8078950b26cc00b5e5ea9ababe0de1fc"}, - {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e683e409e5c45d5c9082dc1daf13f6374300806240719f95dc783d1fc942af10"}, - {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:84aa6223d71012c68d577c83f4e7db50d11d6b1399a9c779046d75e24bed74ea"}, - {file = "typed_ast-1.4.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:a38878a223bdd37c9709d07cd357bb79f4c760b29210e14ad0fb395294583787"}, - {file = "typed_ast-1.4.2-cp38-cp38-win32.whl", hash = "sha256:a2c927c49f2029291fbabd673d51a2180038f8cd5a5b2f290f78c4516be48be2"}, - {file = "typed_ast-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:c0c74e5579af4b977c8b932f40a5464764b2f86681327410aa028a22d2f54937"}, - {file = "typed_ast-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:07d49388d5bf7e863f7fa2f124b1b1d89d8aa0e2f7812faff0a5658c01c59aa1"}, - {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:240296b27397e4e37874abb1df2a608a92df85cf3e2a04d0d4d61055c8305ba6"}, - {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:d746a437cdbca200622385305aedd9aef68e8a645e385cc483bdc5e488f07166"}, - {file = "typed_ast-1.4.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:14bf1522cdee369e8f5581238edac09150c765ec1cb33615855889cf33dcb92d"}, - {file = "typed_ast-1.4.2-cp39-cp39-win32.whl", hash = "sha256:cc7b98bf58167b7f2db91a4327da24fb93368838eb84a44c472283778fc2446b"}, - {file = "typed_ast-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:7147e2a76c75f0f64c4319886e7639e490fee87c9d25cb1d4faef1d8cf83a440"}, - {file = "typed_ast-1.4.2.tar.gz", hash = "sha256:9fc0b3cb5d1720e7141d103cf4819aea239f7d136acf9ee4a69b047b7986175a"}, -] -typing-extensions = [ - {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, - {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, - {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, -] -unidiff = [ - {file = "unidiff-0.7.4-py2.py3-none-any.whl", hash = "sha256:688622add422f84a873498cc4ff9bf50da5ea6c23dea908f19d2190fa39a8e39"}, - {file = "unidiff-0.7.4.tar.gz", hash = "sha256:2bbcbc986e1fb97f04b1d7b864aa6002ab02f4d8a996bf03aa6e5a81447d1fc5"}, -] -urllib3 = [ - {file = "urllib3-1.26.5-py2.py3-none-any.whl", hash = "sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c"}, - {file = "urllib3-1.26.5.tar.gz", hash = "sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098"}, -] -wrapt = [ - {file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"}, -] -zipp = [ - {file = "zipp-3.4.1-py3-none-any.whl", hash = "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098"}, - {file = "zipp-3.4.1.tar.gz", hash = "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76"}, -] +content-hash = "c612e1cc59b24dcb04a3418bc9707a96f41904d808d5608357a04761ee9d5d99" diff --git a/deployer/pyproject.toml b/deployer/pyproject.toml index 5d213bee13ed..c4ce51148e3c 100644 --- a/deployer/pyproject.toml +++ b/deployer/pyproject.toml @@ -10,18 +10,18 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.7" click = "^8.1.3" -boto3 = "^1.26.37" -python-decouple = "^3.6" -requests = {extras = ["security"], version = "^2.28.1"} +boto3 = "^1.26.64" +python-decouple = "^3.7" +requests = {extras = ["security"], version = "^2.28.2"} elasticsearch-dsl = "^7.4.0" -selectolax = "^0.3.11" +selectolax = "^0.3.12" PyGithub = "^1.57" unidiff = "^0.7.4" [tool.poetry.dev-dependencies] -black = "^22.12" +black = "^23.1" flake8 = "^5.0.4" -pytest = "^7.2.0" +pytest = "^7.2.1" [tool.poetry.scripts] deployer = "deployer.main:cli" diff --git a/deployer/src/deployer/analyze_pr.py b/deployer/src/deployer/analyze_pr.py index fe7b2eab4d74..ee8c96541a90 100644 --- a/deployer/src/deployer/analyze_pr.py +++ b/deployer/src/deployer/analyze_pr.py @@ -112,7 +112,6 @@ def mdn_url_to_dev_url(prefix, mdn_url): def post_about_dangerous_content( build_directory: Path, patch: Optional[PatchSet], **config ): - OK_URL_PREFIXES = [ "https://github.com/mdn/", ] @@ -198,7 +197,6 @@ def post_about_dangerous_content( def post_about_flaws(build_directory: Path, **config): - comments = [] MAX_FLAW_EXPLANATION = 5 diff --git a/deployer/src/deployer/upload.py b/deployer/src/deployer/upload.py index 42017721cb59..481bba56f19e 100644 --- a/deployer/src/deployer/upload.py +++ b/deployer/src/deployer/upload.py @@ -197,7 +197,6 @@ def is_hashed(self): @property def cache_control(self): - if self.file_path.name == "service-worker.js": return NO_CACHE_VALUE diff --git a/docs/envvars.md b/docs/envvars.md index bbc6dfa470ec..6f171d361970 100644 --- a/docs/envvars.md +++ b/docs/envvars.md @@ -131,17 +131,6 @@ When doing local development, it's recommended to set this to The base URL used in the Interactive Example iframes. -### `BUILD_MACROS_USED_LOGFILE` - -**Default `not set`** - -This needs to be a file path. E.g. -`export BUILD_MACROS_USED_LOGFILE=/tmp/macros-used.log` It will write one line -for every (normalized) macro name used and its arguments in rendering. - -This is an advanced feature to help potentially figuring out which kumascript -macros, in the source, that aren't used. - ### `BUILD_GOOGLE_ANALYTICS_ACCOUNT` **Default: `''`** diff --git a/docs/kumascript/README.md b/docs/kumascript/README.md index a9b84e86ac32..9da450d155d5 100644 --- a/docs/kumascript/README.md +++ b/docs/kumascript/README.md @@ -375,34 +375,6 @@ contents to be regenerated, but using cached templates and included content. A 'Shift-Reload' is necessary to invalidate caches beyond just the content of the page itself. -### Broken wiki.languages() macros - -On some pages, you'll see a scripting error like this: - -```plain -Syntax error at line 436, column 461: Expected valid JSON object as the -parameter of the preceding macro but… -``` - -If you edit the page, you'll probably see a macro like this at the bottom of the -page: - -```plain -{{ wiki.languages({ "zh-tw": "zh_tw/Core_JavaScript_1.5_教學/JavaScript_概要", … }) }} -``` - -To fix the problem, just delete the macro. Or, replace the curly braces on -either side with HTML comments `<!-- -->` to preserve the information, like so: - -```html -<!-- wiki.languages({ "zh-tw": "zh_tw/Core_JavaScript_1.5_教學/JavaScript_概要", ... }) --> -``` - -Because Kuma supports localization differently, these macros aren't actually -needed any more. But, they've been left intact in case we need to revisit the -relationships between localized pages. Unfortunately, it seems like migration -has failed to convert some of them properly. - ### Finding the Current Page Language In KumaScript, the locale of the current document is exposed as an environment @@ -477,10 +449,6 @@ const text = mdn.localStringMap({ 'Complete_beginners_start_here': 'Complete beginners start here!', 'Getting_started_with_the_web': 'Getting started with the web', }, - 'de': { - 'Complete_beginners_start_here': 'Anfänger starten hier!', - 'Getting_started_with_the_web': 'Lernen Sie das Internet kennen', - }, 'fr': { 'Complete_beginners_start_here': 'Bienvenue aux débutants !', 'Getting_started_with_the_web': 'Commencer avec le Web', @@ -498,8 +466,8 @@ appropriate locale. If a string is missing for a locale, it will fall back to <% const s_title = mdn.localString({ "en-US": "Firefox for Developers", - "de": "Firefox für Entwickler", - "es": "Firefox para desarrolladores" + "es": "Firefox para desarrolladores", + "fr": "Firefox pour les développeurs", }); const body = mdn.localString({ @@ -507,22 +475,22 @@ const body = mdn.localString({ "hello": "Hello!", "goodbye": "Goodbye!", }, - "de": { - "hello": "Hallo!", - "goodbye": "Auf Wiedersehen!", - }, "es": { "hello": "¡Hola!" + }, + "fr": { + "hello": "Bonjour !", + "goodbye": "Au revoir !", } }); %> <%= s_title %> / <%= body['hello'] %> / <%= body['goodbye'] %> ``` -Will render, for `de`: +Will render, for `fr`: ```plain -Firefox für Entwickler / Hallo! / Auf Wiedersehen! +Firefox pour les développeurs / Bonjour ! / Au revoir ! ``` ...and for `es`: diff --git a/kumascript/macros/APIListAlpha.ejs b/kumascript/macros/APIListAlpha.ejs index d4d6224f38a2..3f1350b5d16e 100644 --- a/kumascript/macros/APIListAlpha.ejs +++ b/kumascript/macros/APIListAlpha.ejs @@ -64,9 +64,10 @@ for (var i = 0; i < numLetters; i++) { if (p < numPages) { do { - var tags = pages[p].tags; - var url = pages[p].url; - var title = pages[p].title; + const aPage = pages[p]; + var tags = aPage.tags; + var url = aPage.url; + var title = aPage.title; // Build the formatted title string; skip this page if it's not // an interface. @@ -77,27 +78,12 @@ for (var i = 0; i < numLetters; i++) { continue; } - var badge = ""; - - // add badges if needed - - if (containsTag(tags, "Non-standard") || containsTag(tags, "Non standard")) { - badge = " " + await template("NonStandardBadge", ["1"]); - } - - if (containsTag(tags, "Obsolete")) { - badge += " " + await template("ObsoleteBadge", [1]); - } else if (containsTag(tags, "Deprecated")) { - badge += " " + await template("DeprecatedBadge", [1]); - } - - if (containsTag(tags, "Experimental")) { - badge += " " + await template("ExperimentalBadge", ["1"]); - } + let pageBadges = (await page.badges(aPage)).join(" "); // Wrap the badges in another span - if (badge.length) badge = '<span class="indexListBadges">' + badge + "</span>"; + if (pageBadges.length) + pageBadges = `<span class="indexListBadges"> ${pageBadges}</span>`; if (title[0].toUpperCase() == curLetter) { if (!containsTag(tags, "junk")) { @@ -105,7 +91,7 @@ for (var i = 0; i < numLetters; i++) { html += "<h3>" + curLetter + "</h3><ul>"; insertedHeading = true; } - html += '\n<li><span class="indexListRow"><span class="indexListTerm"><a href="' + url.replace("en-US", locale) + '">' + builtTitle + '</a></span>' + badge + '</span></li>'; + html += `\n<li><span class="indexListRow"><span class="indexListTerm"><a href="${url.replace("en-US", locale)}">${builtTitle}</a></span>${pageBadges}</span></li>`; } p++; } else { diff --git a/kumascript/macros/APIRef.ejs b/kumascript/macros/APIRef.ejs index 58918d7112d4..f24f21de9ad8 100644 --- a/kumascript/macros/APIRef.ejs +++ b/kumascript/macros/APIRef.ejs @@ -152,14 +152,7 @@ getImplementedBy(webAPIData[0]); // output helpers -var badges = { - ExperimentalBadge : await template("ExperimentalBadge"), - NonStandardBadge : await template("NonStandardBadge"), - DeprecatedBadge : await template("DeprecatedBadge"), - ObsoleteBadge : await template("ObsoleteBadge"), -} - -function buildSublist(pages, title) { +async function buildSublist(pages, title) { var result = '<li class="toggle"><details open><summary>' + title + '</summary><ol>'; for (var i in pages) { @@ -192,43 +185,24 @@ function buildSublist(pages, title) { } result += '<li>'; - - var pageBadges = ''; - if (hasTag(aPage, 'Experimental')) { - pageBadges += badges.ExperimentalBadge; - } - - if (hasTag(aPage, 'Non-standard') || hasTag(aPage, 'Non Standard')) { - pageBadges += badges.NonStandardBadge; - } - - if (hasTag(aPage, 'Deprecated')) { - pageBadges += badges.DeprecatedBadge; - } - - if (hasTag(aPage, 'Obsolete')) { - pageBadges += badges.ObsoleteBadge; - result += '<s class="obsoleteElement">'; - } + + const pageBadges = (await page.badges(aPage)).join(""); if (rtlLocales.indexOf(locale) != -1) { result += '<bdi>'; } if (slug == aPage.slug) { - result += '<em>' + pageBadges + ' <code>' + title + '</code></em>' + result += `<em><code>${title}</code> ${pageBadges}</em>` } else { - result += pageBadges + web.smartLink(url, null, `<code>${title}</code>`, APIHref, null, "APIRef"); + result += web.smartLink(url, null, `<code>${title}</code>`, APIHref, null, "APIRef"); + result += pageBadges; } if (rtlLocales.indexOf(locale) != -1) { result += '</bdi>'; } - if (hasTag(aPage, 'Obsolete')) { - result += '</s>'; - } - result += '</li>'; } @@ -259,22 +233,22 @@ if (group && webAPIGroups[0][group] && webAPIGroups[0][group].overview) { output += `<li><strong>${web.smartLink(APIHref + '/' + mainIF, null, `<code>${mainIF}</code>`, APIHref, null, "APIRef")}</strong></li>`; if (ctors.length > 0) { - output += buildSublist(ctors, text['Constructor']); + output += await buildSublist(ctors, text['Constructor']); } if (staticProperties.length > 0) { - output += buildSublist(staticProperties, text['Static properties']); + output += await buildSublist(staticProperties, text['Static properties']); } if (instanceProperties.length > 0) { - output += buildSublist(instanceProperties, text['Instance properties']); + output += await buildSublist(instanceProperties, text['Instance properties']); } if (staticMethods.length > 0) { - output += buildSublist(staticMethods, text['Static methods']); + output += await buildSublist(staticMethods, text['Static methods']); } if (instanceMethods.length > 0) { - output += buildSublist(instanceMethods, text['Instance methods']); + output += await buildSublist(instanceMethods, text['Instance methods']); } if (events.length > 0) { - output += buildSublist(events, text['Events']); + output += await buildSublist(events, text['Events']); } if (inh.length > 0) { output += buildIFList(inheritedIF, text['Inheritance']); diff --git a/kumascript/macros/ARIARole.ejs b/kumascript/macros/ARIARole.ejs index 34e6c86b839c..2075dfe6f9d4 100644 --- a/kumascript/macros/ARIARole.ejs +++ b/kumascript/macros/ARIARole.ejs @@ -4,6 +4,10 @@ // // $0 - role +// Throw a MacroDeprecatedError flaw +// Can be removed when no more used in mdn/translated-content +mdn.deprecated() + var link = 'https://w3c.github.io/aria/#' + $0; %> <code><a href="<%=link%>" class="external"><%=$0%></a></code> diff --git a/kumascript/macros/AvailableInWorkers.ejs b/kumascript/macros/AvailableInWorkers.ejs index 142361ff53f0..eb7c80cf743c 100644 --- a/kumascript/macros/AvailableInWorkers.ejs +++ b/kumascript/macros/AvailableInWorkers.ejs @@ -18,7 +18,7 @@ const note = mdn.localString({ "es": "Nota:", "fr": "Note:", "ja": "注:", - "ko": "주의:", + "ko": "참고:", "ru": "Примечание:", "zh-CN": "备注:", "zh-TW": "備註:" diff --git a/kumascript/macros/CSSRef.ejs b/kumascript/macros/CSSRef.ejs index 766d7698e655..e2271e833486 100644 --- a/kumascript/macros/CSSRef.ejs +++ b/kumascript/macros/CSSRef.ejs @@ -348,6 +348,157 @@ const text = mdn.localStringMap({ 'Supporting_older_browsers': '古いブラウザーの対応', 'Assessment_Fundamental_Layout_Comprehension': '評価課題: 基礎的なレイアウトの理解', }, + 'ko': { + 'Tutorials': '자습서', + 'CSS_basics': 'CSS 기초', + 'CSS_first_steps': 'CSS 첫 번째 단계', + 'CSS_first_steps_overview': 'CSS 첫 번째 단계', + 'What_is_CSS': 'CSS란 무엇인가?', + 'Getting_started_with_CSS': 'CSS 시작하기', + 'How_CSS_is_structured': 'CSS의 구조', + 'How_CSS_works': 'CSS 작동 방식', + 'Assessment_Styling_a_biography_page': '과제: 프로필 페이지 만들기', + 'CSS_building_blocks': 'CSS 구성요소', + 'CSS_building_blocks_overview': 'CSS 구성요소', + 'Cascade_and_inheritance': '계단식 및 상속', + 'CSS_selectors': 'CSS 선택자', + 'The_box_model': '박스 모델', + 'Backgrounds_and_borders': '배경 및 테두리', + 'Handling_different_text_directions': '텍스트 표시 방향 제어하기', + 'Overflowing_content': '콘텐츠 overflow', + 'CSS_values_and_units': 'CSS 값과 단위', + 'Sizing_items_in_CSS': 'CSS에서 항목 크기 조정', + 'Images_media_and_form_elements': '이미지, 미디어 및 양식 요소', + 'Styling_tables': '표 꾸미기', + 'Debugging_CSS': 'CSS 디버깅', + 'Organizing_your_CSS': 'CSS 구성', + 'Assessment_Fundamental_CSS_comprehension': '과제: 기본적인 CSS 이해', + 'Assessment_Creating_fancy_letterheaded_paper': '과제: 이쁜 레터 모양 종이 만들기', + 'Assessment_A_cool_looking_box': '과제: 멋진 박스 만들기 ', + 'Styling_text': '텍스트 꾸미기', + 'Styling_text_overview': '텍스트 꾸미기', + 'Fundamental_text_and_font_styling': '기본적인 텍스트 및 글꼴 꾸미기', + 'Styling_lists': '목록 꾸미기', + 'Styling_links': '링크 꾸미기', + 'Web_fonts': '웹 글꼴', + 'Assessment_Typesetting_a_community_school_homepage': '과제: 학교 홈페이지 만들기', + 'CSS_layout': 'CSS 레이아웃', + 'CSS_layout_overview': 'CSS 레이아웃', + 'Introduction_to_CSS_layout' : 'CSS 레이아웃 입문서', + 'Normal_Flow' : '일반 대열', + 'Flexbox': '플렉스박스', + 'Grids' : '그리드', + 'Floats': 'Floats', + 'Positioning': '위치잡기', + 'Multiple-column_layout': '다단 레이아웃', + 'Responsive_design': '반응형 디자인', + 'Beginners_guide_to_media_queries': '초보자를 위한 미디어 쿼리 안내서', + 'Legacy_layout_methods': '레거시 레이아웃 메서드', + 'Supporting_older_browsers': '이전 브라우저 지원', + 'Assessment_Fundamental_Layout_Comprehension' : '과제 기본적인 레이아웃 사용하기', + 'Reference': 'CSS 참고서', + 'Guides': '안내서', + 'Animations': '애니메이션', + 'Using_CSS_animations': 'CSS 애니메이션 사용하기', + 'Backgrounds_and_Borders': '배경과 보더', + 'Using_multiple_backgrounds': '한 번에 여러 배경 사용하기', + 'Resizing_background_images': '배경 이미지 크기 조정하기', + 'Box_alignment': '박스 정렬', + 'Box_alignment_in_block_layout': '블록 레이아웃 박스 정렬하기', + 'Box_alignment_in_flexbox': '플렉스박스 박스 정렬하기', + 'Box_alignment_in_grid_layout': '그리드 레이아웃 박스 정렬하기', + 'Box_alignment_in_multi-column_layout': '다단 레이아웃 박스 정렬하기', + 'Box_model': '박스 모델', + 'Introduction_to_the_CSS_basic_box_model': 'CSS 기본 박스 모델 입문', + 'Mastering_margin_collapsing': '여백 상쇄 정복', + 'Columns': '다단 레이아웃', + 'Basic_concepts_of_Multicol': '다단 레이아웃의 기본 개념', + 'Styling_columns': '다단 레이아웃 꾸미기', + 'Spanning_and_balancing': 'Spanning 과 balancing', + 'Handling_overflow_in_Multicol': '다단 레이아웃에서 overflow 처리하기', + 'Content_breaks_in_Multicol': '다단 레이아웃에서 컨텐츠 나누기', + 'Conditional_rules': 'CSS에서 규칙 정의하기', + 'Using_feature_queries': '기능 쿼리 사용하기', + 'CSSOM_view': 'CSSOM view', + 'Coordinate_systems': '좌표 시스템', + 'Flexbox': '플렉스박스', + 'Basic_concepts_of_Flexbox': '플렉스박스의 기본 개념', + 'Comparison_with_other_layout_methods': '다른 레이아웃과 비교해보기', + 'Aligning_items_in_a_flex_container': '항목 정렬하기', + 'Ordering_flex_items': '항목 순서 정하기', + 'Controlling_flex_item_ratios': '항목 비율 설정하기', + 'Mastering_wrapping_of_flex_items': '항목 wrapping 정복하기', + 'Typical_use_cases_of_Flexbox': '플렉스박스 적용 사례', + 'Backwards_compatibility_of_Flexbox': '플렉스박스의 하위 호환성', + 'Flow_layout': '플로 레이아웃', + 'Block_and_Inline_layout_in_normal_flow': '일반 대열 속 블록 및 인라인 레이아웃', + 'In_flow_and_Out_of_flow': '대열과 탈대열', + 'Formatting_contexts_explained': '서식 상황 입문서', + 'Flow_layout_and_writing_modes': '플로 레이아웃과 쓰기 모드', + 'Flow_layout_and_overflow': '플로 레이아웃과 overflow', + 'Fonts': '글꼴', + 'OpenType_font_features_guide': '오픈타입 글꼴 기능 안내서', + 'Variable_fonts_guide': '다양한 글꼴 안내서', + 'Grid': '그리드', + 'Basics_concepts_of_grid_layout': '그리드 레이아웃 기본 개념', + 'Relationship_to_other_layout_methods': '그리드 레이아웃과 다른 레이아웃과의 관계성', + 'Line-based_placement': '라인을 이용한 그리드 배치', + 'Grid_template_areas': '그리드 템플릿 영역', + 'Layout_using_named_grid_lines': '이름으로 레이아웃 정하기', + 'Auto-placement_in_grid_layout': '그리드 레이아웃의 자동 배치', + 'Box_alignment_in_grid_layout': '그리드 레이아웃의 박스 정렬', + 'Grids_logical_values_and_writing_modes': '그리드, logical 값, 쓰기 모드', + 'Grid_layout_and_accessibility': '그리드 레이아웃과 접근성', + 'Grid_Layout_and_progressive_enhancement': '그리드 레이아웃과 꾸준한 발전 ', + 'Realizing_common_layouts_using_grids': '자주 사용되는 레이아웃', + 'Subgrid': '하위 그리드', + 'Masonry_layout': 'Masonry 레이아웃', + 'Images': '이미지', + 'Using_CSS_gradients': 'CSS 그레이디언트 사용하기', + 'Lists_and_counters': '리스트와 카운터', + 'Using_CSS_counters': 'CSS 카운터 사용하기', + 'Consistent_list_indentation': '리스트 들여쓰기', + 'Logical_properties': 'Logical 속성', + 'Basic_concepts': '기본 개념', + 'Floating_and_positioning': 'Floating 과 positioning', + 'Margins_borders_and_padding': '바깥여백(마진), 테두리(보더) 그리고 안쪽여백(패딩)', + 'Sizing': '크기 조절하기', + 'Media_queries': '미디어 쿼리', + 'Using_media_queries': '미디어 쿼리 사용하기', + 'Using_media_queries_for_accessibility': '접근성을 위한 미디어 쿼리 사용하기', + 'Testing_media_queries_programmatically': '미디어 쿼리 테스트하기', + 'Positioning': '위치 잡기', + 'Understanding_CSS_z-index': 'CSS z-index 이해하기', + 'Scroll_snap': '스크롤 스냅', + 'Basic_concepts_of_scroll_snap': '스크롤 스냅 기본 개념', + 'Browser_compatibility_and_scroll_snap': '스크롤 스냅과 브라우저 호환성', + 'Shapes': '도형', + 'Overview_of_shapes': '도형의 기본 개념', + 'Shapes_from_box_values': 'CSS 박스 모델로 도형 만들기', + 'Basic_shapes': '기본 도형들', + 'Shapes_from_images': '이미지로 도형 만들기', + 'Text': '텍스트', + 'Wrapping_and_breaking_text': '텍스 포장하기 및 나누기', + 'Transforms': '변형', + 'Using_transforms': 'CSS 변형 사용하기', + 'Transitions': '트랜지션', + 'Using_transitions': 'CSS 트랜지션 사용하기', + 'Layout_cookbook': '레이아웃 비법서', + 'Media_objects': '미디어 객체', + 'Columns': '열', + 'Center_an_element': '아이템 중앙 정렬 하기', + 'Sticky_footers': '바닥글 sticky 설정하기', + 'Split_navigation': '네비게이션 나누기', + 'Breadcrumb_navigation': '네비게이션 breadcrumb 설정하기', + 'List_group_with_badges': '뱃지로 리스트 그룹화하기', + 'Pagination': 'Pagination', + 'Card': '카드', + 'Grid_wrapper': '그리드 wrapper', + 'Tools': '도구', + 'Color_picker_tool': '색상 선택 도구', + 'Box-shadow_generator': '박스에 그림자 생성기', + 'Border-image_generator' : '보더 이미지 생성기', + }, 'pt-BR': { 'Tutorials': 'Tutoriais', 'CSS_basics': 'O básico de CSS', @@ -806,12 +957,6 @@ for (const page of standardPages) { properties = properties.sort((a, b) => a.title.localeCompare(b.title)); -const badges = { - ExperimentalBadge : await template("ExperimentalBadge"), - NonStandardBadge : await template("NonStandardBadge"), - DeprecatedBadge : await template("DeprecatedBadge"), -} - function smartLink(href, title, content, subpath) { let basepath = subpath; let ignoreFlawMacro = "CSSRef"; @@ -821,36 +966,31 @@ function smartLink(href, title, content, subpath) { /** * Create an entry in the sidebar for a single CSS page. * - * @param page : an object containing information about a page, including title, url etc + * @param aPage : an object containing information about a page, including title, url etc * @returns : a string containing markup for that page's entry in the sidebar */ -function makePageLink(page) { - const url = page.url.replace('en-US', locale); - const title = htmlEscape(page.title); +async function makePageLink(aPage) { + const url = aPage.url.replace('en-US', locale); + const title = htmlEscape(aPage.title); if (locale != 'en-US') { - page.translations.forEach(function(translation){ + aPage.translations.forEach(function(translation){ if (translation.locale === locale) { title = htmlEscape(translation.title); } }); } - let result = '<li>'; - - if (hasTag(page, 'Experimental')) { - result += badges.ExperimentalBadge; - } - - if (hasTag(page, 'Deprecated')) { - result += badges.DeprecatedBadge; - } + const pageBadges = (await page.badges(aPage)).join(""); + let result = '<li>'; + if (rtlLocales.indexOf(locale) != -1) { result += '<bdi>'; } result += smartLink(url, null, title, cssURL); + result += pageBadges; if (rtlLocales.indexOf(locale) != -1) { result += '</bdi>'; @@ -861,11 +1001,11 @@ function makePageLink(page) { return result; } -function buildSublist(pages, title) { +async function buildSublist(pages, title) { let result = `<li class="toggle"><details><summary>${title}</summary><ol>`; for (const page of pages) { - result += makePageLink(page); + result += await makePageLink(page); } result += '</ol></details></li>'; @@ -882,7 +1022,7 @@ function buildSublist(pages, title) { * @param title : the title of this section of the sidebar * @returns : markup for the complete CSS property section */ -function buildPropertylist(pages, title) { +async function buildPropertylist(pages, title) { let result = `<li class="toggle"><details><summary>${title}</summary><ol>`; @@ -917,14 +1057,14 @@ function buildPropertylist(pages, title) { // properties with the given prefix) then just write them out as a list // of links for (const page of group) { - result += makePageLink(page); + result += await makePageLink(page); } } else { // otherwise, make a collapsible section for this group, and write // the page links out inside it. result += `<li class="toggle"><details><summary>${prefix}-*</summary><ol>`; for (const page of group) { - result += makePageLink(page); + result += await makePageLink(page); } result += "</ol></details></li>"; } @@ -1013,15 +1153,15 @@ function buildPropertylist(pages, title) { </li> <li><a href="/<%=locale%>/docs/Web/CSS/Reference"><strong><%=text['Reference']%></strong></a></li> - <%-buildSublist(groups, 'Modules');%> - <%-buildPropertylist(properties, 'Properties');%> - <%-buildSublist(selectors, 'Selectors');%> - <%-buildSublist(combinators, 'Combinators');%> - <%-buildSublist(pseudoClasses, 'Pseudo-classes');%> - <%-buildSublist(pseudoElements, 'Pseudo-elements');%> - <%-buildSublist(atRules, 'At-rules');%> - <%-buildSublist(functions, 'Functions');%> - <%-buildSublist(types, 'Types');%> + <%-await buildSublist(groups, 'Modules');%> + <%-await buildPropertylist(properties, 'Properties');%> + <%-await buildSublist(selectors, 'Selectors');%> + <%-await buildSublist(combinators, 'Combinators');%> + <%-await buildSublist(pseudoClasses, 'Pseudo-classes');%> + <%-await buildSublist(pseudoElements, 'Pseudo-elements');%> + <%-await buildSublist(atRules, 'At-rules');%> + <%-await buildSublist(functions, 'Functions');%> + <%-await buildSublist(types, 'Types');%> <li><strong><%=text['Guides']%></strong></li> <li class="toggle"> diff --git a/kumascript/macros/CSS_Ref.ejs b/kumascript/macros/CSS_Ref.ejs index f13307136715..a2bf755d7ab9 100644 --- a/kumascript/macros/CSS_Ref.ejs +++ b/kumascript/macros/CSS_Ref.ejs @@ -9,7 +9,7 @@ $1 - Item grouping type (valid values: 'alphabetically', 'no'; defaults to 'alphabetically') $2 - Array of strings used to filter the items by their status - (valid values: 'standard', 'experimental', "nonstandard', 'obsolete'; + (valid values: 'standard', 'experimental', "nonstandard'; defaults to ['standard', 'experimental']) */ diff --git a/kumascript/macros/CanvasSidebar.ejs b/kumascript/macros/CanvasSidebar.ejs index 83909258454f..0a78bbe0cbfa 100644 --- a/kumascript/macros/CanvasSidebar.ejs +++ b/kumascript/macros/CanvasSidebar.ejs @@ -132,7 +132,7 @@ var text = mdn.localStringMap({ }, 'ko': { 'Canvas_API': 'Canvas API', - 'Canvas_tutorial': 'Canvas 튜토리얼', + 'Canvas_tutorial': 'Canvas 자습서', 'Basic_usage': '기본 사용', 'Drawing_shapes': '도형 그리기', 'Applying': '스타일 및 색상 적용하기', diff --git a/kumascript/macros/DeprecatedBadge.ejs b/kumascript/macros/DeprecatedBadge.ejs index d73f4ef4a7bb..04f24abfc8c2 100644 --- a/kumascript/macros/DeprecatedBadge.ejs +++ b/kumascript/macros/DeprecatedBadge.ejs @@ -5,12 +5,14 @@ const title = mdn.localString({ "en-US": "Deprecated. Not for use in new websites.", + "ko": "지원이 중단되었습니다. 새로운 웹사이트에서 사용하지 마세요.", "zh-CN": "已弃用。请不要在新的网站中使用。", "zh-TW": "已棄用。請不要在新的網站中使用。" }); const abbreviation = mdn.localString({ "en-US": "Deprecated", + "ko": "지원이 중단되었습니다.", "zh-CN": "已弃用", "zh-TW": "已棄用" }); diff --git a/kumascript/macros/DeprecatedGeneric.ejs b/kumascript/macros/DeprecatedGeneric.ejs index 39b89ec02f31..7f2a834b3e26 100644 --- a/kumascript/macros/DeprecatedGeneric.ejs +++ b/kumascript/macros/DeprecatedGeneric.ejs @@ -63,10 +63,6 @@ switch(lang) { str = "Obsolète"; if (ver.length) { str = str + " depuis " + ver; } break; - case 'it': - str = "Deprecato"; - if (ver.length) { str = str + " " + ver; } - break; case 'ja': str = "非推奨"; if (ver.length) { str = str + " " + ver; } diff --git a/kumascript/macros/Deprecated_Inline.ejs b/kumascript/macros/Deprecated_Inline.ejs index aa672a203888..bcfeef2a747f 100644 --- a/kumascript/macros/Deprecated_Inline.ejs +++ b/kumascript/macros/Deprecated_Inline.ejs @@ -2,8 +2,7 @@ // Inserts an inline indicator noting that an inline item is deprecated. // // NOTE: "Deprecated" means that the item should no longer be used, but -// still functions. If you mean that it no longer works at all, -// use the term "obsolete." +// still functions. // // Parameters: // diff --git a/kumascript/macros/FirefoxSidebar.ejs b/kumascript/macros/FirefoxSidebar.ejs index 5e662086c618..19c7459a47e1 100644 --- a/kumascript/macros/FirefoxSidebar.ejs +++ b/kumascript/macros/FirefoxSidebar.ejs @@ -15,15 +15,6 @@ const text = mdn.localStringMap({ "Themes": "Themes", "Firefox_documentation": "Firefox documentation", }, - "bn-BD": { - "Firefox_releases": "Firefox releases", - "Firefox_release_notes_developer": "Firefox release notes for developers", - "Experimental_features_firefox": "Experimental features in Firefox", - "Add-ons": "অ্যাড-অন", - "Browser_extensions": "Browser extensions", - "Themes": "থিম", - "Firefox_documentation": "Firefox documentation", - }, "es": { "Firefox_releases": "Lanzamientos de Firefox", "Firefox_release_notes_developer": "Notas de lanzamiento de Firefox, para desarrolladores", @@ -42,24 +33,6 @@ const text = mdn.localStringMap({ "Themes": "Thèmes", "Firefox_documentation": "Documentation de Firefox", }, - "id": { - "Firefox_releases": "Firefox releases", - "Firefox_release_notes_developer": "Firefox release notes for developers", - "Experimental_features_firefox": "Experimental features in Firefox", - "Add-ons": "Add-ons", - "Browser_extensions": "Browser extensions", - "Themes": "Themes", - "Firefox_documentation": "Firefox documentation", - }, - "it": { - "Firefox_releases": "Firefox releases", - "Firefox_release_notes_developer": "Firefox release notes for developers", - "Experimental_features_firefox": "Experimental features in Firefox", - "Add-ons": "Componenti aggiuntivi", - "Browser_extensions": "WebExtensions", - "Themes": "Temi", - "Firefox_documentation": "Firefox documentation", - }, "ja": { "Firefox_releases": "Firefox リリース", "Firefox_release_notes_developer": "Firefox 開発者向けリリースノート", @@ -69,6 +42,15 @@ const text = mdn.localStringMap({ "Themes": "テーマ", "Firefox_documentation": "Firefox ドキュメント", }, + "ko": { + "Firefox_releases": "Firefox 릴리즈", + "Firefox_release_notes_developer": "개발자를 위한 Firefox 릴리즈 노트", + "Experimental_features_firefox": "Firefox의 실험적인 기능", + "Add-ons": "Add-ons", + "Browser_extensions": "브라우저 확장 프로그램", + "Themes": "테마", + "Firefox_documentation": "Firefox 문서", + }, "pt-BR": { "Firefox_releases": "Lançamentos do Firefox", "Firefox_release_notes_developer": "Notas de lançamento do Firefox para desenvolvedores", diff --git a/kumascript/macros/Firefox_for_developers.ejs b/kumascript/macros/Firefox_for_developers.ejs index 9345d44c2ad0..a0e326041541 100644 --- a/kumascript/macros/Firefox_for_developers.ejs +++ b/kumascript/macros/Firefox_for_developers.ejs @@ -21,8 +21,9 @@ var slug = mdn.localString({ // for content var str = mdn.localString({ - "fr" : ["Firefox ", " pour les développeurs"], "en-US": ["Firefox ", " for developers"], + "fr" : ["Firefox ", " pour les développeurs"], + "ko": ["Firefox", "릴리즈노트"], "ru": ["Firefox ", " для разработчиков"] }); diff --git a/kumascript/macros/GamesSidebar.ejs b/kumascript/macros/GamesSidebar.ejs index d588170bb85f..5a2b884f0747 100644 --- a/kumascript/macros/GamesSidebar.ejs +++ b/kumascript/macros/GamesSidebar.ejs @@ -63,62 +63,6 @@ const text = mdn.localStringMap({ "Game_promotion": "Game promotion", "Game_monetization": "Game monetization" }, - "bn-BD": { - "Introduction": "ওয়েবের জন্য গেম ডেভেলপমেন্ট পরিচিতি", - "Anatomy": "একটি ভিডিও গেমের বিশ্লেষণ", - "Examples": "Examples", - "APIs_for_game_development": "APIs for game development", - "Canvas": "Canvas", - "CSS": "CSS", - "Full_Screen": "Full screen", - "Gamepad": "Gamepad", - "IndexedDB": "IndexedDB", - "JavaScript": "JavaScript", - "Pointer_Lock": "Pointer Lock", - "SVG": "SVG", - "Typed_Arrays": "Typed Arrays", - "Web_Audio": "Web Audio", - "WebGL": "WebGL", - "WebRTC": "WebRTC", - "Web_Sockets": "WebSockets", - "WebVR": "WebVR", - "Web_Workers": "Web Workers", - "XMLHttpRequest": "XMLHttpRequest", - "Techniques": "কৌশল সমূহ", - "Using_async_scripts_for_asm.js": "asm.js এর জন্য async স্ক্রিপ্ট ব্যবহার কর", - "Optimizing_startup_performance": "চালু হওয়াকালীন পারফর্মেন্স উন্নত কর", - "Using_WebRTC_peer-to-peer_data_channels": "WebRTC peer-to-peer ডাটা চ্যানেল ব্যবহার কর", - "Efficient_animation_for_web_games": "ওয়েব গেমের জন্য দক্ষ এনিমেশন", - "Audio_for_Web_Games": "Audio for Web Games", - "2D_collision_detection": "2D collision detection", - "Tiles_and_tilemaps_overview": "Tiles and tilemaps overview", - "3D_games_on_the_Web": "3D games on the Web", - "3D_games_on_the_Web_overview": "3D games on the Web overview", - "Explaining_basic_3D_theory": "Explaining basic 3D theory", - "Building_up_a_basic_demo_with_A-Frame": "Building up a basic demo with A-Frame", - "Building_up_a_basic_demo_with_Babylon.js": "Building up a basic demo with Babylon.js", - "Building_up_a_basic_demo_with_PlayCanvas": "Building up a basic demo with PlayCanvas", - "Building_up_a_basic_demo_with_Three.js": "Building up a basic demo with Three.js", - "WebVR_guide": "WebVR", - "3D_collision_detection": "3D collision detection", - "Bounding_volume_collision_detection_with_THREE.js": "Bounding volume collision detection with THREE.js", - "Implementing_game_control_mechanisms": "Implementing game control mechanisms", - "Control_mechanisms": "Control mechanisms", - "Mobile_touch": "Mobile touch", - "Desktop_with_mouse_and_keyboard": "Desktop with mouse and keyboard", - "Desktop_with_gamepad": "Desktop with gamepad", - "Other": "Other", - "Tutorials": "Tutorials", - "2D_breakout_game_using_pure_JavaScript": "2D breakout game using pure JavaScript", - "2D_breakout_game_using_Phaser": "2D breakout game using Phaser", - "2D_maze_game_with_device_orientation": "2D maze_game with device orientation", - "2D_platform_game_using_Phaser": "2D platform game using Phaser", - "Publishing_games": "Publishing games", - "Publishing_games_overview": "Publishing games overview", - "Game_distribution": "Game distribution", - "Game_promotion": "Game promotion", - "Game_monetization": "Game monetization" - }, "es": { "Introduction": "Introducción para desarrollo de juegos para la Web", "Anatomy": "Anatomía de un videojuego", @@ -294,17 +238,17 @@ const text = mdn.localStringMap({ "APIs_for_game_development": "게임 개발에 필요한 API", "Canvas": "Canvas", "CSS": "CSS", - "Full_Screen": "Full screen", - "Gamepad": "Gamepad", + "Full_Screen": "전체 화면", + "Gamepad": "게임패드", "IndexedDB": "IndexedDB", "JavaScript": "JavaScript", "Pointer_Lock": "Pointer Lock", "SVG": "SVG", - "Typed_Arrays": "Typed Arrays", - "Web_Audio": "Web Audio", + "Typed_Arrays": "형식화 배열", + "Web_Audio": "웹 오디오", "WebGL": "WebGL", "WebRTC": "WebRTC", - "Web_Sockets": "WebSockets", + "Web_Sockets": "웹 소켓", "WebVR": "WebVR", "Web_Workers": "Web Workers", "XMLHttpRequest": "XMLHttpRequest", @@ -319,20 +263,20 @@ const text = mdn.localStringMap({ "3D_games_on_the_Web": "웹 3D 게임", "3D_games_on_the_Web_overview": "웹 3D 게임", "Explaining_basic_3D_theory": "기본적인 3D 이론", - "Building_up_a_basic_demo_with_A-Frame": "Building up a basic demo with A-Frame", - "Building_up_a_basic_demo_with_Babylon.js": "Building up a basic demo with Babylon.js", + "Building_up_a_basic_demo_with_A-Frame": "A-Frame를 사용하여 데모 만들기", + "Building_up_a_basic_demo_with_Babylon.js": "Babylon.js를 사용하여 데모 만들기", "Building_up_a_basic_demo_with_PlayCanvas": "PlayCanvas를 사용하여 데모 만들기", "Building_up_a_basic_demo_with_Three.js": "Three.js를 사용하여 데모 만들기", "WebVR_guide": "WebVR", "3D_collision_detection": "3D 충돌 감지", "Bounding_volume_collision_detection_with_THREE.js": "THREE.js를 사용한 충돌 용적 감지", - "Implementing_game_control_mechanisms": "Implementing game control mechanisms", - "Control_mechanisms": "Control mechanisms", - "Mobile_touch": "Mobile touch", - "Desktop_with_mouse_and_keyboard": "Desktop with mouse and keyboard", - "Desktop_with_gamepad": "Desktop with gamepad", - "Other": "Other", - "Tutorials": "튜토리얼", + "Implementing_game_control_mechanisms": "게임 제어 원리 적용하기", + "Control_mechanisms": "제어 원리", + "Mobile_touch": "모바일 터치", + "Desktop_with_mouse_and_keyboard": "데스크톱과 마우스와 키보드", + "Desktop_with_gamepad": "데스크톱과 게임패드", + "Other": "기타", + "Tutorials": "자습서", "2D_breakout_game_using_pure_JavaScript": "순수 자바스크립트를 사용한 2D 게임", "2D_breakout_game_using_Phaser": "Phaser를 사용한 2D 게임", "2D_maze_game_with_device_orientation": "기기 수평/수직 기능을 활용한 2D 주사위 게임", @@ -399,62 +343,6 @@ const text = mdn.localStringMap({ "Game_promotion": "Promoção de Jogos", "Game_monetization": "Monetização de Jogos" }, - "th": { - "Introduction": "Introduction", - "Anatomy": "Anatomy", - "Examples": "Examples", - "APIs_for_game_development": "APIs for game development", - "Canvas": "Canvas", - "CSS": "CSS", - "Full_Screen": "Full screen", - "Gamepad": "Gamepad", - "IndexedDB": "IndexedDB", - "JavaScript": "JavaScript", - "Pointer_Lock": "Pointer Lock", - "SVG": "SVG", - "Typed_Arrays": "Typed Arrays", - "Web_Audio": "Web Audio", - "WebGL": "WebGL", - "WebRTC": "WebRTC", - "Web_Sockets": "WebSockets", - "WebVR": "WebVR", - "Web_Workers": "Web Workers", - "XMLHttpRequest": "XMLHttpRequest", - "Techniques": "Kỹ thuật", - "Using_async_scripts_for_asm.js": "Sử dụng tập lệnh async cho asm.js", - "Optimizing_startup_performance": "Tối ưu hóa hiệu suất khởi động", - "Using_WebRTC_peer-to-peer_data_channels": "Sử dụng các kênh dữ liệu WebRTC peer-to-peer", - "Efficient_animation_for_web_games": "Hiệu quả hoạt hình cho các trò chơi trên web", - "Audio_for_Web_Games": "Âm thanh cho Trò chơi Web", - "2D_collision_detection": "Phát hiện va chạm 2D", - "Tiles_and_tilemaps_overview": "Gạch ngói và tổng quan", - "3D_games_on_the_Web": "Trò chơi 3D trên tổng quan về Web", - "3D_games_on_the_Web_overview": "Trò chơi 3D trên tổng quan về Web", - "Explaining_basic_3D_theory": "Giải thích lý thuyết cơ bản 3D", - "Building_up_a_basic_demo_with_A-Frame": "Xây dựng một bản giới thiệu cơ bản với A-Frame", - "Building_up_a_basic_demo_with_Babylon.js": "Xây dựng bản giới thiệu cơ bản với Babylon.js", - "Building_up_a_basic_demo_with_PlayCanvas": "Xây dựng bản giới thiệu cơ bản với PlayCanvas", - "Building_up_a_basic_demo_with_Three.js": "Xây dựng bản giới thiệu cơ bản với Three.js", - "WebVR_guide": "WebVR", - "3D_collision_detection": "Phát hiện va chạm 3D", - "Bounding_volume_collision_detection_with_THREE.js": "Bẫy sự va chạm khối lượng với THREE.js", - "Implementing_game_control_mechanisms": "Thực hiện cơ chế kiểm soát trò chơi", - "Control_mechanisms": "Tổng quan về cơ chế kiểm soát trò chơi", - "Mobile_touch": "Điều khiển cảm ứng di động", - "Desktop_with_mouse_and_keyboard": "Bộ điều khiển bàn phím chuột và bàn phím", - "Desktop_with_gamepad": "Bộ điều khiển trò chơi trên máy tính để bàn", - "Other": "Kiểm soát độc đáo", - "Tutorials": "Hướng dẫn", - "2D_breakout_game_using_pure_JavaScript": "Trò chơi 2D breakout sử dụng JavaScript thuần túy", - "2D_breakout_game_using_Phaser": "Trò chơi 2D breakout bằng Phaser", - "2D_maze_game_with_device_orientation": "Game 2D mê cung với định hướng thiết bị", - "2D_platform_game_using_Phaser": "Trò chơi nền tảng 2D sử dụng Phaser", - "Publishing_games": "Trò chơi xuất bản", - "Publishing_games_overview": "Xuất bản trò chơi tổng quan", - "Game_distribution": "Phân phối trò chơi", - "Game_promotion": "Quảng cáo trò chơi", - "Game_monetization": "Kiếm tiền từ trò chơi" - } }); %> diff --git a/kumascript/macros/HTMLRefTable.ejs b/kumascript/macros/HTMLRefTable.ejs index 66d719be5f05..9f6f0535c056 100644 --- a/kumascript/macros/HTMLRefTable.ejs +++ b/kumascript/macros/HTMLRefTable.ejs @@ -16,42 +16,48 @@ let l10n = { element : mdn.localString({ "en-US": "Element", "fr" : "Élément", - "zh-CN": "元素", - "ru" : "Элемент" + "ko" : "요소", + "ru" : "Элемент", + "zh-CN": "元素" }), description : mdn.localString({ "en-US": "Description", - "zh-CN": "描述", - "ru" : "Описание" + "ko" : "설명", + "ru" : "Описание", + "zh-CN": "描述" }), deprecated : mdn.localString({ "en-US": "This element is deprecated.", "fr" : "Cet élément est obsolète.", - "zh-CN": "该元素已被废弃", - "ru" : "Этот элемент устарел." + "ko" : "이 요소는 더 이상 사용되지 않습니다.", + "ru" : "Этот элемент устарел.", + "zh-CN": "该元素已被废弃" }), experimental : mdn.localString({ "en-US": "This element is considered experimental.", "fr" : "Cet élément est considéré comme experimental.", - "zh-CN": "该元素仍处于试验阶段", - "ru" : "Этот элемент считается экспериментальным." + "ko" : "실험적인 요소입니다.", + "ru" : "Этот элемент считается экспериментальным.", + "zh-CN": "该元素仍处于试验阶段" }), html5 : mdn.localString({ "en-US": "This element has been introduced with HTML5.", "fr" : "Cet élément a été ajouté avec HTML5.", - "zh-CN": "该元素于 HTML5 规范中引入", - "ru" : "Этот элемент не был представлен в HTML5." + "ko" : "이 요소는 HTML5에서 처음 소개되었습니다.", + "ru" : "Этот элемент не был представлен в HTML5.", + "zh-CN": "该元素于 HTML5 规范中引入" }), components : mdn.localString({ "en-US": "This element has been introduced with the Web Components specifications.", "fr" : "Cet élément a été introduit par les spécifications sur les Web Components.", - "zh-CN": "该元素于 Web 组建规范中引入", - "ru" : "Этот элемент представлен в спецификации Веб компонентов." + "ko" : "이 요소는 웹 컴포넌트 명세에서 처음 소개되었습니다.", + "ru" : "Этот элемент представлен в спецификации Веб компонентов.", + "zh-CN": "该元素于 Web 组建规范中引入" }) }; @@ -128,7 +134,7 @@ for(let page of HTMLDocPages) { template("HTMLelement", ['h6']) ])).join(', ')), summary : (p?.summary?.()) || "", - deprecated : hasCommonTag(tags, ['deprecated', 'obsolete']), + deprecated : hasCommonTag(tags, ['deprecated']), experimental : hasCommonTag(tags, ['experimental']), html5 : hasCommonTag(tags, ['html5']), component : hasCommonTag(tags, ['html components']) diff --git a/kumascript/macros/HTMLSidebar.ejs b/kumascript/macros/HTMLSidebar.ejs index 932c1ff46c02..227f1b7ed013 100644 --- a/kumascript/macros/HTMLSidebar.ejs +++ b/kumascript/macros/HTMLSidebar.ejs @@ -13,7 +13,7 @@ function state(section) { var text = mdn.localStringMap({ 'en-US': { - 'Tutorials': 'Tutorials:', + 'Tutorials': 'Tutorials', 'HTML_basics': 'HTML basics', 'Introduction_to_HTML': 'Introduction to HTML', 'Introduction_to_HTML_overview': 'Introduction to HTML overview', @@ -39,12 +39,12 @@ var text = mdn.localStringMap({ 'HTML_table_basics' : 'HTML table basics', 'HTML_table_advanced_features_and_accessibility' : 'HTML table advanced features and accessibility', 'Assessment_Structuring_planet_data' : 'Assessment: Structuring planet data', - 'Reference': 'References:', + 'Reference': 'References', 'HTML_Elements': 'HTML elements', 'Global_attributes': 'Global attributes', 'Attributes': 'Attributes', 'Input_types': '<code><input></code> types', - 'Guides': 'Guides:', + 'Guides': 'Guides', 'Content_categories': 'Content categories', 'Allowing_cross-origin_images_and_canvas': 'Allowing cross-origin use of images and canvas', 'Block-level_elements': 'Block-level elements', @@ -57,7 +57,7 @@ var text = mdn.localStringMap({ 'Viewport_meta_tag': 'Viewport meta tag', }, 'fr': { - 'Tutorials': 'Tutoriels\xa0:', + 'Tutorials': 'Tutoriels', 'HTML_basics': 'Notions élémentaires de HTML', 'Introduction_to_HTML': 'Introduction à HTML', 'Introduction_to_HTML_overview': 'Aperçu de l\'introduction à HTML', @@ -83,12 +83,12 @@ var text = mdn.localStringMap({ 'HTML_table_basics' : 'Bases des tableaux HTML', 'HTML_table_advanced_features_and_accessibility' : 'Fonctionnalités avancées et accessibilité des tableaux HTML', 'Assessment_Structuring_planet_data' : 'Évaluation\xa0: structurer les données des planètes', - 'Reference': 'Références\xa0:', + 'Reference': 'Références', 'HTML_Elements': 'Éléments HTML', 'Global_attributes': 'Attributs universels', 'Attributes': 'Attributs', 'Input_types': 'Types <code><input></code>', - 'Guides': 'Guides:', + 'Guides': 'Guides', 'Content_categories': 'Catégories de contenu', 'Allowing_cross-origin_images_and_canvas': 'Autoriser les images et canevas provenant d\'autres origines', 'Block-level_elements': 'Éléments de bloc', @@ -100,7 +100,7 @@ var text = mdn.localStringMap({ 'Viewport_meta_tag': 'Utilisation de la balise meta viewport pour contrôler la mise en page sur mobile', }, 'ja': { - 'Tutorials': 'チュートリアル:', + 'Tutorials': 'チュートリアル', 'HTML_basics': 'HTML の基本', 'Introduction_to_HTML': 'HTML 入門', 'Introduction_to_HTML_overview': 'HTML 入門の概要', @@ -126,11 +126,11 @@ var text = mdn.localStringMap({ 'HTML_table_basics' : 'HTML の表の基本', 'HTML_table_advanced_features_and_accessibility' : 'HTML 表の高度な機能とアクセシビリティ', 'Assessment_Structuring_planet_data' : '評価課題: 太陽系の惑星データの構造化', - 'Reference': 'リファレンス:', + 'Reference': 'リファレンス', 'HTML_Elements': 'HTML 要素', 'Global_attributes': 'グローバル属性', 'Input_types': '<code><input></code> 型', - 'Documentation': 'ドキュメント:', + 'Documentation': 'ドキュメント', 'Useful_lists': '有用なリスト', 'Index': '前ページの索引', 'Contribute': '協力', @@ -138,8 +138,50 @@ var text = mdn.localStringMap({ 'Content_categories': 'コンテンツカテゴリー', 'Constraint_validation': '制約検証', }, + 'ko': { + 'Tutorials': '자습서:', + 'HTML_basics': 'HTML 기초', + 'Introduction_to_HTML': 'HTML 입문서', + 'Introduction_to_HTML_overview': 'HTML 소개', + 'Getting_started_with_HTML': 'HTML 시작하기', + 'Whats_in_the_head_metadata_in_HTML': 'head 태그에는 무엇이 있을까? HTML의 메타데이터', + 'HTML_text_fundamentals': 'HTML 텍스트', + 'Creating_hyperlinks': '하이퍼링크 만들기', + 'Advanced_text_formatting': '고급 텍스트 서식', + 'Document_and_website_structure': '문서와 웹사이트 구조', + 'Debugging_HTML': 'HTML 디버깅', + 'Assessment_Marking_up_a_letter': '과제: 문서 마크업 하기', + 'Assessment_Structuring_a_page_of_content': '과제: 페이지 내용 구조화하기', + 'Multimedia_and_embedding': '멀티미디어와 임베딩', + 'Multimedia_and_embedding_overview': '멀티미디어와 임베딩 소개', + 'Images_in_HTML': 'HTML의 이미지', + 'Video_and_audio_content': '비디오와 오디오 컨텐츠', + 'From_object_to_iframe_other_embedding_technologies': 'object에서 iframe - 다른 임베딩 기술', + 'Adding_vector_graphics_to_the_web': '벡터 그래픽 추가하기', + 'Responsive_images': '반응형 이미지', + 'Assessment_Mozilla_splash_page': '과제: Mozilla 페이지 만들기', + 'HTML_tables' : 'HTML 테이블', + 'HTML_tables_overview' : 'HTML 테이블 소개', + 'HTML_table_basics' : 'HTML 테이블 기초', + 'HTML_table_advanced_features_and_accessibility' : 'HTML 테이블 고급 기능과 접근성', + 'Assessment_Structuring_planet_data' : '과제: 행성 데이터 만들기', + 'Reference': '참고서:', + 'HTML_Elements': 'HTML 요소', + 'Global_attributes': '전역 속성', + 'Attributes': '속성', + 'Input_types': '<code><input></code> types', + 'Guides': '안내서:', + 'Allowing_cross-origin_images_and_canvas': 'cross-origin이 가능한 이미지와 캔버스', + 'Block-level_elements': '블록 단위 요소', + 'Inline_elements': '인라인 요소', + 'Date_and_time_formats': 'HTML의 날짜와 시간 형식', + 'Microdata': 'Microdata', + 'Microformats': 'Microformats', + 'Quirks_Mode_and_Standards_Mode': '쿼크모드와 표준모드', + 'Viewport_meta_tag': '뷰포트 메타 태그', + }, 'pt-BR': { - 'Tutorials': 'Tutoriais:', + 'Tutorials': 'Tutoriais', 'HTML_basics': 'O básico de HTML', 'Introduction_to_HTML': 'Introdução ao HTML', 'Introduction_to_HTML_overview': 'Visão geral da Introdução ao HTML', @@ -165,12 +207,12 @@ var text = mdn.localStringMap({ 'HTML_table_basics' : 'O básico sobre Tabelas HTML', 'HTML_table_advanced_features_and_accessibility' : 'Funcionalidades avançadas e acessibilidade de Tabelas HTML', 'Assessment_Structuring_planet_data' : 'Avaliação: Estruturação dos dados do planenta', - 'Reference': 'Referências:', + 'Reference': 'Referências', 'HTML_Elements': 'Elementos HTML', 'Global_attributes': 'Atributos globais', 'Attributes': 'Atributos', 'Input_types': 'Tipos de <code><input></code>', - 'Guides': 'Guides:', + 'Guides': 'Guides', 'Content_categories': 'Categorias de conteúdo', 'Allowing_cross-origin_images_and_canvas': 'CORS habilitar imagens', 'Block-level_elements': 'Elementos block-level', @@ -182,7 +224,7 @@ var text = mdn.localStringMap({ 'Viewport_meta_tag': 'Viewport meta tag', }, 'ru': { - 'Tutorials': 'Уроки:', + 'Tutorials': 'Уроки', 'HTML_basics': 'Основы HTML', 'Introduction_to_HTML': 'Введение в HTML', 'Introduction_to_HTML_overview': 'Введение в HTML', @@ -208,12 +250,12 @@ var text = mdn.localStringMap({ 'HTML_table_basics' : 'HTML таблицы основы', 'HTML_table_advanced_features_and_accessibility' : 'HTML таблицы продвинутые возможности и доступность', 'Assessment_Structuring_planet_data' : 'Задание: Структурирование данных о планетах', - 'Reference': 'Справочники:', + 'Reference': 'Справочники', 'HTML_Elements': 'HTML элементы', 'Global_attributes': 'Глобальные атрибуты', 'Attributes': 'Aтрибуты', 'Input_types': 'Типы <code><input></code>', - 'Guides': 'Путеводитель:', + 'Guides': 'Путеводитель', 'Content_categories': 'Категории контента', 'Allowing_cross-origin_images_and_canvas': 'Разрешение использования изображений из разных источников и canvas', 'Block-level_elements': 'Блочные элементы', diff --git a/kumascript/macros/HTTPSidebar.ejs b/kumascript/macros/HTTPSidebar.ejs index a8a381da4b45..538c32cc1e9f 100644 --- a/kumascript/macros/HTTPSidebar.ejs +++ b/kumascript/macros/HTTPSidebar.ejs @@ -21,7 +21,7 @@ var text = mdn.localStringMap({ 'Evolution': 'Evolution of HTTP', 'ResourcesURI': 'Resources and URIs', 'Identifying': 'Identifying resources on the Web', - 'DataURIs': 'Data URIs', + 'DataURLs': 'Data URLs', 'MIMETypes': 'Introduction to MIME types', 'ListMIMETypes': 'Common MIME types', 'WWWorNotWWW': 'Choosing between www and non-www URLs', @@ -40,8 +40,8 @@ var text = mdn.localStringMap({ 'CORS': 'HTTP access control (CORS)', 'Resources': 'HTTP specifications', 'Permissions_Policy': 'Permissions Policy', - 'Guides': 'Guides:', - 'Reference': 'References:', + 'Guides': 'Guides', + 'Reference': 'References', 'Methods': 'HTTP request methods', 'Status': 'HTTP response status codes', 'CSPDirectives': 'CSP directives', @@ -58,7 +58,7 @@ var text = mdn.localStringMap({ 'Evolution': 'Evolución de HTTP', 'ResourcesURI': 'Recursons y URIs', 'Identifying': 'Identificación de recursons en la Web', - 'DataURIs': 'URIs de Datos', + 'DataURLs': 'URLs de Datos', 'MIMETypes': 'Presentación de tipos MIME', 'ListMIMETypes': 'Lista completa de tipos MIME', 'WWWorNotWWW': 'Eleción entre ww y no-www URLs', @@ -76,8 +76,8 @@ var text = mdn.localStringMap({ 'Caching': 'HTTP caching', 'CORS': 'Control de acceso en HTTP(CORS)', 'Resources': 'La especificación de HTTP', - 'Guides': 'Guias:', - 'Reference': 'Referencias:', + 'Guides': 'Guias', + 'Reference': 'Referencias', 'Methods': 'Métodos de petición HTTP', 'Status': 'Códigos de estado de HTTP', 'CSPDirectives': 'Directivas CSP', @@ -92,7 +92,7 @@ var text = mdn.localStringMap({ 'Evolution': 'Évolution de HTTP', 'ResourcesURI': 'Ressources et URI', 'Identifying': 'Identifier des ressources sur le Web', - 'DataURIs': 'URI de données', + 'DataURLs': 'URL de données', 'MIMETypes': 'Introduction aux types MIME', 'ListMIMETypes': 'Types MIME usuels', 'WWWorNotWWW': 'Choisir entre les URL avec ou sans www', @@ -111,8 +111,8 @@ var text = mdn.localStringMap({ 'CORS': 'Contrôle d\'accès HTTP', 'Resources': 'Spécifications HTTP', 'Permissions_Policy': 'Règles de fonctionnalité', - 'Guides': 'Guides\xa0:', - 'Reference': 'Références\xa0:', + 'Guides': 'Guides', + 'Reference': 'Références', 'Methods': 'Méthodes de requête HTTP', 'Status': 'Codes de statut de réponse HTTP', 'CSPDirectives': 'Directives CSP', @@ -130,7 +130,7 @@ var text = mdn.localStringMap({ 'Evolution': 'HTTP の進化', 'ResourcesURI': 'リソースと URI', 'Identifying': 'ウェブ上のリソースの識別', - 'DataURIs': 'データ URL', + 'DataURLs': 'データ URL', 'MIMETypes': 'MIME タイプ入門', 'ListMIMETypes': 'よくある MIME タイプ', 'WWWorNotWWW': 'www 付きと www なしの URL の選択', @@ -149,8 +149,8 @@ var text = mdn.localStringMap({ 'CORS': 'HTTP アクセス制御 (CORS)', 'Resources': 'HTTP 仕様書', 'Permissions_Policy': '機能ポリシー', - 'Guides': 'ガイド:', - 'Reference': 'リファレンス:', + 'Guides': 'ガイド', + 'Reference': 'リファレンス', 'Methods': 'HTTP リクエストメソッド', 'Status': 'HTTP レスポンスステータスコード', 'CSPDirectives': 'CSP ディレクティブ', @@ -162,13 +162,13 @@ var text = mdn.localStringMap({ }, 'ko': { 'HTTP': 'HTTP', - 'HTTPGuide': 'HTTP 가이드', + 'HTTPGuide': 'HTTP 안내서', 'Basics': 'HTTP 기본', 'Overview': 'HTTP 개요', 'Evolution': 'HTTP의 진화', 'ResourcesURI': '리소스와 URIs', 'Identifying': '웹의 리소스 식별하기', - 'DataURIs': '데이터 URIs', + 'DataURLs': '데이터 URLs', 'MIMETypes': 'MIME 타입 소개', 'ListMIMETypes': 'MIME 타입의 전체 리스트', 'WWWorNotWWW': 'www와 non-www URL 중에서 선택하기', @@ -187,8 +187,8 @@ var text = mdn.localStringMap({ 'CORS': 'HTTP 접근 제어(CORS)', 'Resources': 'HTTP 명세', 'Permissions_Policy': 'Permissions policy', - 'Guides': '가이드:', - 'Reference': '레퍼런스:', + 'Guides': '가이드', + 'Reference': '레퍼런스', 'Methods': 'HTTP 요청 메소드', 'Status': 'HTTP 응답 상태 코드', 'CSPDirectives': 'CSP 지시문', @@ -206,7 +206,7 @@ var text = mdn.localStringMap({ 'Evolution': 'Эволюция протокола HTTP', 'ResourcesURI': 'Ресурсы и URI-адреса', 'Identifying': 'Идентификация ресурсов в Вебе', - 'DataURIs': 'Data URL', + 'DataURLs': 'Data URL', 'MIMETypes': 'Введение в MIME типы', 'ListMIMETypes': 'Неполный список типов MIME', 'WWWorNotWWW': 'Choosing between www and non-www URLs', @@ -225,8 +225,8 @@ var text = mdn.localStringMap({ 'CORS': 'Контроль доступа в HTTP (CORS)', 'Resources': 'Спецификации HTTP', 'Permissions_Policy': 'Permissions policy', - 'Guides': 'Учебники:', - 'Reference': 'Справочники:', + 'Guides': 'Учебники', + 'Reference': 'Справочники', 'Methods': 'Методы HTTP запроса', 'Status': 'Коды ответа HTTP', 'CSPDirectives': 'Директивы CSP', @@ -244,7 +244,7 @@ var text = mdn.localStringMap({ 'Evolution': 'HTTP 的发展', 'ResourcesURI': '资源和 URI', 'Identifying': '标识互联网上的内容', - 'DataURIs': 'Data URI', + 'DataURLs': 'Data URL', 'MIMETypes': 'MIME 类型介绍', 'ListMIMETypes': '常见的 MIME 类型', 'WWWorNotWWW': '选择 www 或非 www 域名?', @@ -287,7 +287,7 @@ var text = mdn.localStringMap({ <summary><%=text['ResourcesURI']%></summary> <ol> <li><a href="/<%=locale%>/docs/Web/HTTP/Basics_of_HTTP/Identifying_resources_on_the_Web"><%=text['Identifying']%></a></li> - <li><a href="/<%=locale%>/docs/Web/HTTP/Basics_of_HTTP/Data_URIs"><%=text['DataURIs']%></a></li> + <li><a href="/<%=locale%>/docs/Web/HTTP/Basics_of_HTTP/Data_URLs"><%=text['DataURLs']%></a></li> <li><a href="/<%=locale%>/docs/Web/HTTP/Basics_of_HTTP/MIME_Types"><%=text['MIMETypes']%></a></li> <li><a href="/<%=locale%>/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types"><%=text['ListMIMETypes']%></a></li> <li><a href="/<%=locale%>/docs/Web/HTTP/Basics_of_HTTP/Choosing_between_www_and_non-www_URLs"><%=text['WWWorNotWWW']%></a></li> diff --git a/kumascript/macros/JSRef.ejs b/kumascript/macros/JSRef.ejs index 50a6cb88a00a..907ab1fa1217 100644 --- a/kumascript/macros/JSRef.ejs +++ b/kumascript/macros/JSRef.ejs @@ -15,6 +15,7 @@ var jsl10n = web.getJSONData('L10n-JavaScript'); var text = { 'stdlib': mdn.getLocalString(jsl10n, 'stdlib'), + 'Constructor': mdn.getLocalString(commonl10n, 'Constructor'), 'Properties': mdn.getLocalString(commonl10n, 'Properties'), 'Methods': mdn.getLocalString(commonl10n, 'Methods'), 'Inheritance': mdn.getLocalString(commonl10n, 'Inheritance'), @@ -93,6 +94,7 @@ if (inheritance.indexOf("Object") > -1) { var result = {}; result[mainObj] = { title: mainObj, + constructors: [], methods: [], properties: [], defaultOpened: true @@ -100,6 +102,7 @@ result[mainObj] = { if (inheritance.indexOf("Function") > -1) { result['iFunction'] = { title: 'Function', + constructors: [], methods: [], properties: [], defaultOpened: false @@ -108,6 +111,7 @@ result['iFunction'] = { if (inheritance.indexOf("Object") > -1) { result['iObject'] = { title: 'Object', + constructors: [], methods: [], properties: [], defaultOpened: false @@ -140,6 +144,10 @@ function isMethodPage(page) { ].includes(page.pageType); } +function isConstructorPage(page) { + return "javascript-constructor" === page.pageType; +} + for (var object in source) { pageList = source[object]; if (object === "iObject") { @@ -147,6 +155,9 @@ for (var object in source) { pageList = pageList.filter(page => isPrototypeMemberPage(page)); } for (const page of pageList) { + if (isConstructorPage(page)) { + result[object].constructors.push(page); + } if (isPropertyPage(page)) { result[object].properties.push(page); } @@ -158,14 +169,7 @@ for (var object in source) { // Output helper -var badges = { - ExperimentalBadge : await template("ExperimentalBadge"), - NonStandardBadge : await template("NonStandardBadge"), - DeprecatedBadge : await template("DeprecatedBadge"), - ObsoleteBadge : await template("ObsoleteBadge"), -} - -function buildSublist(pages, title, opened) { +async function buildSublist(pages, title, opened) { var result = '<li><details>'; if (opened !== '') { result = '<li><details open>'; @@ -188,38 +192,19 @@ function buildSublist(pages, title, opened) { }); } - var pageBadges = ''; - if (containsTag(aPage, 'Experimental')) { - pageBadges += badges.ExperimentalBadge; - } - - if (containsTag(aPage, 'Non-standard') || containsTag(aPage, 'Non Standard')) { - pageBadges += badges.NonStandardBadge; - } - - if (containsTag(aPage, 'Deprecated')) { - pageBadges += badges.DeprecatedBadge; - } - - if (containsTag(aPage, 'Obsolete')) { - pageBadges += badges.ObsoleteBadge; - result += '<s class="obsoleteElement">'; - } + const pageBadges = (await page.badges(aPage)).join(""); if (rtlLocales.indexOf(locale) != -1) { result += '<bdi>'; } - result += pageBadges + web.smartLink(url, null, `<code>${title}</code>`, aPage.slug, slug_stdlib, "JSRef"); + result += web.smartLink(url, null, `<code>${title}</code>`, aPage.slug, slug_stdlib, "JSRef"); + result += pageBadges; if (rtlLocales.indexOf(locale) != -1) { result += '</bdi>'; } - if (containsTag(aPage, 'Obsolete')) { - result += '</s>'; - } - result += '</li>'; } @@ -230,6 +215,7 @@ function buildSublist(pages, title, opened) { var resultTitle; +var resultConstructors; var resultProperties; var resultMethods; var resultOpen; @@ -243,10 +229,11 @@ output += `<li><strong>${link}</strong></li>`; for (object in result) { len++; - resultTitle = result[object].title || ''; - resultProperties = result[object].properties || ''; - resultMethods = result[object].methods || ''; - resultOpen = result[object].defaultOpened || ''; + resultTitle = result[object].title || ''; + resultConstructors = result[object].constructors || ''; + resultProperties = result[object].properties || ''; + resultMethods = result[object].methods || ''; + resultOpen = result[object].defaultOpened || ''; if (len == 2) { output += '<li><strong>'+text['Inheritance']+'</strong></li>'; @@ -255,11 +242,14 @@ for (object in result) { const link = web.smartLink(`${slug_stdlib}/${resultTitle}`, null, `<code>${resultTitle}</code>`, null, slug_stdlib, "JSRef"); output += `<li><strong>${link}</strong></li>`; + if (resultConstructors) { + output += buildSublist(resultConstructors, text['Constructor'], resultOpen); + } if (resultProperties.length > 0) { - output += buildSublist(resultProperties, text['Properties'], resultOpen); + output += await buildSublist(resultProperties, text['Properties'], resultOpen); } if (resultMethods.length > 0) { - output += buildSublist(resultMethods, text['Methods'], resultOpen); + output += await buildSublist(resultMethods, text['Methods'], resultOpen); } if (len == 1 && group.length > 0) { diff --git a/kumascript/macros/JsSidebar.ejs b/kumascript/macros/JsSidebar.ejs index 1ff566bc107b..c8f1be3bbddf 100644 --- a/kumascript/macros/JsSidebar.ejs +++ b/kumascript/macros/JsSidebar.ejs @@ -12,7 +12,7 @@ function state(section) { var text = mdn.localStringMap({ 'en-US': { 'Overview': 'JavaScript technologies overview', - 'Tutorials': 'Tutorials:', + 'Tutorials': 'Tutorials', 'Guide': 'JavaScript Guide', 'Guide_Introduction': 'Introduction', 'Guide_Grammar': 'Grammar and types', @@ -49,7 +49,7 @@ var text = mdn.localStringMap({ 'Typed_arrays': 'JavaScript typed arrays', 'Memory_Management': 'Memory Management', 'Event_Loop': 'Concurrency model and Event Loop', - 'Reference': 'References:', + 'Reference': 'References', 'Global_Objects': 'Built-in objects', 'Operators': 'Expressions & operators', 'Statements': 'Statements & declarations', @@ -58,7 +58,7 @@ var text = mdn.localStringMap({ 'Errors': 'Errors', 'More': 'Misc', 'Lexical_grammar': 'Lexical grammar', - 'Enumerability':'Enumerability and ownership of properties', + 'Enumerability': 'Enumerability and ownership of properties', 'Data_types': 'Data types and data structures', 'Iteration_protocols': 'Iteration protocols', 'Template_strings': 'Template literals', @@ -67,7 +67,7 @@ var text = mdn.localStringMap({ }, 'ru': { 'Overview': 'Обзор технологий JavaScript', - 'Tutorials': 'Уроки:', + 'Tutorials': 'Уроки', 'Guide': 'Руководство по JavaScript', 'Guide_Introduction': 'Вступление', 'Guide_Grammar': 'Грамматика и типы', @@ -104,7 +104,7 @@ var text = mdn.localStringMap({ 'Typed_arrays': 'Типизированные массивы JavaScript', 'Memory_Management': 'Управление памятью', 'Event_Loop': 'Параллельная модель и цикл событий', - 'Reference': 'Справочники:', + 'Reference': 'Справочники', 'Global_Objects': 'Встроенные объекты', 'Operators': 'Выражения и операторы', 'Statements': 'Инструкции и объявления', @@ -113,7 +113,7 @@ var text = mdn.localStringMap({ 'Errors': 'Ошибки', 'More': 'Ещё', 'Lexical_grammar': 'Лексическая грамматика', - 'Enumerability':'Перечисляемость и принадлежность свойств', + 'Enumerability': 'Перечисляемость и принадлежность свойств', 'Data_types': 'Типы и структуры данных', 'Iteration_protocols': 'Протоколы перебора', 'Template_strings': 'Шаблонные строки', @@ -122,7 +122,7 @@ var text = mdn.localStringMap({ }, 'fr': { 'Overview': 'Aperçu des technologies JavaScript', - 'Tutorials': 'Tutoriels\xa0:', + 'Tutorials': 'Tutoriels', 'Guide': 'Guide JavaScript', 'Guide_Introduction': 'Introduction', 'Guide_Grammar': 'Types et grammaire', @@ -159,7 +159,7 @@ var text = mdn.localStringMap({ 'Typed_arrays': 'Tableaux typés en JavaScript', 'Memory_Management': 'Gestion de la mémoire', 'Event_Loop': 'Concurrence et boucle des évènements', - 'Reference': 'Références\xa0:', + 'Reference': 'Références', 'Global_Objects': 'Objets natifs', 'Operators': 'Expressions et opérateurs', 'Statements': 'Instructions et déclarations', @@ -177,7 +177,7 @@ var text = mdn.localStringMap({ }, 'zh-CN': { 'Overview': 'JavaScript 知识概要', - 'Tutorials': '教程:', + 'Tutorials': '教程', 'Guide': 'JavaScript 指南', 'Guide_Introduction': '介绍', 'Guide_Grammar': '语法和数据类型', @@ -214,7 +214,7 @@ var text = mdn.localStringMap({ 'Typed_arrays': 'JavaScript 类型化数组', 'Memory_Management': '内存管理', 'Event_Loop': '并发模型与事件循环', - 'Reference': '参考:', + 'Reference': '参考', 'Global_Objects': '内置对象', 'Operators': '表达式和运算符', 'Statements': '语句和声明', @@ -223,7 +223,7 @@ var text = mdn.localStringMap({ 'Errors': '错误', 'More': '更多', 'Lexical_grammar': '词法文法', - 'Enumerability':'属性的可枚举性和所有权', + 'Enumerability': '属性的可枚举性和所有权', 'Data_types': '数据类型和数据解构', 'Iteration_protocols': '迭代协议', 'Template_strings': '模板字符串', @@ -232,7 +232,7 @@ var text = mdn.localStringMap({ }, 'ja': { 'Overview': 'JavaScript 技術概説', - 'Tutorials': 'チュートリアル:', + 'Tutorials': 'チュートリアル', 'Guide': 'JavaScript ガイド', 'Guide_Introduction': '入門編', 'Guide_Grammar': '文法とデータ型', @@ -285,9 +285,64 @@ var text = mdn.localStringMap({ 'Trailing_commas': '末尾のカンマ', 'Deprecated_features': '廃止予定の機能', }, + 'ko': { + 'Overview': 'JavaScript 소개', + 'Tutorials': '자습서:', + 'Guide': 'JavaScript 안내서', + 'Guide_Introduction': '안내서 소개', + 'Guide_Grammar': '문법과 자료형', + 'Guide_Control_flow': '제어 흐름과 오류 처리', + 'Guide_Loops': '루프와 반복', + 'Guide_Functions': '함수', + 'Guide_Expressions': '표현식과 연산자', + 'Guide_Numbers': '숫자와 날짜', + 'Guide_Text': '텍스트 서식', + 'Guide_RegExp': '정규 표현식', + 'Guide_Indexed_collections': 'index 기반의 컬렉션', + 'Guide_keyed_collections': 'key 기반의 컬렉션', + 'Guide_Objects': '객체로 작업하기', + 'Guide_Classes': 'class 사용하기', + 'Guide_promises' : 'promise 사용하기', + 'Guide_Iterators_Generators': '반복기와 생성기', + 'Guide_Meta': '메타 프로그래밍', + 'Guide_Modules': 'JavaScript 모듈', + 'Complete_beginners': '입문서', + 'Basics': 'JavaScript 기본', + 'First_steps': 'JavaScript 첫걸음', + 'Building_blocks': 'JavaScript 구성요소', + 'Intermediate': '중급서', + 'Introducing_objects': 'JavaScript 객체 소개', + 'Client-side_APIs': '클라이언트 사이드 웹 API', + 'Frameworks': '클라이언트 사이드 JavaScript 프레임워크', + 'Language_overview': 'JavaScript 재입문하기 (JS 자습서)', + 'Data_structures': 'JavaScript의 타입과 자료구조', + 'Equality': '동치 비교 및 동일성', + 'Closures': '클로저', + 'Advanced': '고급서', + 'Inheritance': '상속과 프로토타입', + 'Strict_mode': '엄격한 모드', + 'Typed_arrays': 'JavaScript 형식화 배열', + 'Memory_Management': 'JavaScript 메모리 관리', + 'Event_Loop': '이벤트 루프', + 'Reference': '참고서:', + 'Global_Objects': '표준 내장 객체', + 'Operators': '표현식 및 연산자', + 'Statements': '문과 선언문', + 'Functions': '함수', + 'Classes': 'Classes', + 'Errors': '오류', + 'More': '기타', + 'Lexical_grammar': 'Lexical 문법', + 'Enumerability':'열거성과 속성의 소유권', + 'Data_types': '데이터 타입과 자료구조', + 'Iteration_protocols': 'Iteration 프로토콜', + 'Template_strings': '템플릿 리터럴', + 'Trailing_commas': 'Trailing commas', + 'Deprecated_features': '제외 예정 기능과 제외된 기능', + }, 'pt-BR': { 'Overview': 'Visão geral das Tecnologias JavaScript', - 'Tutorials': 'Tutoriais:', + 'Tutorials': 'Tutoriais', 'Guide': 'Guia de JavaScript', 'Guide_Introduction': 'Introdução', 'Guide_Grammar': 'Gramática e tipos', @@ -324,7 +379,7 @@ var text = mdn.localStringMap({ 'Typed_arrays': 'Arranjos tipados em JavaScript', 'Memory_Management': 'Gerenciamento de memória', 'Event_Loop': 'Modelo de concorrência e Loop de Eventos', - 'Reference': 'Referências:', + 'Reference': 'Referências', 'Global_Objects': 'Objetos pré-definidos', 'Operators': 'Expressões e operadores', 'Statements': 'Afirmações e declarações', @@ -333,7 +388,7 @@ var text = mdn.localStringMap({ 'Errors': 'Erros', 'More': 'Mais conteúdo', 'Lexical_grammar': 'Gramática léxica', - 'Enumerability':'Enumerabilidade e domínio de propriedades', + 'Enumerability': 'Enumerabilidade e domínio de propriedades', 'Data_types': 'Tipos de dados e estruturas de dados', 'Iteration_protocols': 'Protocolos de iteração', 'Template_strings': 'Template literals', diff --git a/kumascript/macros/LearnSidebar.ejs b/kumascript/macros/LearnSidebar.ejs index d1dd58748d78..8e34c68c2ed8 100644 --- a/kumascript/macros/LearnSidebar.ejs +++ b/kumascript/macros/LearnSidebar.ejs @@ -59,8 +59,9 @@ var text = mdn.localStringMap({ 'Assessment_Styling_a_biography_page': 'Assessment: Styling a biography page', 'CSS_building_blocks': 'CSS building blocks', 'CSS_building_blocks_overview': 'CSS building blocks overview', - 'Cascade_and_inheritance': 'Cascade and inheritance', 'CSS_selectors': 'CSS selectors', + 'Cascade_and_inheritance': 'Cascade and inheritance', + 'Cascade_layers': 'Cascade layers', 'The_box_model': 'The box model', 'Backgrounds_and_borders': 'Backgrounds and borders', 'Handling_different_text_directions': 'Handling different text directions', @@ -1331,29 +1332,274 @@ var text = mdn.localStringMap({ 'Design_and_accessibility': '設計與親合度', }, 'fr': { - 'Complete_beginners_start_here': 'Bienvenue aux débutants !', - 'Getting_started_with_the_web': 'Commencer avec le Web', - 'Getting_started_with_the_web_overview': 'Vue d\'ensemble de Commencer avec le Web', - 'Installing_basic_software': 'Installation des outils de base', - 'What_will_your_website_look_like': 'Quel sera l\'aspect de votre site web ?', + 'Complete_beginners_start_here': 'Vous débutez\xa0? Commencez ici\xa0!', + 'Getting_started_with_the_web': 'Démarrer avec le Web', + 'Getting_started_with_the_web_overview': 'Vue d\'ensemble pour démarrer', + 'Installing_basic_software': 'Installation des logiciels de base', + 'What_will_your_website_look_like': 'À quoi ressemblera votre site web\xa0?', 'Dealing_with_files': 'Gérer les fichiers', - 'HTML_basics': 'Les bases de HTML', - 'CSS_basics': 'Les bases de CSS', - 'JavaScript_basics': 'Les bases de JavaScript', + 'HTML_basics': 'Bases de HTML', + 'CSS_basics': 'Bases de CSS', + 'JavaScript_basics': 'Bases de JavaScript', 'Publishing_your_website': 'Publier votre site web', 'How_the_web_works': 'Le fonctionnement du Web', - 'HTML_Structuring_the_web': 'HTML — Structuring the web', - 'Introduction_to_HTML': 'Introduction au HTML', - 'Introduction_to_HTML_overview': 'Vue d\'ensemble de Introduction au HTML', - 'Getting_started_with_HTML': 'Commencer avec le HTML', - 'Whats_in_the_head_metadata_in_HTML': 'Qu\'y-a-t-il dans l\'en-tête ? Métadonnées en HTML', + 'HTML_Structuring_the_web': 'HTML — Structurer le Web', + 'Introduction_to_HTML': 'Introduction à HTML', + 'Introduction_to_HTML_overview': 'Vue d\'ensemble de l\'introduction à HTML', + 'Getting_started_with_HTML': 'Démarrer avec HTML', + 'Whats_in_the_head_metadata_in_HTML': 'L\'en-tête et les métadonnées HTML', 'HTML_text_fundamentals': 'Fondamentaux du texte en HTML', - 'Creating_hyperlinks': 'Création d\'hyperliens', + 'Creating_hyperlinks': 'Créer des hyperliens', 'Advanced_text_formatting': 'Formatage avancé du texte', - 'Document_and_website_structure': 'Structure de site web et de document', - 'Debugging_HTML': 'Déboguer en HTML', - 'Assessment_Marking_up_a_letter': 'Baliser une lettre', - 'Assessment_Structuring_a_page_of_content': 'Structurer une page de contenu' + 'Document_and_website_structure': 'Structure d\'un document et d\'un site web', + 'Debugging_HTML': 'Déboguer du HTML', + 'Assessment_Marking_up_a_letter': 'Évaluation\xa0: baliser une lettre', + 'Assessment_Structuring_a_page_of_content': 'Évaluation\xa0: structurer une page de contenu', + 'Multimedia_and_embedding': 'Multimédia et contenu embarqué', + 'Multimedia_and_embedding_overview': 'Vue d\'ensemble du multimédia et du contenu embarqué', + 'Images_in_HTML': 'Images en HTML', + 'Video_and_audio_content': 'Contenu audio et vidéo', + 'From_object_to_iframe_other_embedding_technologies': 'Des objets aux iframes, les autres moyens d\'embarquer du contenu', + 'Adding_vector_graphics_to_the_web': 'Ajouter des graphismes vectoriels', + 'Responsive_images': 'Images responsives', + 'Assessment_Mozilla_splash_page': 'Évaluation\xa0: page d\'accueil Mozilla', + 'HTML_tables' : 'Tableaux HTML', + 'HTML_tables_overview' : 'Vue d\'ensemble des tableaux HTML', + 'HTML_table_basics' : 'Bases des tableaux HTML', + 'HTML_table_advanced_features_and_accessibility' : 'Fonctionnalités avancées et accessibilité des tableaux HTML', + 'Assessment_Structuring_planet_data' : 'Évaluation\xa0: structurer des données sur les planètes', + 'CSS_Styling_the_web': 'CSS — Mettre en forme le Web', + 'CSS_first_steps': 'Premiers pas en CSS', + 'CSS_first_steps_overview': 'Vue d\'ensemble des premiers pas en CSS', + 'What_is_CSS': 'Qu\'est-ce que CSS\xa0?', + 'Getting_started_with_CSS': 'Démarrer avec CSS', + 'How_CSS_is_structured': 'Structure de CSS', + 'How_CSS_works': 'Fonctionnement de CSS', + 'Assessment_Styling_a_biography_page': 'Évaluation\xa0: mettre en forme une page de biographie', + 'CSS_building_blocks': 'Blocs de construction CSS', + 'CSS_building_blocks_overview': 'Vue d\'ensemble des blocs de construction CSS', + 'Cascade_and_inheritance': 'Cascade et héritage', + 'CSS_selectors': 'Sélecteurs CSS', + 'The_box_model': 'Le modèle de boîte', + 'Backgrounds_and_borders': 'Arrière-plans et bordures', + 'Handling_different_text_directions': 'Gérer les différentes directions du texte', + 'Overflowing_content': 'Gérer le dépassement du contenu', + 'CSS_values_and_units': 'Valeurs et unités CSS', + 'Sizing_items_in_CSS': 'Dimensionner les éléments en CSS', + 'Images_media_and_form_elements': 'Images, média, et formulaires', + 'Styling_tables': 'Mettre en forme les tableaux', + 'Debugging_CSS': 'Déboguer CSS', + 'Organizing_your_CSS': 'Organiser votre code CSS', + 'Assessment_Fundamental_CSS_comprehension': 'Évaluation\xa0: compréhension des fondamentaux CSS', + 'Assessment_Creating_fancy_letterheaded_paper': 'Évaluation\xa0: créer un papier à lettre fantaisie', + 'Assessment_A_cool_looking_box': 'Évaluation\xa0: une jolie boîte', + 'Styling_text': 'Mise en forme du texte', + 'Styling_text_overview': 'Vue d\'ensemble de la mise en forme du texte', + 'Fundamental_text_and_font_styling': 'Fondamentaux pour la mise en forme du texte et des polices', + 'Styling_lists': 'Mise en forme des listes', + 'Styling_links': 'Mise en forme des liens', + 'Web_fonts': 'Polices web', + 'Assessment_Typesetting_a_community_school_homepage': 'Évaluation\xa0: composer une page d\'accueil pour une école', + 'CSS_layout': 'Disposition en CSS', + 'CSS_layout_overview': 'Vue d\'ensemble de la disposition en CSS', + 'Introduction_to_CSS_layout' : 'Introduction à la disposition en CSS', + 'Normal_Flow' : 'Flux normal', + 'Flexbox': 'Flexbox', + 'Grids' : 'Grilles', + 'Floats': 'Flottements', + 'Positioning': 'Positionnement', + 'Multiple-column_layout': 'Disposition en colonnes', + 'Responsive_design': 'Design adaptatif', + 'Beginners_guide_to_media_queries': 'Guide pour commencer avec les requêtes média', + 'Legacy_layout_methods': 'Méthodes de disposition historiques', + 'Supporting_older_browsers': 'Prendre en charge les anciens navigateurs', + 'Assessment_Fundamental_Layout_Comprehension' : 'Évaluation\xa0: compréhension des fondamentaux de la disposition', + 'JavaScript_dynamic_client-side_scripting': 'JavaScript — Scripts et dynamisme côté client', + 'JavaScript_first_steps': 'Premiers pas en JavaScript', + 'JavaScript_first_steps_overview': 'Vue d\'ensemble des premiers pas en JavaScript', + 'What_is_JavaScript': 'Qu\'est-ce que JavaScript\xa0?', + 'A_first_splash_into_JavaScript': 'Premier saut dans JavaScript', + 'What_went_wrong': 'Quel est le problème\xa0? Diagnostiquer avec JavaScript', + 'Storing_the_information_you_need': 'Enregistrer les informations nécessaires — Les variables', + 'Basic_math_in_JavaScript': 'Mathématiques élémentaires en JavaScript — Nombres et opérateurs', + 'Handling_text': 'Gérer le texte — Les chaînes de caractères en JavaScript', + 'Useful_string_methods': 'Méthodes utiles pour manipuler les chaînes', + 'Arrays': 'Tableaux', + 'Assessment_silly_story_generator': 'Évaluation\xa0: générateur d\'histoires', + 'JavaScript_building_blocks': 'Blocs de construction JavaScript', + 'JavaScript_building_blocks_overview': 'Vue d\'ensemble des blocs de construction JavaScript', + 'Making_decisions_in_your_code': 'Prendre des décisions dans le code — Les instructions conditionnelles', + 'Looping_code': 'Boucles', + 'Functions': 'Fonctions — Des blocs de code réutilisables', + 'Build_your_own_function': 'Construire votre propre fonction', + 'Function_return_values': 'Valeurs de retour des fonctions', + 'Introduction_to_events': 'Introduction aux évènements', + 'Assessment_image_gallery': 'Évaluation\xa0: galerie d\'images', + 'Introducing_JavaScript_objects' : 'Introduction aux objets JavaScript', + 'Introducing_JavaScript_objects_overview' : 'Vue d\'ensemble pour l\'introduction aux objets JavaScript', + 'Object_basics' : 'Notions de base sur les objets', + 'Object_prototypes' : 'Prototypes d\'objet', + 'Object-oriented_programming' : 'Concepts de programmation orientée objet', + 'Classes_in_JavaScript' : 'Les classes en JavaScript', + 'Working_with_JSON_data' : 'Manipuler les données JSON', + 'Object_building_practice' : 'Construire des objets en pratique', + 'Assessment_Adding_features_to_our_bouncing_balls_demo' : 'Évaluation\xa0: ajouter des fonctionnalités à la démo des balles rebondissantes', + 'Asynchronous_JavaScript': 'JavaScript asynchrone', + 'Asynchronous_JavaScript_overview':'Vue d\'ensemble de JavaScript asynchrone', + 'Introducing_asynchronous_JavaScript': 'Introduction à JavaScript asynchrone', + 'How_to_use_promises': 'Comment utiliser les promesses', + 'Implementing_a_promise-based_API': 'Implémenter une API utilisant les promesses', + 'Introducing_workers': 'Introduction aux workers', + 'Assessment_sequencing_animations': 'Évaluation\xa0: séquencer des animations', + 'Client-side_web_APIs': 'Les API web côté client', + 'Client-side_web_APIs_Introduction': 'Introduction aux API web', + 'Client-side_web_APIs_Manipulating_documents': 'Manipuler les documents', + 'Client-side_web_APIs_Fetching_data': 'Récupérer des données du serveur', + 'Client-side_web_APIs_Third_party_APIs': 'Les API tierces', + 'Client-side_web_APIs_Drawing_graphics': 'Dessiner des graphismes', + 'Client-side_web_APIs_Video_and_audio_APIs': 'Les API pour l\'audio et la vidéo', + 'Client-side_web_APIs_client-side_storage': 'Stockage côté client', + 'Web_forms' : 'Formulaires web — Travailler avec les données des utilisateur\u00b7rice\u00b7s', + 'Web_forms_core' : 'Parcours sur les fondamentaux des formulaires web', + 'Web_forms_overview' : 'Vue d\'ensemble des formulaires web', + 'Your_first_form' : 'Votre premier formulaire', + 'How_to_structure_a_web_form' : 'Comment structurer un formulaire web', + 'Basic_native_form_controls' : 'Contrôles de base des formulaires', + 'The_HTML5_input_types': 'Types de champs de saisie', + 'Other_form_controls': 'Autres contrôles de formulaire', + 'Styling_web_forms' : 'Mettre en forme les formulaires web', + 'Advanced_form_styling' : 'Mise en forme avancée des formulaires', + 'UI_pseudo-classes': 'Pseudo-classes relatives à l\'interface utilisateur', + 'Client-side_form_validation' : 'Validation du formulaire côté client', + 'Sending_form_data' : 'Envoyer les données du formulaire', + 'Web_forms_advanced': 'Fonctionnalités avancées des formulaires', + 'How_to_build_custom_form_controls' : 'Comment construire des contrôles de formulaire sur mesure', + 'Sending_forms_through_JavaScript' : 'Envoyer des formulaires avec JavaScript', + 'CSS_property_compatibility_table_for_form_controls' : 'Tableau de compatibilité des propriétés CSS pour les contrôles de formulaire', + 'Accessibility_—_Make_the_web_usable_by_everyone' : 'Accessibilité — Rendre le Web utilisable par toutes et tous', + 'Accessibility_guides' : 'Guides sur l\'accessibilité', + 'Accessibility_assessment' : 'Évaluation de l\'accessibilité', + 'Accessibility_overview' : 'Vue d\'ensemble de l\'accessibilité', + 'What_is_accessibility' : 'Qu\'est-ce que l\'accessibilité\xa0?', + 'HTML_a_good_basis_for_accessibility' : 'HTML\xa0: de bonnes fondations pour l\'accessibilité', + 'CSS_and_JavaScript_accessibility_best_practices' : 'Bonnes pratiques pour l\'accessibilité avec CSS et JavaScript', + 'WAI-ARIA_basics' : 'Fondamentaux pour WAI-ARIA', + 'Accessible_multimedia' : 'Multimédias accessibles', + 'Mobile_accessibility' : 'Accessibilité mobile', + 'Assessment_Accessibility_troubleshooting' : 'Évaluation\xa0: diagnostic d\'accessibilité', + 'MathML_Writing_mathematics' : 'MathML — Écrire des formules mathématiques sur le Web', + 'MathML_first_steps': 'Premiers pas en MathML', + 'MathML_first_steps_overview': 'Vue d\'ensemble des premiers pas en MathML', + 'Getting_started_with_MathML': 'Démarrer avec MathML', + 'Assessment_Three_famous_mathematical_formulas': 'Évaluation\xa0: trois formules mathématiques célèbres', + 'Tools_and_testing' : 'Outils et tests', + 'Cross_browser_testing' : 'Tests entre les différents navigateurs', + 'Cross_browser_testing_overview' : 'Vue d\'ensemble pour les tests entre navigateurs', + 'Introduction_to_cross_browser_testing' : 'Introduction aux tests entre navigateurs', + 'Strategies_for_carrying_out_testing' : 'Stratégies pour mener des tests', + 'Handling_common_HTML_and_CSS_problems' : 'Traiter les problèmes fréquemment rencontrés en HTML et CSS', + 'Handling_common_JavaScript_problems' : 'Traiter les problèmes fréquemment rencontrés en JavaScript', + 'Handling_common_accessibility_problems' : 'Traiter les problèmes d\'accessibilité fréquemment rencontrés', + 'Implementing_feature_detection' : 'Implémenter une détection de fonctionnalité', + 'Introduction_to_automated_testing' : 'Introduction aux tests automatisés', + 'Setting_up_your_own_test_automation_environment' : 'Mise en place de votre environnement de test automatisé', + 'Git_and_GitHub' : 'Git et GitHub', + 'Git_and_GitHub_overview' : 'Vue d\'ensemble de Git et GitHub', + 'Client-side_web_development_tools' : 'Outils pour le développement web côté client', + 'Client-side_web_development_tools_index' : 'Index des outils de développement web côté client', + 'Client-side_tooling_overview' : 'Vue d\'ensemble de l\'outillage côté client', + 'Command_line_crash_course' : 'Cours accéléré sur la ligne de commande', + 'Package_management_basics' : 'Notions de base pour la gestion des paquets', + 'Introducing_a_complete_toolchain' : 'Introduction à un ensemble d\'outils complet', + 'Deploying_our_app' : 'Déployer notre application', + 'Introduction_to_client-side_frameworks': 'Introduction aux frameworks côté client', + 'Client-side_frameworks_overview': 'Vue d\'ensemble des frameworks côté client', + 'Framework_main_features': 'Fonctionnalités principales d\'un framework', + 'React': 'React', + 'Getting_started_with_React': 'Démarrer avec React', + 'Beginning_our_React_todo_list': 'Commencer notre liste de tâches en React', + 'Componentizing_our_React_app': 'Organiser notre application React en composants', + 'React_interactivity:_Events_and_state': 'Interactivité avec React\xa0: évènements et état', + 'React_interactivity:_Editing_filtering_conditional_rendering': 'Interactivité avec React\xa0: édition, filtrage, rendu conditionnel', + 'Accessibility_in_React': 'L\'accessibilité avec React', + 'React_resources': 'Ressources React', + 'Ember': 'Ember', + 'Getting_started_with_Ember': 'Démarrer avec Ember', + 'Ember_app_structure_and_componentization': 'Structure et organisation des composants de notre application Ember', + 'Ember_interactivity:_Events_classes_and_state': 'Interactivité avec Ember\xa0: évènements, classes et état', + 'Ember_Interactivity:_Footer_functionality_conditional_rendering': 'Interactivité avec Ember\xa0: fonctionnalité pour le pied de page, rendu conditionnel', + 'Routing_in_Ember': 'Routage avec Ember', + 'Ember_resources_and_troubleshooting': 'Ressources Ember et diagnostic de problèmes', + 'Vue': 'Vue', + 'Getting_started_with_Vue': 'Démarrer avec Vue', + 'Creating_our_first_Vue_component': 'Créer notre premier composant Vue', + 'Rendering_a_list_of_Vue_components': 'Rendre une liste de composants Vue', + 'Adding_a_new_todo_form:_Vue_events_methods_and_models': 'Ajouter un nouveau formulaire de tâches\xa0: évènements, méthodes et modèles Vue', + 'Styling_Vue_components_with_CSS': 'Mettre en forme les composants Vue avec CSS', + 'Using_Vue_computed_properties': 'Utiliser les propriétés calculées Vue', + 'Vue_conditional_rendering:_editing_existing_todos': 'Rendu conditionnel avec Vue\xa0: éditer les tâches existantes', + 'Focus_management_with_Vue_refs': 'Gestion du focus avec les références Vue', + 'Vue_resources': 'Ressources Vue', + 'Svelte': 'Svelte', + 'Getting_started_with_Svelte': 'Démarrer avec Svelte', + 'Starting_our_Svelte_Todo_list_app': 'Initialiser notre application de liste de tâches Svelte', + 'Dynamic_behavior_in_Svelte:_working_with_variables_and_props': 'Comportement dynamique avec Svelte\xa0: manipuler les variables et les propriétés', + 'Componentizing_our_Svelte_app': 'Organiser notre application Svelte en composants', + 'Advanced_Svelte:_Reactivity_lifecycle_accessibility': 'Notions avancées de Svelte\xa0: réactivité, cycle de vie, accessibilité', + 'Working_with_Svelte_stores': 'Utiliser les magasins de données Svelte', + 'TypeScript_support_in_Svelte': 'Prise en charge de TypeScript avec Svelte', + 'Deployment_and_next_steps': 'Déploiement et prochaines étapes', + 'Angular': 'Angular', + 'Getting_started_with_Angular': 'Démarrer avec Angular', + 'Beginning_our_Angular_todo_list_app': 'Initialiser notre application de liste de tâches Angular', + 'Styling_our_Angular_app': 'Mettre en forme notre application Angular', + 'Creating_an_item_component': 'Créer un composant pour un élément de la liste', + 'Filtering_our_to-do_items': 'Filtrer nos tâches', + 'Building_Angular_applications_and_further_resources': 'Construire des applications Angular et d\'autres ressources', + 'Server-side_website_programming' : 'Programmation web côté serveur', + 'First_steps' : 'Premiers pas', + 'First_steps_overview' : 'Vue d\'ensemble des premiers pas', + 'Introduction_to_the_server-side' : 'Introduction aux notions côté serveur', + 'Client-Server_overview' : 'Vue d\'ensemble client/serveur', + 'Server-side_web_frameworks' : 'Frameworks web côté serveur', + 'Website_security' : 'Sécurité des sites web', + 'Django_web_framework_(Python)' : 'Django (Python)', + 'Django_web_framework_(Python)_overview' : 'Vue d\'ensemble de Django (Python)', + 'Django_introduction' : 'Introduction', + 'Setting_up_a_development_environment' : 'Mettre en place un environnement de développement', + 'Tutorial_The_Local_Library_website' : 'Tutoriel\xa0: site web pour la bibliothèque locale', + 'Tutorial_Part_2_Creating_a_skeleton_website' : '2e partie du tutoriel\xa0: créer un squelette de site', + 'Tutorial_Part_3_Using_models' : '3e partie du tutoriel\xa0: utiliser les modèles', + 'Tutorial_Part_4_Django_admin_site' : '4e partie du tutoriel\xa0: administration d\'un site Django', + 'Tutorial_Part_5_Creating_our_home_page' : '5e partie du tutoriel\xa0: créer notre page d\'accueil', + 'Tutorial_Part_6_Generic_list_and_detail_views' : '6e partie du tutoriel\xa0: liste générique et vues détaillées', + 'Tutorial_Part_7_Sessions_framework' : '7e partie du tutoriel\xa0: sessions', + 'Tutorial_Part_8_User_authentication_and_permissions' : '8e partie du tutoriel\xa0: authentification et permissions', + 'Tutorial_Part_9_Working_with_forms' : '9e partie du tutoriel\xa0: travailler avec des formulaires', + 'Tutorial_Part_10_Testing_a_Django_web_application' : '10e partie du tutoriel\xa0: tester une application web Django', + 'Tutorial_Part_11_Deploying_Django_to_production' : '11e partie du tutoriel\xa0: déployer une application Django en production', + 'Web_application_security' : 'Sécurité des applications web', + 'Assessment_DIY_mini_blog' : 'Évaluation\xa0: mini blog à faire soi-même', + 'Express_Web_Framework_(Node.js_JavaScript)' : 'Express (Node.js/JavaScript)', + 'Express_Web_Framework_(Node.js_JavaScript)_overview' : 'Vue d\'ensemble d\'Express (Node.js/JavaScript)', + 'Express_Node_introduction' : 'Introduction à Express/Node.js', + 'Setting_up_a_Node_(Express)_development_environment' : 'Mettre en place un environnement de développement Express/Node.js', + 'Express_Tutorial_The_Local_Library_website' : 'Tutoriel Express\xa0: le site web de la bibliothèque locale', + 'Express_Tutorial_Part_2_Creating_a_skeleton_website' : '2e partie du tutoriel\xa0: créer un squelette de site', + 'Express_Tutorial_Part_3_Using_a_database_(with_Mongoose)' : '3e partie du tutoriel\xa0: utiliser une base de données (avec Mongoose)', + 'Express_Tutorial_Part_4_Routes_and_controllers' : '4e partie du tutoriel\xa0: routes et contrôleurs', + 'Express_Tutorial_Part_5_Displaying_library_data' : '5e partie du tutoriel\xa0: afficher les données de la bibliothèque', + 'Express_Tutorial_Part_6_Working_with_forms' : '6e partie du tutoriel\xa0: manipuler des formulaires', + 'Express_Tutorial_Part_7_Deploying_to_production' : '7e partie du tutoriel\xa0: déployer en production', + 'Further_resources': 'Ressources complémentaires', + 'Common_questions': 'Questions fréquentes', + 'Common_questions_overview': 'Vue d\'ensemble des questions fréquentes', + 'HTML_questions': 'Questions relatives à HTML', + 'CSS_questions': 'Questions relatives à CSS', + 'JavaScript_questions': 'Questions relatives à JavaScript', + 'Web_mechanics': 'Mécaniques du Web', + 'Tools_and_setup': 'Outils et mise en place', + 'Design_and_accessibility': 'Conception et accessibilité', }, 'ja': { 'Complete_beginners_start_here': '完全な初心者はこちらから!', @@ -1618,7 +1864,277 @@ var text = mdn.localStringMap({ 'Web_mechanics': 'Web mechanics', 'Tools_and_setup': 'Tools and setup', 'Design_and_accessibility': 'Design and accessibility', - } + }, + 'ko': { + 'Complete_beginners_start_here': '입문자들은 여기서부터 시작하세요!', + 'Getting_started_with_the_web': 'Web과 함께 시작하기', + 'Getting_started_with_the_web_overview': 'Web과 함께 시작하기', + 'Installing_basic_software': '기본 소프트웨어 설치하기', + 'What_will_your_website_look_like': '웹사이트의 외관은 어떻게 할까요?', + 'Dealing_with_files': '파일 다루기', + 'HTML_basics': 'HTML 기초', + 'CSS_basics': 'CSS 기초', + 'JavaScript_basics': 'JavaScript 기초', + 'Publishing_your_website': '웹사이트 배포하기', + 'How_the_web_works': '웹의 동작 방식', + 'HTML_Structuring_the_web': 'HTML — 웹 구성', + 'Introduction_to_HTML': 'HTML 입문서', + 'Introduction_to_HTML_overview': 'HTML 소개', + 'Getting_started_with_HTML': 'HTML 시작하기', + 'Whats_in_the_head_metadata_in_HTML': 'head 태그에는 무엇이 있을까? HTML의 메타데이터', + 'HTML_text_fundamentals': 'HTML 텍스트', + 'Creating_hyperlinks': '하이퍼링크 만들기', + 'Advanced_text_formatting': '고급 텍스트 서식', + 'Document_and_website_structure': '문서와 웹사이트 구조', + 'Debugging_HTML': 'HTML 디버깅', + 'Assessment_Marking_up_a_letter': '과제: 문서 마크업 하기', + 'Assessment_Structuring_a_page_of_content': '과제: 페이지 내용 구조화하기', + 'Multimedia_and_embedding': '멀티미디어와 임베딩', + 'Multimedia_and_embedding_overview': '멀티미디어와 임베딩 소개', + 'Images_in_HTML': 'HTML의 이미지', + 'Video_and_audio_content': '비디오와 오디오 컨텐츠', + 'From_object_to_iframe_other_embedding_technologies': 'object에서 iframe - 다른 임베딩 기술', + 'Adding_vector_graphics_to_the_web': '벡터 그래픽 추가하기', + 'Responsive_images': '반응형 이미지', + 'Assessment_Mozilla_splash_page': '과제: Mozilla 페이지 만들기', + 'HTML_tables' : 'HTML 테이블', + 'HTML_tables_overview' : 'HTML 테이블 소개', + 'HTML_table_basics' : 'HTML 테이블 기초', + 'HTML_table_advanced_features_and_accessibility' : 'HTML 테이블 고급 기능과 접근성', + 'Assessment_Structuring_planet_data' : '과제: 행성 데이터 만들기', + 'CSS_Styling_the_web': 'CSS — 웹 꾸미기', + 'CSS_first_steps': 'CSS 첫 번째 단계', + 'CSS_first_steps_overview': 'CSS 첫 번째 단계', + 'What_is_CSS': 'CSS란 무엇인가?', + 'Getting_started_with_CSS': 'CSS 시작하기', + 'How_CSS_is_structured': 'CSS의 구조', + 'How_CSS_works': 'CSS 작동 방식', + 'Assessment_Styling_a_biography_page': '과제: 프로필 페이지 만들기', + 'CSS_building_blocks': 'CSS 구성요소', + 'CSS_building_blocks_overview': 'CSS 구성요소', + 'Cascade_and_inheritance': '계단식 및 상속', + 'CSS_selectors': 'CSS 선택자', + 'The_box_model': '박스 모델', + 'Backgrounds_and_borders': '배경 및 테두리', + 'Handling_different_text_directions': '텍스트 표시 방향 제어하기', + 'Overflowing_content': '콘텐츠 overflow', + 'CSS_values_and_units': 'CSS 값과 단위', + 'Sizing_items_in_CSS': 'CSS에서 항목 크기 조정', + 'Images_media_and_form_elements': '이미지, 미디어 및 양식 요소', + 'Styling_tables': '표 꾸미기', + 'Debugging_CSS': 'CSS 디버깅', + 'Organizing_your_CSS': 'CSS 구성', + 'Assessment_Fundamental_CSS_comprehension': '과제: 기본적인 CSS 이해', + 'Assessment_Creating_fancy_letterheaded_paper': '과제: 이쁜 레터 모양 종이 만들기', + 'Assessment_A_cool_looking_box': '과제: 멋진 박스 만들기 ', + 'Styling_text': '텍스트 꾸미기', + 'Styling_text_overview': '텍스트 꾸미기', + 'Fundamental_text_and_font_styling': '기본적인 텍스트 및 글꼴 꾸미기', + 'Styling_lists': '목록 꾸미기', + 'Styling_links': '링크 꾸미기', + 'Web_fonts': '웹 글꼴', + 'Assessment_Typesetting_a_community_school_homepage': '과제: 학교 홈페이지 만들기', + 'CSS_layout': 'CSS 레이아웃', + 'CSS_layout_overview': 'CSS 레이아웃', + 'Introduction_to_CSS_layout' : 'CSS 레이아웃 입문서', + 'Normal_Flow' : '일반 대열', + 'Flexbox': '플렉스박스', + 'Grids' : '그리드', + 'Floats': 'Floats', + 'Positioning': '위치잡기', + 'Multiple-column_layout': '다단 레이아웃', + 'Responsive_design': '반응형 디자인', + 'Beginners_guide_to_media_queries': '미디어 쿼리 초보자 안내서', + 'Legacy_layout_methods': '레거시 레이아웃 메서드', + 'Supporting_older_browsers': '이전 브라우저 지원', + 'Assessment_Fundamental_Layout_Comprehension' : '과제: 기본적인 레이아웃 사용하기', + 'JavaScript_dynamic_client-side_scripting': 'JavaScript — 동적 클라이언트 사이드 스크립트 언어', + 'JavaScript_first_steps': 'JavaScript 첫걸음', + 'JavaScript_first_steps_overview': 'JavaScript 첫걸음', + 'What_is_JavaScript': 'JavaScript가 뭔가요?', + 'A_first_splash_into_JavaScript': 'JavaScript에 발 담그기', + 'What_went_wrong': '뭐가 잘못됐을까요? JavaScript 문제 해결', + 'Storing_the_information_you_need': '필요한 정보를 저장하기-변수', + 'Basic_math_in_JavaScript': '자바스크립트의 기본적인 연산 - 숫자와 연산자', + 'Handling_text': '문자열 다루기 — 문자열', + 'Useful_string_methods': '문자열 제대로 다루기', + 'Arrays': '배열', + 'Assessment_silly_story_generator': '과제: 랜덤하게 꾸며진 이야기 생성하기', + 'JavaScript_building_blocks': 'JavaScript 구성요소', + 'JavaScript_building_blocks_overview': 'JavaScript 구성요소', + 'Making_decisions_in_your_code': '판단 내리기 — 조건문', + 'Looping_code': '반복문', + 'Functions': '함수 — 코드 재사용', + 'Build_your_own_function': '함수 만들기', + 'Function_return_values': '함수 반환 값', + 'Introduction_to_events': '이벤트 입문', + 'Assessment_image_gallery': '과제: 이미지 갤러리', + 'Introducing_JavaScript_objects' : 'JavaScript 객체', + 'Introducing_JavaScript_objects_overview' : 'JavaScript 객체 소개', + 'Object_basics' : 'JavaScript 객체 기초', + 'Object_prototypes' : '객체 프로토타입', + 'Object-oriented_programming' : '객체지향형 프로그래밍 개념', + 'Classes_in_JavaScript' : 'JavaScript 클래스', + 'Working_with_JSON_data' : 'JSON으로 작업하기', + 'Object_building_practice' : '객체 생성 연습하기', + 'Assessment_Adding_features_to_our_bouncing_balls_demo' : '과제: 움직이는 공 데모에 기능 추가하기', + 'Asynchronous_JavaScript': 'JavaScript의 비동기성', + 'Asynchronous_JavaScript_overview':'JavaScript의 비동기성', + 'Introducing_asynchronous_JavaScript': 'JavaScript의 비동기성 소개', + 'How_to_use_promises': 'Promise 사용하는 방법', + 'Implementing_a_promise-based_API': 'Promise를 반환하는 API 만들기', + 'Introducing_workers': 'workers 소개', + 'Assessment_sequencing_animations': '과제: 애니메이션 만들기', + 'Client-side_web_APIs': '클라이언트 사이드 웹 API', + 'Client-side_web_APIs_Introduction': '웹 API 소개', + 'Client-side_web_APIs_Manipulating_documents': 'Document 수정하기', + 'Client-side_web_APIs_Fetching_data': '서버에서 데이터 가져오기', + 'Client-side_web_APIs_Third_party_APIs': '외부 APIs', + 'Client-side_web_APIs_Drawing_graphics': '그래픽 그리기', + 'Client-side_web_APIs_Video_and_audio_APIs': '비디오와 오디오 API', + 'Client-side_web_APIs_client-side_storage': '클라이언트 사이드 저장소', + 'Web_forms' : '웹 Form — 사용자 데이터 사용하기', + 'Web_forms_core' : '웹 form 핵심', + 'Web_forms_overview' : '웹 form', + 'Your_first_form' : '첫 form 만들기', + 'How_to_structure_a_web_form' : '웹 form 구성하는 방법', + 'Basic_native_form_controls' : '기본적인 form 제어', + 'The_HTML5_input_types': 'HTML5 입력 타입', + 'Other_form_controls': '다른 form 제어', + 'Styling_web_forms' : '웹 form 꾸미기', + 'Advanced_form_styling' : '고급 form 꾸미기', + 'UI_pseudo-classes': 'UI 의사 클래스', + 'Client-side_form_validation' : 'form 인증', + 'Sending_form_data' : 'form에서 데이터 보내기', + 'Web_forms_advanced': '고급 form', + 'How_to_build_custom_form_controls' : '커스텀 form 제어', + 'Sending_forms_through_JavaScript' : 'JavaScript에서 form 보내기', + 'CSS_property_compatibility_table_for_form_controls' : 'form 제어를 위한 CSS 속성 호환성 테이블', + 'Accessibility_—_Make_the_web_usable_by_everyone' : '접근성 - 모두를 위한 웹 만들기', + 'Accessibility_guides' : '접근성 안내서', + 'Accessibility_assessment' : '과제: 접근성 평가', + 'Accessibility_overview' : '접근성 개요', + 'What_is_accessibility' : '접근성이란 무엇일까요?', + 'HTML_a_good_basis_for_accessibility' : 'HTML: 접근성을 위한 기초', + 'CSS_and_JavaScript_accessibility_best_practices' : 'CSS와 JavaScript 접근성 모범 사례', + 'WAI-ARIA_basics' : 'WAI-ARIA 기초', + 'Accessible_multimedia' : '멀티미디어 접근', + 'Mobile_accessibility' : '모바일 접근성', + 'Assessment_Accessibility_troubleshooting' : '과제: 접근성 문제해결', + 'MathML_Writing_mathematics' : 'MathML — MathML을 이용해 수학 쓰기', + 'MathML_first_steps': 'MathML 첫 걸음', + 'MathML_first_steps_overview': 'MathML 첫 걸음', + 'Getting_started_with_MathML': 'MathML 시작하기', + 'Assessment_Three_famous_mathematical_formulas': '과제: 유명한 세가지 수학 공식', + 'Tools_and_testing' : '도구과 테스트', + 'Cross_browser_testing' : '크로스 브라우저 테스팅', + 'Cross_browser_testing_overview' : '크로스 브라우저 테스팅 개요', + 'Introduction_to_cross_browser_testing' : '크로스 브라우저 테스팅 입문', + 'Strategies_for_carrying_out_testing' : '테스팅 전략', + 'Handling_common_HTML_and_CSS_problems' : 'HTML과 CSS에서 문제들 다루기', + 'Handling_common_JavaScript_problems' : 'JaavaScript에서 문제들 다루기', + 'Handling_common_accessibility_problems' : '접근성 문제들 다루기', + 'Implementing_feature_detection' : '기능 동작 검사 추가하기', + 'Introduction_to_automated_testing' : '테스팅 자동화 소개', + 'Setting_up_your_own_test_automation_environment' : '테스팅 자동화 환경 설정하기', + 'Git_and_GitHub' : 'Git과 GitHub', + 'Git_and_GitHub_overview' : 'Git과 GitHub', + 'Client-side_web_development_tools' : '클라이언트 사이드 웹 개발 도구', + 'Client-side_web_development_tools_index' : '클라이언트 사이드 웹 개발 도구 이해하기', + 'Client-side_tooling_overview' : '클라이언트 사이드 도구', + 'Command_line_crash_course' : 'Command line 특강', + 'Package_management_basics' : '패키지 관리 기초', + 'Introducing_a_complete_toolchain' : '툴체인 소개', + 'Deploying_our_app' : '앱 배포하기', + 'Introduction_to_client-side_frameworks': '클라이언트 사이드 프레임워크 소개', + 'Client-side_frameworks_overview': '클라이언트 사이드 프레임워크', + 'Framework_main_features': '프레임워크 메인 기능', + 'React': 'React', + 'Getting_started_with_React': 'React 시작하기', + 'Beginning_our_React_todo_list': 'React todo 리스트 만들기', + 'Componentizing_our_React_app': 'React 앱 컴포넌트화하기', + 'React_interactivity:_Events_and_state': 'React 상호작용: 이벤트와 상태', + 'React_interactivity:_Editing_filtering_conditional_rendering': 'React 상호작용: 편집, 필터링, 조건부 렌더링', + 'Accessibility_in_React': 'React 접근성', + 'React_resources': 'React 자료', + 'Ember': 'Ember', + 'Getting_started_with_Ember': 'Ember 시작하기', + 'Ember_app_structure_and_componentization': 'Ember 앱 구조와 컴포넌트화', + 'Ember_interactivity:_Events_classes_and_state': 'Ember 상호작용: 이벤트, 클래스, 상태', + 'Ember_Interactivity:_Footer_functionality_conditional_rendering': 'Ember 상호작용: 바닥글 기능, 조건부 렌더링', + 'Routing_in_Ember': 'Ember에서 라우팅 하기', + 'Ember_resources_and_troubleshooting': 'Ember 자료 및 문제해결', + 'Vue': 'Vue', + 'Getting_started_with_Vue': 'Vue 시작하기', + 'Creating_our_first_Vue_component': 'Vue에서 첫 컴포넌트 만들기', + 'Rendering_a_list_of_Vue_components': 'Vue에서 리스트 컴포넌트 렌더링하기', + 'Adding_a_new_todo_form:_Vue_events_methods_and_models': 'todo에 새로운 폼 추가: Vue 이벤트, 메서드, 그리고 모델', + 'Styling_Vue_components_with_CSS': 'CSS로 Vue 컴포넌트 꾸미기', + 'Using_Vue_computed_properties': 'Vue 내장 속성 사용하기', + 'Vue_conditional_rendering:_editing_existing_todos': 'Vue 조건부: todo 수정하기', + 'Focus_management_with_Vue_refs': 'Vue ref로 집중 관리', + 'Vue_resources': 'Vue 자료', + 'Svelte': 'Svelte', + 'Getting_started_with_Svelte': 'Svelte 시작하기', + 'Starting_our_Svelte_Todo_list_app': 'Svelte로 todo 앱 만들기', + 'Dynamic_behavior_in_Svelte:_working_with_variables_and_props': 'Svelte 동적 반응: 변수와 props 사용하기', + 'Componentizing_our_Svelte_app': 'Svelte 컴포넌트화하기', + 'Advanced_Svelte:_Reactivity_lifecycle_accessibility': 'Svelte 고급: 반응형, 라이프사이클, 접근성', + 'Working_with_Svelte_stores': 'Svelte stores 사용하기', + 'TypeScript_support_in_Svelte': 'Svelte에서 TypeScript 사용하기', + 'Deployment_and_next_steps': '배포와 다음 스텝', + 'Angular': 'Angular', + 'Getting_started_with_Angular': 'Angular 시작하기', + 'Beginning_our_Angular_todo_list_app': 'Angular로 todo 앱 만들기', + 'Styling_our_Angular_app': 'Angular 앱 꾸미기하기', + 'Creating_an_item_component': '아이템 컴포넌트 만들기', + 'Filtering_our_to-do_items': '아이템 필터링하기', + 'Building_Angular_applications_and_further_resources': 'Angular 앱 빌드하기 및 추가 자료', + 'Server-side_website_programming' : '서버 사이드 웹사이트 프로그래밍', + 'First_steps' : '첫 걸음', + 'First_steps_overview' : '서버 사이드 프로그램 첫 걸음', + 'Introduction_to_the_server-side' : '서버 사이드 첫 걸음', + 'Client-Server_overview' : '클라이언트 서버', + 'Server-side_web_frameworks' : '서버사이드 웹 프레임워크', + 'Website_security' : '웹사이트 보안', + 'Django_web_framework_(Python)' : 'Django 웹 프레임워크 (Python)', + 'Django_web_framework_(Python)_overview' : 'Django 웹 프레임워크 (Python)', + 'Django_introduction' : 'Django 소개', + 'Setting_up_a_development_environment' : '개발 환경 설정하기 ', + 'Tutorial_The_Local_Library_website' : 'Django 자습서 1: 지역 도서관 웹사이트', + 'Tutorial_Part_2_Creating_a_skeleton_website' : 'Django 자습서 2: 뼈대 사이트 만들기', + 'Tutorial_Part_3_Using_models' : 'Django 자습서 3: 모델 사용하기', + 'Tutorial_Part_4_Django_admin_site' : 'Django 자습서 4: Django 어드민 사이트 만들기 ', + 'Tutorial_Part_5_Creating_our_home_page' : 'Django 자습서 5: 홈페이지 만들기', + 'Tutorial_Part_6_Generic_list_and_detail_views' : 'Django 자습서 6: 제네릭 클래스 - 기반 뷰', + 'Tutorial_Part_7_Sessions_framework' : 'Django 자습서 7: 세션 프레임워크', + 'Tutorial_Part_8_User_authentication_and_permissions' : 'Django 자습서 8: 사용자 인증과 허가', + 'Tutorial_Part_9_Working_with_forms' : 'Django 자습서 9: 폼(form)으로 작업하기', + 'Tutorial_Part_10_Testing_a_Django_web_application' : 'Django 자습서 10: Django 웹 어플리케이션 테스트하기', + 'Tutorial_Part_11_Deploying_Django_to_production' : 'Django 자습서 11: Django 웹사이트 공개하기', + 'Web_application_security' : '웹사이트 보안', + 'Assessment_DIY_mini_blog' : '과제: 직접 만들어보는 미니 블로그', + 'Express_Web_Framework_(Node.js_JavaScript)' : 'Express 웹 프레임워크 (Node.js/JavaScript)', + 'Express_Web_Framework_(Node.js_JavaScript)_overview' : 'Express 웹 프레임워크 (Node.js/JavaScript)', + 'Express_Node_introduction' : 'Express/Node 소개', + 'Setting_up_a_Node_(Express)_development_environment' : 'Node 개발 환경을 설치하기', + 'Express_Tutorial_The_Local_Library_website' : 'Express 자습서 1: 지역 도서관 웹사이트', + 'Express_Tutorial_Part_2_Creating_a_skeleton_website' : 'Express 자습서 2: 뼈대 사이트 만들기', + 'Express_Tutorial_Part_3_Using_a_database_(with_Mongoose)' : 'Express 자습서 3: 데이터베이스 (Mongoose) 사용하기', + 'Express_Tutorial_Part_4_Routes_and_controllers' : 'Express 자습서 4: 라우팅과 컨트롤러', + 'Express_Tutorial_Part_5_Displaying_library_data' : 'Express 자습서 5: 도서관 데이터 보여주기', + 'Express_Tutorial_Part_6_Working_with_forms' : 'Express 자습서 6: 폼(form)으로 작업하기', + 'Express_Tutorial_Part_7_Deploying_to_production' : 'Express 자습서 7: 배포하기', + 'Further_resources': '추가 자료', + 'Common_questions': '자주 묻는 질문', + 'Common_questions_overview': '자주 묻는 질문', + 'HTML_questions': 'HTML 질문', + 'CSS_questions': 'CSS 질문', + 'JavaScript_questions': 'JavaScript 질문', + 'Web_mechanics': '웹의 동작 방식', + 'Tools_and_setup': '도구와 설정', + 'Design_and_accessibility': '디자인과 접근성', + }, }); %> diff --git a/kumascript/macros/ListGroups.ejs b/kumascript/macros/ListGroups.ejs index c28eb4dbf7df..ce9d0d57d4ca 100644 --- a/kumascript/macros/ListGroups.ejs +++ b/kumascript/macros/ListGroups.ejs @@ -42,45 +42,24 @@ for(let name of groupNames) { let groupObj = groupData[name]; let firstLetter = name[0]; let groupOutput = ''; - let badge = ""; if (groupObj.overview === undefined) { continue; } let overviewName = groupObj.overview; let groupUrl = APIHref + "/" + spacesToUnderscores(htmlEscape(overviewName)); - let page = await wiki.getPage(groupUrl); + const aPage = await wiki.getPage(groupUrl); - // Go through the tags and build badges if there are any to add + let pageBadges = (await page.badges(aPage)).join(" "); - if (page && page != undefined) { - let tags = page.tags; - - if (tags) { - if (containsTag(tags, "Non-standard") || containsTag(tags, "Non standard")) { - badge = " " + await template("NonStandardBadge", ["1"]); - } - - if (containsTag(tags, "Obsolete")) { - badge += " " + await template("ObsoleteBadge", [1]); - } else if (containsTag(tags, "Deprecated")) { - badge += " " + await template("DeprecatedBadge", [1]); - } - - if (containsTag(tags, "Experimental")) { - badge += " " + await template("ExperimentalBadge", [1]); - } - - if (badge.length) { - badge = "<span class='indexListBadges'>" + badge + "</span>"; - } - } + if (pageBadges.length) { + pageBadges = `<span class='indexListBadges'> ${pageBadges}</span>`; } // Finish constructing the HTML and then append it to the text for the corresponding // letter group. - groupOutput = "<li><a href='" + groupUrl + "'>" + name + "</a>" + badge + "</li>"; + groupOutput = `<li><a href='${groupUrl}'>${name}</a>${pageBadges}</li>`; if (!outputByLetter[firstLetter]) { outputByLetter[firstLetter] = groupOutput; diff --git a/kumascript/macros/ListSubpagesForSidebar.ejs b/kumascript/macros/ListSubpagesForSidebar.ejs index cc3b90d3ef19..e10b60dd6a95 100644 --- a/kumascript/macros/ListSubpagesForSidebar.ejs +++ b/kumascript/macros/ListSubpagesForSidebar.ejs @@ -55,13 +55,6 @@ if (includeParent) { const containsTag = page.hasTag; const htmlEscape = mdn.htmlEscape; -const badges = { - ExperimentalBadge: await template("ExperimentalBadge"), - NonStandardBadge: await template("NonStandardBadge"), - DeprecatedBadge: await template("DeprecatedBadge"), - ObsoleteBadge: await template("ObsoleteBadge"), -} - // Trims the title, returning only the text // between the start and end delimiter characters. // Does nothing if both are null or empty. @@ -75,46 +68,35 @@ function trimTitle(title) { return title.substring(startIndex, endIndex); } -function createLink(item) { - const url = item.url.replace('en-US', locale); - let title = htmlEscape(item.title); +async function createLink(aPage) { + const url = aPage.url.replace('en-US', locale); + let title = htmlEscape(aPage.title); if (locale !== 'en-US') { - for (const translation of item.translations) { + for (const translation of aPage.translations) { if (translation.locale === locale) { title = htmlEscape(trimTitle(translation.title)); } } } - const pageBadges = []; - - if (containsTag(item, 'Experimental')) { - pageBadges.push(badges.ExperimentalBadge); - } - - if (containsTag(item, 'Non-standard') || containsTag(item, 'Non Standard')) { - pageBadges.push(badges.NonStandardBadge); - } - - if (containsTag(item, 'Deprecated')) { - pageBadges.push(badges.DeprecatedBadge); - } - - if (containsTag(item, 'Obsolete')) { - pageBadges.push(badges.ObsoleteBadge); - } - let linkContent = title; if (wrapInCode) { linkContent = `<code>${linkContent}</code>`; } + + const pageBadges = (await page.badges(aPage)).join(""); - const result = `<li>${pageBadges.join('')}<a href="${url}">${linkContent}</a></li>`; + const result = `<li><a href="${url}">${linkContent}</a>${pageBadges}</li>`; return result; } -const output = pages.length ? `<ol>${pages.map(createLink).join('')}</ol>` : ''; +let output = '' +if(pages.length) { + const linkArray = await Promise.all(pages.map(createLink)); + const links = linkArray.join(''); + output = `<ol>${links}</ol>`; +} %> <%- output %> diff --git a/kumascript/macros/MDNSidebar.ejs b/kumascript/macros/MDNSidebar.ejs index 2572c7bc94e5..5f07d35cd229 100644 --- a/kumascript/macros/MDNSidebar.ejs +++ b/kumascript/macros/MDNSidebar.ejs @@ -11,12 +11,13 @@ const text = mdn.localStringMap({ "Comm_overview": "Overview", "Contributing": "Contributing to MDN", "Open_source": "Open source etiquette", + "Communication": "Communication channels", "Discuss": "Discussions", "Learn": "Learn forum", - "Issues": "Issues", - "PRs": "Pull requests", + "Issues": "Issue guidelines", + "PRs": "Pull request guidelines", "Content": "Content repository guidelines", - "Users": "Users and teams", + "Users": "Roles and teams", "Writing_guide": "Writing guidelines", "Write_overview": "Overview", "What_write": "What we write", @@ -32,12 +33,13 @@ const text = mdn.localStringMap({ "Comm_overview": "Overview", "Contributing": "Contributing to MDN", "Open_source": "Open source etiquette", + "Communication": "Communication channels", "Discuss": "Discussions", "Learn": "Learn forum", - "Issues": "Issues", - "PRs": "Pull requests", + "Issues": "Issue guidelines", + "PRs": "Pull request guidelines", "Content": "Content repository guidelines", - "Users": "Users and teams", + "Users": "Roles and teams", "Writing_guide": "Writing guidelines", "Write_overview": "Overview", "What_write": "What we write", @@ -53,12 +55,13 @@ const text = mdn.localStringMap({ "Comm_overview": "Overview", "Contributing": "Contributing to MDN", "Open_source": "Open source etiquette", + "Communication": "Communication channels", "Discuss": "Discussions", "Learn": "Learn forum", - "Issues": "Issues", - "PRs": "Pull requests", + "Issues": "Issue guidelines", + "PRs": "Pull request guidelines", "Content": "Content repository guidelines", - "Users": "Users and teams", + "Users": "Roles and teams", "Writing_guide": "Writing guidelines", "Write_overview": "Overview", "What_write": "What we write", @@ -74,12 +77,13 @@ const text = mdn.localStringMap({ "Comm_overview": "Overview", "Contributing": "Contributing to MDN", "Open_source": "Open source etiquette", + "Communication": "Communication channels", "Discuss": "Discussions", "Learn": "Learn forum", - "Issues": "Issues", - "PRs": "Pull requests", + "Issues": "Issue guidelines", + "PRs": "Pull request guidelines", "Content": "Content repository guidelines", - "Users": "Users and teams", + "Users": "Roles and teams", "Writing_guide": "Writing guidelines", "Write_overview": "Overview", "What_write": "What we write", @@ -90,25 +94,26 @@ const text = mdn.localStringMap({ "Exper": "Experimental, deprecated and obsolete", }, "ko": { - "MDN_project": "The MDN Web Docs Project", - "Community_guide": "Community guidelines", - "Comm_overview": "Overview", - "Contributing": "Contributing to MDN", - "Open_source": "Open source etiquette", - "Discuss": "Discussions", + "MDN_project": "MDN 웹 문서 프로젝트", + "Community_guide": "커뮤니티 지침", + "Comm_overview": "커뮤니티 개요", + "Contributing": "MDN에 기역하기", + "Open_source": "오픈소스 에절", + "Communication": "Communication channels", + "Discuss": "논의", "Learn": "Learn forum", - "Issues": "Issues", + "Issues": "문제", "PRs": "Pull requests", - "Content": "Content repository guidelines", - "Users": "Users and teams", - "Writing_guide": "Writing guidelines", - "Write_overview": "Overview", - "What_write": "What we write", - "Style_guide": "Writing style guide", - "Howto": "How-to guides", - "Structures": "Page structures", - "Attrib": "Attribution and copyright", - "Exper": "Experimental, deprecated and obsolete", + "Content": "콘텐츠 레포지토리 지침", + "Users": "사용자와 팀", + "Writing_guide": "MDN Web Docs 지침", + "Write_overview": "MDN Web Docs에 대해", + "What_write": "MDN Web Docs 내용", + "Style_guide": "MDN Web Docs 작성 안내서", + "Howto": "How-to 안내서", + "Structures": "페이지 구조", + "Attrib": "귀속과 저작권", + "Exper": "Experimental, deprecated 그리고 obsolete", }, "pt-BR": { "MDN_project": "The MDN Web Docs Project", @@ -116,12 +121,13 @@ const text = mdn.localStringMap({ "Comm_overview": "Overview", "Contributing": "Contributing to MDN", "Open_source": "Open source etiquette", + "Communication": "Communication channels", "Discuss": "Discussions", "Learn": "Learn forum", - "Issues": "Issues", - "PRs": "Pull requests", + "Issues": "Issue guidelines", + "PRs": "Pull request guidelines", "Content": "Content repository guidelines", - "Users": "Users and teams", + "Users": "Roles and teams", "Writing_guide": "Writing guidelines", "Write_overview": "Overview", "What_write": "What we write", @@ -137,12 +143,13 @@ const text = mdn.localStringMap({ "Comm_overview": "Overview", "Contributing": "Contributing to MDN", "Open_source": "Open source etiquette", + "Communication": "Communication channels", "Discuss": "Discussions", "Learn": "Learn forum", - "Issues": "Issues", - "PRs": "Pull requests", + "Issues": "Issue guidelines", + "PRs": "Pull request guidelines", "Content": "Content repository guidelines", - "Users": "Users and teams", + "Users": "Roles and teams", "Writing_guide": "Writing guidelines", "Write_overview": "Overview", "What_write": "What we write", @@ -158,12 +165,13 @@ const text = mdn.localStringMap({ "Comm_overview": "Overview", "Contributing": "Contributing to MDN", "Open_source": "Open source etiquette", + "Communication": "Communication channels", "Discuss": "Discussions", "Learn": "Learn forum", - "Issues": "Issues", - "PRs": "Pull requests", + "Issues": "Issue guidelines", + "PRs": "Pull request guidelines", "Content": "Content repository guidelines", - "Users": "Users and teams", + "Users": "Roles and teams", "Writing_guide": "Writing guidelines", "Write_overview": "Overview", "What_write": "What we write", @@ -179,12 +187,13 @@ const text = mdn.localStringMap({ "Comm_overview": "Overview", "Contributing": "Contributing to MDN", "Open_source": "Open source etiquette", + "Communication": "Communication channels", "Discuss": "Discussions", "Learn": "Learn forum", - "Issues": "Issues", - "PRs": "Pull requests", + "Issues": "Issue guidelines", + "PRs": "Pull request guidelines", "Content": "Content repository guidelines", - "Users": "Users and teams", + "Users": "Roles and teams", "Writing_guide": "Writing guidelines", "Write_overview": "Overview", "What_write": "What we write", @@ -211,6 +220,7 @@ const text = mdn.localStringMap({ <li><a href="<%=baseURL%>Community"><%=text['Comm_overview']%></a></li> <li><a href="<%=baseURL%>Community/Contributing"><%=text['Contributing']%></a></li> <li><a href="<%=baseURL%>Community/Open_source_etiquette"><%=text['Open_source']%></a></li> + <li><a href="<%=baseURL%>Community/Communication_channels"><%=text['Communication']%></a></li> <li><a href="<%=baseURL%>Community/Discussions"><%=text['Discuss']%></a></li> <li><a href="<%=baseURL%>Community/Learn_forum"><%=text['Learn']%></a></li> <li><a href="<%=baseURL%>Community/Issues"><%=text['Issues']%></a></li> @@ -235,6 +245,5 @@ const text = mdn.localStringMap({ </ol> </details> </li> - </ol> </section> diff --git a/kumascript/macros/Non-standardGeneric.ejs b/kumascript/macros/Non-standardGeneric.ejs deleted file mode 100644 index 694f8df14cce..000000000000 --- a/kumascript/macros/Non-standardGeneric.ejs +++ /dev/null @@ -1,78 +0,0 @@ -<% -/* - * first parameter: inline/header -*/ - -var str_inline = mdn.localString({ - "en-US": "Non-standard", - "es": "No estándar", - "fr": "Non standard", - "ja": "非標準", - "ru": "Не стандартно", - "zh-CN": "非标准", - "zh-TW": "非標準" -}); - -var str_long = mdn.localString({ - "en-US": "This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.", - "es": "Esta característica no es parte de los estándares. No la uses en sitios Web en producción: no funcionará para todos los usuarios. Podrían haber también incompatibilidades considerables entre distintas implementaciones y el comportamiento podría cambiar en el futuro.", - "fr": "Cette fonctionnalité n'est ni standard, ni en voie de standardisation. Ne l'utilisez pas pour des sites accessibles sur le Web : elle ne fonctionnera pas pour tout utilisateur. Il peut également y avoir d'importantes incompatibilités entre les implémentations et son comportement peut être modifié dans le futur.", - "it": "Questa funzionalità non è standard e non è parte di un processo di standardizzazione. Non utilizzarla in siti accessibili dal Web: non funzionerà per tutti gli utenti. Inoltre si potrebbero verificare incompatibilità sostanziali tra le implementazioni, ed il comportamento potrebbe cambiare in futuro.", - "ja": "この機能は標準ではなく、標準化の予定もありません。公開されているウェブサイトには使用しないでください。ユーザーによっては使用できないことがあります。実装ごとに大きな差があることもあり、将来は振る舞いが変わるかもしれません。", - "ru": "Эта возможность не является стандартной и стандартизировать её пока никто не собирается. Не используйте её на сайтах, смотрящих во внешний мир: она будет работать не у всех пользователей. Также могут присутствовать большие несовместимости между реализациями и её поведение может в будущем измениться.", - "zh-CN": "该特性是非标准的,请尽量不要在生产环境中使用它!" -}); - -var str_fxos_long = mdn.localString({ - "en-US": "This feature is not on a current W3C standards track, but it is supported on the Firefox OS platform. Although implementations may change in the future and it is not supported widely across browsers, it is suitable for use in code dedicated to Firefox OS apps.", - "es": "Esta característica no está en ningún estándar actual del W3C, sin embargo está soportado en la plataforma Firefox OS. Aunque las implementaciones podrían cambiar en el futuro y no se soporta ampliamente por los navegadores, es apropiado usarse en código dedicado a aplicaciones de Firefox OS.", - "fr": "Cette fonctionnalité n'est pas en voie de standardisation au W3C, mais elle est supportée par la plateforme Firefox OS. Bien que son implémentation puisse changer dans le futur et qu'elle n'est pas largement supportée par les différents navigateurs, elle est utilisable pour du code dédié aux applications Firefox OS.", - "it": "Questa funzionalità non è al momento parte di un processo di standardizzazione del W3C, ma è supportata dalla piattaforma Firefox OS. Sebbene l'implementazione potrebbe cambiare in futuro e non è supportata sufficientemente tra i vari browser, è comunque adatta per l'utilizzo nel codice dedicato ad applicazioni per Firefox OS.", - "ja": "この機能は現在 W3C の標準化のプロセスに乗っていませんが、Firefox OS プラットフォームではサポートされています。将来は動作が変わるかもしれませんし、他のブラウザーで広くサポートされているわけでもありませんが、Firefox OS アプリ専用のコードで使うには適しています。", - "ru": "Эта возможность не является стандартом W3C и стандартизировать её пока никто не собирается, но она поддерживается на платформе Firefox OS. Хотя возможность не поддерживается всеми браузерами и в будущем её реализация может изменяться, она может использоваться в коде приложений для Firefox OS." -}); - -var fxosCheck = 0; - -for (i = 0 ; i <= env.tags.length-1 ; i++) { - if (env.tags[i] == "Firefox OS") { - fxosCheck = 1; - break; // we can break out now, to save some time - } -} - -if (fxosCheck == 0) { - -switch($0) { - case 'inline': - %><span class="notecard inline nonstandard"><%-str_inline%></span><% - break; - case 'header': - %> - <div class="notecard nonstandard"> - <h4><%-str_inline%></h4> - <p><%-str_long%></p> - </div> - <% - break; -} - -} else { - -switch($0) { - case 'inline': - %><span class="notecard inline nonstandard"><%-str_inline%></span><% - break; - case 'header': - %> - <div class="notecard nonstandard"> - <h4><%-str_inline%></h4> - <p><%-str_fxos_long%></p> - </div> - <% - break; -} - -} - -%> diff --git a/kumascript/macros/Non-standard_Header.ejs b/kumascript/macros/Non-standard_Header.ejs index 746635930a59..d6c991298a63 100644 --- a/kumascript/macros/Non-standard_Header.ejs +++ b/kumascript/macros/Non-standard_Header.ejs @@ -1 +1,59 @@ -<%- await template("non-standardGeneric", ["header"]) %> +<% + +var str_inline = mdn.localString({ + "en-US": "Non-standard", + "es": "No estándar", + "fr": "Non standard", + "ja": "非標準", + "ko": "비표준", + "ru": "Не стандартно", + "zh-CN": "非标准", + "zh-TW": "非標準" +}); + +var str_long = mdn.localString({ + "en-US": "This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.", + "es": "Esta característica no es parte de los estándares. No la uses en sitios Web en producción: no funcionará para todos los usuarios. Podrían haber también incompatibilidades considerables entre distintas implementaciones y el comportamiento podría cambiar en el futuro.", + "fr": "Cette fonctionnalité n'est ni standard, ni en voie de standardisation. Ne l'utilisez pas pour des sites accessibles sur le Web : elle ne fonctionnera pas pour tout utilisateur. Il peut également y avoir d'importantes incompatibilités entre les implémentations et son comportement peut être modifié dans le futur.", + "ja": "この機能は標準ではなく、標準化の予定もありません。公開されているウェブサイトには使用しないでください。ユーザーによっては使用できないことがあります。実装ごとに大きな差があることもあり、将来は振る舞いが変わるかもしれません。", + "ko": "이 기능은 비표준이므로 실제 프로덕션에서 사용하지 마세요. 모든 사용자 환경에서 작동하지 않을 수 도 있으며, 미래에 호환성 문제가 생길 수 있습니다.", + "ru": "Эта возможность не является стандартной и стандартизировать её пока никто не собирается. Не используйте её на сайтах, смотрящих во внешний мир: она будет работать не у всех пользователей. Также могут присутствовать большие несовместимости между реализациями и её поведение может в будущем измениться.", + "zh-CN": "该特性是非标准的,请尽量不要在生产环境中使用它!" +}); + +var str_fxos_long = mdn.localString({ + "en-US": "This feature is not on a current W3C standards track, but it is supported on the Firefox OS platform. Although implementations may change in the future and it is not supported widely across browsers, it is suitable for use in code dedicated to Firefox OS apps.", + "es": "Esta característica no está en ningún estándar actual del W3C, sin embargo está soportado en la plataforma Firefox OS. Aunque las implementaciones podrían cambiar en el futuro y no se soporta ampliamente por los navegadores, es apropiado usarse en código dedicado a aplicaciones de Firefox OS.", + "fr": "Cette fonctionnalité n'est pas en voie de standardisation au W3C, mais elle est supportée par la plateforme Firefox OS. Bien que son implémentation puisse changer dans le futur et qu'elle n'est pas largement supportée par les différents navigateurs, elle est utilisable pour du code dédié aux applications Firefox OS.", + "ko": "이 기능은 W3C 표준 기능은 아니지만, Firefox 운영체제에서 지원이 됩니다. 미래에는 동작이 바뀔 수 있고, 다른 브라우저에서는 동작 안할 수 있지만, Firefox 운영체제 앱에서는 사용 가능합니다.", + "ja": "この機能は現在 W3C の標準化のプロセスに乗っていませんが、Firefox OS プラットフォームではサポートされています。将来は動作が変わるかもしれませんし、他のブラウザーで広くサポートされているわけでもありませんが、Firefox OS アプリ専用のコードで使うには適しています。", + "ru": "Эта возможность не является стандартом W3C и стандартизировать её пока никто не собирается, но она поддерживается на платформе Firefox OS. Хотя возможность не поддерживается всеми браузерами и в будущем её реализация может изменяться, она может использоваться в коде приложений для Firefox OS." +}); + +var fxosCheck = 0; + +for (i = 0 ; i <= env.tags.length-1 ; i++) { + if (env.tags[i] == "Firefox OS") { + fxosCheck = 1; + break; // we can break out now, to save some time + } +} + +if (fxosCheck == 0) { + %> + <div class="notecard nonstandard"> + <h4><%-str_inline%></h4> + <p><%-str_long%></p> + </div> + <% + +} else { + %> + <div class="notecard nonstandard"> + <h4><%-str_inline%></h4> + <p><%-str_fxos_long%></p> + </div> + <% +} + +%> diff --git a/kumascript/macros/NonStandardBadge.ejs b/kumascript/macros/NonStandardBadge.ejs index 15b5b523d1d3..6447ea095577 100644 --- a/kumascript/macros/NonStandardBadge.ejs +++ b/kumascript/macros/NonStandardBadge.ejs @@ -7,12 +7,14 @@ const title = mdn.localString({ "en-US": "Non-standard. Check cross-browser support before using.", + "ko": "비표준. 사용하기전에 다른 브라우저에서도 사용 가능한지 확인 해주세요.", "zh-CN": "非标准。请在使用前检查跨浏览器支持。", "zh-TW": "非標準。請在使用前檢查跨瀏覽器支援。" }); const abbreviation = mdn.localString({ "en-US": "Non-standard", + "ko": "비표준", "zh-CN": "非标准", "zh-TW": "非標準" }); diff --git a/kumascript/macros/ObsoleteBadge.ejs b/kumascript/macros/ObsoleteBadge.ejs index 9ff15355f31b..0be2c9a1f55b 100644 --- a/kumascript/macros/ObsoleteBadge.ejs +++ b/kumascript/macros/ObsoleteBadge.ejs @@ -5,37 +5,16 @@ // $0 If specified, the badge is "small" var titleAttrValue = mdn.localString({ - "ca": "This is an obsolete API and is no longer guaranteed to work.", - "cs": "This is an obsolete API and is no longer guaranteed to work.", - "el": "This is an obsolete API and is no longer guaranteed to work.", + "en-US": "This is an obsolete API and is no longer guaranteed to work.", "es": "This is an obsolete API and is no longer guaranteed to work.", - "fa": "This is an obsolete API and is no longer guaranteed to work.", - "fi": "This is an obsolete API and is no longer guaranteed to work.", "fr": "This is an obsolete API and is no longer guaranteed to work.", - "he": "This is an obsolete API and is no longer guaranteed to work.", - "hr": "This is an obsolete API and is no longer guaranteed to work.", - "hu": "This is an obsolete API and is no longer guaranteed to work.", - "id": "This is an obsolete API and is no longer guaranteed to work.", - "it": "This is an obsolete API and is no longer guaranteed to work.", "ja": "これは廃止された API であり、動作は保証されていません。", - "ka": "This is an obsolete API and is no longer guaranteed to work.", - "ko": "This is an obsolete API and is no longer guaranteed to work.", - "ms": "This is an obsolete API and is no longer guaranteed to work.", - "nl": "This is an obsolete API and is no longer guaranteed to work.", - "ro": "This is an obsolete API and is no longer guaranteed to work.", - "ru": "Этот API вышел из употребления и его работа больше не гарантируется.", - "sq": "This is an obsolete API and is no longer guaranteed to work.", - "th": "This is an obsolete API and is no longer guaranteed to work.", - "tr": "This is an obsolete API and is no longer guaranteed to work.", - "vi": "This is an obsolete API and is no longer guaranteed to work.", - "bn-BD": "This is an obsolete API and is no longer guaranteed to work.", - "fy-NL": "This is an obsolete API and is no longer guaranteed to work.", - "ga-IE": "This is an obsolete API and is no longer guaranteed to work.", + "ko": "폐기된 API입니다. API의 동작이 보장 되지 않습니다. ", "pt-BR": "This is an obsolete API and is no longer guaranteed to work.", - "pt-PT": "This is an obsolete API and is no longer guaranteed to work.", + "ru": "Этот API вышел из употребления и его работа больше не гарантируется.", "zh-CN": "This is an obsolete API and is no longer guaranteed to work.", - "zh-TW": "This is an obsolete API and is no longer guaranteed to work.", - "en-US": "This is an obsolete API and is no longer guaranteed to work." + "zh-TW": "This is an obsolete API and is no longer guaranteed to work." + }); %> <svg class="icon obsolete" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" diff --git a/kumascript/macros/ObsoleteGeneric.ejs b/kumascript/macros/ObsoleteGeneric.ejs index ee56de249f43..76e72a2e7d46 100644 --- a/kumascript/macros/ObsoleteGeneric.ejs +++ b/kumascript/macros/ObsoleteGeneric.ejs @@ -69,7 +69,7 @@ switch(lang) { str = "廃止"; if (ver.length) { str = ver + " で" + str; } break; case 'ko': - str = "안씀"; + str = "폐기됨"; if (ver.length) { str = str + " " + ver; } break; case 'ru': @@ -95,6 +95,7 @@ var str_desc = mdn.localString({ "fr": "Cette fonctionnalité est obsolète. Bien qu'encore supportée par des navigateurs, son utilisation est découragée pour tout nouveau projet. Évitez de l'utiliser.", "es": "Esta funcionalidad es obsoleta. Aunque puede aún funcionar en algunos navegadores, se desalienta su uso ya que puede ser removida en cualquier momento. Evite usarla.", "ja": "この機能は廃止されました。まだいくつかのブラウザーで動作するかもしれませんが、いつ削除されてもおかしくないので、使わないようにしましょう。", + "ko": "이 기능은 폐기되었습니다. 몇몇 브라우저에서 여전히 동작 할 수 있지만, 언제 삭제되어도 이상하지 않으니 사용하지 마세요.", "ru": "Эта возможность вышла из употребления. Хотя она может продолжать работать в некоторых браузерах, её использование не рекомендуется, поскольку она может быть удалена в любое время. Старайтесь избегать её использования." }); diff --git a/kumascript/macros/PreviousMenuNext.ejs b/kumascript/macros/PreviousMenuNext.ejs index 2069f9db2643..0826812c5ba0 100644 --- a/kumascript/macros/PreviousMenuNext.ejs +++ b/kumascript/macros/PreviousMenuNext.ejs @@ -18,15 +18,11 @@ var strMenu = ""; var s_PreviousNext = mdn.localString({ "en-US": [" Previous ", " Next "], - "cs" : [" Předchozí ", " Následující "], "es" : [" Anterior ", " Siguiente "], "fr" : [" Précédent ", " Suivant "], - "pt-PT": [" Anterior ", " Próxima "], - "pt-BR": [" Anterior ", " Próxima "], - - "he" : [" קוד ם", "הבא "] , "ja" : [" 前のページ ", " 次のページ "], "ko" : [" 이전 ", " 다음 "], + "pt-BR": [" Anterior ", " Próxima "], "ru" : [" Назад ", " Далее "], "zh-CN": [" 上一页 ", " 下一页 "], "zh-TW": [" 前頁 ", " 次頁 "] diff --git a/kumascript/macros/PreviousNext.ejs b/kumascript/macros/PreviousNext.ejs index 68c3add1e3f6..40977b4c5963 100644 --- a/kumascript/macros/PreviousNext.ejs +++ b/kumascript/macros/PreviousNext.ejs @@ -16,12 +16,8 @@ var strNext = ""; var s_PreviousNext = mdn.localString({ "en-US": ["« Previous", "Next »"], - "cs" : ["« Předchozí", "Následující »"], "es" : ["« Anterior", "Siguiente »"], "fr" : ["« Précédent", "Suivant »"], - "pt-PT": ["« Anterior", "Próxima »"], - - "he" : ["« קודם", "הבא »"] , "ja" : ["« 前のページ", "次のページ »"], "ko" : ["« 이전", "다음 »"], "ru" : ["« Предыдущая статья", "Следующая статья »"], diff --git a/kumascript/macros/ReadOnlyInline.ejs b/kumascript/macros/ReadOnlyInline.ejs index 50a47a42a9a2..3aa43a078e1b 100644 --- a/kumascript/macros/ReadOnlyInline.ejs +++ b/kumascript/macros/ReadOnlyInline.ejs @@ -1,19 +1,21 @@ <% var str = mdn.localString({ + "en-US": "Read only ", "fr": "Lecture seule ", "ja": "読取専用 ", - "ru": "Только для чтения ", + "ko": "읽기 전용", "pt-BR": "Somente leitura ", - "zh-CN": "只读 ", - "en-US": "Read only " + "ru": "Только для чтения ", + "zh-CN": "只读 " }); var title = mdn.localString({ + "en-US": "This value may not be changed.", "fr": "Cette valeur ne peut pas être changée.", - "ru": "Это значение изменять нельзя.", + "ko": "이 값은 변경 할 수 없습니다.", "pt-BR": "Este valor não pode ser alterado.", + "ru": "Это значение изменять нельзя.", "zh-CN": "该属性的值无法更改", - "en-US": "This value may not be changed." }); %> <span title="<%= title %>" class="badge inline readonly"><%= str %></span> diff --git a/kumascript/macros/SectionOnPage.ejs b/kumascript/macros/SectionOnPage.ejs index 5969a03f97c3..6b040a9432f2 100644 --- a/kumascript/macros/SectionOnPage.ejs +++ b/kumascript/macros/SectionOnPage.ejs @@ -15,6 +15,8 @@ // {{SectionOnPage("/en-US/docs/Web/API/RTCPeerConnection", // "RTCSignalingState enum", "code")}} +mdn.deprecated(); + let allowedWrappers = [ "code", "kbd", diff --git a/kumascript/macros/ServiceWorkerSidebar.ejs b/kumascript/macros/ServiceWorkerSidebar.ejs deleted file mode 100644 index f0bc7416a438..000000000000 --- a/kumascript/macros/ServiceWorkerSidebar.ejs +++ /dev/null @@ -1,141 +0,0 @@ -<% - -// Throw a MacroDeprecatedError flaw -// Can be removed when its usage translated-content is down to 0 -mdn.deprecated(); - -var currentSection = $0; -var locale = env.locale; - -function state(section) { - if (section == currentSection) { - return "open"; - } - return ""; -} - -var text = mdn.localStringMap({ - 'en-US': { - 'Service_Worker_API': 'Service Worker API', - 'Overview': 'Overview of Service Worker interfaces', - 'Service_Worker_guides': 'Service Worker guides', - 'Interfaces': 'Interfaces', - 'Documentation': 'Documentation:', - 'Useful_lists': 'Useful lists', - 'Contribute': 'Contribute', - 'The_MDN_project': 'The MDN project', - 'Using_Service_Workers': 'Using Service Workers', - 'Related_APIs': 'Related APIs', - 'Push_API': 'Push API', - 'Notifications_API': 'Notifications API', - 'Channel_Messaging_API': 'Channel Messaging API', - 'Web_Workers_API': 'Web Workers API' - }, - 'fr': { - 'Service_Worker_API': 'API Service Worker', - 'Overview': 'Aperçu des interfaces Service Worker', - 'Service_Worker_guides': 'Guides Service Worker', - 'Interfaces': 'Interfaces', - 'Documentation': 'Documentation\xa0:', - 'Useful_lists': 'Listes utiles', - 'Contribute': 'Contribuer', - 'The_MDN_project': 'Le projet MDN', - 'Using_Service_Workers': 'Utiliser les service workers', - 'Related_APIs': 'API associées', - 'Push_API': 'API Push', - 'Notifications_API': 'API Notifications', - 'Channel_Messaging_API': 'API Channel Messaging', - 'Web_Workers_API': 'API Web Workers' - }, - 'ja': { - 'Service_Worker_API': 'サービスワーカー API', - 'Overview': 'サービスワーカーインターフェイスの概要', - 'Service_Worker_guides': 'サービスワーカーガイド', - 'Interfaces': 'インターフェイス', - 'Documentation': 'ドキュメント:', - 'Useful_lists': '有用なリスト', - 'Contribute': '協力', - 'The_MDN_project': 'The MDN project', - 'Using_Service_Workers': 'サービスワーカーの使用', - 'Related_APIs': '関連 API', - 'Push_API': 'プッシュ API', - 'Notifications_API': '通知 API', - 'Channel_Messaging_API': 'チャンネルメッセージング API', - 'Web_Workers_API': 'ウェブワーカー API' - }, - 'ru': { - 'Service_Worker_API': 'Service Worker API', - 'Overview': 'Обзор интерфейсов Service Worker', - 'Service_Worker_guides': 'Руководства по Service Worker', - 'Interfaces': 'Интерфейсы', - 'Documentation': 'Документация:', - 'Useful_lists': 'Полезные списки', - 'Contribute': 'Внести вклад', - 'The_MDN_project': 'Проект MDN', - 'Using_Service_Workers': 'Использование Service Workers', - 'Related_APIs': 'Похожие API', - 'Push_API': 'Push API', - 'Notifications_API': 'Notifications API', - 'Channel_Messaging_API': 'Channel Messaging API', - 'Web_Workers_API': 'Web Workers API' - } -}); -%> -<section id="Quick_links"> - <ol> - <li><a href="/<%=locale%>/docs/Web/API/Service_Worker_API"><strong><%=text['Service_Worker_API']%></strong></a></li> - <li class="toggle"> - <details open> - <summary><%=text['Service_Worker_guides']%></summary> - <ol> - <li><a href="/<%=locale%>/docs/Web/API/Service_Worker_API/Using_Service_Workers"><%=text['Using_Service_Workers']%></a></li> - </ol> - </details> - </li> - <li class="toggle"> - <details open> - <summary><%=text['Interfaces']%></summary> - <ol> - <li><%-await template("domxref", ["Cache"])%></li> - <li><%-await template("domxref", ["CacheStorage"])%></li> - <li><%-await template("domxref", ["Client"])%></li> - <li><%-await template("domxref", ["Clients"])%></li> - <li><%-await template("domxref", ["ExtendableEvent"])%></li> - <li><%-await template("domxref", ["FetchEvent"])%></li> - <li><%-await template("domxref", ["InstallEvent"])%></li> - <li><%-await template("domxref", ["Navigator.serviceWorker"])%></li> - <li><%-await template("domxref", ["NotificationEvent"])%></li> - <li><%-await template("domxref", ["PeriodicSyncEvent"])%></li> - <li><%-await template("domxref", ["PeriodicSyncManager"])%></li> - <li><%-await template("domxref", ["ServiceWorker"])%></li> - <li><%-await template("domxref", ["ServiceWorkerContainer"])%></li> - <li><%-await template("domxref", ["ServiceWorkerGlobalScope"])%></li> - <li><%-await template("domxref", ["ServiceWorkerRegistration"])%></li> - <li><%-await template("domxref", ["SyncEvent"])%></li> - <li><%-await template("domxref", ["SyncManager"])%></li> - <li><%-await template("domxref", ["WindowClient"])%></li> - </ol> - </details> - </li> - <li class="toggle"> - <details open> - <summary><%=text['Related_APIs']%></summary> - <ol> - <li><a href="/<%=locale%>/docs/Web/API/Channel_Messaging_API"><%=text['Channel_Messaging_API']%></a></li> - <li><a href="/<%=locale%>/docs/Web/API/Notifications_API"><%=text['Notifications_API']%></a></li> - <li><a href="/<%=locale%>/docs/Web/API/Push_API"><%=text['Push_API']%></a></li> - <li><a href="/<%=locale%>/docs/Web/API/Web_Workers_API"><%=text['Web_Workers_API']%></a></li> - </ol> - </details> - </li> - <li><strong><a href="/<%=locale%>/docs/MDN"><%=text['Documentation']%></a></strong></li> - <li class="toggle"> - <details <%=state('Contribute')%>> - <summary><%=text['Contribute']%></summary> - <ol> - <li><a href="/<%=locale%>/docs/MDN"><%=text['The_MDN_project']%></a></li> - </ol> - </details> - </li> - </ol> -</section> diff --git a/kumascript/macros/WebAssemblySidebar.ejs b/kumascript/macros/WebAssemblySidebar.ejs index 87cbe99fe93f..83eaccea8db1 100644 --- a/kumascript/macros/WebAssemblySidebar.ejs +++ b/kumascript/macros/WebAssemblySidebar.ejs @@ -29,6 +29,19 @@ var text = mdn.localStringMap({ 'Exported_functions' : "Fonctions WebAssembly exportées", 'JavaScript_interface' : "JavaScript interface" }, + 'ko': { + 'WebAssembly_home_page' : '웹어셈블리 홈페이지', + 'Tutorials' : '자습서', + 'WebAssembly_concepts' : '웹어셈블리의 개념', + 'Compiling_to_wasm' : 'C/C++ 모듈을 웹어셈블리로 컴파일하기', + 'Compiling_rust_to_wasm' : 'Rust를 웹어셈블리로 컴파일하기', + 'JavaScript_API' : '웹어셈블리 JavaScript API 사용하기', + 'Text_format' : '웹어셈블리 텍스트 형식 이해하기', + 'Text_format_to_wasm' : '웹어셈블리 기반 텍스트를 wasm 형식으로 변환하기', + 'Loading_and_running' : '웹어셈블리 코드 로딩하고 실행하기', + 'Exported_functions' : '내보낸 웹어셈블리(Exported WebAssembly) 함수', + 'JavaScript_interface' : 'JavaScript 인터페이스' + }, 'ru': { 'WebAssembly_home_page' : 'WebAssembly', 'Tutorials' : 'Уроки', diff --git a/kumascript/macros/WebExtAPISidebar.ejs b/kumascript/macros/WebExtAPISidebar.ejs index 3d9e307df686..36c34f017ed5 100644 --- a/kumascript/macros/WebExtAPISidebar.ejs +++ b/kumascript/macros/WebExtAPISidebar.ejs @@ -22,14 +22,7 @@ let text = { 'Events': mdn.getLocalString(commonl10n, 'Events'), }; -var badges = { - ExperimentalBadge : await template("ExperimentalBadge"), - NonStandardBadge : await template("NonStandardBadge"), - DeprecatedBadge : await template("DeprecatedBadge"), - ObsoleteBadge : await template("ObsoleteBadge"), -} - -function buildSublist(pages, title, ignoreBadges) { +async function buildSublist(pages, title, ignoreBadges) { var result = '<li data-default-state="open"><a href="#"><strong>' + title + '</strong></a><ol>'; for (var i in pages) { @@ -54,25 +47,9 @@ function buildSublist(pages, title, ignoreBadges) { result += '<li>'; - var pageBadges = ''; + let pageBadges = ''; if (!ignoreBadges) { - - if (hasTag(aPage, 'Experimental')) { - pageBadges += badges.ExperimentalBadge; - } - - if (hasTag(aPage, 'Non-standard') || hasTag(aPage, 'Non Standard')) { - pageBadges += badges.NonStandardBadge; - } - - if (hasTag(aPage, 'Deprecated')) { - pageBadges += badges.DeprecatedBadge; - } - - if (hasTag(aPage, 'Obsolete')) { - pageBadges += badges.ObsoleteBadge; - result += '<s class="obsoleteElement">'; - } + pageBadges = (await page.badges(aPage)).join(""); } if (rtlLocales.indexOf(locale) != -1) { @@ -80,19 +57,15 @@ function buildSublist(pages, title, ignoreBadges) { } if (slug == aPage.slug) { - result += '<em>' + pageBadges + ' <code>' + apiComponentName + '</code></em>' + result += `<em><code>${apiComponentName}</code> ${pageBadges}</em>`; } else { - result += pageBadges + '<a href="' + url + '"><code>' + apiComponentName + '</code></a>'; + result += `<a href="${url}"><code>${apiComponentName}</code></a>${pageBadges}`; } if (rtlLocales.indexOf(locale) != -1) { result += '</bdi>'; } - if (hasTag(aPage, 'Obsolete')) { - result += '</s>'; - } - result += '</li>'; } @@ -135,16 +108,16 @@ async function buildSidebarForSingleAPI(apiPath) { var pageCollection = classifyPages(subpages); if (pageCollection.methods.length > 0) { - output += buildSublist(pageCollection.methods, text["Methods"], true); + output += await buildSublist(pageCollection.methods, text["Methods"], true); } if (pageCollection.properties.length > 0) { - output += buildSublist(pageCollection.properties, text["Properties"], true); + output += await buildSublist(pageCollection.properties, text["Properties"], true); } if (pageCollection.types.length > 0) { - output += buildSublist(pageCollection.types, text["Types"], true); + output += await buildSublist(pageCollection.types, text["Types"], true); } if (pageCollection.events.length > 0) { - output += buildSublist(pageCollection.events, text["Events"], true); + output += await buildSublist(pageCollection.events, text["Events"], true); } output += '</ol>'; diff --git a/kumascript/macros/WebGLSidebar.ejs b/kumascript/macros/WebGLSidebar.ejs index 1d955e1baff1..6b8504a4143c 100644 --- a/kumascript/macros/WebGLSidebar.ejs +++ b/kumascript/macros/WebGLSidebar.ejs @@ -63,6 +63,30 @@ var text = mdn.localStringMap({ 'Contribute': "Contribuer", 'The_MDN_project': "Le projet MDN", }, + 'ko': { + 'WebGL_API': 'WebGL API', + 'WebGL_tutorial': 'WebGL 자습서', + 'Getting_started': 'WebGL 시작하기', + '2D_content': 'WebGL 컨텍스트에 2D 콘텐츠 추가하기', + 'shaders_color': 'WebGL에서 셰이더를 사용하여 색상 적용하기', + 'Animating': 'WebGL을 사용한 애니메이션 객체', + '3D_objects': 'WebGL로 3D 객체 만들기', + 'Textures': 'WebGL에서 텍스쳐 사용하기', + 'Lightning': 'WebGL에서 조명 효과 적용하기', + 'Animating_textures': 'WebGL에서의 텍스쳐 애니메이션', + 'Examples': '예제', + 'webgl_matrix_math': '웹을 위한 행렬(선형대수학)', + 'webgl_mvp': 'WebGL 모델 뷰 투영', + 'webgl_best_practices': 'WebGL 모범 사례', + 'webgl_extensions': 'WebGL 확장 사용하기', + 'basic_2d_example': '2D WebGL 애니메이션 예제', + 'WebGL_by_example': '에제와 함께하는 WebGL', + 'Interfaces': '인터페이스', + 'Documentation': '문서:', + 'Useful_lists': '유용한 리스트', + 'Contribute': '기여하기', + 'The_MDN_project': 'MDN 프로젝트', + }, 'ru': { 'WebGL_API': 'WebGL API', 'WebGL_tutorial': 'Руководство WebGL', diff --git a/kumascript/macros/WebRTCSidebar.ejs b/kumascript/macros/WebRTCSidebar.ejs deleted file mode 100644 index 209d61a82467..000000000000 --- a/kumascript/macros/WebRTCSidebar.ejs +++ /dev/null @@ -1,138 +0,0 @@ -<% - -// Throw a MacroDeprecatedError flaw -// Can be removed when its usage translated-content is down to 0 -mdn.deprecated(); - -var currentSection = $0; -var locale = env.locale; - -function state(section) { - if (section == currentSection) { - return "open"; - } - return ""; -} - -var text = mdn.localStringMap({ - 'en-US': { - 'WebRTC_API': 'WebRTC API', - 'WebRTC_guides': 'WebRTC Guides', - 'Architecture': 'WebRTC Architecture', - 'Basics': 'WebRTC Basics', - 'Protocols': 'WebRTC Protocols', - 'Connectivity': 'Dealing with connectivity', - 'Overview': 'Overview of WebRTC interfaces', - 'Session_lifetime': 'Lifetime of a WebRTC Session', - 'Using_data_channels': 'Using data channels', - 'WebRTC_tutorials': 'WebRTC Tutorials', - 'adapter_js': 'Interoperability with adapter.js', - 'still_photos': 'Taking still photos from the camera', - 'simple_sample': 'A simple data channel example', - 'Interfaces': 'Interfaces', - 'Documentation': 'Documentation:', - 'Useful_lists': 'Useful lists', - 'Contribute': 'Contribute', - 'The_MDN_project': 'The MDN project', - 'build_a_phone_with_peer_js': 'Building an internet-connected phone with Peer.js', - }, - 'fr': { - 'WebRTC_API': "API WebRTC", - 'WebRTC_guides': "Guides WebRTC", - 'Architecture': "Architecture WebRTC", - 'Basics': "Fondamentaux WebRTC", - 'Protocols': "Protocoles WebRTC", - 'Connectivity': "Gérer la connectivité", - 'Overview': "Aperçu des interfaces WebRTC", - 'Session_lifetime': "Cycle de vie d'une session WebRTC", - 'Using_data_channels': "Utiliser les canaux de données", - 'WebRTC_tutorials': "Tutoriels WebRTC", - 'adapter_js': "Interopérabilité avec adapter.js", - 'still_photos': "Prendre des photos avec la caméra", - 'simple_sample': "Un exemple simple de canal de données", - 'Interfaces': "Interfaces", - 'Documentation': "Documentation\xa0:", - 'Useful_lists': "Listes utiles", - 'Contribute': "Contribuer", - 'The_MDN_project': "Le projet MDN", - 'build_a_phone_with_peer_js': "Construire un téléphone connecté à Internet avec Peer.js", - }, - 'ru': { - 'WebRTC_API': 'WebRTC API', - 'WebRTC_guides': 'Руководства по WebRTC', - 'Architecture': 'Архитектура WebRTC', - 'Basics': 'Основы WebRTC', - 'Protocols': 'Протоколы WebRTC', - 'Connectivity': 'Работа с подключением', - 'Overview': 'Обзор интерфейсов WebRTC', - 'Session_lifetime': 'Время жизни сессии WebRTC', - 'Using_data_channels': 'Использование каналов данных в WebRTC', - 'WebRTC_tutorials': 'Уроки по WebRTC', - 'adapter_js': 'Функциональная совместимость с adapter.js', - 'still_photos': 'Делаем фото с камеры', - 'simple_sample': 'Простой пример канала с данными', - 'Interfaces': 'Интерфейсы', - 'Documentation': 'Документация:', - 'Useful_lists': 'Полезные списки', - 'Contribute': 'Внести вклад', - 'The_MDN_project': 'Проект MDN', - } -}); -%> -<section id="Quick_links"> - <ol> - <li><a href="/<%=locale%>/docs/Web/API/WebRTC_API"><strong><%=text['WebRTC_API']%></strong></a></li> - <li class="toggle"> - <details open> - <summary><%=text['WebRTC_guides']%></summary> - <ol> - <li><a href="/<%=locale%>/docs/Web/API/WebRTC_API/Architecture"><%=text['Architecture']%></a></li> - <li><a href="/<%=locale%>/docs/Web/API/WebRTC_API/WebRTC_Basics"><%=text['Basics']%></a></li> - <li><a href="/<%=locale%>/docs/Web/API/WebRTC_API/Protocols"><%=text['Protocols']%></a></li> - <li><a href="/<%=locale%>/docs/Web/API/WebRTC_API/Connectivity"><%=text['Connectivity']%></a></li> - <li><a href="/<%=locale%>/docs/Web/API/WebRTC_API/Overview"><%=text['Overview']%></a></li> - <li><a href="/<%=locale%>/docs/Web/API/WebRTC_API/Session_lifetime"><%=text['Session_lifetime']%></a></li> - <li><a href="/<%=locale%>/docs/Web/API/WebRTC_API/Using_data_channels"><%=text['Using_data_channels']%></a></li> - </ol> - </details> - </li> - <li class="toggle"> - <details open> - <summary><%=text['WebRTC_tutorials']%></summary> - <ol> - <li><a href="/<%=locale%>/docs/Web/API/WebRTC_API/adapter.js"><%=text['adapter_js']%></a></li> - <li><a href="/<%=locale%>/docs/Web/API/WebRTC_API/Taking_still_photos"><%=text['still_photos']%></a></li> - <li><a href="/<%=locale%>/docs/Web/API/WebRTC_API/Simple_RTCDataChannel_sample"><%=text['simple_sample']%></a></li> - <li><a href="/<%=locale%>/docs/Web/API/WebRTC_API/Build_a_phone_with_peerjs"><%=text['build_a_phone_with_peer_js']%></a></li> - </ol> - </details> - </li> - <li class="toggle"> - <details open> - <summary><%=text['Interfaces']%></summary> - <ol> - <li><%-await template("domxref", ["MediaDevices"])%></li> - <li><%-await template("domxref", ["MediaStream"])%></li> - <li><%-await template("domxref", ["MediaStreamEvent"])%></li> - <li><%-await template("domxref", ["MediaStreamTrack"])%></li> - <li><%-await template("domxref", ["MessageEvent"])%></li> - <li><%-await template("domxref", ["RTCDataChannel"])%></li> - <li><%-await template("domxref", ["RTCIceCandidate"])%></li> - <li><%-await template("domxref", ["RTCPeerConnection"])%></li> - <li><%-await template("domxref", ["RTCPeerConnectionIceEvent"])%></li> - <li><%-await template("domxref", ["RTCSessionDescription"])%></li> - <li><%-await template("domxref", ["RTCStatsReport"])%></li> - </ol> - </details> - </li> - <li><strong><a href="/<%=locale%>/docs/MDN"><%=text['Documentation']%></a></strong></li> - <li class="toggle"> - <details <%=state('Contribute')%>> - <summary><%=text['Contribute']%></summary> - <ol> - <li><a href="/<%=locale%>/docs/MDN"><%=text['The_MDN_project']%></a></li> - </ol> - </details> - </li> - </ol> -</section> diff --git a/kumascript/macros/WebkitBug.ejs b/kumascript/macros/WebkitBug.ejs index 5b749c491f49..0125a1ff4dbd 100644 --- a/kumascript/macros/WebkitBug.ejs +++ b/kumascript/macros/WebkitBug.ejs @@ -3,9 +3,8 @@ var bugPageURL = 'https://bugs.webkit.org/show_bug.cgi?id=' + $0; var s = ""; var linkLabel = mdn.replacePlaceholders(mdn.localString({ "en-US": "WebKit bug $1$", - "ca": "WebKit errada $1$", - "cs": "WebKit chyba $1$", - "ru": "Баг WebKit $1$", + "ko": "WebKit 오류 $1$", + "ru": "Баг WebKit $1$" }), [$0]); %> diff --git a/kumascript/macros/bug.ejs b/kumascript/macros/bug.ejs index 5e78cd0eb52c..16c0af3dd390 100644 --- a/kumascript/macros/bug.ejs +++ b/kumascript/macros/bug.ejs @@ -31,11 +31,11 @@ if ($2 != undefined && !isNaN($2)) { var s_bug = mdn.localString({ "en-US": "bug", - "ca" : "errada", - "cs" : "chyba", "es" : "error", "ja" : "バグ", - "ru" : "баг" + "ko" : "오류", + "ru" : "баг", + }); if (type == 'table') { %> <tr> diff --git a/kumascript/macros/gecko.ejs b/kumascript/macros/gecko.ejs index 4271fa38d307..fe27759ab715 100644 --- a/kumascript/macros/gecko.ejs +++ b/kumascript/macros/gecko.ejs @@ -1 +1,7 @@ +<% +// Throw a MacroDeprecatedError flaw +// Can be removed when its usage translated-content is down to 0 +mdn.deprecated(); +%> + <span title="<%= await template("geckoRelease", [$0]) %>">Gecko <%=$0%></span> diff --git a/kumascript/macros/jsOverrides.ejs b/kumascript/macros/jsOverrides.ejs index de7462942854..7fb319af41d8 100644 --- a/kumascript/macros/jsOverrides.ejs +++ b/kumascript/macros/jsOverrides.ejs @@ -99,15 +99,20 @@ var captionText = `${$1}`.charAt(0).toUpperCase() + `${$1}`.slice(1).toLowerCase var titleString = ""; switch(env.locale) { + case "fr": + if (captionText === "Properties") { captionText = "Propriétés"; } + if (captionText === "Methods") { captionText = "Méthodes"; } + titleString = captionText + ' héritées de <a href="' + pageuri + '"><code>' + $0 + '</code></a>:'; + break; case "ja": if (captionText === "Properties") { captionText = "プロパティ"; } if (captionText === "Methods") { captionText = "メソッド"; } titleString = '<a class="internal" href="' + pageuri + '"><code>' + $0 + '</code></a> から継承される' + captionText; break; - case "fr": - if (captionText === "Properties") { captionText = "Propriétés"; } - if (captionText === "Methods") { captionText = "Méthodes"; } - titleString = captionText + ' héritées de <a href="' + pageuri + '"><code>' + $0 + '</code></a>:'; + case "ko": + if (captionText === "Properties") { captionText = "속성"; } + if (captionText === "Methods") { captionText = "메서드"; } + titleString = '<a class="internal" href="' + pageuri + '"><code>' + $0 + '</code></a> 로부터 상속됨' + captionText; break; case "ru": if (captionText === "Properties") { captionText = "Свойства"; } diff --git a/kumascript/macros/js_property_attributes.ejs b/kumascript/macros/js_property_attributes.ejs index 9a849c5bc16c..20d46124ffa7 100644 --- a/kumascript/macros/js_property_attributes.ejs +++ b/kumascript/macros/js_property_attributes.ejs @@ -47,12 +47,12 @@ const text = mdn.localStringMap({ no: "不可" }, "ko": { - header: `Property attributes of <code>${env.title}</code>`, - writableName: "Writable", - enumerableName: "Enumerable", - configurableName: "Configurable", - yes: "yes", - no: "no" + header: 'Property attributes of <code>' + env.title + '</code>', + writable_name: '쓰기 가능', + enumerable_name: '열거 가능', + configurable_name: '설정 가능', + yes: '가능', + no: '불가능', }, "pt-BR": { header: `Property attributes of <code>${env.title}</code>`, diff --git a/kumascript/macros/no_tag_omission.ejs b/kumascript/macros/no_tag_omission.ejs index f18698856c7d..db7e1675de09 100644 --- a/kumascript/macros/no_tag_omission.ejs +++ b/kumascript/macros/no_tag_omission.ejs @@ -5,8 +5,7 @@ var str = mdn.localString({ "en-US": "None, both the starting and ending tag are mandatory.", "fr": "Aucune, la balise d'ouverture et la balise de fermeture sont obligatoires", "ja": "不可。開始と終了タグの両方が必要。", - "it": "Nessuna, sia il tag di apertura che quello di chiusura sono obbligatori.", - "ca": "Cap, tant l'etiqueta inicial com l’etiqueta final són obligatòries", + "ko": "불가능, 시작과 끝에 태그를 추가하는것은 필수입니다.", "ru": "Нет, открывающий и закрывающий теги обязательны.", "zh-CN": "不允许,开始标签和结束标签都不能省略。" }); diff --git a/kumascript/macros/optionalGeneric.ejs b/kumascript/macros/optionalGeneric.ejs deleted file mode 100644 index 86c095fd40e2..000000000000 --- a/kumascript/macros/optionalGeneric.ejs +++ /dev/null @@ -1,38 +0,0 @@ -<% -/* -parameters: - $0: "inline" or "method" - $1: string of indicator - $2: string of heading - $3: heading level ( optional / default = 3 ) -*/ - -var hLevel = $3 || 3; -var str = mdn.localString({ - "en-US": "Optional" + ($1 ? ' from Gecko ' + $1 : ''), - "fr": "Facultatif" + ($1 ? ' depuis Gecko ' + $1 : ''), - "ja": "省略可" + ($1 ? '(Gecko ' + $1 + ' 以降)' : ''), - "ru": "Необязательный" + ($1 ? ' с версии Gecko ' + $1 : ''), - "zh-CN": "可选" + ($1 ? '试用于Gecko ' + $1 : ''), - "zh-TW": ($1 ? '自 Gecko ' + $1 + '開始變為' : '') + "選擇性", - "es": "Opcional" + ($1 ? ' desde Gecko ' + $1 : ''), -}); - -/* - * NOTE: This macro is used by /kumascript/macros/optional_inline.ejs - * The `method` case is never used - */ -switch($0) { - case 'inline': - %><span class="badge inline optional"><%- str %></span><% - break; - case 'method': - %><div> - <span class="badge inline optional"><%- str %></span> - <h<%-hLevel%>><%= $2 %></h<%-hLevel%>> - </div><% - break; - default : - %><span class="badge inline optional"><%- str %></span><% - break; -}%> diff --git a/kumascript/macros/optional_inline.ejs b/kumascript/macros/optional_inline.ejs index 2b048c8073e7..f8f3aa651666 100644 --- a/kumascript/macros/optional_inline.ejs +++ b/kumascript/macros/optional_inline.ejs @@ -1,10 +1,20 @@ <% -var result; -if ($0) { - result = await template("optionalGeneric", ["inline",$0]); -} else { - result = await template("optionalGeneric", ["inline"]); -} +/* +parameters: + $0: string of indicator +*/ -%><%- result %> +var str = mdn.localString({ + "en-US": "Optional" + ($1 ? ' from Gecko ' + $1 : ''), + "fr": "Facultatif" + ($1 ? ' depuis Gecko ' + $1 : ''), + "ja": "省略可" + ($1 ? '(Gecko ' + $1 + ' 以降)' : ''), + "ru": "Необязательный" + ($1 ? ' с версии Gecko ' + $1 : ''), + "zh-CN": "可选" + ($1 ? '试用于Gecko ' + $1 : ''), + "zh-TW": ($1 ? '自 Gecko ' + $1 + '開始變為' : '') + "選擇性", + "es": "Opcional" + ($1 ? ' desde Gecko ' + $1 : ''), +}); + +%> + +<span class="badge inline optional"><%- str %></span> diff --git a/kumascript/macros/page.ejs b/kumascript/macros/page.ejs index 079a5628b73f..e88539a05a6c 100644 --- a/kumascript/macros/page.ejs +++ b/kumascript/macros/page.ejs @@ -14,6 +14,10 @@ // $4 - (optional) the heading level to use as the top heading level; others // are adjusted to match. +// Throw a MacroDeprecatedError flaw +// Can be removed when its usage translated-content is down to 0 +mdn.deprecated(); + var url = web.spacesToUnderscores($0); if ($1) { diff --git a/kumascript/macros/spec.ejs b/kumascript/macros/spec.ejs index d51a97dc9ca0..1eac9ef64cd1 100644 --- a/kumascript/macros/spec.ejs +++ b/kumascript/macros/spec.ejs @@ -39,24 +39,15 @@ switch(lang) { case "fr": titles = [ "Editor's Draft (unofficial)", "Working Draft", "Last Call", "Candidate Recommendation", "Proposed Recommendation", "Recommendation" ]; break; - case "he": - titles = [ "Editor's Draft (unofficial)", "Working Draft", "Last Call", "Candidate Recommendation", "Proposed Recommendation", "Recommendation" ]; - break; - case "it": - titles = [ "Editor's Draft (unofficial)", "Working Draft", "Last Call", "Candidate Recommendation", "Proposed Recommendation", "Recommendation" ]; - break; case "ja": titles = [ "草案(非公式)", "草案", "最終草案", "勧告候補", "勧告案", "W3C 勧告" ]; break; case "ko": - titles = [ "Editor's Draft (unofficial)", "Working Draft", "Last Call", "Candidate Recommendation", "Proposed Recommendation", "Recommendation" ]; + titles = [ "작성 중 초안 (비공식)", "초안", "최종 초안", "후보 권고안", "제안 권고안", "W3C 권고안" ]; break; case "pt-BR": titles = [ "Editor's Draft (unofficial)", "Working Draft", "Last Call", "Candidate Recommendation", "Proposed Recommendation", "Recommendation" ]; break; - case "pt-PT": - titles = [ "Editor's Draft (unofficial)", "Working Draft", "Last Call", "Candidate Recommendation", "Proposed Recommendation", "Recommendation" ]; - break; case "ru": titles = [ "Редакторский черновик (неофициальный)", "Рабочий черновик", "Последнее изменение", "Кандидат в рекомендации", "Предложенная рекомендация", "Рекомендация" ]; break; diff --git a/kumascript/macros/spec2.ejs b/kumascript/macros/spec2.ejs index db9a146b41dd..5c6320283a0a 100644 --- a/kumascript/macros/spec2.ejs +++ b/kumascript/macros/spec2.ejs @@ -27,97 +27,109 @@ status['ES8'] = status['ES2017']; var label = { 'REC': mdn.localString({ 'en-US' : 'Recommendation', - 'ja' : '勧告', - 'ru' : 'Рекомендация', 'fr' : 'Recommendation', - 'pt-BR' : 'Recomendação' + 'ja' : '勧告', + 'ko' : '권고안', + 'pt-BR' : 'Recomendação', + 'ru' : 'Рекомендация' }), 'PR' : mdn.localString({ 'en-US' : 'Proposed Recommendation', - 'ja' : '勧告案', - 'ru' : 'Предложенная рекомендация', 'fr' : 'Recommendation proposée', - 'pt-BR' : 'Recomendação proposta' + 'ja' : '勧告案', + 'ko' : '제안 권고안', + 'pt-BR' : 'Recomendação proposta', + 'ru' : 'Предложенная рекомендация' }), 'CR' : mdn.localString({ 'en-US' : 'Candidate Recommendation', - 'ja' : '勧告候補', - 'ru' : 'Кандидат в рекомендации', 'fr' : 'Candidat au statut de recommandation', - 'pt-BR' : 'Candidata a Recomendação' + 'ja' : '勧告候補', + 'ko' : '후보 권고안', + 'pt-BR' : 'Candidata a Recomendação', + 'ru' : 'Кандидат в рекомендации' }), 'RC' : mdn.localString({ 'en-US' : 'Release Candidate', - 'ja' : 'リリース候補', - 'ru' : 'Кандидат в рекомендации', 'fr' : 'En cours de validation comme recommandation', - 'pt-BR' : 'Recomendação em homologação' + 'ja' : 'リリース候補', + 'ko' : '최종 후보', + 'pt-BR' : 'Recomendação em homologação', + 'ru' : 'Кандидат в рекомендации' }), 'WD' : mdn.localString({ 'en-US' : 'Working Draft', - 'ja' : '草案', - 'ru' : 'Рабочий черновик', 'fr' : 'Version de travail', - 'pt-BR' : 'Rascunho atual' + 'ja' : '草案', + 'ko' : '초안', + 'pt-BR' : 'Rascunho atual', + 'ru' : 'Рабочий черновик' }), 'ED' : mdn.localString({ 'en-US' : 'Editor\'s Draft', - 'ja' : '編集者草案', - 'ru' : 'Редакторский черновик', 'fr' : 'Brouillon de l\'éditeur', - 'pt-BR' : 'Rascunho editorial' + 'ja' : '編集者草案', + 'ko' : '작성 중 초안', + 'pt-BR' : 'Rascunho editorial', + 'ru' : 'Редакторский черновик' }), 'Old-Transforms' : mdn.localString({ 'en-US' : 'This has been merged in another draft. Please update.', - 'ja' : 'この仕様は他のドラフトへ移動されました。アップデートしてください。', - 'ru' : 'Эта спецификация была слита с другим черновиком. Пожалуйста, обновите.', 'fr' : 'Cette spécification a été fusionnée avec une autre. Veuillez mettre à jour cette mention.', - 'pt-BR' : 'Isso foi anexado a outro rascunho. Por favor, atualize.' + 'ja' : 'この仕様は他のドラフトへ移動されました。アップデートしてください。', + 'ko' : "다른 초안과 합쳐졌습니다. 업데이트 하세요.", + 'pt-BR' : 'Isso foi anexado a outro rascunho. Por favor, atualize.', + 'ru' : 'Эта спецификация была слита с другим черновиком. Пожалуйста, обновите.' }), 'Living' : mdn.localString({ 'en-US' : 'Living Standard', - 'ja' : '現行の標準', - 'ru' : 'Живой стандарт', 'fr' : 'Standard évolutif', - 'pt-BR' : 'Padrão em tempo real' + 'ja' : '現行の標準', + 'pt-BR' : 'Padrão em tempo real', + 'ru' : 'Живой стандарт' }), 'RFC' : mdn.localString({ 'en-US' : 'IETF RFC' }), 'Standard' : mdn.localString({ 'en-US' : 'Standard', - 'ja' : '標準', - 'ru' : 'Стандарт', 'fr' : 'Standard', - 'pt-BR' : 'Padrão' + 'ja' : '標準', + 'ko' : '표준', + 'pt-BR' : 'Padrão', + 'ru' : 'Стандарт' }), 'Draft' : mdn.localString({ 'en-US' : 'Draft', + 'fr' : 'Projet', 'ja' : 'ドラフト', + 'ko' : '초안', + 'pt-BR' : 'Rascunho', 'ru' : 'Черновик', - 'fr' : 'Projet', - 'pt-BR' : 'Rascunho' }), 'Obsolete' : mdn.localString({ 'en-US' : 'Obsolete', 'ja' : '廃止', - 'ru' : 'Устаревшая', - 'pt-BR' : 'Obsoleto' + 'ko' : '폐기됨', + 'pt-BR' : 'Obsoleto', + 'ru' : 'Устаревшая' }), 'LC' : mdn.localString({ 'en-US' : 'Last Call Working Draft', 'ja' : '最終草案', - 'ru' : 'Последнее изменение рабочего черновика', - 'pt-BR' : 'Ultima chamada para rascunho' + 'ko' : '최종 초안', + 'pt-BR' : 'Ultima chamada para rascunho', + 'ru' : 'Последнее изменение рабочего черновика' }) } var unknown_label = mdn.localString({ 'en-US' : 'Unknown', - 'ja' : '不明', - 'ru' : 'Неизвестно', 'fr' : 'Statut inconnu', - 'pt-BR' : 'Desconhecido' + 'ja' : '不明', + 'ko' : '알 수 없음', + 'pt-BR' : 'Desconhecido', + 'ru' : 'Неизвестно' }); %> diff --git a/kumascript/macros/unimplementedGeneric.ejs b/kumascript/macros/unimplementedGeneric.ejs index 3ebbe9375a51..8d68b1fc763f 100644 --- a/kumascript/macros/unimplementedGeneric.ejs +++ b/kumascript/macros/unimplementedGeneric.ejs @@ -10,37 +10,15 @@ var product = ($3 || "Mozilla"); var s_str = mdn.localString({ - "ca" : ["Unimplemented", "see"], - "cs" : ["Unimplemented", "see"], - "el" : ["Unimplemented", "see"], + "en-US" : ["Unimplemented", "see"], "es" : ["No implementado", "mira"], - "fa" : ["Unimplemented", "see"], - "fi" : ["Unimplemented", "see"], "fr" : ["Non implémenté", "voir"], - "he" : ["Unimplemented", "see"], - "hr" : ["Unimplemented", "see"], - "hu" : ["Unimplemented", "see"], - "id" : ["Unimplemented", "see"], - "it" : ["Unimplemented", "see"], "ja" : ["未実装", "参照"], - "ka" : ["Unimplemented", "see"], "ko" : ["Unimplemented", "see"], - "ms" : ["Unimplemented", "see"], - "nl" : ["Unimplemented", "see"], - "ro" : ["Unimplemented", "see"], "ru" : ["Не реализовано", "смотрите"], - "sq" : ["Unimplemented", "see"], - "th" : ["Unimplemented", "see"], - "tr" : ["Unimplemented", "see"], - "vi" : ["Unimplemented", "see"], - "bn-BD" : ["Unimplemented", "see"], - "fy-NL" : ["Unimplemented", "see"], - "ga-IE" : ["Unimplemented", "see"], "pt-BR" : ["Unimplemented", "see"], - "pt-PT" : ["Unimplemented", "see"], "zh-CN" : ["未实现", "查看"], "zh-TW" : ["Unimplemented", "see"], - "en-US" : ["Unimplemented", "see"] }); var str = s_str[0]; diff --git a/kumascript/macros/xref_csscomputed.ejs b/kumascript/macros/xref_csscomputed.ejs index 9bb92478d4e0..a26c768907ab 100644 --- a/kumascript/macros/xref_csscomputed.ejs +++ b/kumascript/macros/xref_csscomputed.ejs @@ -4,8 +4,9 @@ let linkText = mdn.localString({ "es" : "Valor calculado", "fr" : "Valeur calculée", "ja" : "計算値", - "zh-CN": "计算值", - "ru" : "Обработка значения" + "ko" : "계산 값", + "ru" : "Обработка значения", + "zh-CN": "计算值" }); %> <%- `<a href="/${env.locale}/docs/Web/CSS/computed_value">${linkText}</a>` %> diff --git a/kumascript/macros/xref_cssinherited.ejs b/kumascript/macros/xref_cssinherited.ejs index 479e319f76b0..d0869b29954f 100644 --- a/kumascript/macros/xref_cssinherited.ejs +++ b/kumascript/macros/xref_cssinherited.ejs @@ -5,9 +5,9 @@ let linkText = mdn.localString({ "fr" : "Héritée", "ja" : "継承", "ko" : "상속", + "ru" : "Наследуется", "zh-CN": "是否是继承属性", - "zh-TW": "繼承與否", - "ru" : "Наследуется" + "zh-TW": "繼承與否" }); %> <%- `<a href="/${env.locale}/docs/Web/CSS/inheritance">${linkText}</a>` %> diff --git a/kumascript/macros/xref_cssinitial.ejs b/kumascript/macros/xref_cssinitial.ejs index d33160a2c7da..298a478cc0e1 100644 --- a/kumascript/macros/xref_cssinitial.ejs +++ b/kumascript/macros/xref_cssinitial.ejs @@ -5,9 +5,10 @@ let linkText = mdn.localString({ "fr" : "Valeur initiale", "ja" : "初期値", "ko" : "초기값", + "ru" : "Начальное значение", "zh-CN": "初始值", - "zh-TW": "預設值", - "ru" : "Начальное значение" + "zh-TW": "預設值" + }); %> <%- `<a href="/${env.locale}/docs/Web/CSS/initial_value">${linkText}</a>` %> diff --git a/kumascript/macros/xref_cssvisual.ejs b/kumascript/macros/xref_cssvisual.ejs index 106c5f9ae637..779aae261555 100644 --- a/kumascript/macros/xref_cssvisual.ejs +++ b/kumascript/macros/xref_cssvisual.ejs @@ -5,7 +5,7 @@ <% } else if ("ja" == env.locale) { %> <%- await template("Cssxref", ["Media/Visual", "visual"]) %> <% } else if ("ko" == env.locale) { %> -<%- await template("Cssxref", ["Media/Visual", "visual"]) %> +<%- await template("Cssxref", ["Media/Visual", "보기 가능"]) %> <% } else if ("zh-CN" == env.locale) { %> <%- await template("Cssxref", ["Media/Visual", "visual"]) %> <% } else if ("zh-TW" == env.locale) { %> diff --git a/kumascript/src/api/mdn.ts b/kumascript/src/api/mdn.ts index 1489143af75d..2fecbc3a70d8 100644 --- a/kumascript/src/api/mdn.ts +++ b/kumascript/src/api/mdn.ts @@ -23,7 +23,7 @@ const mdn = { /** * Given a set of strings like this: - * { "en-US": "Foo", "de": "Bar", "es": "Baz" } + * { "en-US": "Foo", "es": "Baz", "fr": "Bar" } * Return the one which matches the current locale. */ localString(this: KumaThis, strings) { @@ -34,7 +34,7 @@ const mdn = { /** * Given a set of string maps like this: - * { "en-US": {"name": "Foo"}, "de": {"name": "Bar"} } + * { "en-US": {"name": "Foo"}, "fr": {"name": "Bar"} } * Return a map which matches the current locale, falling back to en-US * properties when the localized map contains partial properties. */ @@ -59,15 +59,15 @@ const mdn = { /** * Given a set of strings like this: * { - * "hello": { "en-US": "Hello!", "de": "Hallo!" }, - * "bye": { "en-US": "Goodbye!", "de": "Auf Wiedersehen!" } + * "hello": { "en-US": "Hello!", "fr": "Bonjour !" }, + * "bye": { "en-US": "Goodbye!", "fr": "Au revoir !" } * } * Returns the one, which matches the current locale. * * Example: - * getLocalString({"hello": {"en-US": "Hello!", "de": "Hallo!"}}, + * getLocalString({"hello": {"en-US": "Hello!", "fr": "Bonjour !"}}, * "hello"); - * => "Hallo!" (in case the locale is 'de') + * => "Bonjour !" (in case the locale is 'fr') */ getLocalString(this: KumaThis, strings, key) { if (!Object.prototype.hasOwnProperty.call(strings, key)) { diff --git a/kumascript/src/api/page.ts b/kumascript/src/api/page.ts index 65177b49561e..7196d1055445 100644 --- a/kumascript/src/api/page.ts +++ b/kumascript/src/api/page.ts @@ -1,4 +1,5 @@ import { KumaThis } from "../environment"; +import { getBadgeTemplates } from "../lib/badges"; const page = { // Determines whether or not the page has the specified tag. Returns @@ -54,6 +55,10 @@ const page = { translations(this: KumaThis, path) { return this.info.getTranslations(path || this.env.url); }, + + async badges(this: KumaThis, aPage) { + return await getBadgeTemplates(this, aPage); + }, }; export default page; diff --git a/kumascript/src/environment.ts b/kumascript/src/environment.ts index 135486d02163..f77d66c8b68b 100644 --- a/kumascript/src/environment.ts +++ b/kumascript/src/environment.ts @@ -50,7 +50,7 @@ export interface KumaThis { env: typeof Environment & PerPageContext; info: typeof info; renderPrerequisiteFromURL: (path: string) => unknown; - template: (name: string, args: any) => unknown; + template: (name: string, args?: any[]) => unknown; } type PerPageContext = Partial<{ @@ -168,13 +168,13 @@ export default class Environment { // A templating function that we define in the global environment // so that templates can invoke other templates. This is not part // of the public API of the class; it is for use by other templates - async _renderTemplate(name, args) { + async _renderTemplate(name, args?) { return await this.templates.render(name, this.getExecutionContext(args)); } // Get a customized environment object that is specific to a single // macro on a page by including the arguments to be passed to that macro. - getExecutionContext(args, token = null) { + getExecutionContext(args?, token = null) { const context = Object.create(this.prototypeEnvironment); // Make a defensive copy of the arguments so that macros can't diff --git a/kumascript/src/lib/badges.ts b/kumascript/src/lib/badges.ts new file mode 100644 index 000000000000..440c2f944e33 --- /dev/null +++ b/kumascript/src/lib/badges.ts @@ -0,0 +1,52 @@ +import { KumaThis } from "../environment"; +import page from "../api/page"; + +const badges = [ + { + status: "experimental", + tag: "Experimental", + macro: "ExperimentalBadge", + template: "", + }, + { + status: "non-standard", + tag: "Non-standard", + macro: "NonStandardBadge", + template: "", + }, + { + status: "deprecated", + tag: "Deprecated", + macro: "DeprecatedBadge", + template: "", + }, +]; + +let badgeTemplatesLoaded = false; + +export async function getBadgeTemplates(kuma: KumaThis, aPage: any) { + await assertTemplatesLoaded(kuma); + + return badges + .filter( + ({ status, tag }) => + (status && aPage.status.includes(status)) || page.hasTag(aPage, tag) + ) + .map(({ template }) => template); +} + +async function assertTemplatesLoaded(kuma: KumaThis) { + if (!badgeTemplatesLoaded) { + await loadBadgeTemplates(kuma); + badgeTemplatesLoaded = true; + } + return badges; +} + +async function loadBadgeTemplates(kuma: KumaThis) { + async function loadBadge(badge: (typeof badges)[0]) { + badge.template = (await kuma.template(badge.macro)) as string; + } + + await Promise.all(badges.map(loadBadge)); +} diff --git a/kumascript/src/templates.ts b/kumascript/src/templates.ts index e263a5ea522a..6d53d0810193 100644 --- a/kumascript/src/templates.ts +++ b/kumascript/src/templates.ts @@ -100,21 +100,6 @@ export default class Templates { // creates a more informative MacroNotFoundError throw new ReferenceError(`Unknown macro ${name}`); } - if (process.env.BUILD_MACROS_USED_LOGFILE) { - try { - fs.appendFileSync( - process.env.BUILD_MACROS_USED_LOGFILE, - `${name}|${args.arguments}\n`, - "utf-8" - ); - } catch (err) { - console.warn( - "Unable to write BUILD_MACROS_USED_LOGFILE " + - `(${process.env.BUILD_MACROS_USED_LOGFILE})`, - err - ); - } - } try { const rendered = await ejs.renderFile(path, args, { async: true, diff --git a/kumascript/tests/index.test.ts b/kumascript/tests/index.test.ts index 6cf65c0fc42f..80b22178ae2e 100644 --- a/kumascript/tests/index.test.ts +++ b/kumascript/tests/index.test.ts @@ -5,7 +5,6 @@ import { MacroNotFoundError, MacroBrokenLinkError, MacroRedirectedLinkError, - MacroExecutionError, } from "../src/errors"; describe("testing the main render() function", () => { @@ -22,10 +21,6 @@ describe("testing the main render() function", () => { {{nonExistentMacro("yada")}} {{cssxref("dumber")}} {{cssxref("number")}} - {{page("bogus")}} - {{page("/en-US/docs/Web/B")}} - {{page("/en-US/docs/Web/B", "bogus-section")}} - {{page("/en-US/docs/Web/C")}} `.trim(); Document.findByURL = jest.fn((url) => { return { @@ -59,21 +54,6 @@ describe("testing the main render() function", () => { frontMatterOffset: 4, }, }, - "/en-us/docs/web/c": { - url: "/en-US/docs/Web/C", - metadata: { - title: "C", - locale: "en-US", - slug: "Web/C", - tags: ["Web"], - }, - rawBody: '{{page("/en-US/docs/Web/B")}}', - isMarkdown: false, - fileInfo: { - path: "testing/content/files/en-us/web/c", - frontMatterOffset: 5, - }, - }, "/en-us/docs/web/css/number": { url: "/en-US/docs/Web/CSS/number", metadata: { @@ -97,103 +77,53 @@ describe("testing the main render() function", () => { expect(result).toEqual( expect.stringContaining('{{nonExistentMacro("yada")}}') ); - expect(result).toEqual(expect.stringContaining('{{page("bogus")}}')); - expect(result).toEqual( - expect.stringContaining('{{page("/en-US/docs/Web/B", "bogus-section")}}') - ); const brokenLink = $( 'a.page-not-created[title^="The documentation about this has not yet been written"]' ); - expect(brokenLink).toHaveLength(3); + expect(brokenLink).toHaveLength(1); expect(brokenLink.html()).toBe("<code>bigfoot</code>"); const otherLinks = $(`a[href="/en-US/docs/Web/CSS/number"]`); expect(otherLinks).toHaveLength(2); expect(otherLinks.eq(0).html()).toBe("<code><dumber></code>"); expect(otherLinks.eq(1).html()).toBe("<code><number></code>"); // Next, let's check the errors. - expect(errors).toHaveLength(6); + expect(errors).toHaveLength(3); + expect(errors[0]).toBeInstanceOf(MacroBrokenLinkError); - expect(errors[0]).toHaveProperty("line", 4); - expect(errors[0]).toHaveProperty("column", 4); - expect(errors[0]).toHaveProperty( - "filepath", - "testing/content/files/en-us/web/b" - ); - expect(errors[0]).toHaveProperty( - "errorStack", - expect.stringContaining("/en-US/docs/Web/CSS/bigfoot does not exist") - ); - expect(errors[0]).toHaveProperty("macroName", "cssxref"); - expect(errors[0]).toHaveProperty("macroSource", '{{cssxref("bigfoot")}}'); - expect(errors[1]).toBeInstanceOf(MacroBrokenLinkError); - expect(errors[1]).toHaveProperty("line", 8); - expect(errors[1]).toHaveProperty("column", 1); - expect(errors[1]).toHaveProperty( - "filepath", - "testing/content/files/en-us/web/a" - ); - expect(errors[1]).toHaveProperty( - "errorStack", - expect.stringContaining("/en-US/docs/Web/CSS/bigfoot does not exist") - ); - expect(errors[1]).toHaveProperty("macroName", "cssxref"); - expect(errors[1]).toHaveProperty("macroSource", '{{cssxref("bigfoot")}}'); - expect(errors[2]).toBeInstanceOf(MacroNotFoundError); - expect(errors[2]).toHaveProperty("line", 9); - expect(errors[2]).toHaveProperty("column", 7); - expect(errors[2]).toHaveProperty( - "filepath", - "testing/content/files/en-us/web/a" - ); - expect(errors[2]).toHaveProperty("macroName", "nonExistentMacro"); - expect(errors[2]).toHaveProperty( - "errorStack", - expect.stringContaining("Unknown macro nonexistentmacro") - ); - expect(errors[3]).toBeInstanceOf(MacroRedirectedLinkError); - expect(errors[3]).toHaveProperty("line", 10); - expect(errors[3]).toHaveProperty("column", 7); - expect(errors[3]).toHaveProperty( - "filepath", - "testing/content/files/en-us/web/a" - ); - expect(errors[3]).toHaveProperty( - "errorStack", - expect.stringContaining( + expect(errors[0]).toMatchObject({ + line: 8, + column: 1, + filepath: "testing/content/files/en-us/web/a", + errorStack: expect.stringContaining( + "/en-US/docs/Web/CSS/bigfoot does not exist" + ), + macroName: "cssxref", + macroSource: '{{cssxref("bigfoot")}}', + }); + + expect(errors[1]).toBeInstanceOf(MacroNotFoundError); + expect(errors[1]).toMatchObject({ + line: 9, + column: 7, + filepath: "testing/content/files/en-us/web/a", + macroName: "nonExistentMacro", + errorStack: expect.stringContaining("Unknown macro nonexistentmacro"), + }); + + expect(errors[2]).toBeInstanceOf(MacroRedirectedLinkError); + expect(errors[2]).toMatchObject({ + line: 10, + column: 7, + filepath: "testing/content/files/en-us/web/a", + errorStack: expect.stringContaining( "/en-US/docs/Web/CSS/dumber redirects to /en-US/docs/Web/CSS/number" - ) - ); - expect(errors[3]).toHaveProperty("macroName", "cssxref"); - expect(errors[3]).toHaveProperty("macroSource", '{{cssxref("dumber")}}'); - expect(errors[3]).toHaveProperty("redirectInfo.current", "dumber"); - expect(errors[3]).toHaveProperty("redirectInfo.suggested", "number"); - expect(errors[4]).toBeInstanceOf(MacroExecutionError); - expect(errors[4]).toHaveProperty("line", 12); - expect(errors[4]).toHaveProperty("column", 7); - expect(errors[4]).toHaveProperty( - "filepath", - "testing/content/files/en-us/web/a" - ); - expect(errors[4]).toHaveProperty("macroName", "page"); - expect(errors[4]).toHaveProperty( - "errorStack", - expect.stringContaining( - "/en-us/docs/web/a references bogus, which does not exist" - ) - ); - expect(errors[5]).toBeInstanceOf(MacroExecutionError); - expect(errors[5]).toHaveProperty("line", 14); - expect(errors[5]).toHaveProperty("column", 7); - expect(errors[5]).toHaveProperty( - "filepath", - "testing/content/files/en-us/web/a" - ); - expect(errors[5]).toHaveProperty("macroName", "page"); - expect(errors[5]).toHaveProperty( - "errorStack", - expect.stringContaining( - 'unable to find an HTML element with an "id" of "bogus-section" within /en-us/docs/web/b' - ) - ); + ), + macroName: "cssxref", + macroSource: '{{cssxref("dumber")}}', + redirectInfo: { + current: "dumber", + suggested: "number", + }, + }); }); }); diff --git a/kumascript/tests/macros/ListGroups.test.ts b/kumascript/tests/macros/ListGroups.test.ts index 93bc94c43984..8db03a3a1fa3 100644 --- a/kumascript/tests/macros/ListGroups.test.ts +++ b/kumascript/tests/macros/ListGroups.test.ts @@ -23,9 +23,16 @@ const groupDataFixture = JSON.parse( const overviewPages = { "/en-US/docs/Web/API/An_overview_page_for_ATestInterface_API": { tags: ["foo", "bar"], + status: [], + }, + "/en-US/docs/Web/API/A2TestInterface_overview": { + tags: ["experimental"], + status: [], + }, + "/en-US/docs/Web/API/An_overview_page_for_BTestInterface_API": { + tags: [], + status: [], }, - "/en-US/docs/Web/API/A2TestInterface_overview": { tags: ["experimental"] }, - "/en-US/docs/Web/API/An_overview_page_for_BTestInterface_API": { tags: [] }, }; /** diff --git a/kumascript/tests/macros/apiref.test.ts b/kumascript/tests/macros/apiref.test.ts index 645de92db0ed..90ce2f5dd45e 100644 --- a/kumascript/tests/macros/apiref.test.ts +++ b/kumascript/tests/macros/apiref.test.ts @@ -137,12 +137,7 @@ const expectedStaticMethods = { "The MyTestStaticMethod2 property of the TestInterface interface is deprecated and non-standard.", }, { - badges: [ - "icon-experimental", - "icon-deprecated", - "icon-nonstandard", - "obsolete", - ], + badges: ["icon-experimental", "icon-deprecated", "icon-nonstandard"], text: "MyTestStaticMethod3", target: "/en-US/docs/Web/API/TestInterface/MyTestStaticMethod3", title: @@ -165,12 +160,7 @@ const expectedStaticMethods = { "The MyTestStaticMethod2 property of the TestInterface interface is deprecated and non-standard.", }, { - badges: [ - "icon-experimental", - "icon-deprecated", - "icon-nonstandard", - "obsolete", - ], + badges: ["icon-experimental", "icon-deprecated", "icon-nonstandard"], text: "MyTestStaticMethod3", target: "/fr/docs/Web/API/TestInterface/MyTestStaticMethod3", title: @@ -193,12 +183,7 @@ const expectedStaticMethods = { "The MyTestStaticMethod2 property of the TestInterface interface is deprecated and non-standard (ja translation).", }, { - badges: [ - "icon-experimental", - "icon-deprecated", - "icon-nonstandard", - "obsolete", - ], + badges: ["icon-experimental", "icon-deprecated", "icon-nonstandard"], text: "MyTestStaticMethod3", target: "/ja/docs/Web/API/TestInterface/MyTestStaticMethod3", title: @@ -224,12 +209,7 @@ const expectedInstanceMethods = { "The MyTestInstanceMethod2 property of the TestInterface interface is deprecated and non-standard.", }, { - badges: [ - "icon-experimental", - "icon-deprecated", - "icon-nonstandard", - "obsolete", - ], + badges: ["icon-experimental", "icon-deprecated", "icon-nonstandard"], text: "MyTestInstanceMethod3", target: "/en-US/docs/Web/API/TestInterface/MyTestInstanceMethod3", title: @@ -252,12 +232,7 @@ const expectedInstanceMethods = { "The MyTestInstanceMethod2 property of the TestInterface interface is deprecated and non-standard.", }, { - badges: [ - "icon-experimental", - "icon-deprecated", - "icon-nonstandard", - "obsolete", - ], + badges: ["icon-experimental", "icon-deprecated", "icon-nonstandard"], text: "MyTestInstanceMethod3", target: "/fr/docs/Web/API/TestInterface/MyTestInstanceMethod3", title: @@ -280,12 +255,7 @@ const expectedInstanceMethods = { "The MyTestInstanceMethod2 property of the TestInterface interface is deprecated and non-standard (ja translation).", }, { - badges: [ - "icon-experimental", - "icon-deprecated", - "icon-nonstandard", - "obsolete", - ], + badges: ["icon-experimental", "icon-deprecated", "icon-nonstandard"], text: "MyTestInstanceMethod3", target: "/ja/docs/Web/API/TestInterface/MyTestInstanceMethod3", title: diff --git a/kumascript/tests/macros/fixtures/apiref/subpages.json b/kumascript/tests/macros/fixtures/apiref/subpages.json index f7c3acee8e76..39da6f512ae5 100644 --- a/kumascript/tests/macros/fixtures/apiref/subpages.json +++ b/kumascript/tests/macros/fixtures/apiref/subpages.json @@ -2,6 +2,7 @@ { "tags": [], "pageType": "web-api-static-property", + "status": [], "locale": "en-US", "translations": [ { @@ -21,6 +22,7 @@ { "tags": [], "pageType": "web-api-instance-property", + "status": [], "locale": "en-US", "translations": [ { @@ -40,6 +42,7 @@ { "tags": ["Experimental"], "pageType": "web-api-static-method", + "status": [], "locale": "en-US", "translations": [ { @@ -59,6 +62,7 @@ { "tags": ["Deprecated", "Non-standard"], "pageType": "web-api-static-method", + "status": [], "locale": "en-US", "translations": [ { @@ -76,8 +80,9 @@ }, { - "tags": ["Deprecated", "Non-standard", "Obsolete", "Experimental"], + "tags": ["Deprecated", "Non-standard", "Experimental"], "pageType": "web-api-static-method", + "status": [], "locale": "en-US", "translations": [ { @@ -97,6 +102,7 @@ { "tags": ["Experimental"], "pageType": "web-api-instance-method", + "status": [], "locale": "en-US", "translations": [ { @@ -116,6 +122,7 @@ { "tags": ["Deprecated", "Non-standard"], "pageType": "web-api-instance-method", + "status": [], "locale": "en-US", "translations": [ { @@ -133,8 +140,9 @@ }, { - "tags": ["Deprecated", "Non-standard", "Obsolete", "Experimental"], + "tags": ["Deprecated", "Non-standard", "Experimental"], "pageType": "web-api-instance-method", + "status": [], "locale": "en-US", "translations": [ { @@ -154,6 +162,7 @@ { "tags": [], "pageType": "web-api-event", + "status": [], "locale": "en-US", "translations": [ { @@ -173,6 +182,7 @@ { "tags": ["Deprecated", "Non-standard"], "pageType": "web-api-event", + "status": [], "locale": "en-US", "translations": [ { @@ -192,6 +202,7 @@ { "tags": [], "pageType": "web-api-event", + "status": [], "locale": "en-US", "translations": [ { diff --git a/libs/constants/index.js b/libs/constants/index.js index d2097416ddf0..c46364b4a084 100644 --- a/libs/constants/index.js +++ b/libs/constants/index.js @@ -175,7 +175,6 @@ const VALID_FLAW_CHECKS = new Set([ "macros", "broken_links", "bad_bcd_queries", - "bad_bcd_links", "images", "image_widths", "bad_pre_tags", diff --git a/libs/types/document.ts b/libs/types/document.ts index eca7c403f048..502ed6e4c727 100644 --- a/libs/types/document.ts +++ b/libs/types/document.ts @@ -23,12 +23,6 @@ export interface BrokenLink extends GenericFlaw { column: number; } -export interface BadBCDLinkFlaw extends GenericFlaw { - slug: string; - query: string | null; - key: string; -} - export interface ImageReferenceFlaw extends GenericFlaw { src: string; line: number; @@ -105,7 +99,6 @@ export type Flaws = Partial<{ broken_links: BrokenLink[]; macros: MacroErrorMessage[]; bad_bcd_queries: BadBCDQueryFlaw[]; - bad_bcd_links: BadBCDLinkFlaw[]; images: ImageReferenceFlaw[]; bad_pre_tags: BadPreTagFlaw[]; sectioning: SectioningFlaw[]; @@ -210,20 +203,6 @@ export interface BCDSection { id: string; title: string; isH3: boolean; - data?: BCD.Identifier | null; - dataURL?: string; query: string; - browsers?: BCD.Browsers | null; }; } - -// Yari builder will attach extra keys from the compat data -// it gets from @mdn/browser-compat-data. These are "Yari'esque" -// extras that helps us avoiding to have a separate data structure. -export interface CompatStatementExtended extends BCD.CompatStatement { - // When a compat statement has a .mdn_url but it's actually not a good - // one, the Yari builder will attach an extra boolean that indicates - // that it's not a valid link. - // Note, it's only 'true' if it's present, hence this interface definition. - bad_url?: true; -} diff --git a/lint-staged.config.js b/lint-staged.config.js new file mode 100644 index 000000000000..2a791d1697b9 --- /dev/null +++ b/lint-staged.config.js @@ -0,0 +1,5 @@ +module.exports = { + "*.!{js,jsx,ts,tsx,css,scss}": "prettier --ignore-unknown --write", + "*.{js,jsx,ts,tsx}": ["eslint --fix", "prettier --write"], + "*.{css,scss}": ["stylelint --fix --allow-empty-input", "prettier --write"], +}; diff --git a/package.json b/package.json index ff6389b5dd4b..312185a15741 100644 --- a/package.json +++ b/package.json @@ -21,11 +21,11 @@ "build:ssr": "cd ssr && webpack --mode=production", "build:sw": "cd client/pwa && yarn && yarn build:prod", "build:sw-dev": "cd client/pwa && yarn && yarn build", + "check:tsc": "find . -mindepth 2 -name 'tsconfig.json' ! -wholename '**/node_modules/**' -print0 | xargs -n1 -P 2 -0 bash -c 'cd `dirname $0` && echo \"🔄 $(pwd)\" && npx tsc --noEmit && echo \"☑️ $(pwd)\" || exit 255'", "dev": "yarn build:prepare && nf -j Procfile.dev start", "eslint": "eslint .", "filecheck": "ts-node filecheck/cli.ts", "m2h": "ts-node markdown/m2h/cli.ts", - "md": "echo 'The HTML to Markdown conversion command has been moved to https://github.com/mdn/markdown!' && exit 1", "prepack": "yarn build:dist", "prepare": "husky install", "prettier-check": "prettier --check .", @@ -34,7 +34,7 @@ "start:client": "cd client && cross-env BROWSER=none PORT=3000 node scripts/start.js", "start:dev-server": "node-dev server/index.ts", "start:server": "ts-node server", - "start:static-server": "cross-env ENV_FILE=testing/.env ts-node server/static.ts", + "start:static-server": "ts-node server/static.ts", "style-dictionary": "style-dictionary build -c sd-config.js", "stylelint": "stylelint \"**/*.scss\"", "test": "yarn prettier-check && yarn test:client && yarn test:kumascript && yarn test:content && yarn test:testing", @@ -54,13 +54,13 @@ "dependencies": { "@caporal/core": "^2.0.2", "@fast-csv/parse": "^4.3.6", - "@mdn/browser-compat-data": "^5.2.23", + "@mdn/bcd-utils-api": "^0.0.3", + "@mdn/browser-compat-data": "^5.2.34", "@mozilla/glean": "1.3.0", "@use-it/interval": "^1.0.0", "@webref/css": "^5.4.4", "accept-language-parser": "^1.5.0", "async": "^3.2.4", - "browser-specs": "^3.36.0", "chalk": "^4.1.2", "cheerio": "^1.0.0-rc.12", "cli-progress": "^3.11.2", @@ -69,7 +69,7 @@ "cookie-parser": "^1.4.6", "css-tree": "^2.3.1", "dayjs": "^1.11.7", - "dexie": "^3.2.2", + "dexie": "^3.2.3", "dotenv": "^16.0.3", "ejs": "^3.1.8", "express": "^4.18.2", @@ -78,7 +78,7 @@ "front-matter": "^4.0.2", "fs-extra": "^11.1.0", "got": "^11.8.3", - "html-react-parser": "^3.0.6", + "html-react-parser": "^3.0.8", "http-proxy-middleware": "^2.0.6", "image-size": "^1.0.2", "image-type": "^4.1.0", @@ -94,8 +94,8 @@ "lru-cache": "^7.14.1", "md5-file": "^5.0.0", "mdast-util-from-markdown": "^0.8.5", - "mdast-util-phrasing": "^2.0.0", - "mdn-data": "^2.0.30", + "mdast-util-phrasing": "^3.0.1", + "mdn-data": "^2.0.31", "open": "^8.4.0", "open-editor": "^3.0.0", "prismjs": "^1.29.0", @@ -114,85 +114,84 @@ "tempy": "^1.0.1", "unified": "^9.2.1", "unist-builder": "^2.0.3", - "unist-util-visit": "^2.0.3" + "unist-util-visit": "^2.0.3", + "web-specs": "^2.46.0" }, "devDependencies": { - "@babel/core": "^7.20.7", + "@babel/core": "^7.20.12", "@babel/eslint-parser": "^7.19.1", "@babel/preset-env": "^7.20.2", - "@mdn/bcd-utils-api": "^0.0.2", "@mdn/dinocons": "^0.5.5", "@mdn/minimalist": "^2.0.4", - "@playwright/test": "^1.29.1", + "@playwright/test": "^1.30.0", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.10", "@svgr/webpack": "^6.5.1", - "@swc/core": "^1.3.24", + "@swc/core": "^1.3.32", "@testing-library/react": "^13.4.0", "@types/async": "^3.2.16", "@types/cli-progress": "^3.11.0", "@types/hast": "^2.3.4", "@types/imagemin": "^8.0.0", - "@types/jest": "^29.2.4", + "@types/jest": "^29.4.0", "@types/mdast": "^3.0.10", - "@types/node": "^16.18.10", - "@types/react": "^18.0.26", + "@types/node": "^16.18.12", + "@types/react": "^18.0.27", "@types/react-dom": "^18.0.10", "@types/react-modal": "^3.13.1", - "@typescript-eslint/eslint-plugin": "^5.47.1", - "@typescript-eslint/parser": "^5.47.1", - "babel-jest": "^29.3.1", - "babel-loader": "^9.1.0", + "@typescript-eslint/eslint-plugin": "^5.50.0", + "@typescript-eslint/parser": "^5.50.0", + "babel-jest": "^29.4.1", + "babel-loader": "^9.1.2", "babel-plugin-named-asset-import": "^0.3.8", "babel-preset-react-app": "^10.0.1", "bfj": "^7.0.2", "braces": "^3.0.2", - "browserslist": "^4.21.4", + "browserslist": "^4.21.5", "camelcase": "^6.2.1", "case-sensitive-paths-webpack-plugin": "^2.4.0", "cross-env": "^7.0.3", "css-loader": "^6.7.3", "css-minimizer-webpack-plugin": "^4.2.2", "diff": "^5.1.0", - "dotenv-expand": "^10.0.0", "downshift": "^6.1.12", - "eslint": "^8.30.0", + "eslint": "^8.33.0", "eslint-config-react-app": "^7.0.1", "eslint-gitignore": "^0.1.0", "eslint-plugin-flowtype": "^8.0.3", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jest": "^27.1.7", - "eslint-plugin-jsx-a11y": "^6.6.1", - "eslint-plugin-n": "^15.6.0", - "eslint-plugin-react": "^7.31.11", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-jest": "^27.2.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-n": "^15.6.1", + "eslint-plugin-react": "^7.32.2", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-unicorn": "^45.0.2", - "eslint-webpack-plugin": "^3.2.0", + "eslint-webpack-plugin": "^4.0.0", "extend": "^3.0.2", "file-loader": "^6.2.0", "foreman": "^3.0.1", "history": "^5.2.0", - "html-validate": "^7.12.0", + "html-validate": "^7.13.1", "html-webpack-plugin": "^5.5.0", - "husky": "^8.0.2", + "husky": "^8.0.3", "identity-obj-proxy": "^3.0.0", "ignore-loader": "^0.1.2", - "jest": "^29.3.1", - "jest-environment-jsdom": "^29.3.1", + "jest": "^29.4.1", + "jest-environment-jsdom": "^29.4.1", "jest-junit-reporter": "^1.1.0", - "jest-resolve": "^29.3.1", - "jest-watch-typeahead": "^2.2.1", - "jsdom": "^20.0.3", + "jest-resolve": "^29.4.1", + "jest-watch-typeahead": "^2.2.2", + "jsdom": "^21.1.0", "lint-staged": "^13.1.0", "mini-css-extract-plugin": "^2.7.2", - "node-dev": "^7.4.3", + "node-dev": "^8.0.0", "pegjs": "^0.10.0", - "postcss": "^8.4.20", + "postcss": "^8.4.21", "postcss-flexbugs-fixes": "^5.0.2", "postcss-loader": "^7.0.2", "postcss-normalize": "^10.0.1", - "postcss-preset-env": "^7.8.3", - "prettier": "^2.8.1", - "prettier-plugin-packagejson": "^2.3.0", + "postcss-preset-env": "^8.0.1", + "prettier": "^2.8.3", + "prettier-plugin-packagejson": "^2.4.2", "prompts": "^2.4.2", "react": "^18.2.0", "react-app-polyfill": "^3.0.0", @@ -201,20 +200,20 @@ "react-is": "^18.2.0", "react-refresh": "^0.14", "react-router": "^6.3.0", - "react-router-dom": "^6.6.1", + "react-router-dom": "^6.8.0", "rehype-minify-whitespace": "^4.0.5", "remark-prettier": "^2.0.0", "resolve": "^1.22.1", "resolve-url-loader": "^5.0.0", "rough-notation": "^0.5.1", - "sass": "^1.57.1", + "sass": "^1.58.0", "sass-loader": "^13.2.0", "semver": "^7.3.8", "source-map-explorer": "^2.5.3", "source-map-loader": "^4.0.1", - "style-dictionary": "^3.7.1", + "style-dictionary": "^3.7.2", "style-loader": "^3.3.1", - "stylelint": "^14.16.0", + "stylelint": "^14.16.1", "stylelint-a11y": "^1.2.3", "stylelint-config-prettier": "^9.0.4", "stylelint-config-recommended": "^9.0.0", @@ -224,11 +223,11 @@ "swr": "^1.3.0", "tailwindcss": "^3.2.4", "terser-webpack-plugin": "^5.3.6", - "ts-jest": "^29.0.3", + "ts-jest": "^29.0.5", "ts-loader": "^9.4.2", "ts-node": "^10.9.1", - "typescript": "^4.9.4", - "use-debounce": "^9.0.2", + "typescript": "^4.9.5", + "use-debounce": "^9.0.3", "webpack": "^5.75.0", "webpack-cli": "^5.0.1", "webpack-dev-middleware": "^6.0.1", diff --git a/scripts/lint.sh b/scripts/lint.sh index 3317b7cd1a4b..8e915340849a 100755 --- a/scripts/lint.sh +++ b/scripts/lint.sh @@ -27,3 +27,9 @@ echo "Lint stylelint" echo "--------------" yarn stylelint + +echo "--------------" +echo "Check TypeScript" +echo "--------------" + +yarn check:tsc \ No newline at end of file diff --git a/scripts/testing.sh b/scripts/testing.sh index 117a8faf5f3c..3cefc6f4079e 100755 --- a/scripts/testing.sh +++ b/scripts/testing.sh @@ -20,8 +20,7 @@ echo "----------------------" echo "Build and start server" echo "----------------------" -export ENV_FILE="testing/.env" -cp testing/.env client/ +export ENV_FILE=".env.testing" yarn build:prepare yarn build diff --git a/server/index.ts b/server/index.ts index da3036fc2200..1cffffd4a67d 100644 --- a/server/index.ts +++ b/server/index.ts @@ -9,7 +9,7 @@ import send from "send"; import { createProxyMiddleware } from "http-proxy-middleware"; import cookieParser from "cookie-parser"; import openEditor from "open-editor"; -import getBCDDataForPath from "@mdn/bcd-utils-api"; +import { getBCDDataForPath } from "@mdn/bcd-utils-api"; import { buildDocument, @@ -36,6 +36,8 @@ import { router as translationsRouter } from "./translations"; import { staticMiddlewares, originRequestMiddleware } from "./middlewares"; import { getRoot } from "../content/utils"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore import { renderHTML } from "../ssr/dist/main"; async function buildDocumentFromURL(url) { @@ -260,10 +262,8 @@ app.get("/*", async (req, res, ...args) => { let lookupURL = decodeURI(req.path); let extraSuffix = ""; - let bcdDataURL = ""; let isMetadata = false; let isDocument = false; - const bcdDataURLRegex = /\/(bcd-\d+|bcd)\.json$/; if (req.path.endsWith("index.json")) { // It's a bit special then. @@ -279,21 +279,16 @@ app.get("/*", async (req, res, ...args) => { isMetadata = true; extraSuffix = "/metadata.json"; lookupURL = lookupURL.replace(extraSuffix, ""); - } else if (bcdDataURLRegex.test(req.path)) { - bcdDataURL = req.path; - lookupURL = lookupURL.replace(bcdDataURLRegex, ""); } const isJSONRequest = extraSuffix.endsWith(".json"); let document; - let bcdData; try { console.time(`buildDocumentFromURL(${lookupURL})`); const built = await buildDocumentFromURL(lookupURL); if (built) { document = built.doc; - bcdData = built.bcdData; } else if ( lookupURL.split("/")[1] && lookupURL.split("/")[1].toLowerCase() !== DEFAULT_LOCALE.toLowerCase() && @@ -324,12 +319,6 @@ app.get("/*", async (req, res, ...args) => { .sendFile(path.join(STATIC_ROOT, "en-us", "_spas", "404.html")); } - if (bcdDataURL) { - return res.json( - bcdData.find((data) => data.url.toLowerCase() === bcdDataURL).data - ); - } - if (isDocument) { res.json({ doc: document }); } else if (isMetadata) { diff --git a/server/translations.ts b/server/translations.ts index 8ba74e709099..e0df07598e67 100644 --- a/server/translations.ts +++ b/server/translations.ts @@ -29,10 +29,10 @@ function getAllPopularityValues() { return allPopularityValues; } -function replaceSepPerOS(slug) { +function replaceSepPerOS(slug: string) { if (path.sep !== "/") { // In other words, we're on Windows - return slug.replaceAll("/", "\\\\"); + return slug.replace(/\//g, "\\\\"); } else { return slug; } @@ -404,7 +404,13 @@ function gatherL10NstatsSection({ const _detailsSectionCache = new Map(); -function buildL10nDashboard({ locale, section }) { +function buildL10nDashboard({ + locale, + section, +}: { + locale: string; + section: string; +}) { if (locale === DEFAULT_LOCALE) { throw new Error("Can't run this for the default locale"); } @@ -464,7 +470,7 @@ function buildL10nDashboard({ locale, section }) { upToDate: l10nStatsSection.counts.upToDate, }; - function filterChildrenDocs(url, section) { + function filterChildrenDocs(url: string, section: string) { return ( (section.length === 1 && url.split("/").length > 4) || url.split("/").length > section.split("/").length + 3 @@ -621,8 +627,8 @@ router.get("/dashboard", async (req, res) => { if (!CONTENT_TRANSLATED_ROOT) { return res.status(500).send("CONTENT_TRANSLATED_ROOT not set"); } - const locale = (req.query.locale as string)?.toLowerCase(); - const section = req.query.section || "/"; + const locale = String(req.query.locale || "").toLowerCase(); + const section = String(req.query.section || "/"); if (!locale) { return res.status(400).send("'locale' is always required"); } diff --git a/testing/README.md b/testing/README.md index 7521843c7ef5..c7b2d989d296 100644 --- a/testing/README.md +++ b/testing/README.md @@ -19,7 +19,7 @@ attachments generated from that build. To run these tests, first run: ```sh -export ENV_FILE=testing/.env +export ENV_FILE=.env.testing yarn build:prepare yarn build yarn start:static-server @@ -49,7 +49,7 @@ Headless tests are all about using a headless browser to browse the built HTML files with `playwright`. It's based on the same steps as above, so first: ```sh -export ENV_FILE=testing/.env +export ENV_FILE=.env.testing yarn test:prepare ``` diff --git a/testing/content/files/en-us/_wikihistory.json b/testing/content/files/en-us/_wikihistory.json index d00eb656306b..aa39c45aeb0e 100644 --- a/testing/content/files/en-us/_wikihistory.json +++ b/testing/content/files/en-us/_wikihistory.json @@ -33,12 +33,6 @@ "chrisdavidmills" ] }, - "Learn/CSS/CSS_layout/Introduction/Grid/Stuff": { - "modified": "2020-04-21T08:33:20.154Z", - "contributors": [ - "chrisdavidmills" - ] - }, "Web/API/Blob": { "modified": "2020-05-28T22:35:45.839Z", "contributors": [ diff --git a/testing/content/files/en-us/chicken_and_egg/chicken/index.html b/testing/content/files/en-us/chicken_and_egg/chicken/index.html deleted file mode 100644 index 4d8c3ce0c7d8..000000000000 --- a/testing/content/files/en-us/chicken_and_egg/chicken/index.html +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Chicken -slug: Chicken_and_egg/chicken ---- - -<h2 id="Introduction">Introduction</h2> - -<p>I'm the Chicken page. I think I came first!</p> -<p>The <a href="/en-US/docs/Chicken_and_egg/egg">egg</a> did not come first.</p> - -<h2>Family</h2> - -{{page("/en-US/docs/Chicken_and_egg/egg", "Introduction")}} diff --git a/testing/content/files/en-us/chicken_and_egg/egg/index.html b/testing/content/files/en-us/chicken_and_egg/egg/index.html deleted file mode 100644 index a218829eb43c..000000000000 --- a/testing/content/files/en-us/chicken_and_egg/egg/index.html +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Egg -slug: Chicken_and_egg/egg ---- - -<h2 id="Introduction">Introduction</h2> - -<p>I'm the Egg page. I think I came first!</p> -<p>The <a href="/en-US/docs/Chicken_and_egg/chicken">chicken</a> did not come first.</p> - -<h2>Family</h2> - -{{page("/en-US/docs/Chicken_and_egg/chicken", "Introduction")}} diff --git a/testing/content/files/en-us/chicken_and_egg/index.html b/testing/content/files/en-us/chicken_and_egg/index.html deleted file mode 100644 index a9e46a875c07..000000000000 --- a/testing/content/files/en-us/chicken_and_egg/index.html +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: Chicken and Egg -slug: Chicken_and_egg ---- - -<p>This page has two <i>children</i>. They are:</p> - -<h3>Chicken...</h3> -{{page("/en-US/docs/Chicken_and_egg/chicken", "Introduction")}} - -<h3>Egg...</h3> -{{page("/en-US/docs/Chicken_and_egg/egg", "Introduction")}} diff --git a/testing/content/files/en-us/learn/css/css_layout/introduction/grid/index.html b/testing/content/files/en-us/learn/css/css_layout/introduction/grid/index.html index 47ea97743448..75ea8b81ab76 100644 --- a/testing/content/files/en-us/learn/css/css_layout/introduction/grid/index.html +++ b/testing/content/files/en-us/learn/css/css_layout/introduction/grid/index.html @@ -16,7 +16,83 @@ <h2 id="Grid_Layout">Grid Layout</h2> and also tests that prerequisites are handled as part of the rendering and live-sample-building process. --> -<div id="Grid_1">{{ Page("Learn/CSS/CSS_layout/Introduction/Grid/Stuff", "Grid_1") }}</div> + +<div id="Grid_1"> +<div class="hidden"> +<h6 id="Grid_example_1">Grid example 1</h6> + +<pre class="brush: css"> * {box-sizing: border-box;} + + .wrapper > div { + border-radius: 5px; + background-color: rgb(207,232,220); + padding: 1em; + } + </pre> +</div> + +<pre class="brush: css">.wrapper { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + grid-template-rows: 100px 100px; + grid-gap: 10px; +} +</pre> + +<pre class="brush: html"><div class="wrapper"> + <div class="box1">One</div> + <div class="box2">Two</div> + <div class="box3">Three</div> + <div class="box4">Four</div> + <div class="box5">Five</div> + <div class="box6">Six</div> +</div> +</pre> +</div> {{ EmbedLiveSample('Grid_1', '300', '330') }} -<div id="Grid_2">{{ Page("Learn/CSS/CSS_layout/Introduction/Grid/Stuff", "Grid_2") }}</div> + +<div id="Grid_2"> +<div class="hidden"> +<h6 id="Grid_example_2">Grid example 2</h6> + +<pre class="brush: css"> * {box-sizing: border-box;} + + .wrapper > div { + border-radius: 5px; + background-color: rgb(207,232,220); + padding: 1em; + } + </pre> +</div> + +<pre class="brush: css">.wrapper { + display: grid; + grid-template-columns: 1fr 1fr 1fr; + grid-template-rows: 100px 100px; + grid-gap: 10px; +} + +.box1 { + grid-column: 2 / 4; + grid-row: 1; +} + +.box2 { + grid-column: 1; + grid-row: 1 / 3; +} + +.box3 { + grid-row: 2; + grid-column: 3; +} +</pre> + +<pre class="brush: html"><div class="wrapper"> + <div class="box1">One</div> + <div class="box2">Two</div> + <div class="box3">Three</div> +</div> +</pre> +</div> {{ EmbedLiveSample('Grid_2', '300', '330') }} diff --git a/testing/content/files/en-us/learn/css/css_layout/introduction/grid/stuff/index.html b/testing/content/files/en-us/learn/css/css_layout/introduction/grid/stuff/index.html deleted file mode 100644 index 4f24bc8ee75e..000000000000 --- a/testing/content/files/en-us/learn/css/css_layout/introduction/grid/stuff/index.html +++ /dev/null @@ -1,96 +0,0 @@ ---- -title: Stuff for Grid Layout -slug: Learn/CSS/CSS_layout/Introduction/Grid/Stuff -tags: - - Stuff - - Beginner - - CSS - - Grids - - Introduction - - Layout - - Learn ---- -<div id="Grid_1"> -<div class="hidden"> -<h6 id="Grid_example_1">Grid example 1</h6> - -<pre class="brush: css"> * {box-sizing: border-box;} - - .wrapper > div { - border-radius: 5px; - background-color: rgb(207,232,220); - padding: 1em; - } - </pre> -</div> - -<pre class="brush: css">.wrapper { - display: grid; - grid-template-columns: 1fr 1fr 1fr; - grid-template-rows: 100px 100px; - grid-gap: 10px; -} -</pre> - -<pre class="brush: html"><div class="wrapper"> - <div class="box1">One</div> - <div class="box2">Two</div> - <div class="box3">Three</div> - <div class="box4">Four</div> - <div class="box5">Five</div> - <div class="box6">Six</div> -</div> -</pre> -</div> - -<div id="Grid_2"> -<div class="hidden"> -<h6 id="Grid_example_2">Grid example 2</h6> - -<pre class="brush: css"> * {box-sizing: border-box;} - - .wrapper > div { - border-radius: 5px; - background-color: rgb(207,232,220); - padding: 1em; - } - </pre> -</div> - -<pre class="brush: css">.wrapper { - display: grid; - grid-template-columns: 1fr 1fr 1fr; - grid-template-rows: 100px 100px; - grid-gap: 10px; -} - -.box1 { - grid-column: 2 / 4; - grid-row: 1; -} - -.box2 { - grid-column: 1; - grid-row: 1 / 3; -} - -.box3 { - grid-row: 2; - grid-column: 3; -} -</pre> - -<pre class="brush: html"><div class="wrapper"> - <div class="box1">One</div> - <div class="box2">Two</div> - <div class="box3">Three</div> -</div> -</pre> -</div> - -<!-- -The following macro calls create the conditions necessary for -duplicate, repeating flaws. ---> -<p>{{ doesnotexist() }}</p> -<p>{{ Page("/en-us/docs/does/not/exist") }}</p> diff --git a/testing/content/files/en-us/web/foo/index.html b/testing/content/files/en-us/web/foo/index.html index a4c033c7afc7..6589f53d0328 100644 --- a/testing/content/files/en-us/web/foo/index.html +++ b/testing/content/files/en-us/web/foo/index.html @@ -13,10 +13,6 @@ <p>This becomes the summary.</p> -<p>Let's include some other pages:</p> -<div>{{page("web/fubar")}}</div> -<div>{{page("web/fixable_flaws")}}</div> - <figure> <img src="screenshot.png" alt="Screenshot of colors"> <figcaption>A perfectly normal image</figcaption> diff --git a/testing/content/files/en-us/web/fubar/index.html b/testing/content/files/en-us/web/fubar/index.html index 08a56a4c2cae..3e158273aa84 100644 --- a/testing/content/files/en-us/web/fubar/index.html +++ b/testing/content/files/en-us/web/fubar/index.html @@ -5,7 +5,4 @@ - slang - acronym --- -<p>Let's include some other pages:</p> -<div>{{page("web/fixable_flaws")}}</div> -<div>{{page("does-not-exist")}}</div> <div>{{ EmbedLiveSample('example', '300', '300', "", "does/not/exist") }}</div> diff --git a/testing/content/files/jsondata/L10n-CSS.json b/testing/content/files/jsondata/L10n-CSS.json index 98cf77c33f85..de6e30f1038e 100644 --- a/testing/content/files/jsondata/L10n-CSS.json +++ b/testing/content/files/jsondata/L10n-CSS.json @@ -6,70 +6,60 @@ "zh-CN": "CSS 参考", "es": "Referencia CSS", "pt-PT": "Referência CSS", - "ru": "CSS документация", - "it": "Riferimento CSS" + "ru": "CSS документация" }, "at_rules": { "en-US": "At-Rules", "fr": "Règles @", "ja": "アット規則", - "ru": "@-правила", - "it": "Regole @" + "ru": "@-правила" }, "types": { "en-US": "Data types", "fr": "Types de donnée", "ja": "データ型", - "ru": "Типы данных", - "it": "Tipi di dato" + "ru": "Типы данных" }, "missing": { "en-US": "Value not found in DB!", "fr": "Valeur introuvable dans la base de données", "ja": "DB に値が見つかりません!", - "ru": "Значение не найдено в базе данных!", - "it": "Valore non trovato all'interno della base di dati" + "ru": "Значение не найдено в базе данных!" }, "info_in_preview_not_available": { "en-US": "CSS info in preview not available", "fr": "CSS-Info n'est pas disponible en aperçu", "ja": "プレビューでは CSS info は利用できません", - "ru": "CSS info недоступно в предпросмотре", - "it": "Informazione CSS non disponibile nell'anteprima" + "ru": "CSS info недоступно в предпросмотре" }, "tag_selectors": { "en-US": "Selectors", "fr": "Sélecteur", "ja": "セレクター", - "ru": "Селекторы", - "it": "Selettori" + "ru": "Селекторы" }, "Basic Selectors": { "en-US": "Basic Selectors", "fr": "Sélecteurs simples", "ja": "基本セレクター", - "ru": "Базовые селекторы", - "it": "Selettori di base" + "ru": "Базовые селекторы" }, "Combinators": { "en-US": "Combinators", "fr": "Combinateurs", "ja": "結合子", - "ru": "Комбинаторы", - "it": "Combinatori" + "ru": "Комбинаторы" }, "Pseudo-classes": { "en-US": "Pseudo-classes", "fr": "Pseudo-classes", "ja": "擬似クラス", - "ru": "Псевдоклассы", - "it": "Pseudo-classi" + "ru": "Псевдоклассы" }, "Pseudo-elements": { "en-US": "Pseudo-elements", "fr": "Pseudo-éléments", "ja": "擬似要素", - "ru": "Псевдоэлементы", - "it": "Pseudo-elementi" + "ru": "Псевдоэлементы" } } diff --git a/testing/content/files/jsondata/L10n-Common.json b/testing/content/files/jsondata/L10n-Common.json index e0432140e91e..537f1bf4171c 100644 --- a/testing/content/files/jsondata/L10n-Common.json +++ b/testing/content/files/jsondata/L10n-Common.json @@ -1,7 +1,6 @@ { "summary": { "en-US": "The documentation about this has not yet been written; please consider contributing!", - "ca": "Aquesta pàgina encara no ha estat traduïda. Si us plau considera contribuir-hi!", "es": "La documentación acerca de este tema no ha sido escrita todavía . ¡Por favor considera contribuir !", "fr": "Cette documentation n'a pas encore été rédigée, vous pouvez aider en contribuant !", "pt-BR": "A documentação sobre isto ainda não foi escrita; por favor considere contribuir!", @@ -13,12 +12,10 @@ "Methods": { "en-US": "Methods", "fr": "Méthodes", - "it": "Metodi", "es": "Métodos", "pt-BR": "Métodos", "ru": "Методы", "zh-CN": "方法", - "ca": "Mètodes", "ja": "メソッド" }, @@ -29,8 +26,6 @@ "pt-BR": "Propriedades", "ru": "Свойства", "zh-CN": "属性", - "it": "Proprietà", - "ca": "Propietats", "ja": "プロパティ" }, @@ -50,8 +45,6 @@ "es": "Constructor", "pt-BR": "Construtor", "fr": "Constructeur", - "it": "Costruttore", - "ca": "Constructor", "ja": "コンストラクター", "ru": "Конструктор" }, @@ -63,7 +56,6 @@ "fr": "Héritage :", "ru": "Наследование:", "zh-CN": "继承", - "ca": "Herència", "ja": "継承" }, @@ -72,9 +64,7 @@ "es": "Implementado por:", "pt-BR": "Implementado por:", "fr": "Implémenté par :", - "it": "Implementato da:", "ja": "実装先:", - "ca": "Implementat per", "ru": "Выполняется:" }, @@ -83,8 +73,6 @@ "es": "Páginas relacionadas a $1", "pt-BR": "Páginas relacionadas a $1", "fr": "Pages liées à $1", - "it": "Pagine correlate du $1", - "ca": "Pàgines similars a $1", "ru": "Похожие страницы для $1", "ja": "$1 に関連するページ" }, @@ -94,8 +82,6 @@ "es": "Páginas relacionadas:", "pt-BR": "Páginas relacionadas:", "fr": "Pages similaires :", - "it": "Pagine correlate:", - "ca": "Pàgines similars", "ru": "Похожие страницы:", "ja": "関連するページ" }, @@ -107,7 +93,6 @@ "ja": "リファレンス", "pt-BR": "Referência", "zh-CN": "参考", - "ca": "Referència", "ru": "Руководство" }, @@ -125,7 +110,6 @@ "fr": "[Traduire]", "pt-BR": "[Traduzir]", "zh-CN": "[我来译!]", - "ca": "[Traduir]", "ru": "[Перевести]", "ja": "[翻訳する]" }, @@ -136,7 +120,6 @@ "fr": "Nos volontaires n'ont pas encore traduit cet article en français. Rejoignez-nous et aidez-nous à le faire !", "pt-BR": "Nossos voluntários ainda não traduziram este artigo para sua linguagem. Junte-se a nós e nos ajude a traduzir!", "zh-CN": "此页面仍未被本地化,期待你的翻译!", - "ca": "Els nostres voluntaris encara no han traduït aquest article al Català. Uneix-te a nosaltres i ajuda-ns a acabar la feina!", "ru": "Наши волонтёры ещё не перевели данную статью на Русский. Присоединяйтесь к нам и помогите закончить эту работу!", "ja": "まだボランティアによって日本語に翻訳されていない記事です。MDNに参加して、翻訳してみませんか?" }, diff --git a/testing/content/files/jsondata/L10n-JavaScript.json b/testing/content/files/jsondata/L10n-JavaScript.json index fa9d87ff9af1..ba9bacabc731 100644 --- a/testing/content/files/jsondata/L10n-JavaScript.json +++ b/testing/content/files/jsondata/L10n-JavaScript.json @@ -3,7 +3,6 @@ "en-US": "Standard built-in objects", "fr": "Objets standards", "ru": "Стандартные встроенные объекты", - "zh-CN": "JavaScript 标准库", - "ca": "Objectes estandards" + "zh-CN": "JavaScript 标准库" } } diff --git a/testing/integration/poetry.lock b/testing/integration/poetry.lock index 801faf3cfd31..d60c8df8a447 100644 --- a/testing/integration/poetry.lock +++ b/testing/integration/poetry.lock @@ -1,3 +1,5 @@ +# This file is automatically @generated by Poetry and should not be changed by hand. + [[package]] name = "attrs" version = "20.3.0" @@ -5,6 +7,10 @@ description = "Classes Without Boilerplate" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"}, + {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, +] [package.extras] dev = ["coverage[toml] (>=5.0.2)", "furo", "hypothesis", "pre-commit", "pympler", "pytest (>=4.3.0)", "six", "sphinx", "zope.interface"] @@ -14,18 +20,46 @@ tests-no-zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (> [[package]] name = "black" -version = "22.12.0" +version = "23.1.0" description = "The uncompromising code formatter." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "black-23.1.0-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:b6a92a41ee34b883b359998f0c8e6eb8e99803aa8bf3123bf2b2e6fec505a221"}, + {file = "black-23.1.0-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:57c18c5165c1dbe291d5306e53fb3988122890e57bd9b3dcb75f967f13411a26"}, + {file = "black-23.1.0-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:9880d7d419bb7e709b37e28deb5e68a49227713b623c72b2b931028ea65f619b"}, + {file = "black-23.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6663f91b6feca5d06f2ccd49a10f254f9298cc1f7f49c46e498a0771b507104"}, + {file = "black-23.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:9afd3f493666a0cd8f8df9a0200c6359ac53940cbde049dcb1a7eb6ee2dd7074"}, + {file = "black-23.1.0-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:bfffba28dc52a58f04492181392ee380e95262af14ee01d4bc7bb1b1c6ca8d27"}, + {file = "black-23.1.0-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:c1c476bc7b7d021321e7d93dc2cbd78ce103b84d5a4cf97ed535fbc0d6660648"}, + {file = "black-23.1.0-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:382998821f58e5c8238d3166c492139573325287820963d2f7de4d518bd76958"}, + {file = "black-23.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bf649fda611c8550ca9d7592b69f0637218c2369b7744694c5e4902873b2f3a"}, + {file = "black-23.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:121ca7f10b4a01fd99951234abdbd97728e1240be89fde18480ffac16503d481"}, + {file = "black-23.1.0-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:a8471939da5e824b891b25751955be52ee7f8a30a916d570a5ba8e0f2eb2ecad"}, + {file = "black-23.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8178318cb74f98bc571eef19068f6ab5613b3e59d4f47771582f04e175570ed8"}, + {file = "black-23.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:a436e7881d33acaf2536c46a454bb964a50eff59b21b51c6ccf5a40601fbef24"}, + {file = "black-23.1.0-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:a59db0a2094d2259c554676403fa2fac3473ccf1354c1c63eccf7ae65aac8ab6"}, + {file = "black-23.1.0-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:0052dba51dec07ed029ed61b18183942043e00008ec65d5028814afaab9a22fd"}, + {file = "black-23.1.0-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:49f7b39e30f326a34b5c9a4213213a6b221d7ae9d58ec70df1c4a307cf2a1580"}, + {file = "black-23.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:162e37d49e93bd6eb6f1afc3e17a3d23a823042530c37c3c42eeeaf026f38468"}, + {file = "black-23.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b70eb40a78dfac24842458476135f9b99ab952dd3f2dab738c1881a9b38b753"}, + {file = "black-23.1.0-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:a29650759a6a0944e7cca036674655c2f0f63806ddecc45ed40b7b8aa314b651"}, + {file = "black-23.1.0-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:bb460c8561c8c1bec7824ecbc3ce085eb50005883a6203dcfb0122e95797ee06"}, + {file = "black-23.1.0-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:c91dfc2c2a4e50df0026f88d2215e166616e0c80e86004d0003ece0488db2739"}, + {file = "black-23.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a951cc83ab535d248c89f300eccbd625e80ab880fbcfb5ac8afb5f01a258ac9"}, + {file = "black-23.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0680d4380db3719ebcfb2613f34e86c8e6d15ffeabcf8ec59355c5e7b85bb555"}, + {file = "black-23.1.0-py3-none-any.whl", hash = "sha256:7a0f701d314cfa0896b9001df70a530eb2472babb76086344e688829efd97d32"}, + {file = "black-23.1.0.tar.gz", hash = "sha256:b0bd97bea8903f5a2ba7219257a44e3f1f9d00073d6cc1add68f0beec69692ac"}, +] [package.dependencies] click = ">=8.0.0" mypy-extensions = ">=0.4.3" +packaging = ">=22.0" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} @@ -42,6 +76,10 @@ description = "Bash-style brace expansion for Python" category = "main" optional = false python-versions = "*" +files = [ + {file = "braceexpand-0.1.7-py2.py3-none-any.whl", hash = "sha256:91332d53de7828103dcae5773fb43bc34950b0c8160e35e0f44c4427a3b85014"}, + {file = "braceexpand-0.1.7.tar.gz", hash = "sha256:e6e539bd20eaea53547472ff94f4fb5c3d3bf9d0a89388c4b56663aba765f705"}, +] [[package]] name = "certifi" @@ -50,6 +88,10 @@ description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, + {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, +] [[package]] name = "charset-normalizer" @@ -58,6 +100,10 @@ description = "The Real First Universal Charset Detector. Open, modern and activ category = "main" optional = false python-versions = ">=3.5.0" +files = [ + {file = "charset-normalizer-2.0.3.tar.gz", hash = "sha256:c46c3ace2d744cfbdebceaa3c19ae691f53ae621b39fd7570f59d14fb7f2fd12"}, + {file = "charset_normalizer-2.0.3-py3-none-any.whl", hash = "sha256:88fce3fa5b1a84fdcb3f603d889f723d1dd89b26059d0123ca435570e848d5e1"}, +] [package.extras] unicode-backport = ["unicodedata2"] @@ -69,6 +115,10 @@ description = "Composable command line interface toolkit" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, + {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -81,14 +131,22 @@ description = "Cross-platform colored terminal text." category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, +] [[package]] name = "cssselect" -version = "1.1.0" +version = "1.2.0" description = "cssselect parses CSS3 Selectors and translates them to XPath 1.0" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.7" +files = [ + {file = "cssselect-1.2.0-py2.py3-none-any.whl", hash = "sha256:da1885f0c10b60c03ed5eccbb6b68d6eff248d91976fcde348f395d54c9fd35e"}, + {file = "cssselect-1.2.0.tar.gz", hash = "sha256:666b19839cfaddb9ce9d36bfe4c969132c647b92fc9088c4e23f786b30f1b3dc"}, +] [[package]] name = "exceptiongroup" @@ -97,6 +155,10 @@ description = "Backport of PEP 654 (exception groups)" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.0.4-py3-none-any.whl", hash = "sha256:542adf9dea4055530d6e1279602fa5cb11dab2395fa650b8674eaec35fc4a828"}, + {file = "exceptiongroup-1.0.4.tar.gz", hash = "sha256:bd14967b79cd9bdb54d97323216f8fdf533e278df937aa2a90089e7d6e06e5ec"}, +] [package.extras] test = ["pytest (>=6)"] @@ -108,6 +170,10 @@ description = "the modular source code checker: pep8 pyflakes and co" category = "dev" optional = false python-versions = ">=3.6.1" +files = [ + {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, + {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, +] [package.dependencies] importlib-metadata = {version = ">=1.1.0,<4.3", markers = "python_version < \"3.8\""} @@ -122,6 +188,10 @@ description = "Internationalized Domain Names in Applications (IDNA)" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, + {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, +] [[package]] name = "importlib-metadata" @@ -130,6 +200,10 @@ description = "Read metadata from Python packages" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "importlib_metadata-4.2.0-py3-none-any.whl", hash = "sha256:057e92c15bc8d9e8109738a48db0ccb31b4d9d5cfbee5a8670879a30be66304b"}, + {file = "importlib_metadata-4.2.0.tar.gz", hash = "sha256:b7e52a1f8dec14a75ea73e0891f3060099ca1d8e6a462a4dff11c3e119ea1b31"}, +] [package.dependencies] typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} @@ -146,6 +220,10 @@ description = "iniconfig: brain-dead simple config-ini parsing" category = "main" optional = false python-versions = "*" +files = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] [[package]] name = "lxml" @@ -154,6 +232,78 @@ description = "Powerful and Pythonic XML processing library combining libxml2/li category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" +files = [ + {file = "lxml-4.9.1-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:98cafc618614d72b02185ac583c6f7796202062c41d2eeecdf07820bad3295ed"}, + {file = "lxml-4.9.1-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c62e8dd9754b7debda0c5ba59d34509c4688f853588d75b53c3791983faa96fc"}, + {file = "lxml-4.9.1-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21fb3d24ab430fc538a96e9fbb9b150029914805d551deeac7d7822f64631dfc"}, + {file = "lxml-4.9.1-cp27-cp27m-win32.whl", hash = "sha256:86e92728ef3fc842c50a5cb1d5ba2bc66db7da08a7af53fb3da79e202d1b2cd3"}, + {file = "lxml-4.9.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4cfbe42c686f33944e12f45a27d25a492cc0e43e1dc1da5d6a87cbcaf2e95627"}, + {file = "lxml-4.9.1-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dad7b164905d3e534883281c050180afcf1e230c3d4a54e8038aa5cfcf312b84"}, + {file = "lxml-4.9.1-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a614e4afed58c14254e67862456d212c4dcceebab2eaa44d627c2ca04bf86837"}, + {file = "lxml-4.9.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f9ced82717c7ec65a67667bb05865ffe38af0e835cdd78728f1209c8fffe0cad"}, + {file = "lxml-4.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:d9fc0bf3ff86c17348dfc5d322f627d78273eba545db865c3cd14b3f19e57fa5"}, + {file = "lxml-4.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e5f66bdf0976ec667fc4594d2812a00b07ed14d1b44259d19a41ae3fff99f2b8"}, + {file = "lxml-4.9.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fe17d10b97fdf58155f858606bddb4e037b805a60ae023c009f760d8361a4eb8"}, + {file = "lxml-4.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8caf4d16b31961e964c62194ea3e26a0e9561cdf72eecb1781458b67ec83423d"}, + {file = "lxml-4.9.1-cp310-cp310-win32.whl", hash = "sha256:4780677767dd52b99f0af1f123bc2c22873d30b474aa0e2fc3fe5e02217687c7"}, + {file = "lxml-4.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:b122a188cd292c4d2fcd78d04f863b789ef43aa129b233d7c9004de08693728b"}, + {file = "lxml-4.9.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:be9eb06489bc975c38706902cbc6888f39e946b81383abc2838d186f0e8b6a9d"}, + {file = "lxml-4.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f1be258c4d3dc609e654a1dc59d37b17d7fef05df912c01fc2e15eb43a9735f3"}, + {file = "lxml-4.9.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:927a9dd016d6033bc12e0bf5dee1dde140235fc8d0d51099353c76081c03dc29"}, + {file = "lxml-4.9.1-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9232b09f5efee6a495a99ae6824881940d6447debe272ea400c02e3b68aad85d"}, + {file = "lxml-4.9.1-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:04da965dfebb5dac2619cb90fcf93efdb35b3c6994fea58a157a834f2f94b318"}, + {file = "lxml-4.9.1-cp35-cp35m-win32.whl", hash = "sha256:4d5bae0a37af799207140652a700f21a85946f107a199bcb06720b13a4f1f0b7"}, + {file = "lxml-4.9.1-cp35-cp35m-win_amd64.whl", hash = "sha256:4878e667ebabe9b65e785ac8da4d48886fe81193a84bbe49f12acff8f7a383a4"}, + {file = "lxml-4.9.1-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:1355755b62c28950f9ce123c7a41460ed9743c699905cbe664a5bcc5c9c7c7fb"}, + {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:bcaa1c495ce623966d9fc8a187da80082334236a2a1c7e141763ffaf7a405067"}, + {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6eafc048ea3f1b3c136c71a86db393be36b5b3d9c87b1c25204e7d397cee9536"}, + {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:13c90064b224e10c14dcdf8086688d3f0e612db53766e7478d7754703295c7c8"}, + {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:206a51077773c6c5d2ce1991327cda719063a47adc02bd703c56a662cdb6c58b"}, + {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e8f0c9d65da595cfe91713bc1222af9ecabd37971762cb830dea2fc3b3bb2acf"}, + {file = "lxml-4.9.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8f0a4d179c9a941eb80c3a63cdb495e539e064f8054230844dcf2fcb812b71d3"}, + {file = "lxml-4.9.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:830c88747dce8a3e7525defa68afd742b4580df6aa2fdd6f0855481e3994d391"}, + {file = "lxml-4.9.1-cp36-cp36m-win32.whl", hash = "sha256:1e1cf47774373777936c5aabad489fef7b1c087dcd1f426b621fda9dcc12994e"}, + {file = "lxml-4.9.1-cp36-cp36m-win_amd64.whl", hash = "sha256:5974895115737a74a00b321e339b9c3f45c20275d226398ae79ac008d908bff7"}, + {file = "lxml-4.9.1-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:1423631e3d51008871299525b541413c9b6c6423593e89f9c4cfbe8460afc0a2"}, + {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:2aaf6a0a6465d39b5ca69688fce82d20088c1838534982996ec46633dc7ad6cc"}, + {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:9f36de4cd0c262dd9927886cc2305aa3f2210db437aa4fed3fb4940b8bf4592c"}, + {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ae06c1e4bc60ee076292e582a7512f304abdf6c70db59b56745cca1684f875a4"}, + {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:57e4d637258703d14171b54203fd6822fda218c6c2658a7d30816b10995f29f3"}, + {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6d279033bf614953c3fc4a0aa9ac33a21e8044ca72d4fa8b9273fe75359d5cca"}, + {file = "lxml-4.9.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a60f90bba4c37962cbf210f0188ecca87daafdf60271f4c6948606e4dabf8785"}, + {file = "lxml-4.9.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6ca2264f341dd81e41f3fffecec6e446aa2121e0b8d026fb5130e02de1402785"}, + {file = "lxml-4.9.1-cp37-cp37m-win32.whl", hash = "sha256:27e590352c76156f50f538dbcebd1925317a0f70540f7dc8c97d2931c595783a"}, + {file = "lxml-4.9.1-cp37-cp37m-win_amd64.whl", hash = "sha256:eea5d6443b093e1545ad0210e6cf27f920482bfcf5c77cdc8596aec73523bb7e"}, + {file = "lxml-4.9.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f05251bbc2145349b8d0b77c0d4e5f3b228418807b1ee27cefb11f69ed3d233b"}, + {file = "lxml-4.9.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:487c8e61d7acc50b8be82bda8c8d21d20e133c3cbf41bd8ad7eb1aaeb3f07c97"}, + {file = "lxml-4.9.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8d1a92d8e90b286d491e5626af53afef2ba04da33e82e30744795c71880eaa21"}, + {file = "lxml-4.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:b570da8cd0012f4af9fa76a5635cd31f707473e65a5a335b186069d5c7121ff2"}, + {file = "lxml-4.9.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ef87fca280fb15342726bd5f980f6faf8b84a5287fcc2d4962ea8af88b35130"}, + {file = "lxml-4.9.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:93e414e3206779ef41e5ff2448067213febf260ba747fc65389a3ddaa3fb8715"}, + {file = "lxml-4.9.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6653071f4f9bac46fbc30f3c7838b0e9063ee335908c5d61fb7a4a86c8fd2036"}, + {file = "lxml-4.9.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:32a73c53783becdb7eaf75a2a1525ea8e49379fb7248c3eeefb9412123536387"}, + {file = "lxml-4.9.1-cp38-cp38-win32.whl", hash = "sha256:1a7c59c6ffd6ef5db362b798f350e24ab2cfa5700d53ac6681918f314a4d3b94"}, + {file = "lxml-4.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:1436cf0063bba7888e43f1ba8d58824f085410ea2025befe81150aceb123e345"}, + {file = "lxml-4.9.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:4beea0f31491bc086991b97517b9683e5cfb369205dac0148ef685ac12a20a67"}, + {file = "lxml-4.9.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:41fb58868b816c202e8881fd0f179a4644ce6e7cbbb248ef0283a34b73ec73bb"}, + {file = "lxml-4.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:bd34f6d1810d9354dc7e35158aa6cc33456be7706df4420819af6ed966e85448"}, + {file = "lxml-4.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:edffbe3c510d8f4bf8640e02ca019e48a9b72357318383ca60e3330c23aaffc7"}, + {file = "lxml-4.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6d949f53ad4fc7cf02c44d6678e7ff05ec5f5552b235b9e136bd52e9bf730b91"}, + {file = "lxml-4.9.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:079b68f197c796e42aa80b1f739f058dcee796dc725cc9a1be0cdb08fc45b000"}, + {file = "lxml-4.9.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9c3a88d20e4fe4a2a4a84bf439a5ac9c9aba400b85244c63a1ab7088f85d9d25"}, + {file = "lxml-4.9.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4e285b5f2bf321fc0857b491b5028c5f276ec0c873b985d58d7748ece1d770dd"}, + {file = "lxml-4.9.1-cp39-cp39-win32.whl", hash = "sha256:ef72013e20dd5ba86a8ae1aed7f56f31d3374189aa8b433e7b12ad182c0d2dfb"}, + {file = "lxml-4.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:10d2017f9150248563bb579cd0d07c61c58da85c922b780060dcc9a3aa9f432d"}, + {file = "lxml-4.9.1-pp37-pypy37_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0538747a9d7827ce3e16a8fdd201a99e661c7dee3c96c885d8ecba3c35d1032c"}, + {file = "lxml-4.9.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0645e934e940107e2fdbe7c5b6fb8ec6232444260752598bc4d09511bd056c0b"}, + {file = "lxml-4.9.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:6daa662aba22ef3258934105be2dd9afa5bb45748f4f702a3b39a5bf53a1f4dc"}, + {file = "lxml-4.9.1-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:603a464c2e67d8a546ddaa206d98e3246e5db05594b97db844c2f0a1af37cf5b"}, + {file = "lxml-4.9.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c4b2e0559b68455c085fb0f6178e9752c4be3bba104d6e881eb5573b399d1eb2"}, + {file = "lxml-4.9.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0f3f0059891d3254c7b5fb935330d6db38d6519ecd238ca4fce93c234b4a0f73"}, + {file = "lxml-4.9.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c852b1530083a620cb0de5f3cd6826f19862bafeaf77586f1aef326e49d95f0c"}, + {file = "lxml-4.9.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:287605bede6bd36e930577c5925fcea17cb30453d96a7b4c63c14a257118dbb9"}, + {file = "lxml-4.9.1.tar.gz", hash = "sha256:fe749b052bb7233fe5d072fcb549221a8cb1a16725c47c37e42b0b9cb3ff2c3f"}, +] [package.extras] cssselect = ["cssselect (>=0.7)"] @@ -168,6 +318,10 @@ description = "McCabe checker, plugin for flake8" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] [[package]] name = "mypy-extensions" @@ -176,18 +330,22 @@ description = "Experimental type system extensions for programs checked with the category = "dev" optional = false python-versions = "*" +files = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] [[package]] name = "packaging" -version = "20.4" +version = "23.0" description = "Core utilities for Python packages" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -pyparsing = ">=2.0.2" -six = "*" +python-versions = ">=3.7" +files = [ + {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, + {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, +] [[package]] name = "pathspec" @@ -196,6 +354,10 @@ description = "Utility library for gitignore style pattern matching of file path category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, + {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, +] [[package]] name = "platformdirs" @@ -204,6 +366,10 @@ description = "A small Python module for determining appropriate platform-specif category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "platformdirs-2.2.0-py3-none-any.whl", hash = "sha256:4666d822218db6a262bdfdc9c39d21f23b4cfdb08af331a81e92751daf6c866c"}, + {file = "platformdirs-2.2.0.tar.gz", hash = "sha256:632daad3ab546bd8e6af0537d09805cec458dce201bccfe23012df73332e181e"}, +] [package.extras] docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] @@ -216,6 +382,10 @@ description = "plugin and hook calling mechanisms for python" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, + {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, +] [package.dependencies] importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} @@ -230,6 +400,10 @@ description = "Python style guide checker" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, + {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, +] [[package]] name = "pyflakes" @@ -238,34 +412,41 @@ description = "passive checker of Python programs" category = "dev" optional = false python-versions = ">=3.6" - -[[package]] -name = "pyparsing" -version = "2.4.7" -description = "Python parsing module" -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, + {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, +] [[package]] name = "pyquery" -version = "1.4.3" +version = "2.0.0" description = "A jquery-like library for python" category = "main" optional = false python-versions = "*" +files = [ + {file = "pyquery-2.0.0-py3-none-any.whl", hash = "sha256:8dfc9b4b7c5f877d619bbae74b1898d5743f6ca248cfd5d72b504dd614da312f"}, + {file = "pyquery-2.0.0.tar.gz", hash = "sha256:963e8d4e90262ff6d8dec072ea97285dc374a2f69cad7776f4082abcf6a1d8ae"}, +] [package.dependencies] -cssselect = ">0.7.9" +cssselect = ">=1.2.0" lxml = ">=2.1" +[package.extras] +test = ["pytest", "pytest-cov", "requests", "webob", "webtest"] + [[package]] name = "pytest" -version = "7.2.0" +version = "7.2.1" description = "pytest: simple powerful testing with Python" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "pytest-7.2.1-py3-none-any.whl", hash = "sha256:c7c6ca206e93355074ae32f7403e8ea12163b1163c976fee7d4d84027c162be5"}, + {file = "pytest-7.2.1.tar.gz", hash = "sha256:d45e0952f3727241918b8fd0f376f5ff6b301cc0777c6f9a556935c92d8a7d42"}, +] [package.dependencies] attrs = ">=19.2.0" @@ -287,6 +468,10 @@ description = "pytest plugin for URL based testing" category = "main" optional = false python-versions = ">=3.7,<4.0" +files = [ + {file = "pytest-base-url-2.0.0.tar.gz", hash = "sha256:e1e88a4fd221941572ccdcf3bf6c051392d2f8b6cef3e0bc7da95abec4b5346e"}, + {file = "pytest_base_url-2.0.0-py3-none-any.whl", hash = "sha256:ed36fd632c32af9f1c08f2c2835dcf42ca8fcd097d6ed44a09f253d365ad8297"}, +] [package.dependencies] pytest = ">=3.0.0,<8.0.0" @@ -294,11 +479,15 @@ requests = ">=2.9" [[package]] name = "pytest-rerunfailures" -version = "10.3" +version = "11.0" description = "pytest plugin to re-run tests to eliminate flaky failures" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "pytest-rerunfailures-11.0.tar.gz", hash = "sha256:cee59e4e6f0d73ae63fba099865314ba9b915b719349541110fa012ffb6efb13"}, + {file = "pytest_rerunfailures-11.0-py3-none-any.whl", hash = "sha256:b8c535b6c353de8c4b39258216512c64f288e4d349e86877583a08b2f5ea5441"}, +] [package.dependencies] importlib-metadata = {version = ">=1", markers = "python_version < \"3.8\""} @@ -307,15 +496,19 @@ pytest = ">=5.3" [[package]] name = "requests" -version = "2.28.1" +version = "2.28.2" description = "Python HTTP for Humans." category = "main" optional = false python-versions = ">=3.7, <4" +files = [ + {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, + {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, +] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<3" +charset-normalizer = ">=2,<4" idna = ">=2.5,<4" urllib3 = ">=1.21.1,<1.27" @@ -323,14 +516,6 @@ urllib3 = ">=1.21.1,<1.27" socks = ["PySocks (>=1.5.6,!=1.5.7)"] use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] -[[package]] -name = "six" -version = "1.15.0" -description = "Python 2 and 3 compatibility utilities" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" - [[package]] name = "tomli" version = "2.0.1" @@ -338,6 +523,10 @@ description = "A lil' TOML parser" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] [[package]] name = "typed-ast" @@ -346,6 +535,32 @@ description = "a fork of Python 2 and 3 ast modules with type comment support" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "typed_ast-1.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:669dd0c4167f6f2cd9f57041e03c3c2ebf9063d0757dc89f79ba1daa2bfca9d4"}, + {file = "typed_ast-1.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:211260621ab1cd7324e0798d6be953d00b74e0428382991adfddb352252f1d62"}, + {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:267e3f78697a6c00c689c03db4876dd1efdfea2f251a5ad6555e82a26847b4ac"}, + {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c542eeda69212fa10a7ada75e668876fdec5f856cd3d06829e6aa64ad17c8dfe"}, + {file = "typed_ast-1.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:a9916d2bb8865f973824fb47436fa45e1ebf2efd920f2b9f99342cb7fab93f72"}, + {file = "typed_ast-1.5.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79b1e0869db7c830ba6a981d58711c88b6677506e648496b1f64ac7d15633aec"}, + {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a94d55d142c9265f4ea46fab70977a1944ecae359ae867397757d836ea5a3f47"}, + {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:183afdf0ec5b1b211724dfef3d2cad2d767cbefac291f24d69b00546c1837fb6"}, + {file = "typed_ast-1.5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:639c5f0b21776605dd6c9dbe592d5228f021404dafd377e2b7ac046b0349b1a1"}, + {file = "typed_ast-1.5.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf4afcfac006ece570e32d6fa90ab74a17245b83dfd6655a6f68568098345ff6"}, + {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed855bbe3eb3715fca349c80174cfcfd699c2f9de574d40527b8429acae23a66"}, + {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6778e1b2f81dfc7bc58e4b259363b83d2e509a65198e85d5700dfae4c6c8ff1c"}, + {file = "typed_ast-1.5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:0261195c2062caf107831e92a76764c81227dae162c4f75192c0d489faf751a2"}, + {file = "typed_ast-1.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2efae9db7a8c05ad5547d522e7dbe62c83d838d3906a3716d1478b6c1d61388d"}, + {file = "typed_ast-1.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7d5d014b7daa8b0bf2eaef684295acae12b036d79f54178b92a2b6a56f92278f"}, + {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:370788a63915e82fd6f212865a596a0fefcbb7d408bbbb13dea723d971ed8bdc"}, + {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4e964b4ff86550a7a7d56345c7864b18f403f5bd7380edf44a3c1fb4ee7ac6c6"}, + {file = "typed_ast-1.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:683407d92dc953c8a7347119596f0b0e6c55eb98ebebd9b23437501b28dcbb8e"}, + {file = "typed_ast-1.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4879da6c9b73443f97e731b617184a596ac1235fe91f98d279a7af36c796da35"}, + {file = "typed_ast-1.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e123d878ba170397916557d31c8f589951e353cc95fb7f24f6bb69adc1a8a97"}, + {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebd9d7f80ccf7a82ac5f88c521115cc55d84e35bf8b446fcd7836eb6b98929a3"}, + {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98f80dee3c03455e92796b58b98ff6ca0b2a6f652120c263efdba4d6c5e58f72"}, + {file = "typed_ast-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:0fdbcf2fef0ca421a3f5912555804296f0b0960f0418c440f5d6d3abb549f3e1"}, + {file = "typed_ast-1.5.4.tar.gz", hash = "sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2"}, +] [[package]] name = "typing-extensions" @@ -354,6 +569,10 @@ description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, + {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, +] [[package]] name = "urllib3" @@ -362,6 +581,10 @@ description = "HTTP library with thread-safe connection pooling, file post, and category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +files = [ + {file = "urllib3-1.26.5-py2.py3-none-any.whl", hash = "sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c"}, + {file = "urllib3-1.26.5.tar.gz", hash = "sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098"}, +] [package.extras] brotli = ["brotlipy (>=0.6.0)"] @@ -375,250 +598,16 @@ description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "zipp-3.11.0-py3-none-any.whl", hash = "sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa"}, + {file = "zipp-3.11.0.tar.gz", hash = "sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766"}, +] [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [metadata] -lock-version = "1.1" +lock-version = "2.0" python-versions = "^3.7" -content-hash = "cf40bc32e217dda561959484ee209458125d69cbecd9ccda6942a3b356aba95a" - -[metadata.files] -attrs = [ - {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"}, - {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, -] -black = [ - {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, - {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, - {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, - {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, - {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, - {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, - {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, - {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, - {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, - {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, - {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, - {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, -] -braceexpand = [ - {file = "braceexpand-0.1.7-py2.py3-none-any.whl", hash = "sha256:91332d53de7828103dcae5773fb43bc34950b0c8160e35e0f44c4427a3b85014"}, - {file = "braceexpand-0.1.7.tar.gz", hash = "sha256:e6e539bd20eaea53547472ff94f4fb5c3d3bf9d0a89388c4b56663aba765f705"}, -] -certifi = [ - {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, - {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.0.3.tar.gz", hash = "sha256:c46c3ace2d744cfbdebceaa3c19ae691f53ae621b39fd7570f59d14fb7f2fd12"}, - {file = "charset_normalizer-2.0.3-py3-none-any.whl", hash = "sha256:88fce3fa5b1a84fdcb3f603d889f723d1dd89b26059d0123ca435570e848d5e1"}, -] -click = [ - {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, - {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"}, -] -colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, -] -cssselect = [ - {file = "cssselect-1.1.0-py2.py3-none-any.whl", hash = "sha256:f612ee47b749c877ebae5bb77035d8f4202c6ad0f0fc1271b3c18ad6c4468ecf"}, - {file = "cssselect-1.1.0.tar.gz", hash = "sha256:f95f8dedd925fd8f54edb3d2dfb44c190d9d18512377d3c1e2388d16126879bc"}, -] -exceptiongroup = [ - {file = "exceptiongroup-1.0.4-py3-none-any.whl", hash = "sha256:542adf9dea4055530d6e1279602fa5cb11dab2395fa650b8674eaec35fc4a828"}, - {file = "exceptiongroup-1.0.4.tar.gz", hash = "sha256:bd14967b79cd9bdb54d97323216f8fdf533e278df937aa2a90089e7d6e06e5ec"}, -] -flake8 = [ - {file = "flake8-5.0.4-py2.py3-none-any.whl", hash = "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248"}, - {file = "flake8-5.0.4.tar.gz", hash = "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db"}, -] -idna = [ - {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, - {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, -] -importlib-metadata = [ - {file = "importlib_metadata-4.2.0-py3-none-any.whl", hash = "sha256:057e92c15bc8d9e8109738a48db0ccb31b4d9d5cfbee5a8670879a30be66304b"}, - {file = "importlib_metadata-4.2.0.tar.gz", hash = "sha256:b7e52a1f8dec14a75ea73e0891f3060099ca1d8e6a462a4dff11c3e119ea1b31"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -lxml = [ - {file = "lxml-4.9.1-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:98cafc618614d72b02185ac583c6f7796202062c41d2eeecdf07820bad3295ed"}, - {file = "lxml-4.9.1-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c62e8dd9754b7debda0c5ba59d34509c4688f853588d75b53c3791983faa96fc"}, - {file = "lxml-4.9.1-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:21fb3d24ab430fc538a96e9fbb9b150029914805d551deeac7d7822f64631dfc"}, - {file = "lxml-4.9.1-cp27-cp27m-win32.whl", hash = "sha256:86e92728ef3fc842c50a5cb1d5ba2bc66db7da08a7af53fb3da79e202d1b2cd3"}, - {file = "lxml-4.9.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4cfbe42c686f33944e12f45a27d25a492cc0e43e1dc1da5d6a87cbcaf2e95627"}, - {file = "lxml-4.9.1-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dad7b164905d3e534883281c050180afcf1e230c3d4a54e8038aa5cfcf312b84"}, - {file = "lxml-4.9.1-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a614e4afed58c14254e67862456d212c4dcceebab2eaa44d627c2ca04bf86837"}, - {file = "lxml-4.9.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f9ced82717c7ec65a67667bb05865ffe38af0e835cdd78728f1209c8fffe0cad"}, - {file = "lxml-4.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:d9fc0bf3ff86c17348dfc5d322f627d78273eba545db865c3cd14b3f19e57fa5"}, - {file = "lxml-4.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e5f66bdf0976ec667fc4594d2812a00b07ed14d1b44259d19a41ae3fff99f2b8"}, - {file = "lxml-4.9.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fe17d10b97fdf58155f858606bddb4e037b805a60ae023c009f760d8361a4eb8"}, - {file = "lxml-4.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8caf4d16b31961e964c62194ea3e26a0e9561cdf72eecb1781458b67ec83423d"}, - {file = "lxml-4.9.1-cp310-cp310-win32.whl", hash = "sha256:4780677767dd52b99f0af1f123bc2c22873d30b474aa0e2fc3fe5e02217687c7"}, - {file = "lxml-4.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:b122a188cd292c4d2fcd78d04f863b789ef43aa129b233d7c9004de08693728b"}, - {file = "lxml-4.9.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:be9eb06489bc975c38706902cbc6888f39e946b81383abc2838d186f0e8b6a9d"}, - {file = "lxml-4.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:f1be258c4d3dc609e654a1dc59d37b17d7fef05df912c01fc2e15eb43a9735f3"}, - {file = "lxml-4.9.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:927a9dd016d6033bc12e0bf5dee1dde140235fc8d0d51099353c76081c03dc29"}, - {file = "lxml-4.9.1-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9232b09f5efee6a495a99ae6824881940d6447debe272ea400c02e3b68aad85d"}, - {file = "lxml-4.9.1-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:04da965dfebb5dac2619cb90fcf93efdb35b3c6994fea58a157a834f2f94b318"}, - {file = "lxml-4.9.1-cp35-cp35m-win32.whl", hash = "sha256:4d5bae0a37af799207140652a700f21a85946f107a199bcb06720b13a4f1f0b7"}, - {file = "lxml-4.9.1-cp35-cp35m-win_amd64.whl", hash = "sha256:4878e667ebabe9b65e785ac8da4d48886fe81193a84bbe49f12acff8f7a383a4"}, - {file = "lxml-4.9.1-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:1355755b62c28950f9ce123c7a41460ed9743c699905cbe664a5bcc5c9c7c7fb"}, - {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:bcaa1c495ce623966d9fc8a187da80082334236a2a1c7e141763ffaf7a405067"}, - {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6eafc048ea3f1b3c136c71a86db393be36b5b3d9c87b1c25204e7d397cee9536"}, - {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:13c90064b224e10c14dcdf8086688d3f0e612db53766e7478d7754703295c7c8"}, - {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:206a51077773c6c5d2ce1991327cda719063a47adc02bd703c56a662cdb6c58b"}, - {file = "lxml-4.9.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e8f0c9d65da595cfe91713bc1222af9ecabd37971762cb830dea2fc3b3bb2acf"}, - {file = "lxml-4.9.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8f0a4d179c9a941eb80c3a63cdb495e539e064f8054230844dcf2fcb812b71d3"}, - {file = "lxml-4.9.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:830c88747dce8a3e7525defa68afd742b4580df6aa2fdd6f0855481e3994d391"}, - {file = "lxml-4.9.1-cp36-cp36m-win32.whl", hash = "sha256:1e1cf47774373777936c5aabad489fef7b1c087dcd1f426b621fda9dcc12994e"}, - {file = "lxml-4.9.1-cp36-cp36m-win_amd64.whl", hash = "sha256:5974895115737a74a00b321e339b9c3f45c20275d226398ae79ac008d908bff7"}, - {file = "lxml-4.9.1-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:1423631e3d51008871299525b541413c9b6c6423593e89f9c4cfbe8460afc0a2"}, - {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:2aaf6a0a6465d39b5ca69688fce82d20088c1838534982996ec46633dc7ad6cc"}, - {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:9f36de4cd0c262dd9927886cc2305aa3f2210db437aa4fed3fb4940b8bf4592c"}, - {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ae06c1e4bc60ee076292e582a7512f304abdf6c70db59b56745cca1684f875a4"}, - {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:57e4d637258703d14171b54203fd6822fda218c6c2658a7d30816b10995f29f3"}, - {file = "lxml-4.9.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6d279033bf614953c3fc4a0aa9ac33a21e8044ca72d4fa8b9273fe75359d5cca"}, - {file = "lxml-4.9.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a60f90bba4c37962cbf210f0188ecca87daafdf60271f4c6948606e4dabf8785"}, - {file = "lxml-4.9.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6ca2264f341dd81e41f3fffecec6e446aa2121e0b8d026fb5130e02de1402785"}, - {file = "lxml-4.9.1-cp37-cp37m-win32.whl", hash = "sha256:27e590352c76156f50f538dbcebd1925317a0f70540f7dc8c97d2931c595783a"}, - {file = "lxml-4.9.1-cp37-cp37m-win_amd64.whl", hash = "sha256:eea5d6443b093e1545ad0210e6cf27f920482bfcf5c77cdc8596aec73523bb7e"}, - {file = "lxml-4.9.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:f05251bbc2145349b8d0b77c0d4e5f3b228418807b1ee27cefb11f69ed3d233b"}, - {file = "lxml-4.9.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:487c8e61d7acc50b8be82bda8c8d21d20e133c3cbf41bd8ad7eb1aaeb3f07c97"}, - {file = "lxml-4.9.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8d1a92d8e90b286d491e5626af53afef2ba04da33e82e30744795c71880eaa21"}, - {file = "lxml-4.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:b570da8cd0012f4af9fa76a5635cd31f707473e65a5a335b186069d5c7121ff2"}, - {file = "lxml-4.9.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ef87fca280fb15342726bd5f980f6faf8b84a5287fcc2d4962ea8af88b35130"}, - {file = "lxml-4.9.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:93e414e3206779ef41e5ff2448067213febf260ba747fc65389a3ddaa3fb8715"}, - {file = "lxml-4.9.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6653071f4f9bac46fbc30f3c7838b0e9063ee335908c5d61fb7a4a86c8fd2036"}, - {file = "lxml-4.9.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:32a73c53783becdb7eaf75a2a1525ea8e49379fb7248c3eeefb9412123536387"}, - {file = "lxml-4.9.1-cp38-cp38-win32.whl", hash = "sha256:1a7c59c6ffd6ef5db362b798f350e24ab2cfa5700d53ac6681918f314a4d3b94"}, - {file = "lxml-4.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:1436cf0063bba7888e43f1ba8d58824f085410ea2025befe81150aceb123e345"}, - {file = "lxml-4.9.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:4beea0f31491bc086991b97517b9683e5cfb369205dac0148ef685ac12a20a67"}, - {file = "lxml-4.9.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:41fb58868b816c202e8881fd0f179a4644ce6e7cbbb248ef0283a34b73ec73bb"}, - {file = "lxml-4.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:bd34f6d1810d9354dc7e35158aa6cc33456be7706df4420819af6ed966e85448"}, - {file = "lxml-4.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:edffbe3c510d8f4bf8640e02ca019e48a9b72357318383ca60e3330c23aaffc7"}, - {file = "lxml-4.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6d949f53ad4fc7cf02c44d6678e7ff05ec5f5552b235b9e136bd52e9bf730b91"}, - {file = "lxml-4.9.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:079b68f197c796e42aa80b1f739f058dcee796dc725cc9a1be0cdb08fc45b000"}, - {file = "lxml-4.9.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9c3a88d20e4fe4a2a4a84bf439a5ac9c9aba400b85244c63a1ab7088f85d9d25"}, - {file = "lxml-4.9.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4e285b5f2bf321fc0857b491b5028c5f276ec0c873b985d58d7748ece1d770dd"}, - {file = "lxml-4.9.1-cp39-cp39-win32.whl", hash = "sha256:ef72013e20dd5ba86a8ae1aed7f56f31d3374189aa8b433e7b12ad182c0d2dfb"}, - {file = "lxml-4.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:10d2017f9150248563bb579cd0d07c61c58da85c922b780060dcc9a3aa9f432d"}, - {file = "lxml-4.9.1-pp37-pypy37_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0538747a9d7827ce3e16a8fdd201a99e661c7dee3c96c885d8ecba3c35d1032c"}, - {file = "lxml-4.9.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:0645e934e940107e2fdbe7c5b6fb8ec6232444260752598bc4d09511bd056c0b"}, - {file = "lxml-4.9.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:6daa662aba22ef3258934105be2dd9afa5bb45748f4f702a3b39a5bf53a1f4dc"}, - {file = "lxml-4.9.1-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:603a464c2e67d8a546ddaa206d98e3246e5db05594b97db844c2f0a1af37cf5b"}, - {file = "lxml-4.9.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c4b2e0559b68455c085fb0f6178e9752c4be3bba104d6e881eb5573b399d1eb2"}, - {file = "lxml-4.9.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0f3f0059891d3254c7b5fb935330d6db38d6519ecd238ca4fce93c234b4a0f73"}, - {file = "lxml-4.9.1-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:c852b1530083a620cb0de5f3cd6826f19862bafeaf77586f1aef326e49d95f0c"}, - {file = "lxml-4.9.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:287605bede6bd36e930577c5925fcea17cb30453d96a7b4c63c14a257118dbb9"}, - {file = "lxml-4.9.1.tar.gz", hash = "sha256:fe749b052bb7233fe5d072fcb549221a8cb1a16725c47c37e42b0b9cb3ff2c3f"}, -] -mccabe = [ - {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, - {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, -] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, -] -packaging = [ - {file = "packaging-20.4-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"}, - {file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"}, -] -pathspec = [ - {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, - {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, -] -platformdirs = [ - {file = "platformdirs-2.2.0-py3-none-any.whl", hash = "sha256:4666d822218db6a262bdfdc9c39d21f23b4cfdb08af331a81e92751daf6c866c"}, - {file = "platformdirs-2.2.0.tar.gz", hash = "sha256:632daad3ab546bd8e6af0537d09805cec458dce201bccfe23012df73332e181e"}, -] -pluggy = [ - {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, - {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, -] -pycodestyle = [ - {file = "pycodestyle-2.9.1-py2.py3-none-any.whl", hash = "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b"}, - {file = "pycodestyle-2.9.1.tar.gz", hash = "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785"}, -] -pyflakes = [ - {file = "pyflakes-2.5.0-py2.py3-none-any.whl", hash = "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2"}, - {file = "pyflakes-2.5.0.tar.gz", hash = "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3"}, -] -pyparsing = [ - {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, - {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, -] -pyquery = [ - {file = "pyquery-1.4.3-py3-none-any.whl", hash = "sha256:1fc33b7699455ed25c75282bc8f80ace1ac078b0dda5a933dacbd8b1c1f83963"}, - {file = "pyquery-1.4.3.tar.gz", hash = "sha256:a388eefb6bc4a55350de0316fbd97cda999ae669b6743ae5b99102ba54f5aa72"}, -] -pytest = [ - {file = "pytest-7.2.0-py3-none-any.whl", hash = "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71"}, - {file = "pytest-7.2.0.tar.gz", hash = "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59"}, -] -pytest-base-url = [ - {file = "pytest-base-url-2.0.0.tar.gz", hash = "sha256:e1e88a4fd221941572ccdcf3bf6c051392d2f8b6cef3e0bc7da95abec4b5346e"}, - {file = "pytest_base_url-2.0.0-py3-none-any.whl", hash = "sha256:ed36fd632c32af9f1c08f2c2835dcf42ca8fcd097d6ed44a09f253d365ad8297"}, -] -pytest-rerunfailures = [ - {file = "pytest-rerunfailures-10.3.tar.gz", hash = "sha256:d8244d799f89a6edb5e57301ddaeb3b6f10d6691638d51e80b371311592e28c6"}, - {file = "pytest_rerunfailures-10.3-py3-none-any.whl", hash = "sha256:6be6f96510bf94b54198bf15bc5568fe2cdff88e83875912e22d29810acf65ff"}, -] -requests = [ - {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, - {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, -] -six = [ - {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, - {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, -] -tomli = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] -typed-ast = [ - {file = "typed_ast-1.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:669dd0c4167f6f2cd9f57041e03c3c2ebf9063d0757dc89f79ba1daa2bfca9d4"}, - {file = "typed_ast-1.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:211260621ab1cd7324e0798d6be953d00b74e0428382991adfddb352252f1d62"}, - {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:267e3f78697a6c00c689c03db4876dd1efdfea2f251a5ad6555e82a26847b4ac"}, - {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c542eeda69212fa10a7ada75e668876fdec5f856cd3d06829e6aa64ad17c8dfe"}, - {file = "typed_ast-1.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:a9916d2bb8865f973824fb47436fa45e1ebf2efd920f2b9f99342cb7fab93f72"}, - {file = "typed_ast-1.5.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79b1e0869db7c830ba6a981d58711c88b6677506e648496b1f64ac7d15633aec"}, - {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a94d55d142c9265f4ea46fab70977a1944ecae359ae867397757d836ea5a3f47"}, - {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:183afdf0ec5b1b211724dfef3d2cad2d767cbefac291f24d69b00546c1837fb6"}, - {file = "typed_ast-1.5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:639c5f0b21776605dd6c9dbe592d5228f021404dafd377e2b7ac046b0349b1a1"}, - {file = "typed_ast-1.5.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf4afcfac006ece570e32d6fa90ab74a17245b83dfd6655a6f68568098345ff6"}, - {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed855bbe3eb3715fca349c80174cfcfd699c2f9de574d40527b8429acae23a66"}, - {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6778e1b2f81dfc7bc58e4b259363b83d2e509a65198e85d5700dfae4c6c8ff1c"}, - {file = "typed_ast-1.5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:0261195c2062caf107831e92a76764c81227dae162c4f75192c0d489faf751a2"}, - {file = "typed_ast-1.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2efae9db7a8c05ad5547d522e7dbe62c83d838d3906a3716d1478b6c1d61388d"}, - {file = "typed_ast-1.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7d5d014b7daa8b0bf2eaef684295acae12b036d79f54178b92a2b6a56f92278f"}, - {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:370788a63915e82fd6f212865a596a0fefcbb7d408bbbb13dea723d971ed8bdc"}, - {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4e964b4ff86550a7a7d56345c7864b18f403f5bd7380edf44a3c1fb4ee7ac6c6"}, - {file = "typed_ast-1.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:683407d92dc953c8a7347119596f0b0e6c55eb98ebebd9b23437501b28dcbb8e"}, - {file = "typed_ast-1.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4879da6c9b73443f97e731b617184a596ac1235fe91f98d279a7af36c796da35"}, - {file = "typed_ast-1.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e123d878ba170397916557d31c8f589951e353cc95fb7f24f6bb69adc1a8a97"}, - {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebd9d7f80ccf7a82ac5f88c521115cc55d84e35bf8b446fcd7836eb6b98929a3"}, - {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98f80dee3c03455e92796b58b98ff6ca0b2a6f652120c263efdba4d6c5e58f72"}, - {file = "typed_ast-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:0fdbcf2fef0ca421a3f5912555804296f0b0960f0418c440f5d6d3abb549f3e1"}, - {file = "typed_ast-1.5.4.tar.gz", hash = "sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2"}, -] -typing-extensions = [ - {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, - {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, -] -urllib3 = [ - {file = "urllib3-1.26.5-py2.py3-none-any.whl", hash = "sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c"}, - {file = "urllib3-1.26.5.tar.gz", hash = "sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098"}, -] -zipp = [ - {file = "zipp-3.11.0-py3-none-any.whl", hash = "sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa"}, - {file = "zipp-3.11.0.tar.gz", hash = "sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766"}, -] +content-hash = "44ac0914996c6125fe354865f47b116c6b6412fce06147822878ff57ddfcd6ee" diff --git a/testing/integration/pyproject.toml b/testing/integration/pyproject.toml index 0b3d2add190b..a149f1f7b8c9 100644 --- a/testing/integration/pyproject.toml +++ b/testing/integration/pyproject.toml @@ -9,15 +9,15 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.7" -pytest = "^7.2.0" +pytest = "^7.2.1" pytest-base-url = "^2.0.0" -pytest-rerunfailures = "^10.3" -requests = "^2.28.1" -pyquery = "^1.4.3" +pytest-rerunfailures = "^11.0" +requests = "^2.28.2" +pyquery = "^2.0.0" braceexpand = "^0.1.7" [tool.poetry.dev-dependencies] -black = "^22.12" +black = "^23.1" flake8 = "^5.0.4" [build-system] diff --git a/testing/scripts/functional-test.sh b/testing/scripts/functional-test.sh index aa699131e8b5..635115560376 100755 --- a/testing/scripts/functional-test.sh +++ b/testing/scripts/functional-test.sh @@ -1,7 +1,7 @@ #!/bin/bash set -e -export ENV_FILE=testing/.env +export ENV_FILE=.env.testing yarn build:prepare yarn build diff --git a/testing/tests/developing.spec.ts b/testing/tests/developing.spec.ts index 9d8426ca7dce..aa289d49b6c7 100644 --- a/testing/tests/developing.spec.ts +++ b/testing/tests/developing.spec.ts @@ -72,7 +72,7 @@ test.describe("Testing the kitchensink page", () => { // Loading the index.json doesn't require a headless browser const { doc } = await got( serverURL("/en-US/docs/MDN/Kitchensink/index.json") - ).json(); + ).json<any>(); expect(doc.title).toBe("The MDN Content Kitchensink"); expect(doc.flaws).toEqual({}); diff --git a/testing/tests/headless.sitesearch.spec.ts b/testing/tests/headless.sitesearch.spec.ts index 97e298b120aa..987b55b600a2 100644 --- a/testing/tests/headless.sitesearch.spec.ts +++ b/testing/tests/headless.sitesearch.spec.ts @@ -16,7 +16,9 @@ test.describe("Site search", () => { await page.fill(SEARCH_SELECTOR, "foo"); await page.waitForSelector("#top-nav-search-form"); // autocomplete search form - await page.$eval('form[role="search"]', (form) => form.submit()); + await page.$eval('form[role="search"]', (form) => + (form as HTMLFormElement).submit() + ); // Force a wait for the lazy-loading await page.waitForLoadState("networkidle"); // Force a wait for the search results @@ -32,7 +34,9 @@ test.describe("Site search", () => { // See server/static.js for how fixtures are hardcoded await page.fill(SEARCH_SELECTOR, "FOO"); await page.waitForSelector("#top-nav-search-form"); // autocomplete search form - await page.$eval('form[role="search"]', (form) => form.submit()); + await page.$eval('form[role="search"]', (form) => + (form as HTMLFormElement).submit() + ); // Force a wait for the lazy-loading await page.waitForLoadState("networkidle"); expect(page.url()).toBe(testURL("/en-US/search/?q=FOO")); @@ -47,7 +51,9 @@ test.describe("Site search", () => { // See server/static.js for how fixtures are hardcoded await page.fill(SEARCH_SELECTOR, "NOTHING"); await page.waitForSelector("#top-nav-search-form"); // autocomplete search form - await page.$eval('form[role="search"]', (form) => form.submit()); + await page.$eval('form[role="search"]', (form) => + (form as HTMLFormElement).submit() + ); await page.waitForLoadState("networkidle"); expect(page.url()).toBe(testURL("/en-US/search/?q=NOTHING")); expect( @@ -62,7 +68,9 @@ test.describe("Site search", () => { // See server/static.js for how fixtures are hardcoded await page.fill(SEARCH_SELECTOR, "SERIAL(20)"); await page.waitForSelector("#top-nav-search-form"); // autocomplete search form - await page.$eval('form[role="search"]', (form) => form.submit()); + await page.$eval('form[role="search"]', (form) => + (form as HTMLFormElement).submit() + ); await page.waitForLoadState("networkidle"); expect( await page.isVisible("text=Search results for: SERIAL(20)") diff --git a/testing/tests/index.test.ts b/testing/tests/index.test.ts index 1d0b6e868fcc..ae35c3ae7c71 100644 --- a/testing/tests/index.test.ts +++ b/testing/tests/index.test.ts @@ -75,92 +75,17 @@ test("content built foo page", () => { expect(new Date(doc.modified)).toBeTruthy(); expect(doc.source).toBeTruthy(); - expect(doc.flaws.macros).toHaveLength(7); - expect(doc.flaws.macros[0].name).toBe("MacroRedirectedLinkError"); - expect(doc.flaws.macros[0].macroSource).toBe("{{CSSxRef('dumber')}}"); - expect(doc.flaws.macros[0].line).toBe(8); - expect(doc.flaws.macros[0].column).toBe(7); - expect(doc.flaws.macros[0].sourceContext).toEqual( - expect.stringContaining("<li>{{CSSxRef('dumber')}}</li>") - ); - expect(doc.flaws.macros[0].redirectInfo).toBeDefined(); - expect(doc.flaws.macros[0].redirectInfo.current).toBe("dumber"); - expect(doc.flaws.macros[0].redirectInfo.suggested).toBe("number"); - expect(doc.flaws.macros[0].filepath).toMatch( - /\/en-us\/web\/fixable_flaws\/index\.html$/ - ); - expect(doc.flaws.macros[1].name).toBe("MacroRedirectedLinkError"); - expect(doc.flaws.macros[1].macroSource).toBe( - '{{htmlattrxref("href", "anchor")}}' - ); - expect(doc.flaws.macros[1].line).toBe(9); - expect(doc.flaws.macros[1].column).toBe(7); - expect(doc.flaws.macros[1].sourceContext).toEqual( - expect.stringContaining('<li>{{htmlattrxref("href", "anchor")}}</li>') - ); - expect(doc.flaws.macros[1].redirectInfo).toBeDefined(); - expect(doc.flaws.macros[1].redirectInfo.current).toBe("anchor"); - expect(doc.flaws.macros[1].redirectInfo.suggested).toBe("a"); - expect(doc.flaws.macros[1].filepath).toMatch( - /\/en-us\/web\/fixable_flaws\/index\.html$/ - ); - expect(doc.flaws.macros[2].name).toBe("MacroBrokenLinkError"); - expect(doc.flaws.macros[2].macroSource).toBe( - '{{CSSxRef("will-never-be-fixable")}}' - ); - expect(doc.flaws.macros[2].line).toBe(10); - expect(doc.flaws.macros[2].column).toBe(7); - expect(doc.flaws.macros[2].sourceContext).toEqual( - expect.stringContaining('<li>{{CSSxRef("will-never-be-fixable")}}</li>') - ); - expect(doc.flaws.macros[2].filepath).toMatch( - /\/en-us\/web\/fixable_flaws\/index\.html$/ - ); - expect(doc.flaws.macros[3].name).toBe("MacroRedirectedLinkError"); - expect(doc.flaws.macros[3].macroSource).toBe("{{CSSxRef('dumber')}}"); - expect(doc.flaws.macros[3].line).toBe(11); - expect(doc.flaws.macros[3].column).toBe(7); - expect(doc.flaws.macros[3].sourceContext).toEqual( - expect.stringContaining("<li>{{CSSxRef('dumber')}} second time!</li>") - ); - expect(doc.flaws.macros[3].redirectInfo).toBeDefined(); - expect(doc.flaws.macros[3].redirectInfo.current).toBe("dumber"); - expect(doc.flaws.macros[3].redirectInfo.suggested).toBe("number"); - expect(doc.flaws.macros[3].filepath).toMatch( - /\/en-us\/web\/fixable_flaws\/index\.html$/ - ); - expect(doc.flaws.macros[4].name).toBe("MacroExecutionError"); - expect(doc.flaws.macros[4].errorStack).toEqual( - expect.stringContaining( - '/en-us/docs/web/fubar references /en-us/docs/does-not-exist (derived from "does-not-exist"), which does not exist' - ) - ); - expect(doc.flaws.macros[4].line).toBe(10); - expect(doc.flaws.macros[4].column).toBe(6); - // Check that the line numbers in the source context have been adjusted by the offset. - expect(doc.flaws.macros[4].sourceContext).toEqual( - expect.stringContaining('<div>{{page("does-not-exist")}}</div>') - ); - expect(doc.flaws.macros[4].filepath).toMatch( - /\/en-us\/web\/fubar\/index\.html$/ - ); - expect(doc.flaws.macros[5].name).toBe("MacroExecutionError"); - expect(doc.flaws.macros[5].errorStack).toEqual( - expect.stringContaining( - "/en-us/docs/web/fubar references /en-us/docs/does/not/exist, which does not exist" - ) - ); - expect(doc.flaws.macros[5].line).toBe(11); - expect(doc.flaws.macros[5].column).toBe(6); - // Check that the line numbers in the source context have been adjusted by the offset. - expect(doc.flaws.macros[5].sourceContext).toEqual( - expect.stringContaining( - `<div>{{ EmbedLiveSample('example', '300', '300', "", "does/not/exist") }}</div>` - ) - ); - expect(doc.flaws.macros[5].filepath).toMatch( - /\/en-us\/web\/fubar\/index\.html$/ - ); + expect(doc.flaws.macros).toHaveLength(1); + expect(doc.flaws.macros[0]).toMatchObject({ + column: 4, + errorStack: expect.stringContaining("pages is not iterable"), + filepath: expect.stringContaining( + "testing/content/files/en-us/web/foo/index.html" + ), + line: 8, + macroName: "HTMLSidebar", + name: "MacroExecutionError", + }); const htmlFile = path.join(builtFolder, "index.html"); const html = fs.readFileSync(htmlFile, "utf-8"); @@ -195,7 +120,7 @@ test("content built foo page", () => { expect($('meta[name="robots"]').attr("content")).toBe("index, follow"); // The HTML should contain the Google Analytics snippet. - // The ID should match what's set in `testing/.env`. + // The ID should match what's set in `.env.testing`. expect($('script[src="/static/js/ga.js"]')).toHaveLength(1); // Because this en-US page has a French translation @@ -965,7 +890,7 @@ test("check built flaws for /en-us/learn/css/css_layout/introduction/grid page", const { doc } = JSON.parse(fs.readFileSync(jsonFile, "utf-8")) as { doc: Doc; }; - expect(doc.flaws.macros).toHaveLength(2); + expect(doc.flaws).toEqual({}); }); test("check built flaws for /en-us/learn/css/css_layout/introduction/flex page", () => { @@ -1012,31 +937,6 @@ test("detect bad_bcd_queries flaws", () => { expect(doc.flaws.bad_bcd_queries[0].suggestion).toBeNull(); }); -test("detect bad_bcd_links flaws from", () => { - const builtFolder = path.join( - buildRoot, - "en-us", - "docs", - "web", - "api", - "page_visibility_api" - ); - expect(fs.existsSync(builtFolder)).toBeTruthy(); - const jsonFile = path.join(builtFolder, "index.json"); - const { doc } = JSON.parse(fs.readFileSync(jsonFile, "utf-8")) as { - doc: Doc; - }; - expect(doc.flaws.bad_bcd_links).toHaveLength(1); - // The reasons it's a bad link is because the @mdn/browser-compat-data, - // for the query `api.Document.visibilityState` refers to a page - // with mdn_url `/en-US/docs/Web/API/Document/visibilityState` which we - // don't have. At least not in the testing content :) - const flaw = doc.flaws.bad_bcd_links[0]; - expect(flaw.slug).toBe("/en-US/docs/Web/API/Document/visibilityState"); - expect(flaw.suggestion).toBeNull(); - expect(flaw.query).toBe("api.Document.visibilityState"); -}); - test("detect bad_pre_tags flaws", () => { const builtFolder = path.join( buildRoot, @@ -1241,27 +1141,6 @@ test("images that are in the folder but not in <img> tags", () => { expect(fs.existsSync(path.join(builtFolder, "image.png"))); }); -test("chicken_and_egg page should build with flaws", () => { - const builtFolder = path.join(buildRoot, "en-us", "docs", "chicken_and_egg"); - expect(fs.existsSync(builtFolder)).toBeTruthy(); - const jsonFile = path.join(builtFolder, "index.json"); - const { doc } = JSON.parse(fs.readFileSync(jsonFile, "utf-8")) as { - doc: Doc; - }; - expect(doc.flaws.macros).toHaveLength(1); - // The filepath will be that of the "egg" or the "chicken" page. - // Let's not try to predict which one exactly, because that'd mean this - // test would need to use the exact same sort order as the glob used - // when we ran "yarn build" to set up the build fixtures. - const flaw = doc.flaws.macros[0]; - expect(flaw.name).toBe("MacroExecutionError"); - expect( - flaw.errorStack.includes( - "documents form a circular dependency when rendering" - ) - ).toBeTruthy(); -}); - test("404 page", () => { const builtFolder = path.join(buildRoot, "en-us", "_spas"); expect(fs.existsSync(builtFolder)).toBeTruthy(); diff --git a/yarn.lock b/yarn.lock index c53c2562d005..8a1beb242c45 100644 --- a/yarn.lock +++ b/yarn.lock @@ -36,25 +36,25 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.5.tgz#86f172690b093373a933223b4745deeb6049e733" integrity sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g== -"@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.19.6", "@babel/core@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.7.tgz#37072f951bd4d28315445f66e0ec9f6ae0c8c35f" - integrity sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw== +"@babel/core@^7.11.1", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.19.6", "@babel/core@^7.20.12": + version "7.20.12" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" + integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.18.6" "@babel/generator" "^7.20.7" "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-module-transforms" "^7.20.7" + "@babel/helper-module-transforms" "^7.20.11" "@babel/helpers" "^7.20.7" "@babel/parser" "^7.20.7" "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" + "@babel/traverse" "^7.20.12" "@babel/types" "^7.20.7" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.1" + json5 "^2.2.2" semver "^6.3.0" "@babel/eslint-parser@^7.16.3", "@babel/eslint-parser@^7.19.1": @@ -175,10 +175,10 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.6", "@babel/helper-module-transforms@^7.20.7": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.7.tgz#7a6c9a1155bef55e914af574153069c9d9470c43" - integrity sha512-FNdu7r67fqMUSVuQpFQGE6BPdhJIhitoxhGzDbAXNcA07uoVG37fOiMk3OSV8rEICuyG6t8LGkd9EE64qIEoIA== +"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.6", "@babel/helper-module-transforms@^7.20.11": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" + integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-module-imports" "^7.18.6" @@ -186,7 +186,7 @@ "@babel/helper-split-export-declaration" "^7.18.6" "@babel/helper-validator-identifier" "^7.19.1" "@babel/template" "^7.20.7" - "@babel/traverse" "^7.20.7" + "@babel/traverse" "^7.20.10" "@babel/types" "^7.20.7" "@babel/helper-optimise-call-expression@^7.18.6": @@ -1033,20 +1033,12 @@ "@babel/helper-validator-option" "^7.18.6" "@babel/plugin-transform-typescript" "^7.18.6" -"@babel/runtime-corejs3@^7.10.2": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.19.6.tgz#778471a71d915cf3b955a9201bebabfe924f872a" - integrity sha512-oWNn1ZlGde7b4i/3tnixpH9qI0bOAACiUs+KEES4UUCnsPjVWFlWdLV/iwJuPC2qp3EowbAqsm+0XqNwnwYhxA== - dependencies: - core-js-pure "^3.25.1" - regenerator-runtime "^0.13.4" - -"@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.8", "@babel/runtime@^7.16.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.4.tgz#a42f814502ee467d55b38dd1c256f53a7b885c78" - integrity sha512-EXpLCrk55f+cYqmHsSR+yD/0gAIMxxA9QK9lnQWzhMCvt+YmoBN7Zx94s++Kv0+unHk39vxNO8t+CMA2WSS3wA== +"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.8", "@babel/runtime@^7.16.3", "@babel/runtime@^7.20.7", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.7.tgz#fcb41a5a70550e04a7b708037c7c32f7f356d8fd" + integrity sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ== dependencies: - regenerator-runtime "^0.13.4" + regenerator-runtime "^0.13.11" "@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3": version "7.20.7" @@ -1057,10 +1049,10 @@ "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" -"@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1", "@babel/traverse@^7.20.7", "@babel/traverse@^7.7.2": - version "7.20.7" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.7.tgz#114f992fa989a390896ea72db5220780edab509c" - integrity sha512-xueOL5+ZKX2dJbg8z8o4f4uTRTqGDRjilva9D1hiRlayJbTY8jBRL+Ph67IeRTIE439/VifHk+Z4g0SwRtQE0A== +"@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1", "@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.7", "@babel/traverse@^7.7.2": + version "7.20.12" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.12.tgz#7f0f787b3a67ca4475adef1f56cb94f6abd4a4b5" + integrity sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ== dependencies: "@babel/code-frame" "^7.18.6" "@babel/generator" "^7.20.7" @@ -1118,117 +1110,177 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@csstools/cascade-layer-name-parser@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.1.tgz#5957adeb71be8159e543d37a9c48e124dcd6c32e" + integrity sha512-SAAi5DpgJJWkfTvWSaqkgyIsTawa83hMwKrktkj6ra2h+q6ZN57vOGZ6ySHq6RSo+CbP64fA3aPChPBRDDUgtw== + +"@csstools/css-parser-algorithms@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.0.1.tgz#ff02629c7c95d1f4f8ea84d5ef1173461610535e" + integrity sha512-B9/8PmOtU6nBiibJg0glnNktQDZ3rZnGn/7UmDfrm2vMtrdlXO3p7ErE95N0up80IRk9YEtB5jyj/TmQ1WH3dw== + +"@csstools/css-tokenizer@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-2.0.1.tgz#cb1e11752db57e69d9aa0e84c3105a25845d4055" + integrity sha512-sYD3H7ReR88S/4+V5VbKiBEUJF4FqvG+8aNJkxqoPAnbhFziDG22IDZc4+h+xA63SfgM+h15lq5OnLeCxQ9nPA== + +"@csstools/media-query-list-parser@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-2.0.1.tgz#d85a366811563a5d002755ed10e5212a1613c91d" + integrity sha512-X2/OuzEbjaxhzm97UJ+95GrMeT29d1Ib+Pu+paGLuRWZnWRK9sI9r3ikmKXPWGA1C4y4JEdBEFpp9jEqCvLeRA== + "@csstools/normalize.css@*": version "12.0.0" resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-12.0.0.tgz#a9583a75c3f150667771f30b60d9f059473e62c4" integrity sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg== -"@csstools/postcss-cascade-layers@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz#8a997edf97d34071dd2e37ea6022447dd9e795ad" - integrity sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA== +"@csstools/postcss-cascade-layers@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-3.0.1.tgz#d839386e90428b448e3f75276bc01d516e852a0d" + integrity sha512-dD8W98dOYNOH/yX4V4HXOhfCOnvVAg8TtsL+qCGNoKXuq5z2C/d026wGWgySgC8cajXXo/wNezS31Glj5GcqrA== dependencies: "@csstools/selector-specificity" "^2.0.2" postcss-selector-parser "^6.0.10" -"@csstools/postcss-color-function@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz#2bd36ab34f82d0497cfacdc9b18d34b5e6f64b6b" - integrity sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw== +"@csstools/postcss-color-function@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-2.0.1.tgz#0a5149105da4efa19e3a0fe7a533002c79b82492" + integrity sha512-d7379loVBgIiKTQMOUduUctq3CWMeqNpGkLhzuejvuGyA+bWYT1p7n2GzmIwgXwP0CF8DIFtDgvrsvHn3i+tWw== dependencies: - "@csstools/postcss-progressive-custom-properties" "^1.1.0" + "@csstools/postcss-progressive-custom-properties" "^2.0.0" postcss-value-parser "^4.2.0" -"@csstools/postcss-font-format-keywords@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz#677b34e9e88ae997a67283311657973150e8b16a" - integrity sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg== +"@csstools/postcss-font-format-keywords@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-2.0.1.tgz#47d2de91a3342bff3049c698e508215702db2f7e" + integrity sha512-NRwT5g/L+lDkridDiHfjNGyHvdSHJOdcXPPZXZOpSfr/AwRxTJ+wsbKAzyBb1stalkr9KjICDr+ofpkk96r0Wg== dependencies: postcss-value-parser "^4.2.0" -"@csstools/postcss-hwb-function@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz#ab54a9fce0ac102c754854769962f2422ae8aa8b" - integrity sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w== +"@csstools/postcss-hwb-function@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-2.0.1.tgz#626c2cfab8d3baec1deca0c4229f7cce07869cb2" + integrity sha512-IYoJZ/lDgbXr5iRxlIYdTirWRerrcpezfpP6Xr+bfu8KJRgSMQVOxmXpfJwEXQuTBiX+DyVcAz+IbDdOexHq9g== dependencies: postcss-value-parser "^4.2.0" -"@csstools/postcss-ic-unit@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz#28237d812a124d1a16a5acc5c3832b040b303e58" - integrity sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw== +"@csstools/postcss-ic-unit@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-2.0.1.tgz#9663a0ab89407275c3b79b48230b3d64a944f451" + integrity sha512-718aUIKZJDkbQrINOv6B0I70EZpTB9LzPykGVE/U3gnlXc4tjgvr6/r/G3Hopyn1D5R4BJYcMPI06tVzAgLSMQ== dependencies: - "@csstools/postcss-progressive-custom-properties" "^1.1.0" + "@csstools/postcss-progressive-custom-properties" "^2.0.0" postcss-value-parser "^4.2.0" -"@csstools/postcss-is-pseudo-class@^2.0.7": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz#846ae6c0d5a1eaa878fce352c544f9c295509cd1" - integrity sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA== +"@csstools/postcss-is-pseudo-class@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-3.0.1.tgz#5809d18c067c62c811a1c2ab8c01dd9058d5515c" + integrity sha512-N0GC8eRkHDsI8Y3AZ6HLJol1YANNk8PFWsUHOzuDkQW0zbrPL9arYpPTw4cr8yq0rkY/9TRaBDU74QA4ULmKHQ== dependencies: "@csstools/selector-specificity" "^2.0.0" postcss-selector-parser "^6.0.10" -"@csstools/postcss-nested-calc@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz#d7e9d1d0d3d15cf5ac891b16028af2a1044d0c26" - integrity sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ== +"@csstools/postcss-logical-float-and-clear@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-1.0.1.tgz#d255ea7aad18880930b63d8a04164f56182f2ecf" + integrity sha512-eO9z2sMLddvlfFEW5Fxbjyd03zaO7cJafDurK4rCqyRt9P7aaWwha0LcSzoROlcZrw1NBV2JAp2vMKfPMQO1xw== + +"@csstools/postcss-logical-resize@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-logical-resize/-/postcss-logical-resize-1.0.1.tgz#826d3de929d7d786c32c2c118f78e813a1c2cdec" + integrity sha512-x1ge74eCSvpBkDDWppl+7FuD2dL68WP+wwP2qvdUcKY17vJksz+XoE1ZRV38uJgS6FNUwC0AxrPW5gy3MxsDHQ== dependencies: postcss-value-parser "^4.2.0" -"@csstools/postcss-normalize-display-values@^1.0.1": +"@csstools/postcss-logical-viewport-units@^1.0.0": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-1.0.2.tgz#b968c57e1459429b48b24e2c250ca0904d71df6e" + integrity sha512-nnKFywBqRMYjv5jyjSplD/nbAnboUEGFfdxKw1o34Y1nvycgqjQavhKkmxbORxroBBIDwC5y6SfgENcPPUcOxQ== + dependencies: + "@csstools/css-tokenizer" "^2.0.0" + +"@csstools/postcss-media-queries-aspect-ratio-number-values@^1.0.0": version "1.0.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz#15da54a36e867b3ac5163ee12c1d7f82d4d612c3" - integrity sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw== + resolved "https://registry.yarnpkg.com/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-1.0.1.tgz#fd6a8e50c2d6d46a5c95b6cdc5563a091fa2f0fa" + integrity sha512-V9yQqXdje6OfqDf6EL5iGOpi6N0OEczwYK83rql9UapQwFEryXlAehR5AqH8QqLYb6+y31wUXK6vMxCp0920Zg== + dependencies: + "@csstools/css-parser-algorithms" "^2.0.0" + "@csstools/css-tokenizer" "^2.0.0" + "@csstools/media-query-list-parser" "^2.0.0" + +"@csstools/postcss-nested-calc@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-nested-calc/-/postcss-nested-calc-2.0.1.tgz#1092f0353a273bcdde9c8d1a215021cf8eed60cf" + integrity sha512-6C5yoF99zFb/C2Sa9Y5V0Y/2dnrjK5xe+h59L0LfdVhfanmJPrttwmfTua9etFRA1TGV46aoVMLEZ1NoHjWikg== dependencies: postcss-value-parser "^4.2.0" -"@csstools/postcss-oklab-function@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz#88cee0fbc8d6df27079ebd2fa016ee261eecf844" - integrity sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA== +"@csstools/postcss-normalize-display-values@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-2.0.1.tgz#35dc188c5b4713cf902959fe3c8ce613fcb7543e" + integrity sha512-TQT5g3JQ5gPXC239YuRK8jFceXF9d25ZvBkyjzBGGoW5st5sPXFVQS8OjYb9IJ/K3CdfK4528y483cgS2DJR/w== dependencies: - "@csstools/postcss-progressive-custom-properties" "^1.1.0" postcss-value-parser "^4.2.0" -"@csstools/postcss-progressive-custom-properties@^1.1.0", "@csstools/postcss-progressive-custom-properties@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz#542292558384361776b45c85226b9a3a34f276fa" - integrity sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA== +"@csstools/postcss-oklab-function@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-2.0.1.tgz#56b2abfe15a3cbff53a80e8f6c0901fa5b81ceb9" + integrity sha512-MTj3w6G1TYW0k43sXjw25fY/S+LHXpFIym5NW0oO/hjHFzuz5Uwz93aUvdo/UrrFmxSQeQAYCxmq6NlH3Pf1Hw== dependencies: + "@csstools/postcss-progressive-custom-properties" "^2.0.0" postcss-value-parser "^4.2.0" -"@csstools/postcss-stepped-value-functions@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz#f8772c3681cc2befed695e2b0b1d68e22f08c4f4" - integrity sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ== +"@csstools/postcss-progressive-custom-properties@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-2.0.1.tgz#70b05fa97778c34e0758a313ed11617cdf14189c" + integrity sha512-ImgaFLEOhH/EdcrqDF8GSYSlsVR8EQBJ1p9ZhzoHgDkL7/uuzvSZOlRw5dFGFGnjdi7EXK4gsUjy2HU7ChHh3w== dependencies: postcss-value-parser "^4.2.0" -"@csstools/postcss-text-decoration-shorthand@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz#ea96cfbc87d921eca914d3ad29340d9bcc4c953f" - integrity sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw== +"@csstools/postcss-scope-pseudo-class@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-2.0.1.tgz#3d16ee58c2834913c2e2e93ce4a752e287a92be2" + integrity sha512-wf2dcsqSQlBHc4HMMqdXdxDx4uYuqH+L08kKj+pmT+743C06STcUEu7ORFFEnqGWlOJ1kmA5BJ3pQU0EdMuA+w== + dependencies: + postcss-selector-parser "^6.0.10" + +"@csstools/postcss-stepped-value-functions@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-2.0.1.tgz#674bfca93d063d9ea3262c773d0e1cec3e07d2eb" + integrity sha512-VimD+M69GsZF/XssivjUwo6jXLgi86ar/gRSH7bautnCULSLxCr/HuY32N4rLRUr7qWF8oF/JTv06ceb66Q1jA== dependencies: postcss-value-parser "^4.2.0" -"@csstools/postcss-trigonometric-functions@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz#94d3e4774c36d35dcdc88ce091336cb770d32756" - integrity sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og== +"@csstools/postcss-text-decoration-shorthand@^2.0.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-2.1.0.tgz#6de70bb792267cf01519a455f1b8d871f6bf2943" + integrity sha512-ARU7Oh9nplxt99cDONVrDt/c1osWRCtgAzegtvmkn6ed7wfmjeNOlXogK1SlAIfHl6X116kPTuFL7vuyDmlPQw== dependencies: postcss-value-parser "^4.2.0" -"@csstools/postcss-unset-value@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz#c99bb70e2cdc7312948d1eb41df2412330b81f77" - integrity sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g== +"@csstools/postcss-trigonometric-functions@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-2.0.1.tgz#2ecede7066187cf08423f8318ef5796cda75351f" + integrity sha512-uGmmVWGHozyWe6+I4w321fKUC034OB1OYW0ZP4ySHA23n+r9y93K+1yrmW+hThpSfApKhaWySoD4I71LLlFUYQ== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-unset-value@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-unset-value/-/postcss-unset-value-2.0.1.tgz#67091dd6cff556bff896c95053eb070cc6b21c25" + integrity sha512-oJ9Xl29/yU8U7/pnMJRqAZd4YXNCfGEdcP4ywREuqm/xMqcgDNDppYRoCGDt40aaZQIEKBS79LytUDN/DHf0Ew== "@csstools/selector-specificity@^2.0.0", "@csstools/selector-specificity@^2.0.2": version "2.0.2" resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz#1bfafe4b7ed0f3e4105837e056e0a89b108ebe36" integrity sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg== +"@csstools/selector-specificity@^2.0.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz#c9c61d9fe5ca5ac664e1153bb0aa0eba1c6d6308" + integrity sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw== + "@discoveryjs/json-ext@^0.5.0": version "0.5.7" resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" @@ -1241,10 +1293,10 @@ dependencies: eslint-visitor-keys "^3.3.0" -"@eslint/eslintrc@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.4.0.tgz#8ec64e0df3e7a1971ee1ff5158da87389f167a63" - integrity sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A== +"@eslint/eslintrc@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.4.1.tgz#af58772019a2d271b7e2d4c23ff4ddcba3ccfb3e" + integrity sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA== dependencies: ajv "^6.12.4" debug "^4.3.2" @@ -1311,109 +1363,128 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.3.1.tgz#3e3f876e4e47616ea3b1464b9fbda981872e9583" - integrity sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg== +"@jest/console@^29.4.0": + version "29.4.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.4.0.tgz#ed2e5bc783791c4be75d0054d1bdf66a46deb163" + integrity sha512-xpXud7e/8zo4syxQlAMDz+EQiFsf8/zXDPslBYm+UaSJ5uGTKQHhbSHfECp7Fw1trQtopjYumeved0n3waijhQ== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.4.0" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^29.3.1" - jest-util "^29.3.1" + jest-message-util "^29.4.0" + jest-util "^29.4.0" slash "^3.0.0" -"@jest/core@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.3.1.tgz#bff00f413ff0128f4debec1099ba7dcd649774a1" - integrity sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw== - dependencies: - "@jest/console" "^29.3.1" - "@jest/reporters" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" +"@jest/console@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.4.1.tgz#cbc31d73f6329f693b3d34b365124de797704fff" + integrity sha512-m+XpwKSi3PPM9znm5NGS8bBReeAJJpSkL1OuFCqaMaJL2YX9YXLkkI+MBchMPwu+ZuM2rynL51sgfkQteQ1CKQ== + dependencies: + "@jest/types" "^29.4.1" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.4.1" + jest-util "^29.4.1" + slash "^3.0.0" + +"@jest/core@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.4.1.tgz#91371179b5959951e211dfaeea4277a01dcca14f" + integrity sha512-RXFTohpBqpaTebNdg5l3I5yadnKo9zLBajMT0I38D0tDhreVBYv3fA8kywthI00sWxPztWLD3yjiUkewwu/wKA== + dependencies: + "@jest/console" "^29.4.1" + "@jest/reporters" "^29.4.1" + "@jest/test-result" "^29.4.1" + "@jest/transform" "^29.4.1" + "@jest/types" "^29.4.1" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" ci-info "^3.2.0" exit "^0.1.2" graceful-fs "^4.2.9" - jest-changed-files "^29.2.0" - jest-config "^29.3.1" - jest-haste-map "^29.3.1" - jest-message-util "^29.3.1" + jest-changed-files "^29.4.0" + jest-config "^29.4.1" + jest-haste-map "^29.4.1" + jest-message-util "^29.4.1" jest-regex-util "^29.2.0" - jest-resolve "^29.3.1" - jest-resolve-dependencies "^29.3.1" - jest-runner "^29.3.1" - jest-runtime "^29.3.1" - jest-snapshot "^29.3.1" - jest-util "^29.3.1" - jest-validate "^29.3.1" - jest-watcher "^29.3.1" + jest-resolve "^29.4.1" + jest-resolve-dependencies "^29.4.1" + jest-runner "^29.4.1" + jest-runtime "^29.4.1" + jest-snapshot "^29.4.1" + jest-util "^29.4.1" + jest-validate "^29.4.1" + jest-watcher "^29.4.1" micromatch "^4.0.4" - pretty-format "^29.3.1" + pretty-format "^29.4.1" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.3.1.tgz#eb039f726d5fcd14698acd072ac6576d41cfcaa6" - integrity sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag== +"@jest/environment@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.4.1.tgz#52d232a85cdc995b407a940c89c86568f5a88ffe" + integrity sha512-pJ14dHGSQke7Q3mkL/UZR9ZtTOxqskZaC91NzamEH4dlKRt42W+maRBXiw/LWkdJe+P0f/zDR37+SPMplMRlPg== dependencies: - "@jest/fake-timers" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/fake-timers" "^29.4.1" + "@jest/types" "^29.4.1" "@types/node" "*" - jest-mock "^29.3.1" + jest-mock "^29.4.1" -"@jest/expect-utils@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.3.1.tgz#531f737039e9b9e27c42449798acb5bba01935b6" - integrity sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g== +"@jest/expect-utils@^29.4.0": + version "29.4.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.4.0.tgz#97819d0da7027792888d9d2f1a41443be0baef80" + integrity sha512-w/JzTYIqjmPFIM5OOQHF9CawFx2daw1256Nzj4ZqWX96qRKbCq9WYRVqdySBKHHzuvsXLyTDIF6y61FUyrhmwg== dependencies: jest-get-type "^29.2.0" -"@jest/expect@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.3.1.tgz#456385b62894349c1d196f2d183e3716d4c6a6cd" - integrity sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg== +"@jest/expect-utils@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.4.1.tgz#105b9f3e2c48101f09cae2f0a4d79a1b3a419cbb" + integrity sha512-w6YJMn5DlzmxjO00i9wu2YSozUYRBhIoJ6nQwpMYcBMtiqMGJm1QBzOf6DDgRao8dbtpDoaqLg6iiQTvv0UHhQ== dependencies: - expect "^29.3.1" - jest-snapshot "^29.3.1" + jest-get-type "^29.2.0" -"@jest/fake-timers@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.3.1.tgz#b140625095b60a44de820876d4c14da1aa963f67" - integrity sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A== +"@jest/expect@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.4.1.tgz#3338fa20f547bb6e550c4be37d6f82711cc13c38" + integrity sha512-ZxKJP5DTUNF2XkpJeZIzvnzF1KkfrhEF6Rz0HGG69fHl6Bgx5/GoU3XyaeFYEjuuKSOOsbqD/k72wFvFxc3iTw== + dependencies: + expect "^29.4.1" + jest-snapshot "^29.4.1" + +"@jest/fake-timers@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.4.1.tgz#7b673131e8ea2a2045858f08241cace5d518b42b" + integrity sha512-/1joI6rfHFmmm39JxNfmNAO3Nwm6Y0VoL5fJDy7H1AtWrD1CgRtqJbN9Ld6rhAkGO76qqp4cwhhxJ9o9kYjQMw== dependencies: - "@jest/types" "^29.3.1" - "@sinonjs/fake-timers" "^9.1.2" + "@jest/types" "^29.4.1" + "@sinonjs/fake-timers" "^10.0.2" "@types/node" "*" - jest-message-util "^29.3.1" - jest-mock "^29.3.1" - jest-util "^29.3.1" + jest-message-util "^29.4.1" + jest-mock "^29.4.1" + jest-util "^29.4.1" -"@jest/globals@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.3.1.tgz#92be078228e82d629df40c3656d45328f134a0c6" - integrity sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q== +"@jest/globals@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.4.1.tgz#3cd78c5567ab0249f09fbd81bf9f37a7328f4713" + integrity sha512-znoK2EuFytbHH0ZSf2mQK2K1xtIgmaw4Da21R2C/NE/+NnItm5mPEFQmn8gmF3f0rfOlmZ3Y3bIf7bFj7DHxAA== dependencies: - "@jest/environment" "^29.3.1" - "@jest/expect" "^29.3.1" - "@jest/types" "^29.3.1" - jest-mock "^29.3.1" + "@jest/environment" "^29.4.1" + "@jest/expect" "^29.4.1" + "@jest/types" "^29.4.1" + jest-mock "^29.4.1" -"@jest/reporters@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.3.1.tgz#9a6d78c109608e677c25ddb34f907b90e07b4310" - integrity sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA== +"@jest/reporters@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.4.1.tgz#50d509c08575c75e3cd2176d72ec3786419d5e04" + integrity sha512-AISY5xpt2Xpxj9R6y0RF1+O6GRy9JsGa8+vK23Lmzdy1AYcpQn5ItX79wJSsTmfzPKSAcsY1LNt/8Y5Xe5LOSg== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/console" "^29.4.1" + "@jest/test-result" "^29.4.1" + "@jest/transform" "^29.4.1" + "@jest/types" "^29.4.1" "@jridgewell/trace-mapping" "^0.3.15" "@types/node" "*" chalk "^4.0.0" @@ -1426,20 +1497,20 @@ istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-message-util "^29.3.1" - jest-util "^29.3.1" - jest-worker "^29.3.1" + jest-message-util "^29.4.1" + jest-util "^29.4.1" + jest-worker "^29.4.1" slash "^3.0.0" string-length "^4.0.1" strip-ansi "^6.0.0" v8-to-istanbul "^9.0.1" -"@jest/schemas@^29.0.0": - version "29.0.0" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.0.0.tgz#5f47f5994dd4ef067fb7b4188ceac45f77fe952a" - integrity sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA== +"@jest/schemas@^29.4.0": + version "29.4.0" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.0.tgz#0d6ad358f295cc1deca0b643e6b4c86ebd539f17" + integrity sha512-0E01f/gOZeNTG76i5eWWSupvSHaIINrTie7vCyjiYFKgzNdyEGd12BUv4oNBFHOqlHDbtoJi3HrQ38KCC90NsQ== dependencies: - "@sinclair/typebox" "^0.24.1" + "@sinclair/typebox" "^0.25.16" "@jest/source-map@^29.2.0": version "29.2.0" @@ -1450,53 +1521,63 @@ callsites "^3.0.0" graceful-fs "^4.2.9" -"@jest/test-result@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.3.1.tgz#92cd5099aa94be947560a24610aa76606de78f50" - integrity sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw== +"@jest/test-result@^29.4.0": + version "29.4.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.4.0.tgz#64f7bd518d6d2a6662c40569e208e030a370f351" + integrity sha512-EtRklzjpddZU/aBVxJqqejfzfOcnehmjNXufs6u6qwd05kkhXpAPhZdt8bLlQd7cA2nD+JqZQ5Dx9NX5Jh6mjA== dependencies: - "@jest/console" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/console" "^29.4.0" + "@jest/types" "^29.4.0" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz#fa24b3b050f7a59d48f7ef9e0b782ab65123090d" - integrity sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA== +"@jest/test-result@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.4.1.tgz#997f19695e13b34779ceb3c288a416bd26c3238d" + integrity sha512-WRt29Lwt+hEgfN8QDrXqXGgCTidq1rLyFqmZ4lmJOpVArC8daXrZWkWjiaijQvgd3aOUj2fM8INclKHsQW9YyQ== + dependencies: + "@jest/console" "^29.4.1" + "@jest/types" "^29.4.1" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.4.1.tgz#f7a006ec7058b194a10cf833c88282ef86d578fd" + integrity sha512-v5qLBNSsM0eHzWLXsQ5fiB65xi49A3ILPSFQKPXzGL4Vyux0DPZAIN7NAFJa9b4BiTDP9MBF/Zqc/QA1vuiJ0w== dependencies: - "@jest/test-result" "^29.3.1" + "@jest/test-result" "^29.4.1" graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" + jest-haste-map "^29.4.1" slash "^3.0.0" -"@jest/transform@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.3.1.tgz#1e6bd3da4af50b5c82a539b7b1f3770568d6e36d" - integrity sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug== +"@jest/transform@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.4.1.tgz#e4f517841bb795c7dcdee1ba896275e2c2d26d4a" + integrity sha512-5w6YJrVAtiAgr0phzKjYd83UPbCXsBRTeYI4BXokv9Er9CcrH9hfXL/crCvP2d2nGOcovPUnlYiLPFLZrkG5Hg== dependencies: "@babel/core" "^7.11.6" - "@jest/types" "^29.3.1" + "@jest/types" "^29.4.1" "@jridgewell/trace-mapping" "^0.3.15" babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" convert-source-map "^2.0.0" fast-json-stable-stringify "^2.1.0" graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" + jest-haste-map "^29.4.1" jest-regex-util "^29.2.0" - jest-util "^29.3.1" + jest-util "^29.4.1" micromatch "^4.0.4" pirates "^4.0.4" slash "^3.0.0" - write-file-atomic "^4.0.1" + write-file-atomic "^5.0.0" -"@jest/types@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.3.1.tgz#7c5a80777cb13e703aeec6788d044150341147e3" - integrity sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA== +"@jest/types@^29.4.0", "@jest/types@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.4.1.tgz#f9f83d0916f50696661da72766132729dcb82ecb" + integrity sha512-zbrAXDUOnpJ+FMST2rV7QZOgec8rskg2zv8g2ajeqitp4tvZiyqTCYXANrKsM+ryj5o+LI+ZN2EgU9drrkiwSA== dependencies: - "@jest/schemas" "^29.0.0" + "@jest/schemas" "^29.4.0" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" @@ -1564,17 +1645,17 @@ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== -"@mdn/bcd-utils-api@^0.0.2": - version "0.0.2" - resolved "https://registry.yarnpkg.com/@mdn/bcd-utils-api/-/bcd-utils-api-0.0.2.tgz#c5bdda39d7d6f5a6dfa6547bd89a2633bf1711e5" - integrity sha512-U58OQDwi/NYd2dSkVeESSPCqJI+tA8wHUUiYGDpMQ6pq7lxUMW9bWkTzb0DpFKFKM+yeXrvhaNTyJCU4UevYVQ== +"@mdn/bcd-utils-api@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@mdn/bcd-utils-api/-/bcd-utils-api-0.0.3.tgz#8ef135dc4985d0ed7cc8616b546055007ef77b07" + integrity sha512-plyZoNOtKGKPoMkQQ/KXziQswzrhO1rdrjslcM7J2TRCOAlusnmjhPf3NKyvv7mDm0nqHex+l8Chq2TUj8tehw== dependencies: "@mdn/browser-compat-data" latest -"@mdn/browser-compat-data@^5.2.23": - version "5.2.23" - resolved "https://registry.yarnpkg.com/@mdn/browser-compat-data/-/browser-compat-data-5.2.23.tgz#77e9f8ebd53865cd7ce3afdb8cbef895ad8c20bf" - integrity sha512-El3EaBt6EzO8DrRgpaJKLwik+wdImyIxL6Nbp9iQSddDIfmrFvF+Chz2LYBQoLEUCg8wjwEVRMA44TwlhW3rjQ== +"@mdn/browser-compat-data@^5.2.34": + version "5.2.34" + resolved "https://registry.yarnpkg.com/@mdn/browser-compat-data/-/browser-compat-data-5.2.34.tgz#803b52e6fd7fc97215f76ccd469ba74924079cb2" + integrity sha512-Z2YDZ+wTOo9q7ztKndznivTbPk+DOVDUcc8Gdq3nE00AErSZlt/aWNlE33lVfR/7FcP9Zz3uaSA2nBzOGGrh8A== "@mdn/browser-compat-data@latest": version "5.2.21" @@ -1629,13 +1710,25 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@playwright/test@^1.29.1": - version "1.29.1" - resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.29.1.tgz#f2ed4dc143b9c7825a7ad2703b2f1ac4354e1145" - integrity sha512-iQxk2DX5U9wOGV3+/Jh9OHPsw5H3mleUL2S4BgQuwtlAfK3PnKvn38m4Rg9zIViGHVW24opSm99HQm/UFLEy6w== +"@pkgr/utils@^2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.3.1.tgz#0a9b06ffddee364d6642b3cd562ca76f55b34a03" + integrity sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw== + dependencies: + cross-spawn "^7.0.3" + is-glob "^4.0.3" + open "^8.4.0" + picocolors "^1.0.0" + tiny-glob "^0.2.9" + tslib "^2.4.0" + +"@playwright/test@^1.30.0": + version "1.30.0" + resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.30.0.tgz#8c0c4930ff2c7be7b3ec3fd434b2a3b4465ed7cb" + integrity sha512-SVxkQw1xvn/Wk/EvBnqWIq6NLo1AppwbYOjNLmyU0R1RoQ3rLEBtmjTnElcnz8VEtn11fptj1ECxK0tgURhajw== dependencies: "@types/node" "*" - playwright-core "1.29.1" + playwright-core "1.30.0" "@pmmmwh/react-refresh-webpack-plugin@^0.5.10": version "0.5.10" @@ -1652,10 +1745,10 @@ schema-utils "^3.0.0" source-map "^0.7.3" -"@remix-run/router@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.2.1.tgz#812edd4104a15a493dda1ccac0b352270d7a188c" - integrity sha512-XiY0IsyHR+DXYS5vBxpoBe/8veTeoRpMHP+vDosLZxL5bnpetzI0igkxkLZS235ldLzyfkxF+2divEwWHP3vMQ== +"@remix-run/router@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.3.1.tgz#3bb0b6ddc0a276e8dc1138d08f63035e4e23e8bf" + integrity sha512-+eun1Wtf72RNRSqgU7qM2AMX/oHp+dnx7BHk1qhK5ZHzdHTUU4LA1mGG1vT+jMc8sbhG3orvsfOmryjzx2PzQw== "@rollup/plugin-babel@^5.2.0": version "5.3.1" @@ -1707,10 +1800,10 @@ "@babel/code-frame" "^7.16.0" chalk "^4.1.0" -"@sinclair/typebox@^0.24.1": - version "0.24.47" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.47.tgz#530b67163714356f93e82bdb871e7db4b7bc564e" - integrity sha512-J4Xw0xYK4h7eC34MNOPQi6IkNxGRck6n4VJpWDzXIFVTW8I/D43Gf+NfWz/v/7NHlzWOPd3+T4PJ4OqklQ2u7A== +"@sinclair/typebox@^0.25.16": + version "0.25.21" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.21.tgz#763b05a4b472c93a8db29b2c3e359d55b29ce272" + integrity sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g== "@sindresorhus/is@^0.7.0": version "0.7.0" @@ -1722,19 +1815,19 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== -"@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== +"@sinonjs/commons@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" + integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== +"@sinonjs/fake-timers@^10.0.2": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz#d10549ed1f423d80639c528b6c7f5a1017747d0c" + integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== dependencies: - "@sinonjs/commons" "^1.7.0" + "@sinonjs/commons" "^2.0.0" "@surma/rollup-plugin-off-main-thread@^2.2.3": version "2.2.3" @@ -1852,71 +1945,71 @@ "@svgr/plugin-jsx" "^6.5.1" "@svgr/plugin-svgo" "^6.5.1" -"@swc/core-darwin-arm64@1.3.24": - version "1.3.24" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.24.tgz#d41fc574cb5049def9001903680fdd924f065052" - integrity sha512-rR+9UpWm+fGXcipsjCst2hIL1GYIbo0YTLhJZWdIpQD6KRHHJMFXiydMgQQkDj2Ml7HpqUVgxj6m4ZWYL8b0OA== - -"@swc/core-darwin-x64@1.3.24": - version "1.3.24" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.24.tgz#0f7a3960b91cbd7f95f25542b29d0e08bde4f59d" - integrity sha512-px+5vkGtgPH0m3FkkTBHynlRdS5rRz+lK+wiXIuBZFJSySWFl6RkKbvwkD+sf0MpazQlqwlv/rTOGJBw6oDffg== - -"@swc/core-linux-arm-gnueabihf@1.3.24": - version "1.3.24" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.24.tgz#a0fdd97b8341806b57290217830a5d1ab7d0b193" - integrity sha512-jLs8ZOdTV4UW4J12E143QJ4mOMONQtqgAnuhBbRuWFzQ3ny1dfoC3P1jNWAJ2Xi59XdxAIXn0PggPNH4Kh34kw== - -"@swc/core-linux-arm64-gnu@1.3.24": - version "1.3.24" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.24.tgz#0536d03e12dd471ebafc180599488404aebb65cf" - integrity sha512-A/v0h70BekrwGpp1DlzIFGcHQ3QQ2PexXcnnuIBZeMc9gNmHlcZmg3EcwAnaUDiokhNuSUFA/wV94yk1OqmSkw== - -"@swc/core-linux-arm64-musl@1.3.24": - version "1.3.24" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.24.tgz#54f46ffea1bf6ffcbe7c62037efaefdfb5115214" - integrity sha512-pbc9eArWPTiMrbpS/pJo0IiQNAKAQBcBIDjWBGP1tcw2iDXYLw4bruwz9kI/VjakbshWb8MoE4T5ClkeuULvSw== - -"@swc/core-linux-x64-gnu@1.3.24": - version "1.3.24" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.24.tgz#c2b5cef83f8afd2a57d0eafbac083562d50cd0e6" - integrity sha512-pP5pOLlY1xd352qo7rTlpVPUI9/9VhOd4b3Lk+LzfZDq9bTL2NDlGfyrPiwa5DGHMSzrugH56K2J68eutkxYVA== - -"@swc/core-linux-x64-musl@1.3.24": - version "1.3.24" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.24.tgz#3459d01f9bf745568a4196c1993987f3d4a98303" - integrity sha512-phNbP7zGp+Wcyxq1Qxlpe5KkxO7WLT2kVQUC7aDFGlVdCr+xdXsfH1MzheHtnr0kqTVQX1aiM8XXXHfFxR0oNA== - -"@swc/core-win32-arm64-msvc@1.3.24": - version "1.3.24" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.24.tgz#85a18c844c00d66bf46db99d9c98e9550b4d28f5" - integrity sha512-qhbiJTWAOqyR+K9xnGmCkOWSz2EmWpDBstEJCEOTc6FZiEdbiTscDmqTcMbCKaTHGu8t+6erVA4t65/Eg6uWPA== - -"@swc/core-win32-ia32-msvc@1.3.24": - version "1.3.24" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.24.tgz#18318199ba06cab4ead8f6122b9f30b3f452b1e7" - integrity sha512-JfghIlscE4Rz+Lc08lSoDh+R0cWxrISed5biogFfE6vZqhaDnw3E5Qshqw7O3pIaiq8L2u1nmzuyP581ZmpbRA== - -"@swc/core-win32-x64-msvc@1.3.24": - version "1.3.24" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.24.tgz#b53746787e5af021787134d393fd67b0431f90d9" - integrity sha512-3AmJRr0hwciwDBbzUNqaftvppzS8v9X/iv/Wl7YaVLBVpPfQvaZzfqLycvNMGLZb5vIKXR/u58txg3dRBGsJtw== - -"@swc/core@^1.3.24": - version "1.3.24" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.24.tgz#ef6b30267c1bbd48af62cbc91370fe9b3f5d6a23" - integrity sha512-QMOTd0AgiUT3K1crxLRqd3gw0f3FC8hhH1vvlIlryvYqU4c+FJ/T2G4ZhMKLxQlZ/jX6Rhk0gKINZRBxy2GFyQ== +"@swc/core-darwin-arm64@1.3.32": + version "1.3.32" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.32.tgz#841b0a244c2c75e67bb9d3cb665b2ede601e4e3a" + integrity sha512-o19bhlxuUgjUElm6i+QhXgZ0vD6BebiB/gQpK3en5aAwhOvinwr4sah3GqFXsQzz/prKVDuMkj9SW6F/Ug5hgg== + +"@swc/core-darwin-x64@1.3.32": + version "1.3.32" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.32.tgz#125247c6a5d7189776a6973b0a539a07576d5585" + integrity sha512-hVEGd+v5Afh+YekGADOGKwhuS4/AXk91nLuk7pmhWkk8ceQ1cfmah90kXjIXUlCe2G172MLRfHNWlZxr29E/Og== + +"@swc/core-linux-arm-gnueabihf@1.3.32": + version "1.3.32" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.32.tgz#d8ba8da3707b91e62059e65e375fc6093c4d5f82" + integrity sha512-5X01WqI9EbJ69oHAOGlI08YqvEIXMfT/mCJ1UWDQBb21xWRE2W1yFAAeuqOLtiagLrXjPv/UKQ0S2gyWQR5AXQ== + +"@swc/core-linux-arm64-gnu@1.3.32": + version "1.3.32" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.32.tgz#15973e533c45e2976e57c590613e3e5dca0e62ad" + integrity sha512-PTJ6oPiutkNBg+m22bUUPa4tNuMmsgpSnsnv2wnWVOgK0lhvQT6bAPTUXDq/8peVAgR/SlpP2Ht8TRRqYMRjRQ== + +"@swc/core-linux-arm64-musl@1.3.32": + version "1.3.32" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.32.tgz#0e20f30885c8588bd13e7e5628ce8bdbe6cb44b6" + integrity sha512-lG0VOuYNPWOCJ99Aza69cTljjeft/wuRQeYFF8d+1xCQS/OT7gnbgi7BOz39uSHIPTBqfzdIsuvzdKlp9QydrQ== + +"@swc/core-linux-x64-gnu@1.3.32": + version "1.3.32" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.32.tgz#2ea5e17d13a70e6a13742282cf30e92e4074f4c5" + integrity sha512-ecqtSWX4NBrs7Ji2VX3fDWeqUfrbLlYqBuufAziCM27xMxwlAVgmyGQk4FYgoQ3SAUAu3XFH87+3Q7uWm2X7xg== + +"@swc/core-linux-x64-musl@1.3.32": + version "1.3.32" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.32.tgz#d96cde03d54f13f77dd1d6602a049bd2baaef446" + integrity sha512-rl3dMcUuENVkpk5NGW/LXovjK0+JFm4GWPjy4NM3Q5cPvhBpGwSeLZlR+zAw9K0fdGoIXiayRTTfENrQwwsH+g== + +"@swc/core-win32-arm64-msvc@1.3.32": + version "1.3.32" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.32.tgz#3870113492cc3d2679945372f4975ce7f60594cc" + integrity sha512-VlybAZp8DcS66CH1LDnfp9zdwbPlnGXREtHDMHaBfK9+80AWVTg+zn0tCYz+HfcrRONqxbudwOUIPj+dwl/8jw== + +"@swc/core-win32-ia32-msvc@1.3.32": + version "1.3.32" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.32.tgz#643519663778e64941c8b730197d4ba762dffcb0" + integrity sha512-MEUMdpUFIQ+RD+K/iHhHKfu0TFNj9VXwIxT5hmPeqyboKo095CoFEFBJ0sHG04IGlnu8T9i+uE2Pi18qUEbFug== + +"@swc/core-win32-x64-msvc@1.3.32": + version "1.3.32" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.32.tgz#aa9595cb93d9dd5bbc7e5cfdabd8bb086ea6c21d" + integrity sha512-DPMoneNFQco7SqmVVOUv1Vn53YmoImEfrAPMY9KrqQzgfzqNTuL2JvfxUqfAxwQ6pEKYAdyKJvZ483rIhgG9XQ== + +"@swc/core@^1.3.32": + version "1.3.32" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.32.tgz#ecb3c9d7717e0a15796230def1b17968b18228f1" + integrity sha512-Yx/n1j+uUkcqlJAW8IRg8Qymgkdow6NHJZPFShiR0YiaYq2sXY+JHmvh16O6GkL91Y+gTlDUS7uVgDz50czJUQ== optionalDependencies: - "@swc/core-darwin-arm64" "1.3.24" - "@swc/core-darwin-x64" "1.3.24" - "@swc/core-linux-arm-gnueabihf" "1.3.24" - "@swc/core-linux-arm64-gnu" "1.3.24" - "@swc/core-linux-arm64-musl" "1.3.24" - "@swc/core-linux-x64-gnu" "1.3.24" - "@swc/core-linux-x64-musl" "1.3.24" - "@swc/core-win32-arm64-msvc" "1.3.24" - "@swc/core-win32-ia32-msvc" "1.3.24" - "@swc/core-win32-x64-msvc" "1.3.24" + "@swc/core-darwin-arm64" "1.3.32" + "@swc/core-darwin-x64" "1.3.32" + "@swc/core-linux-arm-gnueabihf" "1.3.32" + "@swc/core-linux-arm64-gnu" "1.3.32" + "@swc/core-linux-arm64-musl" "1.3.32" + "@swc/core-linux-x64-gnu" "1.3.32" + "@swc/core-linux-x64-musl" "1.3.32" + "@swc/core-win32-arm64-msvc" "1.3.32" + "@swc/core-win32-ia32-msvc" "1.3.32" + "@swc/core-win32-x64-msvc" "1.3.32" "@szmarczak/http-timer@^4.0.5": version "4.0.6" @@ -2081,10 +2174,10 @@ "@types/eslint" "*" "@types/estree" "*" -"@types/eslint@*", "@types/eslint@^7.29.0 || ^8.4.1": - version "8.4.7" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.7.tgz#0f05a2677d1a394ff70c21a964a32d3efa05f966" - integrity sha512-ehM7cCt2RSFs42mb+lcmhFT9ouIlV92PuaeRGn8N8c98oMjG4Z5pJHA9b1QiCcuqnbPSHcyfiD3mlhqMaHsQIw== +"@types/eslint@*", "@types/eslint@^8.4.10": + version "8.21.0" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.21.0.tgz#21724cfe12b96696feafab05829695d4d7bd7c48" + integrity sha512-35EhHNOXgxnUgh4XCJsGhE7zdlDhYDN/aMG6UbkByCFFNgQ7b3U+uVoqBpicFydR8JEfgdjCF7SJ7MiJfzuiTA== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -2188,10 +2281,10 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@^29.2.4": - version "29.2.4" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.2.4.tgz#9c155c4b81c9570dbd183eb8604aa0ae80ba5a5b" - integrity sha512-PipFB04k2qTRPePduVLTRiPzQfvMeLwUN3Z21hsAKaB/W9IIzgB2pizCL466ftJlcyZqnHoC9ZHpxLGl3fS86A== +"@types/jest@^29.4.0": + version "29.4.0" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.4.0.tgz#a8444ad1704493e84dbf07bb05990b275b3b9206" + integrity sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ== dependencies: expect "^29.0.0" pretty-format "^29.0.0" @@ -2264,10 +2357,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.32.tgz#8074f7106731f1a12ba993fe8bad86ee73905014" integrity sha512-Y6S38pFr04yb13qqHf8uk1nHE3lXgQ30WZbv1mLliV9pt0NjvqdWttLcrOYLnXbOafknVYRHZGoMSpR9UwfYow== -"@types/node@^16.18.10": - version "16.18.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.10.tgz#d7415ef18c94f8d4e4a82ebcc8b8999f965d8920" - integrity sha512-XU1+v7h81p7145ddPfjv7jtWvkSilpcnON3mQ+bDi9Yuf7OI56efOglXRyXWgQ57xH3fEQgh7WOJMncRHVew5w== +"@types/node@^16.18.12": + version "16.18.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.12.tgz#e3bfea80e31523fde4292a6118f19ffa24fd6f65" + integrity sha512-vzLe5NaNMjIE3mcddFVGlAXN1LEWueUsMsOJWaT6wWMJGyljHAWHznqfnKUQWGzu7TLPrGvWdNAsvQYW+C0xtw== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -2318,10 +2411,10 @@ dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^18.0.26": - version "18.0.26" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.26.tgz#8ad59fc01fef8eaf5c74f4ea392621749f0b7917" - integrity sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug== +"@types/react@*", "@types/react@^18.0.27": + version "18.0.27" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.0.27.tgz#d9425abe187a00f8a5ec182b010d4fd9da703b71" + integrity sha512-3vtRKHgVxu3Jp9t718R9BuzoD4NcQ8YJ5XRzsSKxNDiDonD2MXIT1TmSkenxuCycZJoQT5d2vE8LwWJxBC1gmA== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -2434,15 +2527,16 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^5.47.1", "@typescript-eslint/eslint-plugin@^5.5.0": - version "5.47.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.47.1.tgz#50cc5085578a7fa22cd46a0806c2e5eae858af02" - integrity sha512-r4RZ2Jl9kcQN7K/dcOT+J7NAimbiis4sSM9spvWimsBvDegMhKLA5vri2jG19PmIPbDjPeWzfUPQ2hjEzA4Nmg== +"@typescript-eslint/eslint-plugin@^5.5.0", "@typescript-eslint/eslint-plugin@^5.50.0": + version "5.50.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.50.0.tgz#fb48c31cadc853ffc1dc35373f56b5e2a8908fe9" + integrity sha512-vwksQWSFZiUhgq3Kv7o1Jcj0DUNylwnIlGvKvLLYsq8pAWha6/WCnXUeaSoNNha/K7QSf2+jvmkxggC1u3pIwQ== dependencies: - "@typescript-eslint/scope-manager" "5.47.1" - "@typescript-eslint/type-utils" "5.47.1" - "@typescript-eslint/utils" "5.47.1" + "@typescript-eslint/scope-manager" "5.50.0" + "@typescript-eslint/type-utils" "5.50.0" + "@typescript-eslint/utils" "5.50.0" debug "^4.3.4" + grapheme-splitter "^1.0.4" ignore "^5.2.0" natural-compare-lite "^1.4.0" regexpp "^3.2.0" @@ -2456,14 +2550,14 @@ dependencies: "@typescript-eslint/utils" "5.40.1" -"@typescript-eslint/parser@^5.47.1", "@typescript-eslint/parser@^5.5.0": - version "5.47.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.47.1.tgz#c4bf16f8c3c7608ce4bf8ff804b677fc899f173f" - integrity sha512-9Vb+KIv29r6GPu4EboWOnQM7T+UjpjXvjCPhNORlgm40a9Ia9bvaPJswvtae1gip2QEeVeGh6YquqAzEgoRAlw== +"@typescript-eslint/parser@^5.5.0", "@typescript-eslint/parser@^5.50.0": + version "5.50.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.50.0.tgz#a33f44b2cc83d1b7176ec854fbecd55605b0b032" + integrity sha512-KCcSyNaogUDftK2G9RXfQyOCt51uB5yqC6pkUYqhYh8Kgt+DwR5M0EwEAxGPy/+DH6hnmKeGsNhiZRQxjH71uQ== dependencies: - "@typescript-eslint/scope-manager" "5.47.1" - "@typescript-eslint/types" "5.47.1" - "@typescript-eslint/typescript-estree" "5.47.1" + "@typescript-eslint/scope-manager" "5.50.0" + "@typescript-eslint/types" "5.50.0" + "@typescript-eslint/typescript-estree" "5.50.0" debug "^4.3.4" "@typescript-eslint/scope-manager@5.40.1": @@ -2474,21 +2568,21 @@ "@typescript-eslint/types" "5.40.1" "@typescript-eslint/visitor-keys" "5.40.1" -"@typescript-eslint/scope-manager@5.47.1": - version "5.47.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.47.1.tgz#0d302b3c2f20ab24e4787bf3f5a0d8c449b823bd" - integrity sha512-9hsFDsgUwrdOoW1D97Ewog7DYSHaq4WKuNs0LHF9RiCmqB0Z+XRR4Pf7u7u9z/8CciHuJ6yxNws1XznI3ddjEw== +"@typescript-eslint/scope-manager@5.50.0": + version "5.50.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.50.0.tgz#90b8a3b337ad2c52bbfe4eac38f9164614e40584" + integrity sha512-rt03kaX+iZrhssaT974BCmoUikYtZI24Vp/kwTSy841XhiYShlqoshRFDvN1FKKvU2S3gK+kcBW1EA7kNUrogg== dependencies: - "@typescript-eslint/types" "5.47.1" - "@typescript-eslint/visitor-keys" "5.47.1" + "@typescript-eslint/types" "5.50.0" + "@typescript-eslint/visitor-keys" "5.50.0" -"@typescript-eslint/type-utils@5.47.1": - version "5.47.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.47.1.tgz#aee13314f840ab336c1adb49a300856fd16d04ce" - integrity sha512-/UKOeo8ee80A7/GJA427oIrBi/Gd4osk/3auBUg4Rn9EahFpevVV1mUK8hjyQD5lHPqX397x6CwOk5WGh1E/1w== +"@typescript-eslint/type-utils@5.50.0": + version "5.50.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.50.0.tgz#509d5cc9728d520008f7157b116a42c5460e7341" + integrity sha512-dcnXfZ6OGrNCO7E5UY/i0ktHb7Yx1fV6fnQGGrlnfDhilcs6n19eIRcvLBqx6OQkrPaFlDPk3OJ0WlzQfrV0bQ== dependencies: - "@typescript-eslint/typescript-estree" "5.47.1" - "@typescript-eslint/utils" "5.47.1" + "@typescript-eslint/typescript-estree" "5.50.0" + "@typescript-eslint/utils" "5.50.0" debug "^4.3.4" tsutils "^3.21.0" @@ -2497,10 +2591,10 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.40.1.tgz#de37f4f64de731ee454bb2085d71030aa832f749" integrity sha512-Icg9kiuVJSwdzSQvtdGspOlWNjVDnF3qVIKXdJ103o36yRprdl3Ge5cABQx+csx960nuMF21v8qvO31v9t3OHw== -"@typescript-eslint/types@5.47.1": - version "5.47.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.47.1.tgz#459f07428aec5a8c4113706293c2ae876741ac8e" - integrity sha512-CmALY9YWXEpwuu6377ybJBZdtSAnzXLSQcxLSqSQSbC7VfpMu/HLVdrnVJj7ycI138EHqocW02LPJErE35cE9A== +"@typescript-eslint/types@5.50.0": + version "5.50.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.50.0.tgz#c461d3671a6bec6c2f41f38ed60bd87aa8a30093" + integrity sha512-atruOuJpir4OtyNdKahiHZobPKFvZnBnfDiyEaBf6d9vy9visE7gDjlmhl+y29uxZ2ZDgvXijcungGFjGGex7w== "@typescript-eslint/typescript-estree@5.40.1": version "5.40.1" @@ -2515,13 +2609,13 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@5.47.1": - version "5.47.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.47.1.tgz#b9d8441308aca53df7f69b2c67a887b82c9ed418" - integrity sha512-4+ZhFSuISAvRi2xUszEj0xXbNTHceV9GbH9S8oAD2a/F9SW57aJNQVOCxG8GPfSWH/X4eOPdMEU2jYVuWKEpWA== +"@typescript-eslint/typescript-estree@5.50.0": + version "5.50.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.50.0.tgz#0b9b82975bdfa40db9a81fdabc7f93396867ea97" + integrity sha512-Gq4zapso+OtIZlv8YNAStFtT6d05zyVCK7Fx3h5inlLBx2hWuc/0465C2mg/EQDDU2LKe52+/jN4f0g9bd+kow== dependencies: - "@typescript-eslint/types" "5.47.1" - "@typescript-eslint/visitor-keys" "5.47.1" + "@typescript-eslint/types" "5.50.0" + "@typescript-eslint/visitor-keys" "5.50.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -2542,16 +2636,16 @@ eslint-utils "^3.0.0" semver "^7.3.7" -"@typescript-eslint/utils@5.47.1", "@typescript-eslint/utils@^5.10.0", "@typescript-eslint/utils@^5.13.0": - version "5.47.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.47.1.tgz#595f25ac06e9ee28c339fd43c709402820b13d7b" - integrity sha512-l90SdwqfmkuIVaREZ2ykEfCezepCLxzWMo5gVfcJsJCaT4jHT+QjgSkYhs5BMQmWqE9k3AtIfk4g211z/sTMVw== +"@typescript-eslint/utils@5.50.0", "@typescript-eslint/utils@^5.10.0", "@typescript-eslint/utils@^5.13.0": + version "5.50.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.50.0.tgz#807105f5ffb860644d30d201eefad7017b020816" + integrity sha512-v/AnUFImmh8G4PH0NDkf6wA8hujNNcrwtecqW4vtQ1UOSNBaZl49zP1SHoZ/06e+UiwzHpgb5zP5+hwlYYWYAw== dependencies: "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.47.1" - "@typescript-eslint/types" "5.47.1" - "@typescript-eslint/typescript-estree" "5.47.1" + "@typescript-eslint/scope-manager" "5.50.0" + "@typescript-eslint/types" "5.50.0" + "@typescript-eslint/typescript-estree" "5.50.0" eslint-scope "^5.1.1" eslint-utils "^3.0.0" semver "^7.3.7" @@ -2564,12 +2658,12 @@ "@typescript-eslint/types" "5.40.1" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@5.47.1": - version "5.47.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.1.tgz#d35c2da544dbb685db9c5b5b85adac0a1d74d1f2" - integrity sha512-rF3pmut2JCCjh6BLRhNKdYjULMb1brvoaiWDlHfLNVgmnZ0sBVJrs3SyaKE1XoDDnJuAx/hDQryHYmPUuNq0ig== +"@typescript-eslint/visitor-keys@5.50.0": + version "5.50.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.50.0.tgz#b752ffc143841f3d7bc57d6dd01ac5c40f8c4903" + integrity sha512-cdMeD9HGu6EXIeGOh2yVW6oGf9wq8asBgZx7nsR/D36gTfQ0odE5kcRYe5M81vjEFAcPeugXrHg78Imu55F6gg== dependencies: - "@typescript-eslint/types" "5.47.1" + "@typescript-eslint/types" "5.50.0" eslint-visitor-keys "^3.3.0" "@use-it/interval@^1.0.0": @@ -2970,18 +3064,12 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b" - integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA== +aria-query@^5.0.0, aria-query@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== dependencies: - "@babel/runtime" "^7.10.2" - "@babel/runtime-corejs3" "^7.10.2" - -aria-query@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.0.2.tgz#0b8a744295271861e1d933f8feca13f9b70cfdc1" - integrity sha512-eigU3vhqSO+Z8BKDnVLN/ompjhf3pYzecKXz8+whRy+9gZu8n1TCGfwzQUUPnqdHl9ax1Hr9031orZ+UOEYr7Q== + deep-equal "^2.0.5" array-flatten@1.1.1: version "1.1.1" @@ -2993,7 +3081,7 @@ array-flatten@^2.1.2: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-includes@^3.1.4, array-includes@^3.1.5, array-includes@^3.1.6: +array-includes@^3.1.5, array-includes@^3.1.6: version "3.1.6" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== @@ -3009,14 +3097,14 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array.prototype.flat@^1.2.5: - version "1.3.0" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" - integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== +array.prototype.flat@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" array.prototype.flatmap@^1.2.3, array.prototype.flatmap@^1.3.1: @@ -3099,33 +3187,40 @@ autoprefixer@^10.4.13: picocolors "^1.0.0" postcss-value-parser "^4.2.0" -axe-core@^4.4.3: - version "4.4.3" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.3.tgz#11c74d23d5013c0fa5d183796729bc3482bd2f6f" - integrity sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w== +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== -axobject-query@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" - integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== +axe-core@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.6.2.tgz#6e566ab2a3d29e415f5115bc0fd2597a5eb3e5e3" + integrity sha512-b1WlTV8+XKLj9gZy2DZXgQiyDp9xkkoe2a6U6UbYccScq2wgH/YwCeI2/Jq2mgo0HzQxqJOjWZBLeA/mqsk5Mg== -babel-jest@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.3.1.tgz#05c83e0d128cd48c453eea851482a38782249f44" - integrity sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA== +axobject-query@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" + integrity sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== dependencies: - "@jest/transform" "^29.3.1" + deep-equal "^2.0.5" + +babel-jest@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.4.1.tgz#01fa167e27470b35c2d4a1b841d9586b1764da19" + integrity sha512-xBZa/pLSsF/1sNpkgsiT3CmY7zV1kAsZ9OxxtrFqYucnOuRftXAfcJqcDVyOPeN4lttWTwhLdu0T9f8uvoPEUg== + dependencies: + "@jest/transform" "^29.4.1" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.2.0" + babel-preset-jest "^29.4.0" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" -babel-loader@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.0.tgz#839e9ae88aea930864ef9ec0f356dfca96ecf238" - integrity sha512-Antt61KJPinUMwHwIIz9T5zfMgevnfZkEVWYDWlG888fgdvRRGD0JTuf/fFozQnfT+uq64sk1bmdHDy/mOEWnA== +babel-loader@^9.1.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.2.tgz#a16a080de52d08854ee14570469905a5fc00d39c" + integrity sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA== dependencies: find-cache-dir "^3.3.2" schema-utils "^4.0.0" @@ -3141,10 +3236,10 @@ babel-plugin-istanbul@^6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz#23ee99c37390a98cfddf3ef4a78674180d823094" - integrity sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA== +babel-plugin-jest-hoist@^29.4.0: + version "29.4.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.4.0.tgz#3fd3dfcedf645932df6d0c9fc3d9a704dd860248" + integrity sha512-a/sZRLQJEmsmejQ2rPEUe35nO1+C9dc9O1gplH1SXmJxveQSRUYdBk8yGZG/VOUuZs1u2aHZJusEGoRMbhhwCg== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -3212,12 +3307,12 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz#3048bea3a1af222e3505e4a767a974c95a7620dc" - integrity sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA== +babel-preset-jest@^29.4.0: + version "29.4.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.4.0.tgz#c2b03c548b02dea0a18ae21d5759c136f9251ee4" + integrity sha512-fUB9vZflUSM3dO/6M2TCAepTzvA4VkOvl67PjErcrQMGt9Eve7uazaeyCZ2th3UtI7ljpiBJES0F7A1vBRsLZA== dependencies: - babel-plugin-jest-hoist "^29.2.0" + babel-plugin-jest-hoist "^29.4.0" babel-preset-current-node-syntax "^1.0.0" babel-preset-react-app@^10.0.1: @@ -3412,11 +3507,6 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browser-specs@^3.36.0: - version "3.36.0" - resolved "https://registry.yarnpkg.com/browser-specs/-/browser-specs-3.36.0.tgz#aac13506fd9d0e534ba146d156f1883e9ae8fbe8" - integrity sha512-jlE9X1c1pk2BfI+qWyt6zwPhHQSA8Zd3da1sKCiIct3oCBKxL4UduFO8uH+M77sp4VQfPHm/eeOlZAJBGj1z8Q== - browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.18.1, browserslist@^4.20.3, browserslist@^4.21.3, browserslist@^4.21.4: version "4.21.4" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" @@ -3427,6 +3517,16 @@ browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4 node-releases "^2.0.6" update-browserslist-db "^1.0.9" +browserslist@^4.21.5: + version "4.21.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" + integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== + dependencies: + caniuse-lite "^1.0.30001449" + electron-to-chromium "^1.4.284" + node-releases "^2.0.8" + update-browserslist-db "^1.0.10" + bs-logger@0.x: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" @@ -3590,15 +3690,15 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001400: - version "1.0.30001422" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001422.tgz#f2d7c6202c49a8359e6e35add894d88ef93edba1" - integrity sha512-hSesn02u1QacQHhaxl/kNMZwqVG35Sz/8DgvmgedxSH8z9UUpcDYSPYgsj3x5dQNRcNp6BwpSfQfVzYUTm+fog== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001426, caniuse-lite@^1.0.30001449: + version "1.0.30001449" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001449.tgz#a8d11f6a814c75c9ce9d851dc53eb1d1dfbcd657" + integrity sha512-CPB+UL9XMT/Av+pJxCKGhdx+yg1hzplvFJQlJ2n68PyQGMz9L/E2zCyLdOL8uasbouTUgnPl+y0tccI/se+BEw== -caniuse-lite@^1.0.30001426: - version "1.0.30001431" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz#e7c59bd1bc518fae03a4656be442ce6c4887a795" - integrity sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ== +caniuse-lite@^1.0.30001400: + version "1.0.30001450" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001450.tgz#022225b91200589196b814b51b1bbe45144cf74f" + integrity sha512-qMBmvmQmFXaSxexkjjfMvD5rnDL0+m+dUMZKoDYsGG8iZN29RuYh9eRoMvKsT6uMAWlyUUGDEQGJJYjzCIO9ew== capital-case@^1.0.4: version "1.0.4" @@ -3654,6 +3754,11 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" + integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== + change-case@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12" @@ -4118,7 +4223,7 @@ core-js-compat@^3.25.1: dependencies: browserslist "^4.21.4" -core-js-pure@^3.23.3, core-js-pure@^3.25.1: +core-js-pure@^3.23.3: version "3.25.5" resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.25.5.tgz#79716ba54240c6aa9ceba6eee08cf79471ba184d" integrity sha512-oml3M22pHM+igfWHDfdLVq2ShWmjM2V4L+dQEBs0DWVIqEm9WHCwGAlZ6BmyBQGy5sFrJmcx+856D9lVKyGWYg== @@ -4201,12 +4306,12 @@ crypto-random-string@^2.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== -css-blank-pseudo@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz#36523b01c12a25d812df343a32c322d2a2324561" - integrity sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ== +css-blank-pseudo@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-5.0.1.tgz#55f159510e1084576ae7037175b42725ece0c072" + integrity sha512-uEWT+613bR0lxUAz7BDdk4yZJ1BfzIJ9rmyOFj+p53ZP8rm0BC3nA2YsyswyxjFZsrfRDxe2WERDfKiEZNSXag== dependencies: - postcss-selector-parser "^6.0.9" + postcss-selector-parser "^6.0.10" css-declaration-sorter@^6.3.0: version "6.3.1" @@ -4218,12 +4323,14 @@ css-functions-list@^3.1.0: resolved "https://registry.yarnpkg.com/css-functions-list/-/css-functions-list-3.1.0.tgz#cf5b09f835ad91a00e5959bcfc627cd498e1321b" integrity sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w== -css-has-pseudo@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz#57f6be91ca242d5c9020ee3e51bbb5b89fc7af73" - integrity sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw== +css-has-pseudo@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-5.0.1.tgz#e8875de026a51675d8d4c0a01c3cc7be6dd87582" + integrity sha512-zhsGCKVkBohliMlcsZsv5WF/i4FQ3pkVMtl4yYa7Qpv/PVQebTjh7cjMoT5grW+DBZzunmgHe6skdWawgCYuPQ== dependencies: - postcss-selector-parser "^6.0.9" + "@csstools/selector-specificity" "^2.0.1" + postcss-selector-parser "^6.0.10" + postcss-value-parser "^4.2.0" css-loader@^6.7.3: version "6.7.3" @@ -4251,10 +4358,10 @@ css-minimizer-webpack-plugin@^4.2.2: serialize-javascript "^6.0.0" source-map "^0.6.1" -css-prefers-color-scheme@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz#ca8a22e5992c10a5b9d315155e7caee625903349" - integrity sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA== +css-prefers-color-scheme@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-8.0.1.tgz#fc7217734df3d8e5337d614921e1fa1d10b1fa38" + integrity sha512-RPRyqJsk5KIjP2+WGhcGCaAJB8ojLbX1mVE8fG9127jQmnp1FNMfNMkERk/w6c4smgC/i5KxcY+Rtaa6/bMdKQ== css-select@^4.1.3: version "4.3.0" @@ -4299,10 +4406,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.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-7.1.0.tgz#574f97235a83eb753a29f0b1f2cbacac0d628bb8" - integrity sha512-Sd99PrFgx28ez4GHu8yoQIufc/70h9oYowDf4EjeIKi8mac9whxRjhM3IaMr6EllP6KKKWtJrMfN6C7T9tIWvQ== +cssdb@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-7.4.1.tgz#61d55c0173126689922a219e15e131e4b5caf422" + integrity sha512-0Q8NOMpXJ3iTDDbUv9grcmQAfdDx4qz+fN/+Md2FGbevT+6+bJNQ2LjB2YIUlLbpBTM32idU1Sb+tb/uGt6/XQ== cssesc@^3.0.0: version "3.0.0" @@ -4416,7 +4523,7 @@ debounce@^1.0.0: resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.1.tgz#38881d8f4166a5c5848020c11827b834bcb3e0a5" integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== -debug@2.6.9, debug@^2.6.0, debug@^2.6.9: +debug@2.6.9, debug@^2.6.0: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -4539,6 +4646,29 @@ dedent@^0.7.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== +deep-equal@^2.0.5: + version "2.2.0" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.2.0.tgz#5caeace9c781028b9ff459f33b779346637c43e6" + integrity sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw== + dependencies: + call-bind "^1.0.2" + es-get-iterator "^1.1.2" + get-intrinsic "^1.1.3" + is-arguments "^1.1.1" + is-array-buffer "^3.0.1" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -4620,16 +4750,21 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -detect-indent@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.1.0.tgz#592485ebbbf6b3b1ab2be175c8393d04ca0d57e6" - integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== +detect-indent@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-7.0.1.tgz#cbb060a12842b9c4d333f1cac4aa4da1bb66bc25" + integrity sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g== -detect-newline@3.1.0, detect-newline@^3.0.0: +detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== +detect-newline@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-4.0.0.tgz#450ac3f864d5f61112b53a524123b012c59581bc" + integrity sha512-1aXUEPdfGdzVPFpzGJJNgq9o81bGg1s09uxTWsqBlo9PI332uyJRQq13+LK/UN4JfxJbFdCXonUFQ9R/p7yCtw== + detect-node@^2.0.4: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" @@ -4652,10 +4787,10 @@ detective@^5.2.1: defined "^1.0.0" minimist "^1.2.6" -dexie@^3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/dexie/-/dexie-3.2.2.tgz#fa6f2a3c0d6ed0766f8d97a03720056f88fe0e01" - integrity sha512-q5dC3HPmir2DERlX+toCBbHQXW5MsyrFqPFcovkH9N2S/UW/H3H5AWAB6iEOExeraAu+j+zRDG+zg/D7YhH0qg== +dexie@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/dexie/-/dexie-3.2.3.tgz#f35c91ca797599df8e771b998e9ae9669c877f8c" + integrity sha512-iHayBd4UYryDCVUNa3PMsJMEnd8yjyh5p7a+RFeC8i8n476BC9wMhVvqiImq5zJZJf5Tuer+s4SSj+AA3x+ZbQ== diagnostics@^1.1.1: version "1.1.1" @@ -4806,11 +4941,6 @@ dot-case@^3.0.4: no-case "^3.0.4" tslib "^2.0.3" -dotenv-expand@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-10.0.0.tgz#12605d00fb0af6d0a592e6558585784032e4ef37" - integrity sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A== - dotenv@^16.0.3: version "16.0.3" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" @@ -4896,7 +5026,7 @@ ejs@^3.1.5, ejs@^3.1.6, ejs@^3.1.8: dependencies: jake "^10.8.5" -electron-to-chromium@^1.4.251: +electron-to-chromium@^1.4.251, electron-to-chromium@^1.4.284: version "1.4.284" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== @@ -4992,7 +5122,7 @@ error-stack-parser@^2.0.6: dependencies: stackframe "^1.3.4" -es-abstract@^1.19.0, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.4: +es-abstract@^1.19.0, es-abstract@^1.19.5, es-abstract@^1.20.4: version "1.20.4" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== @@ -5022,6 +5152,20 @@ es-abstract@^1.19.0, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20 string.prototype.trimstart "^1.0.5" unbox-primitive "^1.0.2" +es-get-iterator@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7" + integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.0" + has-symbols "^1.0.1" + is-arguments "^1.1.0" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.5" + isarray "^2.0.5" + es-module-lexer@^0.9.0: version "0.9.3" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" @@ -5114,15 +5258,16 @@ eslint-gitignore@^0.1.0: debug "^4.1.1" fast-glob "^3.2.2" -eslint-import-resolver-node@^0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" - integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== +eslint-import-resolver-node@^0.3.7: + version "0.3.7" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" + integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== dependencies: debug "^3.2.7" - resolve "^1.20.0" + is-core-module "^2.11.0" + resolve "^1.22.1" -eslint-module-utils@^2.7.3: +eslint-module-utils@^2.7.4: version "2.7.4" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== @@ -5145,23 +5290,25 @@ eslint-plugin-flowtype@^8.0.3: lodash "^4.17.21" string-natural-compare "^3.0.1" -eslint-plugin-import@^2.25.3, eslint-plugin-import@^2.26.0: - version "2.26.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" - integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== +eslint-plugin-import@^2.25.3, eslint-plugin-import@^2.27.5: + version "2.27.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" + integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== dependencies: - array-includes "^3.1.4" - array.prototype.flat "^1.2.5" - debug "^2.6.9" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + array.prototype.flatmap "^1.3.1" + debug "^3.2.7" doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.6" - eslint-module-utils "^2.7.3" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.7.4" has "^1.0.3" - is-core-module "^2.8.1" + is-core-module "^2.11.0" is-glob "^4.0.3" minimatch "^3.1.2" - object.values "^1.1.5" - resolve "^1.22.0" + object.values "^1.1.6" + resolve "^1.22.1" + semver "^6.3.0" tsconfig-paths "^3.14.1" eslint-plugin-jest@^25.3.0: @@ -5171,36 +5318,39 @@ eslint-plugin-jest@^25.3.0: dependencies: "@typescript-eslint/experimental-utils" "^5.0.0" -eslint-plugin-jest@^27.1.7: - version "27.1.7" - resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.1.7.tgz#0351e904afb8d66b7f70452929556dfdc8daba0d" - integrity sha512-0QVzf+og4YI1Qr3UoprkqqhezAZjFffdi62b0IurkCXMqPtRW84/UT4CKsYT80h/D82LA9avjO/80Ou1LdgbaQ== +eslint-plugin-jest@^27.2.1: + version "27.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-27.2.1.tgz#b85b4adf41c682ea29f1f01c8b11ccc39b5c672c" + integrity sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg== dependencies: "@typescript-eslint/utils" "^5.10.0" -eslint-plugin-jsx-a11y@^6.5.1, eslint-plugin-jsx-a11y@^6.6.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz#93736fc91b83fdc38cc8d115deedfc3091aef1ff" - integrity sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q== +eslint-plugin-jsx-a11y@^6.5.1, eslint-plugin-jsx-a11y@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz#fca5e02d115f48c9a597a6894d5bcec2f7a76976" + integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== dependencies: - "@babel/runtime" "^7.18.9" - aria-query "^4.2.2" - array-includes "^3.1.5" + "@babel/runtime" "^7.20.7" + aria-query "^5.1.3" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" ast-types-flow "^0.0.7" - axe-core "^4.4.3" - axobject-query "^2.2.0" + axe-core "^4.6.2" + axobject-query "^3.1.1" damerau-levenshtein "^1.0.8" emoji-regex "^9.2.2" has "^1.0.3" - jsx-ast-utils "^3.3.2" - language-tags "^1.0.5" + jsx-ast-utils "^3.3.3" + language-tags "=1.0.5" minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" semver "^6.3.0" -eslint-plugin-n@^15.6.0: - version "15.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-15.6.0.tgz#cfb1d2e2e427d620eb9008f8b3b5a40de0c84120" - integrity sha512-Hd/F7wz4Mj44Jp0H6Jtty13NcE69GNTY0rVlgTIj1XBnGGVI6UTdDrpE6vqu3AHo07bygq/N+7OH/lgz1emUJw== +eslint-plugin-n@^15.6.1: + version "15.6.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-n/-/eslint-plugin-n-15.6.1.tgz#f7e77f24abb92a550115cf11e29695da122c398c" + integrity sha512-R9xw9OtCRxxaxaszTQmQAlPgM+RdGjaL1akWuY/Fv9fRAi8Wj4CUKc6iYVG8QNRjRuo8/BqVYIpfqberJUEacA== dependencies: builtins "^5.0.1" eslint-plugin-es "^4.1.0" @@ -5216,10 +5366,10 @@ eslint-plugin-react-hooks@^4.3.0, eslint-plugin-react-hooks@^4.6.0: resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== -eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.31.11: - version "7.31.11" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz#011521d2b16dcf95795df688a4770b4eaab364c8" - integrity sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw== +eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.32.2: + version "7.32.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz#e71f21c7c265ebce01bcbc9d0955170c55571f10" + integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== dependencies: array-includes "^3.1.6" array.prototype.flatmap "^1.3.1" @@ -5233,7 +5383,7 @@ eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.31.11: object.hasown "^1.1.2" object.values "^1.1.6" prop-types "^15.8.1" - resolve "^2.0.0-next.3" + resolve "^2.0.0-next.4" semver "^6.3.0" string.prototype.matchall "^4.0.8" @@ -5311,23 +5461,23 @@ eslint-visitor-keys@^3.3.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== -eslint-webpack-plugin@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz#1978cdb9edc461e4b0195a20da950cf57988347c" - integrity sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w== +eslint-webpack-plugin@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-4.0.0.tgz#f77f37b2bbb8ad5c4197b5e55f5f2a49365a1a81" + integrity sha512-eM9ccGRWkU+btBSVfABRn8CjT7jZ2Q+UV/RfErMDVCFXpihEbvajNrLltZpwTAcEoXSqESGlEPIUxl7PoDlLWw== dependencies: - "@types/eslint" "^7.29.0 || ^8.4.1" - jest-worker "^28.0.2" + "@types/eslint" "^8.4.10" + jest-worker "^29.4.1" micromatch "^4.0.5" normalize-path "^3.0.0" schema-utils "^4.0.0" -eslint@^8.30.0: - version "8.30.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.30.0.tgz#83a506125d089eef7c5b5910eeea824273a33f50" - integrity sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ== +eslint@^8.33.0: + version "8.33.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.33.0.tgz#02f110f32998cb598c6461f24f4d306e41ca33d7" + integrity sha512-WjOpFQgKK8VrCnAtl8We0SUOy/oVZ5NHykyMiagV1M9r8IFpIJX7DduK6n1mpfhlG7T1NLWm2SuD8QB7KFySaA== dependencies: - "@eslint/eslintrc" "^1.4.0" + "@eslint/eslintrc" "^1.4.1" "@humanwhocodes/config-array" "^0.11.8" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" @@ -5518,16 +5668,27 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== -expect@^29.0.0, expect@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.3.1.tgz#92877aad3f7deefc2e3f6430dd195b92295554a6" - integrity sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA== +expect@^29.0.0: + version "29.4.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.4.0.tgz#e2d58a73bf46399deac7db6ec16842827525ce35" + integrity sha512-pzaAwjBgLEVxBh6ZHiqb9Wv3JYuv6m8ntgtY7a48nS+2KbX0EJkPS3FQlKiTZNcqzqJHNyQsfjqN60w1hPUBfQ== + dependencies: + "@jest/expect-utils" "^29.4.0" + jest-get-type "^29.2.0" + jest-matcher-utils "^29.4.0" + jest-message-util "^29.4.0" + jest-util "^29.4.0" + +expect@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.4.1.tgz#58cfeea9cbf479b64ed081fd1e074ac8beb5a1fe" + integrity sha512-OKrGESHOaMxK3b6zxIq9SOW8kEXztKff/Dvg88j4xIJxur1hspEbedVkR3GpHe5LO+WB2Qw7OWN0RMTdp6as5A== dependencies: - "@jest/expect-utils" "^29.3.1" + "@jest/expect-utils" "^29.4.1" jest-get-type "^29.2.0" - jest-matcher-utils "^29.3.1" - jest-message-util "^29.3.1" - jest-util "^29.3.1" + jest-matcher-utils "^29.4.1" + jest-message-util "^29.4.1" + jest-util "^29.4.1" express@^4.17.3, express@^4.18.2: version "4.18.2" @@ -5605,7 +5766,7 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -fast-glob@^3.0.3, fast-glob@^3.2.12, fast-glob@^3.2.2, fast-glob@^3.2.9: +fast-glob@^3.0.3, fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.2, fast-glob@^3.2.9: version "3.2.12" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== @@ -5864,6 +6025,13 @@ follow-redirects@^1.0.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + foreman@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/foreman/-/foreman-3.0.1.tgz#805f28afc5a4bbaf08dbb1f5018c557dcbb8a410" @@ -6085,10 +6253,10 @@ gifsicle@^5.0.0: bin-wrapper "^4.0.0" execa "^5.0.0" -git-hooks-list@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/git-hooks-list/-/git-hooks-list-1.0.3.tgz#be5baaf78203ce342f2f844a9d2b03dba1b45156" - integrity sha512-Y7wLWcrLUXwk2noSka166byGCvhMtDRpgHdzCno1UQv/n/Hegp++a2xBWJL1lJarnKD3SWaljD+0z1ztqxuKyQ== +git-hooks-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/git-hooks-list/-/git-hooks-list-3.0.0.tgz#6d888988bb445b34e7c2e1eb97cb88358153221e" + integrity sha512-XDfdemBGJIMAsHHOONHQxEH5dX2kCpE6MGZ1IsNvBuDPBZM3p4EAwAC7ygMjn/1/x+BJX0TK1ara1Zrh7JCFdQ== glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" @@ -6160,19 +6328,10 @@ globals@^13.19.0: dependencies: type-fest "^0.20.2" -globby@10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.0.tgz#abfcd0630037ae174a88590132c2f6804e291072" - integrity sha512-3LifW9M4joGZasyYPz2A1U74zbC/45fvpXUvO/9KbSa+VV0aGZarWkfdgKyR9sExNP0t0x0ss/UMJpNpcaTspw== - dependencies: - "@types/glob" "^7.1.1" - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.0.3" - glob "^7.1.3" - ignore "^5.1.1" - merge2 "^1.2.3" - slash "^3.0.0" +globalyzer@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465" + integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q== globby@^10.0.0: version "10.0.2" @@ -6200,11 +6359,34 @@ globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" +globby@^13.1.2: + version "13.1.3" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.3.tgz#f62baf5720bcb2c1330c8d4ef222ee12318563ff" + integrity sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.2.11" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^4.0.0" + globjoin@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" integrity sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg== +globrex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" + integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + got@^11.8.3: version "11.8.5" resolved "https://registry.yarnpkg.com/got/-/got-11.8.5.tgz#ce77d045136de56e8f024bebb82ea349bc730046" @@ -6329,7 +6511,7 @@ has-symbol-support-x@^1.4.1: resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" integrity sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw== -has-symbols@^1.0.2, has-symbols@^1.0.3: +has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== @@ -6554,10 +6736,10 @@ hpack.js@^2.1.6: readable-stream "^2.0.1" wbuf "^1.1.0" -html-dom-parser@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/html-dom-parser/-/html-dom-parser-3.1.2.tgz#c137c42df80e17d185ff35a806925d96cc73f408" - integrity sha512-mLTtl3pVn3HnqZSZzW3xVs/mJAKrG1yIw3wlp+9bdoZHHLaBRvELdpfShiPVLyjPypq1Fugv2KMDoGHW4lVXnw== +html-dom-parser@3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/html-dom-parser/-/html-dom-parser-3.1.3.tgz#ba87ca379f2817ca733523cac55c90de6bac43dd" + integrity sha512-fI0yyNlIeSboxU+jnrA4v8qj4+M8SI9/q6AKYdwCY2qki22UtKCDTxvagHniECu7sa5/o2zFRdLleA67035lsA== dependencies: domhandler "5.0.3" htmlparser2 "8.0.1" @@ -6592,25 +6774,25 @@ html-minifier-terser@^6.0.2: relateurl "^0.2.7" terser "^5.10.0" -html-react-parser@^3.0.6: - version "3.0.6" - resolved "https://registry.yarnpkg.com/html-react-parser/-/html-react-parser-3.0.6.tgz#356b861e6ad48e3221337d5a5929c5e452f8dfdd" - integrity sha512-kFh/qJkz4KJudCcILfI1hQKXTheRyMREXuL/WbWYUAsMsu0EOwV4nO5jA3ecu1LUNpCcebkNcBECxqpswBDlLw== +html-react-parser@^3.0.8: + version "3.0.8" + resolved "https://registry.yarnpkg.com/html-react-parser/-/html-react-parser-3.0.8.tgz#d0bb3cea8c1db7a687b51138dfd54f31a0c8e1aa" + integrity sha512-eIxPq/3Ja3+nZkx6X/BNpFy0lNuW+v3V4nzABzuL8KkRVdYY/2KyXO42epKonsEVVRSBxm2zsxWcOkT6fYL+iQ== dependencies: domhandler "5.0.3" - html-dom-parser "3.1.2" + html-dom-parser "3.1.3" react-property "2.0.0" - style-to-js "1.1.2" + style-to-js "1.1.3" html-tags@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-3.2.0.tgz#dbb3518d20b726524e4dd43de397eb0a95726961" integrity sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg== -html-validate@^7.12.0: - version "7.12.0" - resolved "https://registry.yarnpkg.com/html-validate/-/html-validate-7.12.0.tgz#beb2c58a6453b48537ebf4c7d01bb264b4ff0151" - integrity sha512-GO4sX6dmbAjHQxQOW9WvFImz76EFHmSNNNSrwX5ZwzoSLaNyFavFvfKdDABQagKfSdc1J2GzdPfMX5SQWqCYGA== +html-validate@^7.13.1: + version "7.13.1" + resolved "https://registry.yarnpkg.com/html-validate/-/html-validate-7.13.1.tgz#3bd3a578adbc3cae41f77c537fa513c722d9f594" + integrity sha512-AtLPBf9hZD/ynMCYfTWs0a71sTvsKps5cQxsTtyZaJ0w7G+UNDmN2F6oYCBoWmRtWm+4M2o+CwOGx8EVuubRTQ== dependencies: "@babel/code-frame" "^7.10.0" "@html-validate/stylish" "^3.0.0" @@ -6768,10 +6950,10 @@ human-signals@^3.0.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-3.0.1.tgz#c740920859dafa50e5a3222da9d3bf4bb0e5eef5" integrity sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ== -husky@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.2.tgz#5816a60db02650f1f22c8b69b928fd6bcd77a236" - integrity sha512-Tkv80jtvbnkK3mYWxPZePGFpQ/tT3HNSs/sasF9P2YfkMezDl3ON37YN6jUUI4eTg5LcyVynlb6r4eyvOmspvg== +husky@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184" + integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" @@ -7042,6 +7224,23 @@ is-alphanumerical@^1.0.0: is-alphabetical "^1.0.0" is-decimal "^1.0.0" +is-arguments@^1.1.0, is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.1.tgz#deb1db4fcae48308d54ef2442706c0393997052a" + integrity sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-typed-array "^1.1.10" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -7086,19 +7285,19 @@ is-builtin-module@^3.2.0: dependencies: builtin-modules "^3.3.0" -is-callable@^1.1.4, is-callable@^1.2.7: +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.11.0, is-core-module@^2.5.0, is-core-module@^2.8.1, is-core-module@^2.9.0: +is-core-module@^2.11.0, is-core-module@^2.5.0, is-core-module@^2.9.0: version "2.11.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== dependencies: has "^1.0.3" -is-date-object@^1.0.1: +is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -7169,6 +7368,11 @@ is-jpg@^2.0.0: resolved "https://registry.yarnpkg.com/is-jpg/-/is-jpg-2.0.0.tgz#2e1997fa6e9166eaac0242daae443403e4ef1d97" integrity sha512-ODlO0ruzhkzD3sdynIainVP5eoOFNN85rxA1+cwwnPe4dKyX0r5+hxNO5XpCrxlHcmb9vkOit9mhRD2JVuimHg== +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" @@ -7216,21 +7420,26 @@ is-path-inside@^3.0.2, is-path-inside@^3.0.3: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== -is-plain-obj@2.1.0, is-plain-obj@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== +is-plain-obj@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + is-plain-obj@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== +is-plain-obj@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" + integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== + is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -7276,6 +7485,11 @@ is-root@^2.1.0: resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + is-shared-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" @@ -7319,11 +7533,27 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" +is-typed-array@^1.1.10: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -7331,6 +7561,14 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" @@ -7338,6 +7576,11 @@ is-wsl@^2.1.1, is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -7413,94 +7656,104 @@ jake@^10.8.5: filelist "^1.0.1" minimatch "^3.0.4" -jest-changed-files@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.2.0.tgz#b6598daa9803ea6a4dce7968e20ab380ddbee289" - integrity sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA== +jest-changed-files@^29.4.0: + version "29.4.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.4.0.tgz#ac2498bcd394228f7eddcadcf928b3583bf2779d" + integrity sha512-rnI1oPxgFghoz32Y8eZsGJMjW54UlqT17ycQeCEktcxxwqqKdlj9afl8LNeO0Pbu+h2JQHThQP0BzS67eTRx4w== dependencies: execa "^5.0.0" p-limit "^3.1.0" -jest-circus@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.3.1.tgz#177d07c5c0beae8ef2937a67de68f1e17bbf1b4a" - integrity sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg== +jest-circus@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.4.1.tgz#ff1b63eb04c3b111cefea9489e8dbadd23ce49bd" + integrity sha512-v02NuL5crMNY4CGPHBEflLzl4v91NFb85a+dH9a1pUNx6Xjggrd8l9pPy4LZ1VYNRXlb+f65+7O/MSIbLir6pA== dependencies: - "@jest/environment" "^29.3.1" - "@jest/expect" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/environment" "^29.4.1" + "@jest/expect" "^29.4.1" + "@jest/test-result" "^29.4.1" + "@jest/types" "^29.4.1" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^0.7.0" is-generator-fn "^2.0.0" - jest-each "^29.3.1" - jest-matcher-utils "^29.3.1" - jest-message-util "^29.3.1" - jest-runtime "^29.3.1" - jest-snapshot "^29.3.1" - jest-util "^29.3.1" + jest-each "^29.4.1" + jest-matcher-utils "^29.4.1" + jest-message-util "^29.4.1" + jest-runtime "^29.4.1" + jest-snapshot "^29.4.1" + jest-util "^29.4.1" p-limit "^3.1.0" - pretty-format "^29.3.1" + pretty-format "^29.4.1" slash "^3.0.0" stack-utils "^2.0.3" -jest-cli@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.3.1.tgz#e89dff427db3b1df50cea9a393ebd8640790416d" - integrity sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ== +jest-cli@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.4.1.tgz#7abef96944f300feb9b76f68b1eb2d68774fe553" + integrity sha512-jz7GDIhtxQ37M+9dlbv5K+/FVcIo1O/b1sX3cJgzlQUf/3VG25nvuWzlDC4F1FLLzUThJeWLu8I7JF9eWpuURQ== dependencies: - "@jest/core" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/core" "^29.4.1" + "@jest/test-result" "^29.4.1" + "@jest/types" "^29.4.1" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^29.3.1" - jest-util "^29.3.1" - jest-validate "^29.3.1" + jest-config "^29.4.1" + jest-util "^29.4.1" + jest-validate "^29.4.1" prompts "^2.0.1" yargs "^17.3.1" -jest-config@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.3.1.tgz#0bc3dcb0959ff8662957f1259947aedaefb7f3c6" - integrity sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg== +jest-config@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.4.1.tgz#e62670c6c980ec21d75941806ec4d0c0c6402728" + integrity sha512-g7p3q4NuXiM4hrS4XFATTkd+2z0Ml2RhFmFPM8c3WyKwVDNszbl4E7cV7WIx1YZeqqCtqbtTtZhGZWJlJqngzg== dependencies: "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.3.1" - "@jest/types" "^29.3.1" - babel-jest "^29.3.1" + "@jest/test-sequencer" "^29.4.1" + "@jest/types" "^29.4.1" + babel-jest "^29.4.1" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.3" graceful-fs "^4.2.9" - jest-circus "^29.3.1" - jest-environment-node "^29.3.1" + jest-circus "^29.4.1" + jest-environment-node "^29.4.1" jest-get-type "^29.2.0" jest-regex-util "^29.2.0" - jest-resolve "^29.3.1" - jest-runner "^29.3.1" - jest-util "^29.3.1" - jest-validate "^29.3.1" + jest-resolve "^29.4.1" + jest-runner "^29.4.1" + jest-util "^29.4.1" + jest-validate "^29.4.1" micromatch "^4.0.4" parse-json "^5.2.0" - pretty-format "^29.3.1" + pretty-format "^29.4.1" slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.3.1.tgz#d8215b72fed8f1e647aed2cae6c752a89e757527" - integrity sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw== +jest-diff@^29.4.0: + version "29.4.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.4.0.tgz#9c75dcef5872c8889bfcb78bc9571a0e4e9bd8f6" + integrity sha512-s8KNvFx8YgdQ4fn2YLDQ7N6kmVOP68dUDVJrCHNsTc3UM5jcmyyFeYKL8EPWBQbJ0o0VvDGbWp8oYQ1nsnqnWw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.3.1" + jest-get-type "^29.2.0" + pretty-format "^29.4.0" + +jest-diff@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.4.1.tgz#9a6dc715037e1fa7a8a44554e7d272088c4029bd" + integrity sha512-uazdl2g331iY56CEyfbNA0Ut7Mn2ulAG5vUaEHXycf1L6IPyuImIxSz4F0VYBKi7LYIuxOwTZzK3wh5jHzASMw== dependencies: chalk "^4.0.0" diff-sequences "^29.3.1" jest-get-type "^29.2.0" - pretty-format "^29.3.1" + pretty-format "^29.4.1" jest-docblock@^29.2.0: version "29.2.0" @@ -7509,62 +7762,62 @@ jest-docblock@^29.2.0: dependencies: detect-newline "^3.0.0" -jest-each@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.3.1.tgz#bc375c8734f1bb96625d83d1ca03ef508379e132" - integrity sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA== +jest-each@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.4.1.tgz#05ce9979e7486dbd0f5d41895f49ccfdd0afce01" + integrity sha512-QlYFiX3llJMWUV0BtWht/esGEz9w+0i7BHwODKCze7YzZzizgExB9MOfiivF/vVT0GSQ8wXLhvHXh3x2fVD4QQ== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.4.1" chalk "^4.0.0" jest-get-type "^29.2.0" - jest-util "^29.3.1" - pretty-format "^29.3.1" + jest-util "^29.4.1" + pretty-format "^29.4.1" -jest-environment-jsdom@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.3.1.tgz#14ca63c3e0ef5c63c5bcb46033e50bc649e3b639" - integrity sha512-G46nKgiez2Gy4zvYNhayfMEAFlVHhWfncqvqS6yCd0i+a4NsSUD2WtrKSaYQrYiLQaupHXxCRi8xxVL2M9PbhA== +jest-environment-jsdom@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-29.4.1.tgz#34d491244ddd6fe3d666da603b576bd0ae6aef78" + integrity sha512-+KfYmRTl5CBHQst9hIz77TiiriHYvuWoLjMT855gx2AMxhHxpk1vtKvag1DQfyWCPVTWV/AG7SIqVh5WI1O/uw== dependencies: - "@jest/environment" "^29.3.1" - "@jest/fake-timers" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/environment" "^29.4.1" + "@jest/fake-timers" "^29.4.1" + "@jest/types" "^29.4.1" "@types/jsdom" "^20.0.0" "@types/node" "*" - jest-mock "^29.3.1" - jest-util "^29.3.1" + jest-mock "^29.4.1" + jest-util "^29.4.1" jsdom "^20.0.0" -jest-environment-node@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.3.1.tgz#5023b32472b3fba91db5c799a0d5624ad4803e74" - integrity sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag== +jest-environment-node@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.4.1.tgz#22550b7d0f8f0b16228639c9f88ca04bbf3c1974" + integrity sha512-x/H2kdVgxSkxWAIlIh9MfMuBa0hZySmfsC5lCsWmWr6tZySP44ediRKDUiNggX/eHLH7Cd5ZN10Rw+XF5tXsqg== dependencies: - "@jest/environment" "^29.3.1" - "@jest/fake-timers" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/environment" "^29.4.1" + "@jest/fake-timers" "^29.4.1" + "@jest/types" "^29.4.1" "@types/node" "*" - jest-mock "^29.3.1" - jest-util "^29.3.1" + jest-mock "^29.4.1" + jest-util "^29.4.1" jest-get-type@^29.2.0: version "29.2.0" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.2.0.tgz#726646f927ef61d583a3b3adb1ab13f3a5036408" integrity sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA== -jest-haste-map@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.3.1.tgz#af83b4347f1dae5ee8c2fb57368dc0bb3e5af843" - integrity sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A== +jest-haste-map@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.4.1.tgz#b0579dc82d94b40ed9041af56ad25c2f80bedaeb" + integrity sha512-imTjcgfVVTvg02khXL11NNLTx9ZaofbAWhilrMg/G8dIkp+HYCswhxf0xxJwBkfhWb3e8dwbjuWburvxmcr58w== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.4.1" "@types/graceful-fs" "^4.1.3" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.9" jest-regex-util "^29.2.0" - jest-util "^29.3.1" - jest-worker "^29.3.1" + jest-util "^29.4.1" + jest-worker "^29.4.1" micromatch "^4.0.4" walker "^1.0.8" optionalDependencies: @@ -7577,47 +7830,72 @@ jest-junit-reporter@^1.1.0: dependencies: xml "^1.0.1" -jest-leak-detector@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz#95336d020170671db0ee166b75cd8ef647265518" - integrity sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA== +jest-leak-detector@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.4.1.tgz#632186c546e084da2b490b7496fee1a1c9929637" + integrity sha512-akpZv7TPyGMnH2RimOCgy+hPmWZf55EyFUvymQ4LMsQP8xSPlZumCPtXGoDhFNhUE2039RApZkTQDKU79p/FiQ== dependencies: jest-get-type "^29.2.0" - pretty-format "^29.3.1" + pretty-format "^29.4.1" -jest-matcher-utils@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz#6e7f53512f80e817dfa148672bd2d5d04914a572" - integrity sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ== +jest-matcher-utils@^29.4.0: + version "29.4.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.4.0.tgz#c2f804f95152216c8b80afbe73d82ae0ba89f652" + integrity sha512-pU4OjBn96rDdRIaPUImbPiO2ETyRVzkA1EZVu9AxBDv/XPDJ7JWfkb6IiDT5jwgicaPHMrB/fhVa6qjG6potfA== dependencies: chalk "^4.0.0" - jest-diff "^29.3.1" + jest-diff "^29.4.0" jest-get-type "^29.2.0" - pretty-format "^29.3.1" + pretty-format "^29.4.0" -jest-message-util@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.3.1.tgz#37bc5c468dfe5120712053dd03faf0f053bd6adb" - integrity sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA== +jest-matcher-utils@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.4.1.tgz#73d834e305909c3b43285fbc76f78bf0ad7e1954" + integrity sha512-k5h0u8V4nAEy6lSACepxL/rw78FLDkBnXhZVgFneVpnJONhb2DhZj/Gv4eNe+1XqQ5IhgUcqj745UwH0HJmMnA== + dependencies: + chalk "^4.0.0" + jest-diff "^29.4.1" + jest-get-type "^29.2.0" + pretty-format "^29.4.1" + +jest-message-util@^29.4.0: + version "29.4.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.4.0.tgz#60d3f3dd6b5ef08ec9b698f434fbbafdb0af761d" + integrity sha512-0FvobqymmhE9pDEifvIcni9GeoKLol8eZspzH5u41g1wxYtLS60a9joT95dzzoCgrKRidNz64eaAXyzaULV8og== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.3.1" + "@jest/types" "^29.4.0" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^29.3.1" + pretty-format "^29.4.0" slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.3.1.tgz#60287d92e5010979d01f218c6b215b688e0f313e" - integrity sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA== +jest-message-util@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.4.1.tgz#522623aa1df9a36ebfdffb06495c7d9d19e8a845" + integrity sha512-H4/I0cXUaLeCw6FM+i4AwCnOwHRgitdaUFOdm49022YD5nfyr8C/DrbXOBEyJaj+w/y0gGJ57klssOaUiLLQGQ== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.4.1" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.4.1" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.4.1.tgz#a218a2abf45c99c501d4665207748a6b9e29afbd" + integrity sha512-MwA4hQ7zBOcgVCVnsM8TzaFLVUD/pFWTfbkY953Y81L5ret3GFRZtmPmRFAjKQSdCKoJvvqOu6Bvfpqlwwb0dQ== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.4.1" "@types/node" "*" - jest-util "^29.3.1" + jest-util "^29.4.1" jest-pnp-resolver@^1.2.2: version "1.2.2" @@ -7629,88 +7907,89 @@ jest-regex-util@^29.0.0, jest-regex-util@^29.2.0: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.2.0.tgz#82ef3b587e8c303357728d0322d48bbfd2971f7b" integrity sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA== -jest-resolve-dependencies@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz#a6a329708a128e68d67c49f38678a4a4a914c3bf" - integrity sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA== +jest-resolve-dependencies@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.4.1.tgz#02420a2e055da105e5fca8218c471d8b9553c904" + integrity sha512-Y3QG3M1ncAMxfjbYgtqNXC5B595zmB6e//p/qpA/58JkQXu/IpLDoLeOa8YoYfsSglBKQQzNUqtfGJJT/qLmJg== dependencies: jest-regex-util "^29.2.0" - jest-snapshot "^29.3.1" + jest-snapshot "^29.4.1" -jest-resolve@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.3.1.tgz#9a4b6b65387a3141e4a40815535c7f196f1a68a7" - integrity sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw== +jest-resolve@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.4.1.tgz#4c6bf71a07b8f0b79c5fdf4f2a2cf47317694c5e" + integrity sha512-j/ZFNV2lm9IJ2wmlq1uYK0Y/1PiyDq9g4HEGsNTNr3viRbJdV+8Lf1SXIiLZXFvyiisu0qUyIXGBnw+OKWkJwQ== dependencies: chalk "^4.0.0" graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" + jest-haste-map "^29.4.1" jest-pnp-resolver "^1.2.2" - jest-util "^29.3.1" - jest-validate "^29.3.1" + jest-util "^29.4.1" + jest-validate "^29.4.1" resolve "^1.20.0" - resolve.exports "^1.1.0" + resolve.exports "^2.0.0" slash "^3.0.0" -jest-runner@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.3.1.tgz#a92a879a47dd096fea46bb1517b0a99418ee9e2d" - integrity sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA== - dependencies: - "@jest/console" "^29.3.1" - "@jest/environment" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" +jest-runner@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.4.1.tgz#57460d9ebb0eea2e27eeddca1816cf8537469661" + integrity sha512-8d6XXXi7GtHmsHrnaqBKWxjKb166Eyj/ksSaUYdcBK09VbjPwIgWov1VwSmtupCIz8q1Xv4Qkzt/BTo3ZqiCeg== + dependencies: + "@jest/console" "^29.4.1" + "@jest/environment" "^29.4.1" + "@jest/test-result" "^29.4.1" + "@jest/transform" "^29.4.1" + "@jest/types" "^29.4.1" "@types/node" "*" chalk "^4.0.0" emittery "^0.13.1" graceful-fs "^4.2.9" jest-docblock "^29.2.0" - jest-environment-node "^29.3.1" - jest-haste-map "^29.3.1" - jest-leak-detector "^29.3.1" - jest-message-util "^29.3.1" - jest-resolve "^29.3.1" - jest-runtime "^29.3.1" - jest-util "^29.3.1" - jest-watcher "^29.3.1" - jest-worker "^29.3.1" + jest-environment-node "^29.4.1" + jest-haste-map "^29.4.1" + jest-leak-detector "^29.4.1" + jest-message-util "^29.4.1" + jest-resolve "^29.4.1" + jest-runtime "^29.4.1" + jest-util "^29.4.1" + jest-watcher "^29.4.1" + jest-worker "^29.4.1" p-limit "^3.1.0" source-map-support "0.5.13" -jest-runtime@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.3.1.tgz#21efccb1a66911d6d8591276a6182f520b86737a" - integrity sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A== +jest-runtime@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.4.1.tgz#9a50f9c69d3a391690897c01b0bfa8dc5dd45808" + integrity sha512-UXTMU9uKu2GjYwTtoAw5rn4STxWw/nadOfW7v1sx6LaJYa3V/iymdCLQM6xy3+7C6mY8GfX22vKpgxY171UIoA== dependencies: - "@jest/environment" "^29.3.1" - "@jest/fake-timers" "^29.3.1" - "@jest/globals" "^29.3.1" + "@jest/environment" "^29.4.1" + "@jest/fake-timers" "^29.4.1" + "@jest/globals" "^29.4.1" "@jest/source-map" "^29.2.0" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/test-result" "^29.4.1" + "@jest/transform" "^29.4.1" + "@jest/types" "^29.4.1" "@types/node" "*" chalk "^4.0.0" cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" glob "^7.1.3" graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" - jest-message-util "^29.3.1" - jest-mock "^29.3.1" + jest-haste-map "^29.4.1" + jest-message-util "^29.4.1" + jest-mock "^29.4.1" jest-regex-util "^29.2.0" - jest-resolve "^29.3.1" - jest-snapshot "^29.3.1" - jest-util "^29.3.1" + jest-resolve "^29.4.1" + jest-snapshot "^29.4.1" + jest-util "^29.4.1" + semver "^7.3.5" slash "^3.0.0" strip-bom "^4.0.0" -jest-snapshot@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.3.1.tgz#17bcef71a453adc059a18a32ccbd594b8cc4e45e" - integrity sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA== +jest-snapshot@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.4.1.tgz#5692210b3690c94f19317913d4082b123bd83dd9" + integrity sha512-l4iV8EjGgQWVz3ee/LR9sULDk2pCkqb71bjvlqn+qp90lFwpnulHj4ZBT8nm1hA1C5wowXLc7MGnw321u0tsYA== dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" @@ -7718,74 +7997,88 @@ jest-snapshot@^29.3.1: "@babel/plugin-syntax-typescript" "^7.7.2" "@babel/traverse" "^7.7.2" "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/expect-utils" "^29.4.1" + "@jest/transform" "^29.4.1" + "@jest/types" "^29.4.1" "@types/babel__traverse" "^7.0.6" "@types/prettier" "^2.1.5" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^29.3.1" + expect "^29.4.1" graceful-fs "^4.2.9" - jest-diff "^29.3.1" + jest-diff "^29.4.1" jest-get-type "^29.2.0" - jest-haste-map "^29.3.1" - jest-matcher-utils "^29.3.1" - jest-message-util "^29.3.1" - jest-util "^29.3.1" + jest-haste-map "^29.4.1" + jest-matcher-utils "^29.4.1" + jest-message-util "^29.4.1" + jest-util "^29.4.1" natural-compare "^1.4.0" - pretty-format "^29.3.1" + pretty-format "^29.4.1" semver "^7.3.5" -jest-util@^29.0.0, jest-util@^29.2.1, jest-util@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.3.1.tgz#1dda51e378bbcb7e3bc9d8ab651445591ed373e1" - integrity sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ== +jest-util@^29.0.0, jest-util@^29.4.0, jest-util@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.4.1.tgz#2eeed98ff4563b441b5a656ed1a786e3abc3e4c4" + integrity sha512-bQy9FPGxVutgpN4VRc0hk6w7Hx/m6L53QxpDreTZgJd9gfx/AV2MjyPde9tGyZRINAUrSv57p2inGBu2dRLmkQ== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.4.1" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.3.1.tgz#d56fefaa2e7d1fde3ecdc973c7f7f8f25eea704a" - integrity sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g== +jest-validate@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.4.1.tgz#0d5174510415083ec329d4f981bf6779211f17e9" + integrity sha512-qNZXcZQdIQx4SfUB/atWnI4/I2HUvhz8ajOSYUu40CSmf9U5emil8EDHgE7M+3j9/pavtk3knlZBDsgFvv/SWw== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.4.1" camelcase "^6.2.0" chalk "^4.0.0" jest-get-type "^29.2.0" leven "^3.1.0" - pretty-format "^29.3.1" + pretty-format "^29.4.1" -jest-watch-typeahead@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-2.2.1.tgz#36601520a2a30fd561788552dbda9c76bb44814a" - integrity sha512-jYpYmUnTzysmVnwq49TAxlmtOAwp8QIqvZyoofQFn8fiWhEDZj33ZXzg3JA4nGnzWFm1hbWf3ADpteUokvXgFA== +jest-watch-typeahead@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/jest-watch-typeahead/-/jest-watch-typeahead-2.2.2.tgz#5516d3cd006485caa5cfc9bd1de40f1f8b136abf" + integrity sha512-+QgOFW4o5Xlgd6jGS5X37i08tuuXNW8X0CV9WNFi+3n8ExCIP+E1melYhvYLjv5fE6D0yyzk74vsSO8I6GqtvQ== dependencies: ansi-escapes "^6.0.0" - chalk "^4.0.0" + chalk "^5.2.0" jest-regex-util "^29.0.0" jest-watcher "^29.0.0" slash "^5.0.0" string-length "^5.0.1" strip-ansi "^7.0.1" -jest-watcher@^29.0.0, jest-watcher@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.3.1.tgz#3341547e14fe3c0f79f9c3a4c62dbc3fc977fd4a" - integrity sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg== +jest-watcher@^29.0.0: + version "29.4.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.4.0.tgz#4f51e6fba4341d965279a5a646adde5104d414f0" + integrity sha512-PnnfLygNKelWOJwpAYlcsQjB+OxRRdckD0qiGmYng4Hkz1ZwK3jvCaJJYiywz2msQn4rBNLdriasJtv7YpWHpA== + dependencies: + "@jest/test-result" "^29.4.0" + "@jest/types" "^29.4.0" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.4.0" + string-length "^4.0.1" + +jest-watcher@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.4.1.tgz#6e3e2486918bd778849d4d6e67fd77b814f3e6ed" + integrity sha512-vFOzflGFs27nU6h8dpnVRER3O2rFtL+VMEwnG0H3KLHcllLsU8y9DchSh0AL/Rg5nN1/wSiQ+P4ByMGpuybaVw== dependencies: - "@jest/test-result" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/test-result" "^29.4.1" + "@jest/types" "^29.4.1" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" emittery "^0.13.1" - jest-util "^29.3.1" + jest-util "^29.4.1" string-length "^4.0.1" jest-worker@^26.2.1: @@ -7806,44 +8099,25 @@ jest-worker@^27.4.5: merge-stream "^2.0.0" supports-color "^8.0.0" -jest-worker@^28.0.2: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.3.tgz#7e3c4ce3fa23d1bb6accb169e7f396f98ed4bb98" - integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest-worker@^29.1.2: - version "29.2.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.2.1.tgz#8ba68255438252e1674f990f0180c54dfa26a3b1" - integrity sha512-ROHTZ+oj7sBrgtv46zZ84uWky71AoYi0vEV9CdEtc1FQunsoAGe5HbQmW76nI5QWdvECVPrSi1MCVUmizSavMg== - dependencies: - "@types/node" "*" - jest-util "^29.2.1" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest-worker@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.3.1.tgz#e9462161017a9bb176380d721cab022661da3d6b" - integrity sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw== +jest-worker@^29.1.2, jest-worker@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.4.1.tgz#7cb4a99a38975679600305650f86f4807460aab1" + integrity sha512-O9doU/S1EBe+yp/mstQ0VpPwpv0Clgn68TkNwGxL6/usX/KUW9Arnn4ag8C3jc6qHcXznhsT5Na1liYzAsuAbQ== dependencies: "@types/node" "*" - jest-util "^29.3.1" + jest-util "^29.4.1" merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest/-/jest-29.3.1.tgz#c130c0d551ae6b5459b8963747fed392ddbde122" - integrity sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA== +jest@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.4.1.tgz#bb34baca8e05901b49c02c62f1183a6182ea1785" + integrity sha512-cknimw7gAXPDOmj0QqztlxVtBVCw2lYY9CeIE5N6kD+kET1H4H79HSNISJmijb1HF+qk+G+ploJgiDi5k/fRlg== dependencies: - "@jest/core" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/core" "^29.4.1" + "@jest/types" "^29.4.1" import-local "^3.0.2" - jest-cli "^29.3.1" + jest-cli "^29.4.1" jose@^4.0.4: version "4.10.0" @@ -7875,7 +8149,7 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -jsdom@^20.0.0, jsdom@^20.0.3: +jsdom@^20.0.0: version "20.0.3" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-20.0.3.tgz#886a41ba1d4726f67a8858028c99489fed6ad4db" integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== @@ -7907,6 +8181,38 @@ jsdom@^20.0.0, jsdom@^20.0.3: ws "^8.11.0" xml-name-validator "^4.0.0" +jsdom@^21.1.0: + version "21.1.0" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-21.1.0.tgz#d56ba4a84ed478260d83bd53dc181775f2d8e6ef" + integrity sha512-m0lzlP7qOtthD918nenK3hdItSd2I+V3W9IrBcB36sqDwG+KnUs66IF5GY7laGWUnlM9vTsD0W1QwSEBYWWcJg== + dependencies: + abab "^2.0.6" + acorn "^8.8.1" + acorn-globals "^7.0.0" + cssom "^0.5.0" + cssstyle "^2.3.0" + data-urls "^3.0.2" + decimal.js "^10.4.2" + domexception "^4.0.0" + escodegen "^2.0.0" + form-data "^4.0.0" + html-encoding-sniffer "^3.0.0" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.1" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.2" + parse5 "^7.1.1" + saxes "^6.0.0" + symbol-tree "^3.2.4" + tough-cookie "^4.1.2" + w3c-xmlserializer "^4.0.0" + webidl-conversions "^7.0.0" + whatwg-encoding "^2.0.0" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + ws "^8.11.0" + xml-name-validator "^4.0.0" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -7958,16 +8264,16 @@ json-stable-stringify-without-jsonify@^1.0.1: integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.2.0, json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== +json5@^2.1.2, json5@^2.2.0, json5@^2.2.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonc-parser@^3.0.0: version "3.2.0" @@ -7988,7 +8294,7 @@ jsonpointer@^5.0.0: resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-5.0.1.tgz#2110e0af0900fd37467b5907ecd13a7884a1b559" integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.2: +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: version "3.3.3" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== @@ -8052,7 +8358,7 @@ language-subtag-registry@~0.3.2: resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== -language-tags@^1.0.5: +language-tags@=1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== @@ -8472,6 +8778,14 @@ mdast-util-phrasing@^2.0.0: dependencies: unist-util-is "^4.0.0" +mdast-util-phrasing@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz#c7c21d0d435d7fb90956038f02e8702781f95463" + integrity sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg== + dependencies: + "@types/mdast" "^3.0.0" + unist-util-is "^5.0.0" + mdast-util-to-hast@^10.2.0: version "10.2.0" resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz#61875526a017d8857b71abc9333942700b2d3604" @@ -8531,11 +8845,16 @@ mdn-data@2.0.14: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== -mdn-data@2.0.30, mdn-data@^2.0.30: +mdn-data@2.0.30: version "2.0.30" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== +mdn-data@^2.0.31: + version "2.0.31" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.31.tgz#dfb6cbdd1b0326aa231179d054b58a83212c2202" + integrity sha512-BoMtKzFjk2+b5QDi1QtS4XBZtwd1WIBVQSVe9Q6iIgQP+m6KhlbukWM8bp7rYgWXOXzp/cBqgHWU7az4hGV1WA== + mdurl@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" @@ -8872,10 +9191,10 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" -node-dev@^7.4.3: - version "7.4.3" - resolved "https://registry.yarnpkg.com/node-dev/-/node-dev-7.4.3.tgz#b30eb365f8e2fa7ce489efb2d597fae1c1aae3ae" - integrity sha512-o8aYipN28xY+WEunMHHiNc3hpPSkGG8ulHyYBapNbkg4dQxohmhx6jiRbiFhTF6zy+5IwljUGv1EcuxsaWI4Bw== +node-dev@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/node-dev/-/node-dev-8.0.0.tgz#856cb5d80394d301d675a9e90cc3f0dfba065f2c" + integrity sha512-GXc0KxmBXfQxMPdymOui40yvC5W/RXFwmuUDT65wvTAO/o9wAsddYC8q4EHKxq3Qqt+uLS/g7XKdgVcsjyk9lw== dependencies: dateformat "^3.0.3" dynamic-dedupe "^0.3.0" @@ -8908,10 +9227,10 @@ node-notifier@^8.0.1: uuid "^8.3.0" which "^2.0.2" -node-releases@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" - integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== +node-releases@^2.0.6, node-releases@^2.0.8: + version "2.0.9" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.9.tgz#fe66405285382b0c4ac6bcfbfbe7e8a510650b4d" + integrity sha512-2xfmOrRkGogbTK9R6Leda0DGiXeY3p2NJpy4+gNCffdUvV6mdEJnaDEic1i3Ec2djAo8jWYoJMR5PB0MSMpxUA== normalize-package-data@^2.5.0: version "2.5.0" @@ -9013,6 +9332,14 @@ object-inspect@^1.12.2, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== +object-is@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -9054,7 +9381,7 @@ object.hasown@^1.1.2: define-properties "^1.1.4" es-abstract "^1.20.4" -object.values@^1.1.5, object.values@^1.1.6: +object.values@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== @@ -9527,10 +9854,10 @@ pkg-up@^3.1.0: dependencies: find-up "^3.0.0" -playwright-core@1.29.1: - version "1.29.1" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.29.1.tgz#9ec15d61c4bd2f386ddf6ce010db53a030345a47" - integrity sha512-20Ai3d+lMkWpI9YZYlxk8gxatfgax5STW8GaMozAHwigLiyiKQrdkt7gaoT9UQR8FIVDg6qVXs9IoZUQrDjIIg== +playwright-core@1.30.0: + version "1.30.0" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.30.0.tgz#de987cea2e86669e3b85732d230c277771873285" + integrity sha512-7AnRmTCf+GVYhHbLJsGUtskWTE33SwMZkybJ0v6rqR1boxq2x36U7p1vDRV7HO2IwTZgmycracLxPEJI49wu4g== pluralize@^8.0.0: version "8.0.0" @@ -9546,10 +9873,10 @@ pngquant-bin@^6.0.0: bin-wrapper "^4.0.1" execa "^4.0.0" -postcss-attribute-case-insensitive@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz#03d761b24afc04c09e757e92ff53716ae8ea2741" - integrity sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ== +postcss-attribute-case-insensitive@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-6.0.1.tgz#69f521cf99aa4fe280943290032c69e3b51df5c0" + integrity sha512-XNVoIdu/Pskb5OhkM+iHicEVuASeqAjOTCaW8Wcbrd1UVwRukOJr5+zWzFjYxJj55Z/67ViVm9n/1hwF7MGByQ== dependencies: postcss-selector-parser "^6.0.10" @@ -9573,24 +9900,24 @@ postcss-clamp@^4.1.0: dependencies: postcss-value-parser "^4.2.0" -postcss-color-functional-notation@^4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz#21a909e8d7454d3612d1659e471ce4696f28caec" - integrity sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg== +postcss-color-functional-notation@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-5.0.1.tgz#996eaac092c07bc0748b9086cf4a4a6280a86f35" + integrity sha512-Q9YDNQddKrl6YBs3229v+ckQINLyAaPfjJqG3jp5NUlP0UMm9+JeuLO1IMpeZy0l+rIE64y4OjUq0o+xhrnnrA== dependencies: postcss-value-parser "^4.2.0" -postcss-color-hex-alpha@^8.0.4: - version "8.0.4" - resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz#c66e2980f2fbc1a63f5b079663340ce8b55f25a5" - integrity sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ== +postcss-color-hex-alpha@^9.0.0: + version "9.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-9.0.1.tgz#2dbb1b7a64428ee291465171601ffff0d057b455" + integrity sha512-1ZTJvmOZXTCsedKeY+Puqwx6AgoyB1KnzSD/CGDIl1NWvDfxi1jYky4R9konw2SAYw0SOeU33EU27ihE59Fp8Q== dependencies: postcss-value-parser "^4.2.0" -postcss-color-rebeccapurple@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz#63fdab91d878ebc4dd4b7c02619a0c3d6a56ced0" - integrity sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg== +postcss-color-rebeccapurple@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-8.0.1.tgz#c2e855498079b4dee66b5df240839f75266346d8" + integrity sha512-bzZYxBDx/uUGW9HeldOA7J69GdymOZJNz3pG8av27YSgJt9dobl4l+hI/3KAosoRJml/iWceT97pJQj3O/dQDw== dependencies: postcss-value-parser "^4.2.0" @@ -9612,31 +9939,40 @@ postcss-convert-values@^5.1.2: browserslist "^4.20.3" postcss-value-parser "^4.2.0" -postcss-custom-media@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz#c8f9637edf45fef761b014c024cee013f80529ea" - integrity sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg== +postcss-custom-media@^9.1.0: + version "9.1.1" + resolved "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-9.1.1.tgz#ceeb1cd7e5d13ee6aeb68206b8817d178e6437cb" + integrity sha512-veQwzQkHgBkizxYCV/EBsiK8sFIJA0oQMQL9mpQ3gqFGc2dWlNWURHk4J44i9Q0dFeFCK81vV/Xpj7fyfNQKSA== dependencies: - postcss-value-parser "^4.2.0" + "@csstools/cascade-layer-name-parser" "^1.0.0" + "@csstools/css-parser-algorithms" "^2.0.0" + "@csstools/css-tokenizer" "^2.0.0" + "@csstools/media-query-list-parser" "^2.0.0" -postcss-custom-properties@^12.1.10: - version "12.1.10" - resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-12.1.10.tgz#624517179fd4cf50078a7a60f628d5782e7d4903" - integrity sha512-U3BHdgrYhCrwTVcByFHs9EOBoqcKq4Lf3kXwbTi4hhq0qWhl/pDWq2THbv/ICX/Fl9KqeHBb8OVrTf2OaYF07A== +postcss-custom-properties@^13.1.0: + version "13.1.1" + resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-13.1.1.tgz#1d7b7d589124c3f5dfe9d255aba5ac15e9bd017c" + integrity sha512-FK4dBiHdzWOosLu3kEAHaYpfcrnMfVV4nP6PT6EFIfWXrtHH9LY8idfTYnEDpq/vgE33mr8ykhs7BjlgcT9agg== dependencies: + "@csstools/cascade-layer-name-parser" "^1.0.0" + "@csstools/css-parser-algorithms" "^2.0.0" + "@csstools/css-tokenizer" "^2.0.0" postcss-value-parser "^4.2.0" -postcss-custom-selectors@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz#1ab4684d65f30fed175520f82d223db0337239d9" - integrity sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg== +postcss-custom-selectors@^7.1.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-7.1.1.tgz#32f14dc78a6183b91ec28a1933271e34e5089a92" + integrity sha512-CPs3BSdQfKqdrJ3d+3In9ppBPA8GpRy4Bd50jU+BDD6WEZOx8TTIB9i67BfRc2AVEAbRZwDMesreF95598dwhw== dependencies: + "@csstools/cascade-layer-name-parser" "^1.0.0" + "@csstools/css-parser-algorithms" "^2.0.0" + "@csstools/css-tokenizer" "^2.0.0" postcss-selector-parser "^6.0.4" -postcss-dir-pseudo-class@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz#2bf31de5de76added44e0a25ecf60ae9f7c7c26c" - integrity sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA== +postcss-dir-pseudo-class@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-7.0.1.tgz#9462a609ae915d2bcea86112a637182598c0f338" + integrity sha512-VjiqVOTz1op7bsiw7qd5CjZ0txA5yJY/oo1wb3f37qdleRTZQ9hzhAtLDqXimn0ZKh9XbtYawc4pmVBnV+LyMA== dependencies: postcss-selector-parser "^6.0.10" @@ -9660,19 +9996,12 @@ postcss-discard-overridden@^5.1.0: resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== -postcss-double-position-gradients@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz#b96318fdb477be95997e86edd29c6e3557a49b91" - integrity sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ== - dependencies: - "@csstools/postcss-progressive-custom-properties" "^1.1.0" - postcss-value-parser "^4.2.0" - -postcss-env-function@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-4.0.6.tgz#7b2d24c812f540ed6eda4c81f6090416722a8e7a" - integrity sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA== +postcss-double-position-gradients@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-4.0.1.tgz#96d7539d0f471801d6cd7f67bd2112df49b69db8" + integrity sha512-XE+eKvX96E9cmldwKeRmK8AMxfQfuuHN9Yjerymau5i+fgC/vEY+B+Ke2vnEv4E8EXu8MKdLxi4DzmodusW19Q== dependencies: + "@csstools/postcss-progressive-custom-properties" "^2.0.0" postcss-value-parser "^4.2.0" postcss-flexbugs-fixes@^5.0.2: @@ -9680,34 +10009,34 @@ postcss-flexbugs-fixes@^5.0.2: resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz#2028e145313074fc9abe276cb7ca14e5401eb49d" integrity sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ== -postcss-focus-visible@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz#50c9ea9afa0ee657fb75635fabad25e18d76bf9e" - integrity sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw== +postcss-focus-visible@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-8.0.1.tgz#30533353a52f74d2d0f294624d2dbf7758249c53" + integrity sha512-azd1NMrLBe5bfKyomui9AMcgIR2zzlqXCTnKjshNDSClmmSO5MauTyflJUqmIwjIhD16+FbPyGV8Nxsly87BjA== dependencies: - postcss-selector-parser "^6.0.9" + postcss-selector-parser "^6.0.10" -postcss-focus-within@^5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz#5b1d2ec603195f3344b716c0b75f61e44e8d2e20" - integrity sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ== +postcss-focus-within@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-7.0.1.tgz#4b91875d2ceba27e1deebb26f74e68bad6096e36" + integrity sha512-iSpk018Yqn0xwltFR7NHjagyt+e/6u8w50uEnGOcFOddLay5zQFjpJBg6euEZu7wY5WDq83DPpdO99eL+8Er8g== dependencies: - postcss-selector-parser "^6.0.9" + postcss-selector-parser "^6.0.10" postcss-font-variant@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz#efd59b4b7ea8bb06127f2d031bfbb7f24d32fa66" integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== -postcss-gap-properties@^3.0.5: - version "3.0.5" - resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz#f7e3cddcf73ee19e94ccf7cb77773f9560aa2fff" - integrity sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg== +postcss-gap-properties@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-4.0.1.tgz#0347d6a84a46bfbe88bedc542cc4b354e04a8338" + integrity sha512-V5OuQGw4lBumPlwHWk/PRfMKjaq/LTGR4WDTemIMCaMevArVfCCA9wBJiL1VjDAd+rzuCIlkRoRvDsSiAaZ4Fg== -postcss-image-set-function@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz#08353bd756f1cbfb3b6e93182c7829879114481f" - integrity sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw== +postcss-image-set-function@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-5.0.1.tgz#115454817f5f4b795066640b646882effd0428af" + integrity sha512-JnmN9Wo7WjlvM7fg00wzC4d/1kOqau+6v6hteLLqEyBjCuzoFZUU0Te3JphDyxc65RtPNsCujDwYbbs6+vYxCQ== dependencies: postcss-value-parser "^4.2.0" @@ -9732,12 +10061,12 @@ postcss-js@^4.0.0: dependencies: camelcase-css "^2.0.1" -postcss-lab-function@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz#6fe4c015102ff7cd27d1bd5385582f67ebdbdc98" - integrity sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w== +postcss-lab-function@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-5.0.1.tgz#c3bded56192f7f6d502f344143a1b46592343a50" + integrity sha512-TuvrxsRIA3oWjjjI9T1ZEAolrtrLzYwYDw14GFivy0BkRqUTi4IithbM1aZkZGbAxV4lLwD6rL7MHhfDslUEzg== dependencies: - "@csstools/postcss-progressive-custom-properties" "^1.1.0" + "@csstools/postcss-progressive-custom-properties" "^2.0.0" postcss-value-parser "^4.2.0" postcss-load-config@^3.1.4: @@ -9757,10 +10086,12 @@ postcss-loader@^7.0.2: klona "^2.0.5" semver "^7.3.8" -postcss-logical@^5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-5.0.4.tgz#ec75b1ee54421acc04d5921576b7d8db6b0e6f73" - integrity sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g== +postcss-logical@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-6.0.1.tgz#bd286a06b521aee7b69ca64108bcb3ff9f516ec9" + integrity sha512-0LIzRgbT42n0q8txcM9SrLkYLjr1LTbRTy80bnKiYXY8tnYGdjkBymwb5XE87o4csW1z8dhKD1VRI6cHBQBQtw== + dependencies: + postcss-value-parser "^4.2.0" postcss-media-minmax@^5.0.0: version "5.0.0" @@ -9857,10 +10188,10 @@ postcss-nested@6.0.0: dependencies: postcss-selector-parser "^6.0.10" -postcss-nesting@^10.2.0: - version "10.2.0" - resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-10.2.0.tgz#0b12ce0db8edfd2d8ae0aaf86427370b898890be" - integrity sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA== +postcss-nesting@^11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-11.0.1.tgz#9eca3dfea03ae8b9450493c4640e1fed8b24d82d" + integrity sha512-p/XiegrifL9CBwBiuJtFuUUvp8AgmxdyjNagmIjLEyJDUuo0JwbEgUsnQ99SzE7TRRXqXml7BFXkZpRhonE8rQ== dependencies: "@csstools/selector-specificity" "^2.0.0" postcss-selector-parser "^6.0.10" @@ -9937,10 +10268,10 @@ postcss-normalize@^10.0.1: postcss-browser-comments "^4" sanitize.css "*" -postcss-opacity-percentage@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz#bd698bb3670a0a27f6d657cc16744b3ebf3b1145" - integrity sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w== +postcss-opacity-percentage@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz#5b89b35551a556e20c5d23eb5260fbfcf5245da6" + integrity sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A== postcss-ordered-values@^5.1.3: version "5.1.3" @@ -9950,10 +10281,10 @@ postcss-ordered-values@^5.1.3: cssnano-utils "^3.1.0" postcss-value-parser "^4.2.0" -postcss-overflow-shorthand@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz#7ed6486fec44b76f0eab15aa4866cda5d55d893e" - integrity sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A== +postcss-overflow-shorthand@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-4.0.1.tgz#cb61ca24d8c4e1dbf14d85181b017cfa6953aa34" + integrity sha512-HQZ0qi/9iSYHW4w3ogNqVNr2J49DHJAl7r8O2p0Meip38jsdnRPgiDW7r/LlLrrMBMe3KHkvNtAV2UmRVxzLIg== dependencies: postcss-value-parser "^4.2.0" @@ -9962,72 +10293,76 @@ postcss-page-break@^3.0.4: resolved "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-3.0.4.tgz#7fbf741c233621622b68d435babfb70dd8c1ee5f" integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== -postcss-place@^7.0.5: - version "7.0.5" - resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-7.0.5.tgz#95dbf85fd9656a3a6e60e832b5809914236986c4" - integrity sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g== +postcss-place@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/postcss-place/-/postcss-place-8.0.1.tgz#408d7a27e99192df51c95fe62a3a34def62aa66a" + integrity sha512-Ow2LedN8sL4pq8ubukO77phSVt4QyCm35ZGCYXKvRFayAwcpgB0sjNJglDoTuRdUL32q/ZC1VkPBo0AOEr4Uiw== dependencies: postcss-value-parser "^4.2.0" -postcss-preset-env@^7.8.3: - version "7.8.3" - resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz#2a50f5e612c3149cc7af75634e202a5b2ad4f1e2" - integrity sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag== - dependencies: - "@csstools/postcss-cascade-layers" "^1.1.1" - "@csstools/postcss-color-function" "^1.1.1" - "@csstools/postcss-font-format-keywords" "^1.0.1" - "@csstools/postcss-hwb-function" "^1.0.2" - "@csstools/postcss-ic-unit" "^1.0.1" - "@csstools/postcss-is-pseudo-class" "^2.0.7" - "@csstools/postcss-nested-calc" "^1.0.0" - "@csstools/postcss-normalize-display-values" "^1.0.1" - "@csstools/postcss-oklab-function" "^1.1.1" - "@csstools/postcss-progressive-custom-properties" "^1.3.0" - "@csstools/postcss-stepped-value-functions" "^1.0.1" - "@csstools/postcss-text-decoration-shorthand" "^1.0.0" - "@csstools/postcss-trigonometric-functions" "^1.0.2" - "@csstools/postcss-unset-value" "^1.0.2" +postcss-preset-env@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-8.0.1.tgz#d249c137febc037dd5dbb97e18f94dba4dd0cda8" + integrity sha512-IUbymw0JlUbyVG+I85963PNWgPp3KhnFa1sxU7M/2dGthxV8e297P0VV5W9XcyypoH4hirH2fp1c6fmqh6YnSg== + dependencies: + "@csstools/postcss-cascade-layers" "^3.0.0" + "@csstools/postcss-color-function" "^2.0.0" + "@csstools/postcss-font-format-keywords" "^2.0.0" + "@csstools/postcss-hwb-function" "^2.0.0" + "@csstools/postcss-ic-unit" "^2.0.0" + "@csstools/postcss-is-pseudo-class" "^3.0.0" + "@csstools/postcss-logical-float-and-clear" "^1.0.0" + "@csstools/postcss-logical-resize" "^1.0.0" + "@csstools/postcss-logical-viewport-units" "^1.0.0" + "@csstools/postcss-media-queries-aspect-ratio-number-values" "^1.0.0" + "@csstools/postcss-nested-calc" "^2.0.0" + "@csstools/postcss-normalize-display-values" "^2.0.0" + "@csstools/postcss-oklab-function" "^2.0.0" + "@csstools/postcss-progressive-custom-properties" "^2.0.0" + "@csstools/postcss-scope-pseudo-class" "^2.0.0" + "@csstools/postcss-stepped-value-functions" "^2.0.0" + "@csstools/postcss-text-decoration-shorthand" "^2.0.0" + "@csstools/postcss-trigonometric-functions" "^2.0.0" + "@csstools/postcss-unset-value" "^2.0.0" autoprefixer "^10.4.13" browserslist "^4.21.4" - css-blank-pseudo "^3.0.3" - css-has-pseudo "^3.0.4" - css-prefers-color-scheme "^6.0.3" - cssdb "^7.1.0" - postcss-attribute-case-insensitive "^5.0.2" + css-blank-pseudo "^5.0.0" + css-has-pseudo "^5.0.0" + css-prefers-color-scheme "^8.0.0" + cssdb "^7.4.0" + postcss-attribute-case-insensitive "^6.0.0" postcss-clamp "^4.1.0" - postcss-color-functional-notation "^4.2.4" - postcss-color-hex-alpha "^8.0.4" - postcss-color-rebeccapurple "^7.1.1" - postcss-custom-media "^8.0.2" - postcss-custom-properties "^12.1.10" - postcss-custom-selectors "^6.0.3" - postcss-dir-pseudo-class "^6.0.5" - postcss-double-position-gradients "^3.1.2" - postcss-env-function "^4.0.6" - postcss-focus-visible "^6.0.4" - postcss-focus-within "^5.0.4" + postcss-color-functional-notation "^5.0.0" + postcss-color-hex-alpha "^9.0.0" + postcss-color-rebeccapurple "^8.0.0" + postcss-custom-media "^9.1.0" + postcss-custom-properties "^13.1.0" + postcss-custom-selectors "^7.1.0" + postcss-dir-pseudo-class "^7.0.0" + postcss-double-position-gradients "^4.0.0" + postcss-focus-visible "^8.0.0" + postcss-focus-within "^7.0.0" postcss-font-variant "^5.0.0" - postcss-gap-properties "^3.0.5" - postcss-image-set-function "^4.0.7" + postcss-gap-properties "^4.0.0" + postcss-image-set-function "^5.0.0" postcss-initial "^4.0.1" - postcss-lab-function "^4.2.1" - postcss-logical "^5.0.4" + postcss-lab-function "^5.0.0" + postcss-logical "^6.0.0" postcss-media-minmax "^5.0.0" - postcss-nesting "^10.2.0" - postcss-opacity-percentage "^1.1.2" - postcss-overflow-shorthand "^3.0.4" + postcss-nesting "^11.0.0" + postcss-opacity-percentage "^1.1.3" + postcss-overflow-shorthand "^4.0.0" postcss-page-break "^3.0.4" - postcss-place "^7.0.5" - postcss-pseudo-class-any-link "^7.1.6" + postcss-place "^8.0.0" + postcss-pseudo-class-any-link "^8.0.0" postcss-replace-overflow-wrap "^4.0.0" - postcss-selector-not "^6.0.1" + postcss-selector-not "^7.0.0" postcss-value-parser "^4.2.0" -postcss-pseudo-class-any-link@^7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz#2693b221902da772c278def85a4d9a64b6e617ab" - integrity sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w== +postcss-pseudo-class-any-link@^8.0.0: + version "8.0.1" + resolved "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-8.0.1.tgz#8cbbeb9dbe4514406ab3ccb21c85c6205f31c93d" + integrity sha512-CYcLGofbGDhx6BmNFQGFH0cqW+qlXVk9PR4LZ8Y7g24m6TopYKt6FSwhMGAIyme6lQxgB32XMhpYRwZAcPnMXA== dependencies: postcss-selector-parser "^6.0.10" @@ -10066,10 +10401,10 @@ postcss-scss@^4.0.2: resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.5.tgz#8ee33c1dda8d9d4753b565ec79014803dc6edabf" integrity sha512-F7xpB6TrXyqUh3GKdyB4Gkp3QL3DDW1+uI+gxx/oJnUt/qXI4trj5OGlp9rOKdoABGULuqtqeG+3HEVQk4DjmA== -postcss-selector-not@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz#8f0a709bf7d4b45222793fc34409be407537556d" - integrity sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ== +postcss-selector-not@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-7.0.1.tgz#8142e90c8eb6c8c5faecb3e9d96d4353d02e94fb" + integrity sha512-1zT5C27b/zeJhchN7fP0kBr16Cc61mu7Si9uWWLoA3Px/D9tIJPKchJCkUH3tPO5D0pCFmGeApAv8XpXBQJ8SQ== dependencies: postcss-selector-parser "^6.0.10" @@ -10106,10 +10441,10 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.2.14, postcss@^8.3.11, postcss@^8.4.17, postcss@^8.4.18, postcss@^8.4.19, postcss@^8.4.20: - version "8.4.20" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.20.tgz#64c52f509644cecad8567e949f4081d98349dc56" - integrity sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g== +postcss@^8.2.14, postcss@^8.3.11, postcss@^8.4.17, postcss@^8.4.18, postcss@^8.4.19, postcss@^8.4.21: + version "8.4.21" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.21.tgz#c639b719a57efc3187b13a1d765675485f4134f4" + integrity sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg== dependencies: nanoid "^3.3.4" picocolors "^1.0.0" @@ -10142,17 +10477,18 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier-plugin-packagejson@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.3.0.tgz#5c242a39627c227d813161618fa88e64e44e9c84" - integrity sha512-2SAPMMk1UDkqsB7DifWKcwCm6VC52JXMrzLHfbcQHJRWhRCj9zziOy+s+2XOyPBeyqFqS+A/1IKzOrxKFTo6pw== +prettier-plugin-packagejson@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.4.2.tgz#76dfd8b2bb723bc001abf3b0a383cd67235442b3" + integrity sha512-Y/sW29qq0FhEQRA+85K98VOlMW7/Wicrm0Tm2j/EZ+Eh7F6jVUpGVv7WIMku+WsaEab/PyxaA5ckmTd3E0seNg== dependencies: - sort-package-json "1.57.0" + sort-package-json "2.2.0" + synckit "0.8.5" -prettier@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.1.tgz#4e1fd11c34e2421bc1da9aea9bd8127cd0a35efc" - integrity sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg== +prettier@^2.8.3: + version "2.8.3" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.3.tgz#ab697b1d3dd46fb4626fbe2f543afe0cc98d8632" + integrity sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw== pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: version "5.6.0" @@ -10176,12 +10512,21 @@ pretty-format@^27.0.2: ansi-styles "^5.0.0" react-is "^17.0.1" -pretty-format@^29.0.0, pretty-format@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.3.1.tgz#1841cac822b02b4da8971dacb03e8a871b4722da" - integrity sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg== +pretty-format@^29.0.0, pretty-format@^29.4.0: + version "29.4.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.4.0.tgz#766f071bb1c53f1ef8000c105bbeb649e86eb993" + integrity sha512-J+EVUPXIBHCdWAbvGBwXs0mk3ljGppoh/076g1S8qYS8nVG4u/yrhMvyTFHYYYKWnDdgRLExx0vA7pzxVGdlNw== + dependencies: + "@jest/schemas" "^29.4.0" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-format@^29.4.1: + version "29.4.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.4.1.tgz#0da99b532559097b8254298da7c75a0785b1751c" + integrity sha512-dt/Z761JUVsrIKaY215o1xQJBGlSmTx/h4cSqXqjHLnU1+Kt+mavVE7UgqJJO5ukx5HjSswHfmXz4LjS2oIJfg== dependencies: - "@jest/schemas" "^29.0.0" + "@jest/schemas" "^29.4.0" ansi-styles "^5.0.0" react-is "^18.0.0" @@ -10429,20 +10774,20 @@ react-refresh@^0.14: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.0.tgz#4e02825378a5f227079554d4284889354e5f553e" integrity sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ== -react-router-dom@^6.6.1: - version "6.6.1" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.6.1.tgz#1b96ec0b2cefa7319f1251383ea5b41295ee260d" - integrity sha512-u+8BKUtelStKbZD5UcY0NY90WOzktrkJJhyhNg7L0APn9t1qJNLowzrM9CHdpB6+rcPt6qQrlkIXsTvhuXP68g== +react-router-dom@^6.8.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.8.0.tgz#5e5f4c4b15fdec3965d2ad9d7460d0c61971e744" + integrity sha512-hQouduSTywGJndE86CXJ2h7YEy4HYC6C/uh19etM+79FfQ6cFFFHnHyDlzO4Pq0eBUI96E4qVE5yUjA00yJZGQ== dependencies: - "@remix-run/router" "1.2.1" - react-router "6.6.1" + "@remix-run/router" "1.3.1" + react-router "6.8.0" -react-router@6.6.1, react-router@^6.3.0: - version "6.6.1" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.6.1.tgz#17de6cf285f2d1c9721a3afca999c984e5558854" - integrity sha512-YkvlYRusnI/IN0kDtosUCgxqHeulN5je+ew8W+iA1VvFhf86kA+JEI/X/8NqYcr11hCDDp906S+SGMpBheNeYQ== +react-router@6.8.0, react-router@^6.3.0: + version "6.8.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.8.0.tgz#dd61fd1ec44daa2cceaef8e6baa00f99a01a650f" + integrity sha512-760bk7y3QwabduExtudhWbd88IBbuD1YfwzpuDUAlJUJ7laIIcqhMvdhSVh1Fur1PE8cGl84L0dxhR3/gvHF7A== dependencies: - "@remix-run/router" "1.2.1" + "@remix-run/router" "1.3.1" react@^18.2.0: version "18.2.0" @@ -10555,7 +10900,12 @@ regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.9: +regenerator-runtime@^0.13.11: + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regenerator-runtime@^0.13.9: version "0.13.10" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz#ed07b19616bcbec5da6274ebc75ae95634bfc2ee" integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== @@ -10770,10 +11120,10 @@ resolve-url-loader@^5.0.0: postcss "^8.2.14" source-map "0.6.1" -resolve.exports@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== +resolve.exports@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.0.tgz#c1a0028c2d166ec2fbf7d0644584927e76e7400e" + integrity sha512-6K/gDlqgQscOlg9fSRpWstA8sYe8rbELsSTNpx+3kTrsVCzvSl0zIvRErM7fdl9ERWDsKnrLnwB+Ne89918XOg== resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1: version "1.22.1" @@ -10784,7 +11134,7 @@ resolve@^1.1.7, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20 path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^2.0.0-next.3: +resolve@^2.0.0-next.4: version "2.0.0-next.4" resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== @@ -10956,10 +11306,10 @@ sass-loader@^13.2.0: klona "^2.0.4" neo-async "^2.6.2" -sass@^1.57.1: - version "1.57.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.57.1.tgz#dfafd46eb3ab94817145e8825208ecf7281119b5" - integrity sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw== +sass@^1.58.0: + version "1.58.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.58.0.tgz#ee8aea3ad5ea5c485c26b3096e2df6087d0bb1cc" + integrity sha512-PiMJcP33DdKtZ/1jSjjqVIKihoDc6yWmYr9K/4r3fVVIEDAluD0q7XZiRKrNJcPK3qkLRF/79DND1H5q1LBjgg== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -11202,6 +11552,11 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + slash@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-5.0.0.tgz#8c18a871096b71ee0e002976a4fe3374991c3074" @@ -11285,16 +11640,16 @@ sort-object-keys@^1.1.3: resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.3.tgz#bff833fe85cab147b34742e45863453c1e190b45" integrity sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg== -sort-package-json@1.57.0: - version "1.57.0" - resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.57.0.tgz#e95fb44af8ede0bb6147e3f39258102d4bb23fc4" - integrity sha512-FYsjYn2dHTRb41wqnv+uEqCUvBpK3jZcTp9rbz2qDTmel7Pmdtf+i2rLaaPMRZeSVM60V3Se31GyWFpmKs4Q5Q== - dependencies: - detect-indent "^6.0.0" - detect-newline "3.1.0" - git-hooks-list "1.0.3" - globby "10.0.0" - is-plain-obj "2.1.0" +sort-package-json@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-2.2.0.tgz#1787f5662005c9b3bd3bc570e6d53ccc4ffc2c87" + integrity sha512-ux712xsrPqkW+0b51GdmC8QTvImM3wsdip9mNVSQTY9ZV3/1eTAK6jIcQ8Vz9kfN1WHL4wv/pLn89mrqeyQu6A== + dependencies: + detect-indent "^7.0.1" + detect-newline "^4.0.0" + git-hooks-list "^3.0.0" + globby "^13.1.2" + is-plain-obj "^4.1.0" sort-object-keys "^1.1.3" source-list-map@^2.0.0, source-list-map@^2.0.1: @@ -11690,10 +12045,10 @@ strtok3@^6.2.4: "@tokenizer/token" "^0.3.0" peek-readable "^4.1.0" -style-dictionary@^3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/style-dictionary/-/style-dictionary-3.7.1.tgz#d61c980513d7bb0a1946a9fab31491a672d0f6a2" - integrity sha512-yYU9Z/J8Znj9T9oJVjo8VOYamrOxv0UbBKPjhSt+PharxrhyQCM4RWb71fgEfv2pK9KO8G83/0ChDNQZ1mn0wQ== +style-dictionary@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/style-dictionary/-/style-dictionary-3.7.2.tgz#bb4e70b2c2020dfa3ea81f22adda252aaf31e0a4" + integrity sha512-Nd/qrPj1ikYX+sL/8PofMgfaJLRvGgT96Ty3dJLGNqtZmecVr3Xs+OZivMQEYmSCTiap/UyeV5SqwmAgn3/KKA== dependencies: chalk "^4.0.0" change-case "^4.1.2" @@ -11715,17 +12070,17 @@ style-search@^0.1.0: resolved "https://registry.yarnpkg.com/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" integrity sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg== -style-to-js@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/style-to-js/-/style-to-js-1.1.2.tgz#6821c53b86a236571236d9d15688389e81a2a893" - integrity sha512-aMG8jJpEF0SCGbQFY8W8CT+EjQ9ubp35FOZG3prWkNjxW/a1bEeSod0tkWiP+6iiOCDIIrQykUDkPY5LbNF87g== +style-to-js@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/style-to-js/-/style-to-js-1.1.3.tgz#2012d75dc89bf400edc29c545ed61c8626b00184" + integrity sha512-zKI5gN/zb7LS/Vm0eUwjmjrXWw8IMtyA8aPBJZdYiQTXj4+wQ3IucOLIOnF7zCHxvW8UhIGh/uZh/t9zEHXNTQ== dependencies: - style-to-object "0.4.0" + style-to-object "0.4.1" -style-to-object@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.0.tgz#fdcee2ba7f195f96023a44a124683f70d463dd24" - integrity sha512-dAjq2m87tPn/TcYTeqMhXJRhu96WYWcxMFQxs3Y9jfYpq2jG+38u4tj0Lst6DOiYXmDuNxVJ2b1Z2uPC6wTEeg== +style-to-object@0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.4.1.tgz#53cf856f7cf7f172d72939d9679556469ba5de37" + integrity sha512-HFpbb5gr2ypci7Qw+IOhnP2zOU7e77b+rzM+wTzXzfi1PrtBCX0E7Pk4wL4iTLnhzZ+JgEGAhX81ebTg/aYjQw== dependencies: inline-style-parser "0.1.1" @@ -11794,10 +12149,10 @@ stylelint-scss@^4.0.0, stylelint-scss@^4.3.0: postcss-selector-parser "^6.0.6" postcss-value-parser "^4.1.0" -stylelint@^14.16.0: - version "14.16.0" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-14.16.0.tgz#8e1a424f4b9852e59089f95de306734d70e5048b" - integrity sha512-X6uTi9DcxjzLV8ZUAjit1vsRtSwcls0nl07c9rqOPzvpA8IvTX/xWEkBRowS0ffevRrqkHa/ThDEu86u73FQDg== +stylelint@^14.16.1: + version "14.16.1" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-14.16.1.tgz#b911063530619a1bbe44c2b875fd8181ebdc742d" + integrity sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A== dependencies: "@csstools/selector-specificity" "^2.0.2" balanced-match "^2.0.0" @@ -11905,6 +12260,14 @@ symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== +synckit@0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.5.tgz#b7f4358f9bb559437f9f167eb6bc46b3c9818fa3" + integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q== + dependencies: + "@pkgr/utils" "^2.3.1" + tslib "^2.5.0" + table@5.4.6: version "5.4.6" resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" @@ -12092,6 +12455,14 @@ timed-out@^4.0.0, timed-out@^4.0.1: resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA== +tiny-glob@^0.2.9: + version "0.2.9" + resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.9.tgz#2212d441ac17928033b110f8b3640683129d31e2" + integrity sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg== + dependencies: + globalyzer "0.1.0" + globrex "^0.1.2" + tinycolor2@^1.4.1: version "1.4.2" resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803" @@ -12202,15 +12573,15 @@ tryer@^1.0.1: resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== -ts-jest@^29.0.3: - version "29.0.3" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.0.3.tgz#63ea93c5401ab73595440733cefdba31fcf9cb77" - integrity sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ== +ts-jest@^29.0.5: + version "29.0.5" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.0.5.tgz#c5557dcec8fe434fcb8b70c3e21c6b143bfce066" + integrity sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA== dependencies: bs-logger "0.x" fast-json-stable-stringify "2.x" jest-util "^29.0.0" - json5 "^2.2.1" + json5 "^2.2.3" lodash.memoize "4.x" make-error "1.x" semver "7.x" @@ -12265,6 +12636,16 @@ tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== +tslib@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" + integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== + +tslib@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -12351,10 +12732,10 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typescript@^4.9.4: - version "4.9.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" - integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== +typescript@^4.9.5: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== unbox-primitive@^1.0.2: version "1.0.2" @@ -12521,7 +12902,7 @@ upath@^1.2.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.0.9: +update-browserslist-db@^1.0.10, update-browserslist-db@^1.0.9: version "1.0.10" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== @@ -12577,10 +12958,10 @@ url-to-options@^1.0.1: resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" integrity sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A== -use-debounce@^9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/use-debounce/-/use-debounce-9.0.2.tgz#2883982ec1eb79affec46f14047244057b78161c" - integrity sha512-QLyB0sxt9F5AisGDrUybCRJSLE60bTQR0yXc+IebNGUu1GCXwii1zsZl82mPGdWqDVQy7+1FKMLHQUixxf5Nbw== +use-debounce@^9.0.3: + version "9.0.3" + resolved "https://registry.yarnpkg.com/use-debounce/-/use-debounce-9.0.3.tgz#bac660c19ab7b38662e08608fee23c7ad303f532" + integrity sha512-FhtlbDtDXILJV7Lix5OZj5yX/fW1tzq+VrvK1fnT2bUrPOGruU9Rw8NCEn+UI9wopfERBEZAOQ8lfeCJPllgnw== utf8-byte-length@^1.0.1: version "1.0.4" @@ -12746,6 +13127,11 @@ web-namespaces@^1.0.0: resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== +web-specs@^2.46.0: + version "2.46.0" + resolved "https://registry.yarnpkg.com/web-specs/-/web-specs-2.46.0.tgz#db10a0bba2546a434cb45356512bf1d5440c591a" + integrity sha512-JLNjCl1778GLCTmsJefPlVpLkF1FowITbw3Ql9hyc2FtfeVWMvZwsU0BNw8aN5JMk9PzklRpxgoiRY91UN/BhA== + webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" @@ -12972,6 +13358,28 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + +which-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -13221,7 +13629,7 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== -write-file-atomic@^4.0.1, write-file-atomic@^4.0.2: +write-file-atomic@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== @@ -13229,6 +13637,14 @@ write-file-atomic@^4.0.1, write-file-atomic@^4.0.2: imurmurhash "^0.1.4" signal-exit "^3.0.7" +write-file-atomic@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.0.tgz#54303f117e109bf3d540261125c8ea5a7320fab0" + integrity sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + ws@^8.11.0, ws@^8.4.2: version "8.11.0" resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143"