From d1aef91c72d6a3bf670826dd059b7bf3b7b2ffae Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina into the
parent bullet with no separator, so ordered steps lost their numbers, sub-steps
merged upward, and where the HTML had no whitespace between into the parent bullet, with
+ // no separator - so ordered steps lost their numbers, sub-steps merged into
+ // their parent, and where the HTML had no whitespace between /
and extra
went through
the inline branch and had its newlines collapsed straight back out, so the "//
comment swallows the rest of the sample" failure still shipped for the 4
multi-line in-list samples. List items now separate inline prose from
line-structured blocks, and route code the same way as nested lists. The Express
Find sample extracts as 14 lines instead of 1.
extractMarkdownish still walked children(), so the dropped-text-node bug fixed
for wrapper elements survived at the article root - two pages lost a whole
trailing sentence that sits as a direct text child of .markdown. My first attempt
at this changed only the comment and not the call, which is why the sentence was
still missing; now fixed and verified present.
Shallowness is now settled by `git rev-parse --is-shallow-repository` instead of
probing for a .git/shallow FILE. The probe failed open wherever .git is a file -
a linked worktree, --separate-git-dir, a submodule - and would have run git log
against a shallow store, resolving every page to the one available commit: the
exact fake constant the change set out to remove. This review ran from such a
worktree.
Empty product keys are filtered before slugging, because slug("") returns
"module": the old filter(Boolean) could never fire, and a products.json entry
with a missing key would have registered "module" as a product, after which a
page at /sdks/ through `own` was why the fix for flattened code
+ // samples did not reach the 9 blocks that live inside a list item: the
+ // newlines were restored and then collapsed straight back out, so a `//`
+ // comment still swallowed the rest of the sample.
const own: string[] = [];
- const nested: string[] = [];
+ const blocks: string[] = [];
+ const hasPre = (node: any) => $(node).find("pre").length > 0;
$(li)
.contents()
.each((_j, c: any) => {
@@ -245,9 +281,9 @@ function blockToMd($: cheerio.CheerioAPI, el: any): string {
}
if (c.type !== "tag") return;
const ctag = String(c.name || "").toLowerCase();
- if (ctag === "ul" || ctag === "ol") {
+ if (ctag === "ul" || ctag === "ol" || ctag === "pre" || hasPre(c)) {
const sub = blockToMd($, c);
- if (sub.trim()) nested.push(sub.trim());
+ if (sub.trim()) blocks.push(sub.trim());
} else if (ctag === "p" || ctag === "div") {
const t = blockToMd($, c);
if (t.trim()) own.push(t.trim());
@@ -258,9 +294,9 @@ function blockToMd($: cheerio.CheerioAPI, el: any): string {
});
const marker = ordered ? `${start + i}.` : "-";
const head = own.join(" ").replace(/\s+/g, " ").trim();
- if (!head && !nested.length) return;
+ if (!head && !blocks.length) return;
const lines = [`${marker} ${head}`.trim()];
- for (const sub of nested) {
+ for (const sub of blocks) {
for (const ln of sub.split("\n")) lines.push(` ${ln}`);
}
items.push(lines.join("\n"));
@@ -311,10 +347,21 @@ function blockToMd($: cheerio.CheerioAPI, el: any): string {
}
function extractMarkdownish($: cheerio.CheerioAPI, root: any): string {
+ // contents(), not children(): the same dropped-text-node bug that was fixed
+ // for wrapper elements survived one level up here. Two real pages lost a whole
+ // trailing sentence, because it sits as a direct text child of .markdown after
+ // an inline element - e.g. "…Sample
(backticks) and
. My walk passed inline elements one at a time, so
every anchor and inline-code span sitting directly inside an was stripped:
1489 anchors and 3124 code spans across 173 pages. Measured effect on the
artifact: CitesApi edges 2980 -> 1854, with 82 API-reference URLs disappearing
entirely - in a file whose stated purpose is preserving citations.
Three findings shared that root cause, so one restructure fixes all of them:
gather consecutive inline children into a RUN and serialize the run as one unit.
That puts / back where serializeInline can see them, removes the
join(" ") that was inserting "List-based workflows : Validate…", and lets
document order be preserved so a sentence following a code block is no longer
hoisted above it. CitesApi 1854 -> 2976 (base 2980), 818 distinct API URLs,
" :" artefacts 640 -> 1 (the 1 predates this PR).
LAST_VERIFIED NOW FOLLOWS THE CONTENT, which is the point of the field.
110 pages under docs/sdks/ are 2-line shells importing a partial, so the shell's
own commit date describes when the shell was written, not when the content
changed - and editing a partial changes what a dozen pages say while moving none
of their dates. The date is now the most recent commit across the page's own
source AND every partial it imports, transitively. Verified on
features-by-framework: shell 2026-01-19, partial 2026-02-03 on this branch, and
the page now reports 2026-02-03.
Frontmatter reading and date resolution also had two different ideas of where a
page's source lives, which is why /hosted/express/configuration/device-pairing/
had no date even from a full-history clone - its source is
device-pairing/device-pairing.md, Docusaurus' folder/folder.md convention, which
neither list covered. One shared candidate list now; that page reports
2026-07-29.
Also from round 3:
- Self-references were filtered from the graph but not the index, so 25 records
pointed a consumer back at the page it was already on. Both agree now: 0.
- The Channel nodes were left behind when HasChannel was removed - 3 typed nodes
no traversal could reach, in a graph whose point is traversal. Dropped.
- The size budget now WARNS instead of throwing. Everything else in this plugin
is careful never to break a deploy, and growth is not the exception to make:
it would have failed the whole docs build on main, for artifacts nothing
consumes yet. The empty-output guard still throws - that means the selectors
drifted and the data is wrong, which is worth stopping for.
- Four "not available" stubs were being discarded rather than recorded, because
ai-powered-barcode-scanning and batch-scanning are not products.json entries
and so fell into the synthetic bucket - the same loss the bucket was added to
prevent. A page whose whole job is to say "X is not available here" is now
named after itself. NotAvailableOn 28 -> 32.
- Availability now covers every declared product instead of products[0], so it
stops disagreeing with BelongsToProduct on multi-product pages.
- The rollback comment no longer restates the "atomic" claim it replaced: two
renames cannot be one operation, the catch only covers a throw, and that is
now said plainly.
CI, per the decision that last_verified should track real edits:
docs-preview.yml is brought over from main with fetch-depth: 0 on its BUILD job
only - `deploy` just downloads the artifact and reading git there would slow
every preview for nothing.
package-lock.json is no longer touched by this PR: main deleted it in #416 (the
repo is yarn-only), which retires the lockfile-sync finding from round 1 rather
than fixing it.
Verified: tsc reports no errors in the file; 4668 modules from 616 pages, 0 page
errors; 0 unbalanced fences; 0 availability contradictions; 0 index
self-references. Evals improve again - success@3 0.95, precision@3 0.85, MRR
0.9167 (floors 0.8/0.6/0.6).
Known and left alone deliberately: products.json keys and docs directory names
are different vocabularies (matrixscan-batch vs matrixscan), so a future
single-FILE page named after a product directory would re-open the "core"
misfiling. No such page exists today, and a second alias map is a worse cure
than the disease - it would be one more thing to drift.
Co-Authored-By: Claude Opus 5 (1M context)
---
.github/workflows/docs-preview.yml | 84 +++++++
package-lock.json | 12 +-
src/plugins/knowledge-extractor/index.ts | 266 ++++++++++++++++++-----
3 files changed, 295 insertions(+), 67 deletions(-)
create mode 100644 .github/workflows/docs-preview.yml
diff --git a/.github/workflows/docs-preview.yml b/.github/workflows/docs-preview.yml
new file mode 100644
index 0000000000..e7d756ab1c
--- /dev/null
+++ b/.github/workflows/docs-preview.yml
@@ -0,0 +1,84 @@
+name: Deploy PR Preview
+
+on:
+ pull_request:
+ types: [opened, reopened, synchronize, closed]
+ branches:
+ - main
+ - 'release/**'
+
+concurrency:
+ group: docs-preview-${{ github.event.number }}
+ cancel-in-progress: true
+
+jobs:
+ build:
+ name: Build preview site
+ if: github.event.action != 'closed'
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+ with:
+ # Full history, because the knowledge-extractor sets each page's
+ # `last_verified` from that file's last commit date. A depth-1 clone
+ # makes every file resolve to the same single commit, and the plugin
+ # then emits "" rather than a constant that looks like data - so a
+ # preview would carry no freshness signal at all.
+ #
+ # Only this job needs it: `deploy` below just downloads the artifact.
+ # Cheap here - 796 commits, and the `git log` over docs/ measures at
+ # ~0.13s.
+ fetch-depth: 0
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '18'
+ cache: 'yarn'
+
+ - name: Install dependencies
+ run: yarn install --frozen-lockfile
+
+ - name: Build documentation
+ run: yarn build
+ env:
+ base_url: /data-capture-documentation/pr-preview/pr-${{ github.event.number }}/
+ preview_build: 'true'
+
+ - name: Upload build artifact
+ uses: actions/upload-artifact@v4
+ with:
+ name: preview-site
+ path: build/
+ retention-days: 1
+
+ deploy:
+ name: Deploy or remove PR preview
+ needs: build
+ # Runs whenever build succeeded (normal deploy) OR was skipped (closed
+ # event has nothing to build but still needs to run removal) - but not
+ # when build actually failed.
+ if: always() && (needs.build.result == 'success' || needs.build.result == 'skipped')
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+ pull-requests: write
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Download build artifact
+ if: github.event.action != 'closed'
+ uses: actions/download-artifact@v4
+ with:
+ name: preview-site
+ path: build/
+
+ - name: Deploy or remove PR preview
+ uses: rossjrw/pr-preview-action@ffa7509e91a3ec8dfc2e5536c4d5c1acdf7a6de9 # v1.8.1
+ with:
+ source-dir: ./build/
+ qr-code: false
diff --git a/package-lock.json b/package-lock.json
index e77b07319d..5bfeaf51a6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,7 +13,6 @@
"@docusaurus/plugin-client-redirects": "3.4.0",
"@docusaurus/preset-classic": "^3.4.0",
"@mdx-js/react": "^3.0.0",
- "cheerio": "1.0.0-rc.12",
"classnames": "^2.5.1",
"clsx": "^1.2.1",
"docusaurus-plugin-sass": "^0.2.5",
@@ -21,8 +20,7 @@
"react": "^18.0.0",
"react-dom": "^18.0.0",
"react-player": "^2.16.0",
- "sass": "^1.77.2",
- "search-insights": "^2.17.3"
+ "sass": "^1.77.2"
},
"devDependencies": {
"@docusaurus/module-type-aliases": "^3.4.0",
@@ -12920,10 +12918,10 @@
}
},
"node_modules/search-insights": {
- "version": "2.17.3",
- "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz",
- "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==",
- "license": "MIT"
+ "version": "2.14.0",
+ "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.14.0.tgz",
+ "integrity": "sha512-OLN6MsPMCghDOqlCtsIsYgtsC0pnwVTyT9Mu6A3ewOj1DxvzZF6COrn2g86E/c05xbktB0XN04m/t1Z+n+fTGw==",
+ "peer": true
},
"node_modules/section-matter": {
"version": "1.0.0",
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index cfd24312bb..4cf33e7e47 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -262,42 +262,70 @@ function blockToMd($: cheerio.CheerioAPI, el: any): string {
$(el)
.children("li")
.each((i, li) => {
- // `own` is inline prose and gets its whitespace collapsed. `blocks` is
- // anything whose LINE STRUCTURE matters - nested lists, and code samples.
- // Routing a through `own` was why the fix for flattened code
- // samples did not reach the 9 blocks that live inside a list item: the
- // newlines were restored and then collapsed straight back out, so a `//`
- // comment still swallowed the rest of the sample.
- const own: string[] = [];
- const blocks: string[] = [];
+ // Segments in DOCUMENT ORDER. Consecutive inline children are gathered
+ // into a run and serialized together, which matters for two reasons:
+ //
+ // - serializeInline iterates the CONTENTS of the node it is given, so
+ // handing it an skips the branch that emits [label](href) and
+ // keeps only the label. Same for (backticks) and
. Passing
+ // inline elements one at a time stripped 1489 anchors and 3124 code
+ // spans that sit directly inside an .
+ // - joining separately-serialized pieces with " " inserted a space at
+ // every boundary, producing "List-based workflows : Validate…".
+ //
+ // Order is preserved so a sentence that follows a code block in the
+ // source is not hoisted above it.
+ const segs: string[] = [];
+ let pending: any[] = [];
const hasPre = (node: any) => $(node).find("pre").length > 0;
+ const flushInline = () => {
+ if (!pending.length) return;
+ const wrap = $("");
+ for (const nd of pending) wrap.append($(nd).clone());
+ const t = inlineText($, wrap[0]);
+ if (t) segs.push(t);
+ pending = [];
+ };
$(li)
.contents()
.each((_j, c: any) => {
if (c.type === "text") {
- const t = String(c.data || "").replace(/\s+/g, " ").trim();
- if (t) own.push(t);
+ pending.push(c);
return;
}
if (c.type !== "tag") return;
const ctag = String(c.name || "").toLowerCase();
- if (ctag === "ul" || ctag === "ol" || ctag === "pre" || hasPre(c)) {
- const sub = blockToMd($, c);
- if (sub.trim()) blocks.push(sub.trim());
- } else if (ctag === "p" || ctag === "div") {
- const t = blockToMd($, c);
- if (t.trim()) own.push(t.trim());
- } else {
- const t = inlineText($, c);
- if (t) own.push(t);
+ const isBlock =
+ ctag === "ul" ||
+ ctag === "ol" ||
+ ctag === "pre" ||
+ ctag === "p" ||
+ ctag === "div" ||
+ hasPre(c);
+ if (!isBlock) {
+ pending.push(c);
+ return;
}
+ flushInline();
+ const sub = blockToMd($, c);
+ if (sub.trim()) segs.push(sub.trim());
});
+ flushInline();
+ if (!segs.length) return;
+
const marker = ordered ? `${start + i}.` : "-";
- const head = own.join(" ").replace(/\s+/g, " ").trim();
- if (!head && !blocks.length) return;
- const lines = [`${marker} ${head}`.trim()];
- for (const sub of blocks) {
- for (const ln of sub.split("\n")) lines.push(` ${ln}`);
+ const lines: string[] = [];
+ const [first, ...rest] = segs;
+ if (first.includes("\n")) {
+ // A block leads the item: keep the marker on its own line rather than
+ // gluing a fence onto it.
+ lines.push(marker);
+ for (const ln of first.split("\n")) lines.push(` ${ln}`);
+ } else {
+ lines.push(`${marker} ${first}`);
+ }
+ for (const seg of rest) {
+ for (const ln of seg.split("\n")) lines.push(` ${ln}`);
}
items.push(lines.join("\n"));
});
@@ -572,27 +600,114 @@ function gitDates(siteDir: string): Map {
}
/**
- * Real last-modified date of the source behind a built pathname, or "" when it is
- * genuinely unknown. Same path-guessing as readFrontMatter.
+ * Every shape a built pathname's source file might take, repo-relative and in
+ * priority order. ONE list, shared by frontmatter reading and date resolution -
+ * they had drifted apart, which is why /hosted/express/configuration/
+ * device-pairing/ shipped an empty date even from a full-history clone: its
+ * source is device-pairing/device-pairing.md, a shape neither list covered.
*/
-function sourceDate(siteDir: string, pathname: string): string {
- const dates = gitDates(siteDir);
- if (!dates.size) return "";
+function sourceCandidates(pathname: string): string[] {
const rel = pathname.replace(/^\/+|\/+$/g, "");
- if (!rel) return "";
- for (const cand of [
- `docs/${rel}.mdx`,
+ if (!rel) return ["docs/index.md", "docs/index.mdx", "docs/intro.md", "docs/intro.mdx"];
+ const leaf = rel.split("/").pop() || "";
+ return [
`docs/${rel}.md`,
- `docs/${rel}/index.mdx`,
+ `docs/${rel}.mdx`,
`docs/${rel}/index.md`,
- ]) {
- const hit = dates.get(cand);
- if (hit) return hit;
+ `docs/${rel}/index.mdx`,
+ // Docusaurus' folder/folder.md convention.
+ `docs/${rel}/${leaf}.md`,
+ `docs/${rel}/${leaf}.mdx`,
+ `docs/${rel}/README.md`,
+ ];
+}
+
+/** Repo-relative path of the source file behind a pathname, or "". */
+function resolveSource(siteDir: string, pathname: string): string {
+ for (const cand of sourceCandidates(pathname)) {
+ try {
+ if (fs.statSync(path.join(siteDir, cand)).isFile()) return cand;
+ } catch {
+ /* next shape */
+ }
}
return "";
}
+/**
+ * Every file whose content ends up on the page: its own source, plus the partials
+ * it imports, transitively.
+ *
+ * This is what makes the date honest under single-sourcing. 110 pages in this
+ * repo are 2-line shells around a partial, so the shell's own commit date
+ * describes when the shell was written, not when the content changed - measured:
+ * _features-by-framework.mdx last changed 2026-08-14 while every shell around it
+ * still reads 2026-01-19.
+ */
+function contributingFiles(siteDir: string, pathname: string): string[] {
+ const root = resolveSource(siteDir, pathname);
+ if (!root) return [];
+ const seen = new Set([root]);
+ const queue = [root];
+ // Depth is bounded by the queue: a partial importing a partial is followed,
+ // and `seen` makes a cycle terminate.
+ while (queue.length) {
+ const rel = queue.shift() as string;
+ let body = "";
+ try {
+ body = fs.readFileSync(path.join(siteDir, rel), "utf8");
+ } catch {
+ continue;
+ }
+ const dir = path.posix.dirname(rel.split(path.sep).join("/"));
+ const re = /from\s+['"]([^'"]*partials\/[^'"]+)['"]/g;
+ let m: RegExpExecArray | null;
+ while ((m = re.exec(body))) {
+ const spec = m[1].replace(/^@site\//, "");
+ const resolved = spec.startsWith("docs/")
+ ? spec
+ : path.posix.normalize(path.posix.join(dir, spec));
+ if (!resolved.startsWith("docs/")) continue;
+ const withExt = /\.mdx?$/.test(resolved) ? [resolved] : [`${resolved}.mdx`, `${resolved}.md`];
+ for (const cand of withExt) {
+ if (seen.has(cand)) continue;
+ try {
+ if (!fs.statSync(path.join(siteDir, cand)).isFile()) continue;
+ } catch {
+ continue;
+ }
+ seen.add(cand);
+ queue.push(cand);
+ break;
+ }
+ }
+ }
+ return Array.from(seen);
+}
+
+/**
+ * When the page was last edited: the most recent commit date across the page's
+ * own source and every partial it pulls in. "" when genuinely unknown (shallow
+ * clone, or no git) rather than a constant that would look like data.
+ *
+ * Caveat worth knowing: a commit date answers "when did this change", not "when
+ * was this checked" - a formatting sweep moves it. Real verification needs a
+ * human-set frontmatter field, which is a separate thing from this.
+ */
+function sourceDate(siteDir: string, pathname: string): string {
+ const dates = gitDates(siteDir);
+ if (!dates.size) return "";
+ let newest = "";
+ for (const rel of contributingFiles(siteDir, pathname)) {
+ const d = dates.get(rel);
+ // ISO-8601 with a fixed offset sorts lexicographically.
+ if (d && d > newest) newest = d;
+ }
+ return newest;
+}
+
function readFrontMatter(siteDir: string, pathname: string): Record {
+ // Kept in step with sourceCandidates() - see the note there.
const rel = pathname.replace(/^\/+|\/+$/g, "");
const base = path.join(siteDir, "docs");
const candidates = rel
@@ -715,7 +830,10 @@ function buildModule(args: {
keywords,
status: curatedApplied ? "frontmatter_augmented" : "rule_based",
},
- references: links.internal.slice(0, 20),
+ // Self-references were filtered when building the graph but not here, so 25
+ // index records pointed a consumer back at the page it was already on - and
+ // burned one of the 20 slots doing it. Both artifacts now agree.
+ references: links.internal.filter((r) => r !== pathname).slice(0, 20),
api_refs: links.api.slice(0, 20),
content: {
docs_markdown: chunkClean,
@@ -807,7 +925,9 @@ function buildGraph(modules: KModule[], site: string) {
const conceptNodes: any[] = [
...intents.map((v) => ({ "@id": `urn:intent:${v}`, "@type": "Intent", name: v })),
...audiences.map((v) => ({ "@id": `urn:audience:${v}`, "@type": "Audience", name: v })),
- ...channels.map((v) => ({ "@id": `urn:channel:${v}`, "@type": "Channel", name: v })),
+ // No Channel nodes: the HasChannel edges are gone (they were a constant on
+ // every module), and a typed node no traversal can reach is dead data in a
+ // graph whose whole point is traversal. `channels` stays on the modules.
...frameworks.map((v) => ({ "@id": `urn:framework:${v}`, "@type": "Framework", name: v })),
...products.map((v) => ({ "@id": `urn:product:${v}`, "@type": "Product", name: v })),
...apiRefs.map((v) => ({ "@id": `urn:api:${v}`, "@type": "ApiReference", url: v })),
@@ -844,18 +964,23 @@ function buildGraph(modules: KModule[], site: string) {
if (ref === m.metadata.source_path) continue;
if (indexedPaths.has(ref)) addEdge(`${src}#see:${ref}`, "SeeAlso", src, `urn:doc:${ref}`);
}
- // Record availability. Synthetic buckets are excluded: they group unrelated
- // pages, so both an "available" and a "not available" page land in the same
- // bucket and the two edges contradict each other.
- const prod = m.metadata.product;
+ // Record availability for EVERY declared product, not just the first:
+ // BelongsToProduct already uses all of them, so using products[0] here made
+ // two edge families derived from the same field disagree on multi-product
+ // pages. Synthetic buckets stay excluded - they group unrelated pages, so an
+ // "available" and a "not available" page land in the same bucket and the two
+ // edges contradict each other.
const fw = m.metadata.framework;
- if (prod && fw && !SYNTHETIC_PRODUCTS.has(prod)) {
- if (m.metadata.not_available) {
- if (!unavailable.has(prod)) unavailable.set(prod, new Set());
- unavailable.get(prod)!.add(fw);
- } else {
- if (!available.has(prod)) available.set(prod, new Set());
- available.get(prod)!.add(fw);
+ const prods = (
+ m.metadata.products && m.metadata.products.length
+ ? m.metadata.products
+ : [m.metadata.product]
+ ).filter((p) => p && !SYNTHETIC_PRODUCTS.has(p));
+ if (fw) {
+ for (const prod of prods) {
+ const bucket = m.metadata.not_available ? unavailable : available;
+ if (!bucket.has(prod)) bucket.set(prod, new Set());
+ bucket.get(prod)!.add(fw);
}
}
}
@@ -965,11 +1090,24 @@ export default function knowledgeExtractor(context: any, _options: any) {
const framework = detectFramework(pathname);
// Frontmatter is authoritative when present; fall back to path/heuristics.
const fmProducts = fmStringArray(fm.product).map(slug).filter(Boolean);
- const products = fmProducts.length ? Array.from(new Set(fmProducts)) : [detectProduct(pathname, siteDir)];
+ const notAvailable = isAvailabilityStub(title, bodyMd);
+ let products = fmProducts.length
+ ? Array.from(new Set(fmProducts))
+ : [detectProduct(pathname, siteDir)];
+ // A page whose whole job is to say "X is not available here" is about a
+ // real feature, even when that feature is not a products.json entry
+ // (ai-powered-barcode-scanning, batch-scanning). Filing it under the
+ // synthetic bucket threw the fact away - the same class of loss the
+ // bucket was introduced to stop. Name it after the page instead.
+ if (notAvailable && products.every((p) => SYNTHETIC_PRODUCTS.has(p))) {
+ const seg = pathSegments(pathname);
+ const i = seg[1] === "net" ? 3 : 2;
+ const own = slug(seg.slice(i)[0] || "");
+ if (own && !SYNTHETIC_PRODUCTS.has(own)) products = [own];
+ }
const product = products[0];
const fmTopic = fmFirst(fm.topic_type).toLowerCase();
const contentType = TOPIC_TYPE_TO_CONTENT[fmTopic] || detectContentType(pathname, title);
- const notAvailable = isAvailabilityStub(title, bodyMd);
chunks.forEach((chunk, i) => {
modules.push(
buildModule({ pathname, url, sourceSite, site, title, description, chunk, idx: i + 1, framework, product, products, contentType, version, updatedAt: buildStamp, sourceUpdatedAt, notAvailable, fm }),
@@ -1012,18 +1150,26 @@ export default function knowledgeExtractor(context: any, _options: any) {
const idxMb = mb(Buffer.byteLength(idxJson));
const graphMb = mb(Buffer.byteLength(graphJson));
if (idxMb > MAX_INDEX_MB || graphMb > MAX_GRAPH_MB) {
- throw new Error(
- `[knowledge-extractor] artifacts exceed their budget: index ${idxMb.toFixed(1)} MB ` +
- `(max ${MAX_INDEX_MB}), graph ${graphMb.toFixed(1)} MB (max ${MAX_GRAPH_MB}). ` +
- `Either the corpus grew legitimately - then raise the budget deliberately - or ` +
- `an edge type is multiplying. Refusing to publish silently.`,
+ // WARN, do not throw. Everything else in this plugin is careful never to
+ // be able to break a deploy, and growth is not a reason to make an
+ // exception: the whole docs build would start failing on main because the
+ // corpus got bigger, for artifacts nothing consumes yet. An empty-output
+ // guard is worth throwing for - that means the selectors drifted and the
+ // data is wrong. This just means there is more of it.
+ console.warn(
+ `[knowledge-extractor] artifacts over budget: index ${idxMb.toFixed(1)} MB ` +
+ `(soft max ${MAX_INDEX_MB}), graph ${graphMb.toFixed(1)} MB (soft max ` +
+ `${MAX_GRAPH_MB}). Either the corpus grew - then raise the budget ` +
+ `deliberately - or an edge type is multiplying. Publishing anyway.`,
);
}
- // Two renameSync calls are NOT atomic as a pair - the previous comment here
- // claimed they were, and a crash between them would ship a new index with
- // the old graph, which is exactly what it said it prevented. Keep a copy of
- // the previous index so the first rename can be rolled back.
+ // BEST-EFFORT, not atomic. Two renames cannot be one operation, so a
+ // process kill or a cancelled job between them still leaves a new index
+ // beside the old graph; the catch below only covers a rename that THROWS.
+ // Made explicit rather than repeating the "atomically" claim this replaced.
+ // A genuinely atomic pair needs a directory swap, or a version stamp
+ // carried by both files so a consumer can detect the mismatch itself.
fs.writeFileSync(idxPath + ".tmp", idxJson, "utf8");
fs.writeFileSync(graphPath + ".tmp", graphJson, "utf8");
const prevIdx = fs.existsSync(idxPath) ? fs.readFileSync(idxPath) : null;
From 3a261f01f00f5c359e7acaa12ee7c61baa332e82 Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Fri, 4 Sep 2026 13:30:40 +0100
Subject: [PATCH 14/53] fix(knowledge-extractor): one shared walker; fence-safe
excerpt; real path sharing
Round 4. Three walk sites had independently grown the same logic - the
branch, the wrapper-element branch and extractMarkdownish - and each review round
found the same class of bug in whichever one had not been touched yet. They now
share ONE helper, orderedSegments(), so the next fix lands in all three at once.
That closes two findings by construction: the wrapper branch was still stripping
link URLs the same way the list branch had been (serializeInline iterates the
CONTENTS of the node it is given, so an passed directly never reaches the
branch that emits the href), and extractMarkdownish was pushing every root-level
text node as its own paragraph, so a text node CONTINUING a sentence became a
standalone fragment - and since \n\n is a chunk boundary, that fragment could
land in a different chunk with nothing to attach it to.
readFrontMatter now ACTUALLY shares sourceCandidates(). The previous commit added
a comment saying it did and left the duplicate list in place - my second
comment-only "fix" in this PR. It mattered: a folder/folder.md page resolved for
dating but not for frontmatter, so device-pairing's curated `keywords: [express]`
was dropped and semantic_status stayed rule_based. Verified: the keyword is now
in the shipped record.
The PUBLISHED excerpt no longer truncates inside a code fence. docs_excerpt is a
hard slice(0, 400) of the chunk, so restoring real newlines in code samples made
this worse, not better - 693 records at base, 783 after. Every one of those hands
a consumer raw code with a dangling ```, the exact defect this plugin treats as a
bug elsewhere, and my earlier "0 unbalanced fences" was measured on chunk content
rather than on the field consumers actually read. Now clipped at the last safe
boundary: 783 -> 0.
Dates are compared as unix seconds (%ct), not ISO strings. %cI carries each
committer's own offset - this repo has +02:00, +01:00, +03:00 and one Z - so
comparing lexicographically can order two commits backwards and pick the older
one, putting last_verified out by a day.
contributingFiles also follows local component imports, not just partials. The
nine agent-skills pages are shells around @site/src/components/SkillsPage, whose
prose lives in the component, so editing it changes what those pages say while
their date sat at the shell's commit. gitDates covers src/ for this. Verified:
those pages now report 2026-08-04, the component's date.
And slug("") bit me in my own round-3 fix: an empty path segment became "module",
so a framework-root availability stub would have emitted a phantom
urn:product:module with availability edges. The raw segment is checked before
slugging, and the path shape is verified before trusting the /net/ offset.
NOT FIXED, deliberately - it is a docs bug, not an extractor bug. The review
flagged that /sdks/{ios,android}/matrixscan-count/advanced/ ship "See the
[Expiry Management Sample](...)" and "for an example of how to use this feature."
as two paragraphs. The source does that itself:
See the [Expiry Management Sample](https://...)
for an example of how to use this feature.
The sentence is split around a video embed in the markdown, so it reads broken on
the live page too. Papering over it here would hide a real content defect.
Exactly 2 pages, one line each; worth its own change.
Verified: tsc reports no errors in the file; 4668 modules from 616 pages, 0 page
errors; 0 dangling fences in the published excerpt; 0 availability
contradictions; 0 index self-references; no phantom product; CitesApi 2976 (base
2980). Evals: success@3 0.90, precision@3 0.85, MRR 0.90 (floors 0.8/0.6/0.6) -
precision holds at 0.85, above the 0.8333 of the last two rounds.
Co-Authored-By: Claude Opus 5 (1M context)
---
src/plugins/knowledge-extractor/index.ts | 268 +++++++++++++----------
1 file changed, 156 insertions(+), 112 deletions(-)
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index 4cf33e7e47..babf9cd4fe 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -40,6 +40,33 @@ type Chunk = { heading: string; content: string };
// ---------------------------------------------------------------------------
// small helpers (ported)
// ---------------------------------------------------------------------------
+/**
+ * Truncate markdown without leaving an unterminated code fence.
+ *
+ * Prefers cutting just before the fence that would be left open; if the text
+ * opens a fence too early for that to leave anything useful, closes the fence
+ * instead. Consumers read this field directly, so a dangling ``` is not cosmetic.
+ */
+function clipMarkdown(text: string, limit: number): string {
+ if (text.length <= limit) return text;
+ const cut = text.slice(0, limit);
+ const lines = cut.split("\n");
+ let open = false;
+ let lastFenceStart = -1;
+ for (let i = 0; i < lines.length; i++) {
+ if (/^\s*```/.test(lines[i])) {
+ if (!open) lastFenceStart = i;
+ open = !open;
+ }
+ }
+ if (!open) return cut;
+ // Dropping the half-included block is better than shipping it broken, unless
+ // that would throw away almost everything.
+ const trimmed = lines.slice(0, lastFenceStart).join("\n").trimEnd();
+ if (trimmed.length >= Math.floor(limit / 3)) return trimmed;
+ return `${cut.trimEnd()}\n\u0060\u0060\u0060`;
+}
+
function slug(value: string): string {
const clean = String(value)
.toLowerCase()
@@ -241,6 +268,71 @@ function tableToMd($: cheerio.CheerioAPI, el: any): string {
return rows.join("\n");
}
+/**
+ * Split an element's children into ordered segments, gathering CONSECUTIVE
+ * INLINE children into runs and serializing each run as one unit.
+ *
+ * Both properties are load-bearing, and every round of review found the same two
+ * bugs in whichever walk site had not yet been fixed:
+ *
+ * - serializeInline() iterates the CONTENTS of the node it is handed, so passing
+ * it an skips the branch that emits [label](href) and keeps only the
+ * label. Same for (backticks) and
. Inline children therefore have
+ * to be serialized as a group, inside a wrapper, never one at a time.
+ * - joining separately-serialized pieces with " " inserts a space at every
+ * boundary, which produced "List-based workflows : Validate…".
+ *
+ * Runs also preserve document order, so a sentence that follows a code block is
+ * not hoisted above it, and a text node that CONTINUES a sentence across an
+ * inline element stays in the same segment instead of becoming its own paragraph.
+ */
+function orderedSegments($: cheerio.CheerioAPI, el: any): string[] {
+ const segs: string[] = [];
+ let pending: any[] = [];
+ const flush = () => {
+ if (!pending.length) return;
+ const wrap = $("");
+ for (const nd of pending) wrap.append($(nd).clone());
+ const t = inlineText($, wrap[0]);
+ if (t) segs.push(t);
+ pending = [];
+ };
+ const isBlockTag = (tag: string, node: any) =>
+ tag === "ul" ||
+ tag === "ol" ||
+ tag === "pre" ||
+ tag === "p" ||
+ tag === "div" ||
+ tag === "section" ||
+ tag === "details" ||
+ tag === "article" ||
+ tag === "aside" ||
+ tag === "table" ||
+ tag === "blockquote" ||
+ Boolean(HEADING_LEVEL[tag]) ||
+ $(node).find("pre").length > 0;
+
+ $(el)
+ .contents()
+ .each((_i, c: any) => {
+ if (c.type === "text") {
+ pending.push(c);
+ return;
+ }
+ if (c.type !== "tag") return;
+ const tag = String(c.name || "").toLowerCase();
+ if (!isBlockTag(tag, c)) {
+ pending.push(c);
+ return;
+ }
+ flush();
+ const sub = blockToMd($, c);
+ if (sub.trim()) segs.push(sub.trim());
+ });
+ flush();
+ return segs;
+}
+
function blockToMd($: cheerio.CheerioAPI, el: any): string {
const tag = String(el.tagName || el.name || "").toLowerCase();
if (HEADING_LEVEL[tag]) {
@@ -262,55 +354,7 @@ function blockToMd($: cheerio.CheerioAPI, el: any): string {
$(el)
.children("li")
.each((i, li) => {
- // Segments in DOCUMENT ORDER. Consecutive inline children are gathered
- // into a run and serialized together, which matters for two reasons:
- //
- // - serializeInline iterates the CONTENTS of the node it is given, so
- // handing it an skips the branch that emits [label](href) and
- // keeps only the label. Same for (backticks) and
. Passing
- // inline elements one at a time stripped 1489 anchors and 3124 code
- // spans that sit directly inside an .
- // - joining separately-serialized pieces with " " inserted a space at
- // every boundary, producing "List-based workflows : Validate…".
- //
- // Order is preserved so a sentence that follows a code block in the
- // source is not hoisted above it.
- const segs: string[] = [];
- let pending: any[] = [];
- const hasPre = (node: any) => $(node).find("pre").length > 0;
- const flushInline = () => {
- if (!pending.length) return;
- const wrap = $("");
- for (const nd of pending) wrap.append($(nd).clone());
- const t = inlineText($, wrap[0]);
- if (t) segs.push(t);
- pending = [];
- };
- $(li)
- .contents()
- .each((_j, c: any) => {
- if (c.type === "text") {
- pending.push(c);
- return;
- }
- if (c.type !== "tag") return;
- const ctag = String(c.name || "").toLowerCase();
- const isBlock =
- ctag === "ul" ||
- ctag === "ol" ||
- ctag === "pre" ||
- ctag === "p" ||
- ctag === "div" ||
- hasPre(c);
- if (!isBlock) {
- pending.push(c);
- return;
- }
- flushInline();
- const sub = blockToMd($, c);
- if (sub.trim()) segs.push(sub.trim());
- });
- flushInline();
+ const segs = orderedSegments($, li);
if (!segs.length) return;
const marker = ordered ? `${start + i}.` : "-";
@@ -352,24 +396,11 @@ function blockToMd($: cheerio.CheerioAPI, el: any): string {
if (tag === "table") return tableToMd($, el);
if (tag === "blockquote") return inlineText($, el);
if (tag === "div" || tag === "section" || tag === "details" || tag === "article" || tag === "aside") {
- // Walk contents(), not children(): a text node that is a DIRECT child of a
- // wrapper was silently dropped. Real case - an admonition heading is
+ // Shared walker: keeps direct text children (an admonition heading is
// icondanger, so the
- // severity word vanished and a :::danger block read as ordinary prose.
- const parts: string[] = [];
- $(el)
- .contents()
- .each((_i, c: any) => {
- if (c.type === "text") {
- const t = String(c.data || "").replace(/\s+/g, " ").trim();
- if (t) parts.push(t);
- return;
- }
- if (c.type !== "tag") return;
- const t = blockToMd($, c);
- if (t && t.trim()) parts.push(t.trim());
- });
- return parts.join("\n\n");
+ // severity word used to vanish) AND keeps link URLs, which a per-child walk
+ // would strip for the same reason it did inside list items.
+ return orderedSegments($, el).join("\n\n");
}
return inlineText($, el);
}
@@ -380,20 +411,11 @@ function extractMarkdownish($: cheerio.CheerioAPI, root: any): string {
// trailing sentence, because it sits as a direct text child of .markdown after
// an inline element - e.g. "…Sample for an example of how to use
// this feature."
- const parts: string[] = [];
- $(root)
- .contents()
- .each((_i, el: any) => {
- if (el.type === "text") {
- const t = String(el.data || "").replace(/\s+/g, " ").trim();
- if (t) parts.push(t);
- return;
- }
- if (el.type !== "tag") return;
- const t = blockToMd($, el);
- if (t && t.trim()) parts.push(t.trim());
- });
- return parts.join("\n\n").replace(/\n{3,}/g, "\n\n").trim();
+ // Shared walker, so a trailing text node that continues the preceding
+ // sentence stays attached to it instead of becoming a standalone paragraph -
+ // which mattered because \n\n is a chunk boundary, so the fragment could land
+ // in a different chunk with nothing to attach it to.
+ return orderedSegments($, root).join("\n\n").replace(/\n{3,}/g, "\n\n").trim();
}
// ---------------------------------------------------------------------------
@@ -577,20 +599,24 @@ function gitDates(siteDir: string): Map {
);
return GIT_DATES;
}
+ // %ct (unix seconds) rather than %cI: the ISO form carries each committer's
+ // own UTC offset - this repo has +02:00, +01:00, +03:00 and Z - so comparing
+ // the strings lexicographically can order two commits backwards and pick the
+ // older one. Seconds compare correctly regardless of zone.
const out = execFileSync(
"git",
- ["log", "--no-merges", "--name-only", "--format=%x00%cI", "--", "docs"],
+ ["log", "--no-merges", "--name-only", "--format=%x00%ct", "--", "docs", "src"],
{ cwd: siteDir, encoding: "utf8", maxBuffer: 256 * 1024 * 1024 },
);
- let commitDate = "";
+ let commitStamp = "";
for (const raw of out.split("\n")) {
if (raw.startsWith("\u0000")) {
- commitDate = raw.slice(1).trim();
+ commitStamp = raw.slice(1).trim();
continue;
}
const file = raw.trim();
// git log is newest-first, so the first sighting of a file is its latest.
- if (file && commitDate && !GIT_DATES.has(file)) GIT_DATES.set(file, commitDate);
+ if (file && commitStamp && !GIT_DATES.has(file)) GIT_DATES.set(file, commitStamp);
}
} catch {
// Never fatal: this plugin must not be able to break a deploy.
@@ -660,15 +686,29 @@ function contributingFiles(siteDir: string, pathname: string): string[] {
continue;
}
const dir = path.posix.dirname(rel.split(path.sep).join("/"));
- const re = /from\s+['"]([^'"]*partials\/[^'"]+)['"]/g;
+ // Follow partials AND local components: the nine agent-skills pages are
+ // shells around @site/src/components/SkillsPage, whose prose lives in the
+ // component - so editing it changes what those pages say. Same staleness the
+ // partial-following fixes, one directory over. gitDates covers src/ for this.
+ const re = /from\s+['"]([^'"]*(?:partials\/|@site\/src\/components\/)[^'"]+)['"]/g;
let m: RegExpExecArray | null;
while ((m = re.exec(body))) {
const spec = m[1].replace(/^@site\//, "");
- const resolved = spec.startsWith("docs/")
- ? spec
- : path.posix.normalize(path.posix.join(dir, spec));
- if (!resolved.startsWith("docs/")) continue;
- const withExt = /\.mdx?$/.test(resolved) ? [resolved] : [`${resolved}.mdx`, `${resolved}.md`];
+ const resolved =
+ spec.startsWith("docs/") || spec.startsWith("src/")
+ ? spec
+ : path.posix.normalize(path.posix.join(dir, spec));
+ if (!resolved.startsWith("docs/") && !resolved.startsWith("src/")) continue;
+ const withExt = /\.(mdx?|tsx?|jsx?)$/.test(resolved)
+ ? [resolved]
+ : [
+ `${resolved}.mdx`,
+ `${resolved}.md`,
+ `${resolved}.tsx`,
+ `${resolved}.ts`,
+ `${resolved}/index.tsx`,
+ `${resolved}/index.ts`,
+ ];
for (const cand of withExt) {
if (seen.has(cand)) continue;
try {
@@ -697,29 +737,22 @@ function contributingFiles(siteDir: string, pathname: string): string[] {
function sourceDate(siteDir: string, pathname: string): string {
const dates = gitDates(siteDir);
if (!dates.size) return "";
- let newest = "";
+ let newest = 0;
for (const rel of contributingFiles(siteDir, pathname)) {
- const d = dates.get(rel);
- // ISO-8601 with a fixed offset sorts lexicographically.
- if (d && d > newest) newest = d;
+ const secs = Number(dates.get(rel) || 0);
+ if (Number.isFinite(secs) && secs > newest) newest = secs;
}
- return newest;
+ return newest ? new Date(newest * 1000).toISOString() : "";
}
function readFrontMatter(siteDir: string, pathname: string): Record {
- // Kept in step with sourceCandidates() - see the note there.
- const rel = pathname.replace(/^\/+|\/+$/g, "");
- const base = path.join(siteDir, "docs");
- const candidates = rel
- ? [
- path.join(base, `${rel}.md`),
- path.join(base, `${rel}.mdx`),
- path.join(base, rel, "index.md"),
- path.join(base, rel, "index.mdx"),
- path.join(base, rel, "README.md"),
- ]
- : [path.join(base, "index.md"), path.join(base, "intro.md"), path.join(base, "index.mdx")];
- for (const file of candidates) {
+ // Actually shares sourceCandidates() now. It previously kept its own list with
+ // a comment claiming otherwise, and the lists had drifted: a folder/folder.md
+ // page resolved for dating but not for frontmatter, so its curated fields
+ // (keywords, and any topic_type / product / user_intents / canonical_id) were
+ // silently dropped and semantic_status stayed "rule_based".
+ for (const rel of sourceCandidates(pathname)) {
+ const file = path.join(siteDir, rel);
try {
if (!fs.existsSync(file)) continue;
return (matter(fs.readFileSync(file, "utf8")).data || {}) as Record;
@@ -862,7 +895,11 @@ function toIndexRecord(m: KModule) {
channels: m.channels,
dependencies: m.dependencies,
tags: m.tags,
- docs_excerpt: m.content.docs_markdown.slice(0, 400),
+ // Truncating mid-fence leaves the consumer with raw code and a dangling
+ // ``` - the very defect this plugin treats as a bug elsewhere. Restoring
+ // real newlines in code samples made it more likely, not less (measured 693
+ // -> 783 records). Cut at the last safe point instead.
+ docs_excerpt: clipMarkdown(m.content.docs_markdown, 400),
assistant_excerpt: m.content.assistant_context.slice(0, 300),
url: m.metadata.url,
heading: m.metadata.heading,
@@ -1101,9 +1138,16 @@ export default function knowledgeExtractor(context: any, _options: any) {
// bucket was introduced to stop. Name it after the page instead.
if (notAvailable && products.every((p) => SYNTHETIC_PRODUCTS.has(p))) {
const seg = pathSegments(pathname);
- const i = seg[1] === "net" ? 3 : 2;
- const own = slug(seg.slice(i)[0] || "");
- if (own && !SYNTHETIC_PRODUCTS.has(own)) products = [own];
+ // Guard the shape before trusting the offset, and check the RAW
+ // segment: slug("") returns "module", which would have emitted a
+ // phantom urn:product:module for a framework-root stub. Same trap
+ // productKeys() documents - it caught me here too.
+ if (seg[0] === "sdks") {
+ const i = seg[1] === "net" ? 3 : 2;
+ const raw = (seg[i] || "").trim();
+ const own = raw ? slug(raw) : "";
+ if (own && !SYNTHETIC_PRODUCTS.has(own)) products = [own];
+ }
}
const product = products[0];
const fmTopic = fmFirst(fm.topic_type).toLowerCase();
From 457c3a31e0c91649e4b90fc21594be5932f4a10b Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Fri, 4 Sep 2026 13:53:18 +0100
Subject: [PATCH 15/53] fix(knowledge-extractor): clip the other excerpt;
follow imports all the way
Round 5. Two of the four findings were one line away from something already
fixed, which is the same shape of mistake as the earlier comment-only edits.
assistant_excerpt was still a hard slice(0, 300) while docs_excerpt directly
above it had been given clipMarkdown, so 466 of 4668 records handed an assistant
raw code with a dangling ``` - the identical defect, on the other published text
field of the same record. Now clipped the same way: 466 -> 0 (base 471).
contributingFiles stopped one hop short of the prose it was added for. Matching
only `partials/` and `@site/src/components/` reached SkillsPage/index.tsx but not
the src/data/skills.json that page renders, so adding a skill would change what
nine pages say and move none of their dates. It now matches EVERY import spec and
decides by where the spec RESOLVES - package imports land outside docs/ and src/
and are dropped, so widening the match costs nothing - and .json counts as a
content file. Verified: the label-definitions pages now pick up 2026-08-04
through the deeper chain, where before they stopped at the shell.
Correcting my own verification claim from the last commit while I am here: the
agent-skills pages report 2026-08-04 from their own .mdx, not from the component
(SkillsPage/index.tsx is 2026-07-09). The date was right; my attribution of where
it came from was not.
The div walk had started publishing SSR loading placeholders as documentation.
Returning bare text children from wrapper elements surfaced "Loading
features..." - what FeatureList renders before it hydrates - so nine
label-definitions pages asserted that where their feature tables should be, and
the real tables are never in the HTML at all. Loading strings 52 -> 0, matched
narrowly (the word plus a trailing ellipsis) so prose that merely begins with
"Loading" survives.
package-lock.json is now DELETED rather than reverted. Reverting it left the
branch carrying a pre-PR lockfile that omits cheerio while package.json declares
it, so `npm ci` refuses - and main deleted the file outright in #416 when the
repo went yarn-only, so keeping any version of it only guarantees a modify/delete
conflict on merge. The PR-wide diff is now 9 files with no lockfile in it.
Verified: tsc reports no errors in the file; 4668 modules from 616 pages, 0 page
errors; 0 dangling fences in EITHER published excerpt; 0 loading placeholders; 0
availability contradictions; 0 index self-references. Evals: success@3 0.90,
precision@3 0.85, MRR 0.90 (floors 0.8/0.6/0.6).
Known, from the review and left as-is: docs-preview.yml will be an add/add
conflict on merge, since main has it and this branch's copy differs only by the
fetch-depth hunk - trivially resolved by taking this version.
Co-Authored-By: Claude Opus 5 (1M context)
---
package-lock.json | 14926 ---------------------
src/plugins/knowledge-extractor/index.ts | 32 +-
2 files changed, 24 insertions(+), 14934 deletions(-)
delete mode 100644 package-lock.json
diff --git a/package-lock.json b/package-lock.json
deleted file mode 100644
index 5bfeaf51a6..0000000000
--- a/package-lock.json
+++ /dev/null
@@ -1,14926 +0,0 @@
-{
- "name": "docs",
- "version": "0.0.0",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "docs",
- "version": "0.0.0",
- "license": "Apache-2.0",
- "dependencies": {
- "@docusaurus/core": "^3.4.0",
- "@docusaurus/plugin-client-redirects": "3.4.0",
- "@docusaurus/preset-classic": "^3.4.0",
- "@mdx-js/react": "^3.0.0",
- "classnames": "^2.5.1",
- "clsx": "^1.2.1",
- "docusaurus-plugin-sass": "^0.2.5",
- "prism-react-renderer": "^2.1.0",
- "react": "^18.0.0",
- "react-dom": "^18.0.0",
- "react-player": "^2.16.0",
- "sass": "^1.77.2"
- },
- "devDependencies": {
- "@docusaurus/module-type-aliases": "^3.4.0",
- "@docusaurus/tsconfig": "^3.4.0",
- "@docusaurus/types": "^3.4.0",
- "docusaurus-plugin-llms": "^0.1.5",
- "dotenv": "^16.4.5",
- "typescript": "~5.2.2"
- },
- "engines": {
- "node": ">=18.0"
- }
- },
- "node_modules/@algolia/autocomplete-core": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz",
- "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==",
- "dependencies": {
- "@algolia/autocomplete-plugin-algolia-insights": "1.9.3",
- "@algolia/autocomplete-shared": "1.9.3"
- }
- },
- "node_modules/@algolia/autocomplete-plugin-algolia-insights": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz",
- "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==",
- "dependencies": {
- "@algolia/autocomplete-shared": "1.9.3"
- },
- "peerDependencies": {
- "search-insights": ">= 1 < 3"
- }
- },
- "node_modules/@algolia/autocomplete-preset-algolia": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz",
- "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==",
- "dependencies": {
- "@algolia/autocomplete-shared": "1.9.3"
- },
- "peerDependencies": {
- "@algolia/client-search": ">= 4.9.1 < 6",
- "algoliasearch": ">= 4.9.1 < 6"
- }
- },
- "node_modules/@algolia/autocomplete-shared": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz",
- "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==",
- "peerDependencies": {
- "@algolia/client-search": ">= 4.9.1 < 6",
- "algoliasearch": ">= 4.9.1 < 6"
- }
- },
- "node_modules/@algolia/cache-browser-local-storage": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.20.0.tgz",
- "integrity": "sha512-uujahcBt4DxduBTvYdwO3sBfHuJvJokiC3BP1+O70fglmE1ShkH8lpXqZBac1rrU3FnNYSUs4pL9lBdTKeRPOQ==",
- "dependencies": {
- "@algolia/cache-common": "4.20.0"
- }
- },
- "node_modules/@algolia/cache-browser-local-storage/node_modules/@algolia/cache-common": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.20.0.tgz",
- "integrity": "sha512-vCfxauaZutL3NImzB2G9LjLt36vKAckc6DhMp05An14kVo8F1Yofb6SIl6U3SaEz8pG2QOB9ptwM5c+zGevwIQ=="
- },
- "node_modules/@algolia/cache-common": {
- "version": "4.24.0",
- "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.24.0.tgz",
- "integrity": "sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g==",
- "peer": true
- },
- "node_modules/@algolia/cache-in-memory": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.20.0.tgz",
- "integrity": "sha512-Wm9ak/IaacAZXS4mB3+qF/KCoVSBV6aLgIGFEtQtJwjv64g4ePMapORGmCyulCFwfePaRAtcaTbMcJF+voc/bg==",
- "dependencies": {
- "@algolia/cache-common": "4.20.0"
- }
- },
- "node_modules/@algolia/cache-in-memory/node_modules/@algolia/cache-common": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.20.0.tgz",
- "integrity": "sha512-vCfxauaZutL3NImzB2G9LjLt36vKAckc6DhMp05An14kVo8F1Yofb6SIl6U3SaEz8pG2QOB9ptwM5c+zGevwIQ=="
- },
- "node_modules/@algolia/client-account": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.20.0.tgz",
- "integrity": "sha512-GGToLQvrwo7am4zVkZTnKa72pheQeez/16sURDWm7Seyz+HUxKi3BM6fthVVPUEBhtJ0reyVtuK9ArmnaKl10Q==",
- "dependencies": {
- "@algolia/client-common": "4.20.0",
- "@algolia/client-search": "4.20.0",
- "@algolia/transporter": "4.20.0"
- }
- },
- "node_modules/@algolia/client-account/node_modules/@algolia/cache-common": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.20.0.tgz",
- "integrity": "sha512-vCfxauaZutL3NImzB2G9LjLt36vKAckc6DhMp05An14kVo8F1Yofb6SIl6U3SaEz8pG2QOB9ptwM5c+zGevwIQ=="
- },
- "node_modules/@algolia/client-account/node_modules/@algolia/client-common": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.20.0.tgz",
- "integrity": "sha512-P3WgMdEss915p+knMMSd/fwiHRHKvDu4DYRrCRaBrsfFw7EQHon+EbRSm4QisS9NYdxbS04kcvNoavVGthyfqQ==",
- "dependencies": {
- "@algolia/requester-common": "4.20.0",
- "@algolia/transporter": "4.20.0"
- }
- },
- "node_modules/@algolia/client-account/node_modules/@algolia/client-search": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.20.0.tgz",
- "integrity": "sha512-zgwqnMvhWLdpzKTpd3sGmMlr4c+iS7eyyLGiaO51zDZWGMkpgoNVmltkzdBwxOVXz0RsFMznIxB9zuarUv4TZg==",
- "dependencies": {
- "@algolia/client-common": "4.20.0",
- "@algolia/requester-common": "4.20.0",
- "@algolia/transporter": "4.20.0"
- }
- },
- "node_modules/@algolia/client-account/node_modules/@algolia/logger-common": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.20.0.tgz",
- "integrity": "sha512-xouigCMB5WJYEwvoWW5XDv7Z9f0A8VoXJc3VKwlHJw/je+3p2RcDXfksLI4G4lIVncFUYMZx30tP/rsdlvvzHQ=="
- },
- "node_modules/@algolia/client-account/node_modules/@algolia/requester-common": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.20.0.tgz",
- "integrity": "sha512-9h6ye6RY/BkfmeJp7Z8gyyeMrmmWsMOCRBXQDs4mZKKsyVlfIVICpcSibbeYcuUdurLhIlrOUkH3rQEgZzonng=="
- },
- "node_modules/@algolia/client-account/node_modules/@algolia/transporter": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.20.0.tgz",
- "integrity": "sha512-Lsii1pGWOAISbzeyuf+r/GPhvHMPHSPrTDWNcIzOE1SG1inlJHICaVe2ikuoRjcpgxZNU54Jl+if15SUCsaTUg==",
- "dependencies": {
- "@algolia/cache-common": "4.20.0",
- "@algolia/logger-common": "4.20.0",
- "@algolia/requester-common": "4.20.0"
- }
- },
- "node_modules/@algolia/client-analytics": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.20.0.tgz",
- "integrity": "sha512-EIr+PdFMOallRdBTHHdKI3CstslgLORQG7844Mq84ib5oVFRVASuuPmG4bXBgiDbcsMLUeOC6zRVJhv1KWI0ug==",
- "dependencies": {
- "@algolia/client-common": "4.20.0",
- "@algolia/client-search": "4.20.0",
- "@algolia/requester-common": "4.20.0",
- "@algolia/transporter": "4.20.0"
- }
- },
- "node_modules/@algolia/client-analytics/node_modules/@algolia/cache-common": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.20.0.tgz",
- "integrity": "sha512-vCfxauaZutL3NImzB2G9LjLt36vKAckc6DhMp05An14kVo8F1Yofb6SIl6U3SaEz8pG2QOB9ptwM5c+zGevwIQ=="
- },
- "node_modules/@algolia/client-analytics/node_modules/@algolia/client-common": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.20.0.tgz",
- "integrity": "sha512-P3WgMdEss915p+knMMSd/fwiHRHKvDu4DYRrCRaBrsfFw7EQHon+EbRSm4QisS9NYdxbS04kcvNoavVGthyfqQ==",
- "dependencies": {
- "@algolia/requester-common": "4.20.0",
- "@algolia/transporter": "4.20.0"
- }
- },
- "node_modules/@algolia/client-analytics/node_modules/@algolia/client-search": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.20.0.tgz",
- "integrity": "sha512-zgwqnMvhWLdpzKTpd3sGmMlr4c+iS7eyyLGiaO51zDZWGMkpgoNVmltkzdBwxOVXz0RsFMznIxB9zuarUv4TZg==",
- "dependencies": {
- "@algolia/client-common": "4.20.0",
- "@algolia/requester-common": "4.20.0",
- "@algolia/transporter": "4.20.0"
- }
- },
- "node_modules/@algolia/client-analytics/node_modules/@algolia/logger-common": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.20.0.tgz",
- "integrity": "sha512-xouigCMB5WJYEwvoWW5XDv7Z9f0A8VoXJc3VKwlHJw/je+3p2RcDXfksLI4G4lIVncFUYMZx30tP/rsdlvvzHQ=="
- },
- "node_modules/@algolia/client-analytics/node_modules/@algolia/requester-common": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.20.0.tgz",
- "integrity": "sha512-9h6ye6RY/BkfmeJp7Z8gyyeMrmmWsMOCRBXQDs4mZKKsyVlfIVICpcSibbeYcuUdurLhIlrOUkH3rQEgZzonng=="
- },
- "node_modules/@algolia/client-analytics/node_modules/@algolia/transporter": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.20.0.tgz",
- "integrity": "sha512-Lsii1pGWOAISbzeyuf+r/GPhvHMPHSPrTDWNcIzOE1SG1inlJHICaVe2ikuoRjcpgxZNU54Jl+if15SUCsaTUg==",
- "dependencies": {
- "@algolia/cache-common": "4.20.0",
- "@algolia/logger-common": "4.20.0",
- "@algolia/requester-common": "4.20.0"
- }
- },
- "node_modules/@algolia/client-common": {
- "version": "4.24.0",
- "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz",
- "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==",
- "peer": true,
- "dependencies": {
- "@algolia/requester-common": "4.24.0",
- "@algolia/transporter": "4.24.0"
- }
- },
- "node_modules/@algolia/client-personalization": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.20.0.tgz",
- "integrity": "sha512-N9+zx0tWOQsLc3K4PVRDV8GUeOLAY0i445En79Pr3zWB+m67V+n/8w4Kw1C5LlbHDDJcyhMMIlqezh6BEk7xAQ==",
- "dependencies": {
- "@algolia/client-common": "4.20.0",
- "@algolia/requester-common": "4.20.0",
- "@algolia/transporter": "4.20.0"
- }
- },
- "node_modules/@algolia/client-personalization/node_modules/@algolia/cache-common": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.20.0.tgz",
- "integrity": "sha512-vCfxauaZutL3NImzB2G9LjLt36vKAckc6DhMp05An14kVo8F1Yofb6SIl6U3SaEz8pG2QOB9ptwM5c+zGevwIQ=="
- },
- "node_modules/@algolia/client-personalization/node_modules/@algolia/client-common": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.20.0.tgz",
- "integrity": "sha512-P3WgMdEss915p+knMMSd/fwiHRHKvDu4DYRrCRaBrsfFw7EQHon+EbRSm4QisS9NYdxbS04kcvNoavVGthyfqQ==",
- "dependencies": {
- "@algolia/requester-common": "4.20.0",
- "@algolia/transporter": "4.20.0"
- }
- },
- "node_modules/@algolia/client-personalization/node_modules/@algolia/logger-common": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.20.0.tgz",
- "integrity": "sha512-xouigCMB5WJYEwvoWW5XDv7Z9f0A8VoXJc3VKwlHJw/je+3p2RcDXfksLI4G4lIVncFUYMZx30tP/rsdlvvzHQ=="
- },
- "node_modules/@algolia/client-personalization/node_modules/@algolia/requester-common": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.20.0.tgz",
- "integrity": "sha512-9h6ye6RY/BkfmeJp7Z8gyyeMrmmWsMOCRBXQDs4mZKKsyVlfIVICpcSibbeYcuUdurLhIlrOUkH3rQEgZzonng=="
- },
- "node_modules/@algolia/client-personalization/node_modules/@algolia/transporter": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.20.0.tgz",
- "integrity": "sha512-Lsii1pGWOAISbzeyuf+r/GPhvHMPHSPrTDWNcIzOE1SG1inlJHICaVe2ikuoRjcpgxZNU54Jl+if15SUCsaTUg==",
- "dependencies": {
- "@algolia/cache-common": "4.20.0",
- "@algolia/logger-common": "4.20.0",
- "@algolia/requester-common": "4.20.0"
- }
- },
- "node_modules/@algolia/client-search": {
- "version": "4.24.0",
- "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz",
- "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==",
- "peer": true,
- "dependencies": {
- "@algolia/client-common": "4.24.0",
- "@algolia/requester-common": "4.24.0",
- "@algolia/transporter": "4.24.0"
- }
- },
- "node_modules/@algolia/events": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz",
- "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ=="
- },
- "node_modules/@algolia/logger-common": {
- "version": "4.24.0",
- "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.24.0.tgz",
- "integrity": "sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA==",
- "peer": true
- },
- "node_modules/@algolia/logger-console": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.20.0.tgz",
- "integrity": "sha512-THlIGG1g/FS63z0StQqDhT6bprUczBI8wnLT3JWvfAQDZX5P6fCg7dG+pIrUBpDIHGszgkqYEqECaKKsdNKOUA==",
- "dependencies": {
- "@algolia/logger-common": "4.20.0"
- }
- },
- "node_modules/@algolia/logger-console/node_modules/@algolia/logger-common": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.20.0.tgz",
- "integrity": "sha512-xouigCMB5WJYEwvoWW5XDv7Z9f0A8VoXJc3VKwlHJw/je+3p2RcDXfksLI4G4lIVncFUYMZx30tP/rsdlvvzHQ=="
- },
- "node_modules/@algolia/requester-browser-xhr": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.20.0.tgz",
- "integrity": "sha512-HbzoSjcjuUmYOkcHECkVTwAelmvTlgs48N6Owt4FnTOQdwn0b8pdht9eMgishvk8+F8bal354nhx/xOoTfwiAw==",
- "dependencies": {
- "@algolia/requester-common": "4.20.0"
- }
- },
- "node_modules/@algolia/requester-browser-xhr/node_modules/@algolia/requester-common": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.20.0.tgz",
- "integrity": "sha512-9h6ye6RY/BkfmeJp7Z8gyyeMrmmWsMOCRBXQDs4mZKKsyVlfIVICpcSibbeYcuUdurLhIlrOUkH3rQEgZzonng=="
- },
- "node_modules/@algolia/requester-common": {
- "version": "4.24.0",
- "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.24.0.tgz",
- "integrity": "sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==",
- "peer": true
- },
- "node_modules/@algolia/requester-node-http": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.20.0.tgz",
- "integrity": "sha512-ocJ66L60ABSSTRFnCHIEZpNHv6qTxsBwJEPfYaSBsLQodm0F9ptvalFkHMpvj5DfE22oZrcrLbOYM2bdPJRHng==",
- "dependencies": {
- "@algolia/requester-common": "4.20.0"
- }
- },
- "node_modules/@algolia/requester-node-http/node_modules/@algolia/requester-common": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.20.0.tgz",
- "integrity": "sha512-9h6ye6RY/BkfmeJp7Z8gyyeMrmmWsMOCRBXQDs4mZKKsyVlfIVICpcSibbeYcuUdurLhIlrOUkH3rQEgZzonng=="
- },
- "node_modules/@algolia/transporter": {
- "version": "4.24.0",
- "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.24.0.tgz",
- "integrity": "sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA==",
- "peer": true,
- "dependencies": {
- "@algolia/cache-common": "4.24.0",
- "@algolia/logger-common": "4.24.0",
- "@algolia/requester-common": "4.24.0"
- }
- },
- "node_modules/@ampproject/remapping": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
- "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/code-frame": {
- "version": "7.24.2",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz",
- "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==",
- "dependencies": {
- "@babel/highlight": "^7.24.2",
- "picocolors": "^1.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/compat-data": {
- "version": "7.24.1",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz",
- "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/core": {
- "version": "7.24.3",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz",
- "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==",
- "dependencies": {
- "@ampproject/remapping": "^2.2.0",
- "@babel/code-frame": "^7.24.2",
- "@babel/generator": "^7.24.1",
- "@babel/helper-compilation-targets": "^7.23.6",
- "@babel/helper-module-transforms": "^7.23.3",
- "@babel/helpers": "^7.24.1",
- "@babel/parser": "^7.24.1",
- "@babel/template": "^7.24.0",
- "@babel/traverse": "^7.24.1",
- "@babel/types": "^7.24.0",
- "convert-source-map": "^2.0.0",
- "debug": "^4.1.0",
- "gensync": "^1.0.0-beta.2",
- "json5": "^2.2.3",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/babel"
- }
- },
- "node_modules/@babel/core/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@babel/generator": {
- "version": "7.24.1",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz",
- "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==",
- "dependencies": {
- "@babel/types": "^7.24.0",
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.25",
- "jsesc": "^2.5.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-annotate-as-pure": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz",
- "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==",
- "dependencies": {
- "@babel/types": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
- "version": "7.22.15",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz",
- "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==",
- "dependencies": {
- "@babel/types": "^7.22.15"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-compilation-targets": {
- "version": "7.23.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz",
- "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==",
- "dependencies": {
- "@babel/compat-data": "^7.23.5",
- "@babel/helper-validator-option": "^7.23.5",
- "browserslist": "^4.22.2",
- "lru-cache": "^5.1.1",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@babel/helper-create-class-features-plugin": {
- "version": "7.22.15",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz",
- "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.22.5",
- "@babel/helper-environment-visitor": "^7.22.5",
- "@babel/helper-function-name": "^7.22.5",
- "@babel/helper-member-expression-to-functions": "^7.22.15",
- "@babel/helper-optimise-call-expression": "^7.22.5",
- "@babel/helper-replace-supers": "^7.22.9",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
- "@babel/helper-split-export-declaration": "^7.22.6",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@babel/helper-create-regexp-features-plugin": {
- "version": "7.22.15",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz",
- "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.22.5",
- "regexpu-core": "^5.3.1",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@babel/helper-define-polyfill-provider": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz",
- "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==",
- "dependencies": {
- "@babel/helper-compilation-targets": "^7.22.6",
- "@babel/helper-plugin-utils": "^7.22.5",
- "debug": "^4.1.1",
- "lodash.debounce": "^4.0.8",
- "resolve": "^1.14.2"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
- }
- },
- "node_modules/@babel/helper-environment-visitor": {
- "version": "7.22.20",
- "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
- "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-function-name": {
- "version": "7.23.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
- "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
- "dependencies": {
- "@babel/template": "^7.22.15",
- "@babel/types": "^7.23.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-hoist-variables": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
- "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
- "dependencies": {
- "@babel/types": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-member-expression-to-functions": {
- "version": "7.23.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz",
- "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==",
- "dependencies": {
- "@babel/types": "^7.23.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-imports": {
- "version": "7.22.15",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz",
- "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==",
- "dependencies": {
- "@babel/types": "^7.22.15"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-module-transforms": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz",
- "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==",
- "dependencies": {
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-module-imports": "^7.22.15",
- "@babel/helper-simple-access": "^7.22.5",
- "@babel/helper-split-export-declaration": "^7.22.6",
- "@babel/helper-validator-identifier": "^7.22.20"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-optimise-call-expression": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz",
- "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==",
- "dependencies": {
- "@babel/types": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-plugin-utils": {
- "version": "7.24.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz",
- "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-remap-async-to-generator": {
- "version": "7.22.20",
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz",
- "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.22.5",
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-wrap-function": "^7.22.20"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-replace-supers": {
- "version": "7.22.20",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz",
- "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==",
- "dependencies": {
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-member-expression-to-functions": "^7.22.15",
- "@babel/helper-optimise-call-expression": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-simple-access": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
- "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
- "dependencies": {
- "@babel/types": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz",
- "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==",
- "dependencies": {
- "@babel/types": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-split-export-declaration": {
- "version": "7.22.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
- "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
- "dependencies": {
- "@babel/types": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-string-parser": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz",
- "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.22.20",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
- "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-option": {
- "version": "7.23.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz",
- "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-wrap-function": {
- "version": "7.22.20",
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz",
- "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==",
- "dependencies": {
- "@babel/helper-function-name": "^7.22.5",
- "@babel/template": "^7.22.15",
- "@babel/types": "^7.22.19"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helpers": {
- "version": "7.24.1",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz",
- "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==",
- "dependencies": {
- "@babel/template": "^7.24.0",
- "@babel/traverse": "^7.24.1",
- "@babel/types": "^7.24.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/highlight": {
- "version": "7.24.2",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz",
- "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==",
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.22.20",
- "chalk": "^2.4.2",
- "js-tokens": "^4.0.0",
- "picocolors": "^1.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/highlight/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/highlight/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/highlight/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/@babel/highlight/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
- },
- "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/@babel/highlight/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/highlight/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/parser": {
- "version": "7.24.1",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz",
- "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==",
- "bin": {
- "parser": "bin/babel-parser.js"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz",
- "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz",
- "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
- "@babel/plugin-transform-optional-chaining": "^7.23.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.13.0"
- }
- },
- "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz",
- "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==",
- "dependencies": {
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-proposal-private-property-in-object": {
- "version": "7.21.0-placeholder-for-preset-env.2",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
- "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-async-generators": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
- "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-class-properties": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
- "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-class-static-block": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
- "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-dynamic-import": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
- "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-export-namespace-from": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
- "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.3"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-import-assertions": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz",
- "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-import-attributes": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz",
- "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-import-meta": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
- "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.10.4"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-json-strings": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
- "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-jsx": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz",
- "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
- "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.10.4"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
- "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-numeric-separator": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
- "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.10.4"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-object-rest-spread": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
- "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-optional-catch-binding": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
- "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-optional-chaining": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
- "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-private-property-in-object": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
- "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-top-level-await": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
- "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-typescript": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz",
- "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
- "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.18.6",
- "@babel/helper-plugin-utils": "^7.18.6"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-transform-arrow-functions": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz",
- "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-async-generator-functions": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz",
- "integrity": "sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==",
- "dependencies": {
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/helper-remap-async-to-generator": "^7.22.20",
- "@babel/plugin-syntax-async-generators": "^7.8.4"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-async-to-generator": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz",
- "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==",
- "dependencies": {
- "@babel/helper-module-imports": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/helper-remap-async-to-generator": "^7.22.20"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-block-scoped-functions": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz",
- "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-block-scoping": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz",
- "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-class-properties": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz",
- "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==",
- "dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-class-static-block": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz",
- "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==",
- "dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/plugin-syntax-class-static-block": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.12.0"
- }
- },
- "node_modules/@babel/plugin-transform-classes": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz",
- "integrity": "sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w==",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.22.5",
- "@babel/helper-compilation-targets": "^7.22.15",
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-function-name": "^7.23.0",
- "@babel/helper-optimise-call-expression": "^7.22.5",
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/helper-replace-supers": "^7.22.20",
- "@babel/helper-split-export-declaration": "^7.22.6",
- "globals": "^11.1.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-computed-properties": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz",
- "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/template": "^7.22.15"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-destructuring": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz",
- "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-dotall-regex": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz",
- "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-duplicate-keys": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz",
- "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-dynamic-import": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz",
- "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/plugin-syntax-dynamic-import": "^7.8.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-exponentiation-operator": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz",
- "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==",
- "dependencies": {
- "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-export-namespace-from": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz",
- "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-for-of": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz",
- "integrity": "sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-function-name": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz",
- "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==",
- "dependencies": {
- "@babel/helper-compilation-targets": "^7.22.15",
- "@babel/helper-function-name": "^7.23.0",
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-json-strings": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz",
- "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/plugin-syntax-json-strings": "^7.8.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-literals": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz",
- "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-logical-assignment-operators": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz",
- "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-member-expression-literals": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz",
- "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-modules-amd": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz",
- "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==",
- "dependencies": {
- "@babel/helper-module-transforms": "^7.23.3",
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-modules-commonjs": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz",
- "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==",
- "dependencies": {
- "@babel/helper-module-transforms": "^7.23.3",
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/helper-simple-access": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-modules-systemjs": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz",
- "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==",
- "dependencies": {
- "@babel/helper-hoist-variables": "^7.22.5",
- "@babel/helper-module-transforms": "^7.23.3",
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/helper-validator-identifier": "^7.22.20"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-modules-umd": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz",
- "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==",
- "dependencies": {
- "@babel/helper-module-transforms": "^7.23.3",
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz",
- "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.22.5",
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-transform-new-target": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz",
- "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz",
- "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-numeric-separator": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz",
- "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/plugin-syntax-numeric-separator": "^7.10.4"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-object-rest-spread": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz",
- "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==",
- "dependencies": {
- "@babel/compat-data": "^7.23.3",
- "@babel/helper-compilation-targets": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-transform-parameters": "^7.23.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-object-super": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz",
- "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/helper-replace-supers": "^7.22.20"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-optional-catch-binding": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz",
- "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-optional-chaining": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz",
- "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
- "@babel/plugin-syntax-optional-chaining": "^7.8.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-parameters": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz",
- "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-private-methods": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz",
- "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==",
- "dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-private-property-in-object": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz",
- "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.22.5",
- "@babel/helper-create-class-features-plugin": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-property-literals": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz",
- "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-constant-elements": {
- "version": "7.24.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.1.tgz",
- "integrity": "sha512-QXp1U9x0R7tkiGB0FOk8o74jhnap0FlZ5gNkRIWdG3eP+SvMFg118e1zaWewDzgABb106QSKpVsD3Wgd8t6ifA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.24.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-display-name": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz",
- "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-jsx": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz",
- "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.22.5",
- "@babel/helper-module-imports": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/plugin-syntax-jsx": "^7.23.3",
- "@babel/types": "^7.23.4"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-jsx-development": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz",
- "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==",
- "dependencies": {
- "@babel/plugin-transform-react-jsx": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-react-pure-annotations": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz",
- "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.22.5",
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-regenerator": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz",
- "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "regenerator-transform": "^0.15.2"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-reserved-words": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz",
- "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-runtime": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.4.tgz",
- "integrity": "sha512-ITwqpb6V4btwUG0YJR82o2QvmWrLgDnx/p2A3CTPYGaRgULkDiC0DRA2C4jlRB9uXGUEfaSS/IGHfVW+ohzYDw==",
- "dependencies": {
- "@babel/helper-module-imports": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5",
- "babel-plugin-polyfill-corejs2": "^0.4.6",
- "babel-plugin-polyfill-corejs3": "^0.8.5",
- "babel-plugin-polyfill-regenerator": "^0.5.3",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-runtime/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@babel/plugin-transform-shorthand-properties": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz",
- "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-spread": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz",
- "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-sticky-regex": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz",
- "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-template-literals": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz",
- "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-typeof-symbol": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz",
- "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-typescript": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.4.tgz",
- "integrity": "sha512-39hCCOl+YUAyMOu6B9SmUTiHUU0t/CxJNUmY3qRdJujbqi+lrQcL11ysYUsAvFWPBdhihrv1z0oRG84Yr3dODQ==",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.22.5",
- "@babel/helper-create-class-features-plugin": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/plugin-syntax-typescript": "^7.23.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-unicode-escapes": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz",
- "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-unicode-property-regex": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz",
- "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-unicode-regex": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz",
- "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-unicode-sets-regex": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz",
- "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/preset-env": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.3.tgz",
- "integrity": "sha512-ovzGc2uuyNfNAs/jyjIGxS8arOHS5FENZaNn4rtE7UdKMMkqHCvboHfcuhWLZNX5cB44QfcGNWjaevxMzzMf+Q==",
- "dependencies": {
- "@babel/compat-data": "^7.23.3",
- "@babel/helper-compilation-targets": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/helper-validator-option": "^7.22.15",
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3",
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3",
- "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3",
- "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
- "@babel/plugin-syntax-async-generators": "^7.8.4",
- "@babel/plugin-syntax-class-properties": "^7.12.13",
- "@babel/plugin-syntax-class-static-block": "^7.14.5",
- "@babel/plugin-syntax-dynamic-import": "^7.8.3",
- "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
- "@babel/plugin-syntax-import-assertions": "^7.23.3",
- "@babel/plugin-syntax-import-attributes": "^7.23.3",
- "@babel/plugin-syntax-import-meta": "^7.10.4",
- "@babel/plugin-syntax-json-strings": "^7.8.3",
- "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
- "@babel/plugin-syntax-numeric-separator": "^7.10.4",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
- "@babel/plugin-syntax-optional-chaining": "^7.8.3",
- "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
- "@babel/plugin-syntax-top-level-await": "^7.14.5",
- "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
- "@babel/plugin-transform-arrow-functions": "^7.23.3",
- "@babel/plugin-transform-async-generator-functions": "^7.23.3",
- "@babel/plugin-transform-async-to-generator": "^7.23.3",
- "@babel/plugin-transform-block-scoped-functions": "^7.23.3",
- "@babel/plugin-transform-block-scoping": "^7.23.3",
- "@babel/plugin-transform-class-properties": "^7.23.3",
- "@babel/plugin-transform-class-static-block": "^7.23.3",
- "@babel/plugin-transform-classes": "^7.23.3",
- "@babel/plugin-transform-computed-properties": "^7.23.3",
- "@babel/plugin-transform-destructuring": "^7.23.3",
- "@babel/plugin-transform-dotall-regex": "^7.23.3",
- "@babel/plugin-transform-duplicate-keys": "^7.23.3",
- "@babel/plugin-transform-dynamic-import": "^7.23.3",
- "@babel/plugin-transform-exponentiation-operator": "^7.23.3",
- "@babel/plugin-transform-export-namespace-from": "^7.23.3",
- "@babel/plugin-transform-for-of": "^7.23.3",
- "@babel/plugin-transform-function-name": "^7.23.3",
- "@babel/plugin-transform-json-strings": "^7.23.3",
- "@babel/plugin-transform-literals": "^7.23.3",
- "@babel/plugin-transform-logical-assignment-operators": "^7.23.3",
- "@babel/plugin-transform-member-expression-literals": "^7.23.3",
- "@babel/plugin-transform-modules-amd": "^7.23.3",
- "@babel/plugin-transform-modules-commonjs": "^7.23.3",
- "@babel/plugin-transform-modules-systemjs": "^7.23.3",
- "@babel/plugin-transform-modules-umd": "^7.23.3",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5",
- "@babel/plugin-transform-new-target": "^7.23.3",
- "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.3",
- "@babel/plugin-transform-numeric-separator": "^7.23.3",
- "@babel/plugin-transform-object-rest-spread": "^7.23.3",
- "@babel/plugin-transform-object-super": "^7.23.3",
- "@babel/plugin-transform-optional-catch-binding": "^7.23.3",
- "@babel/plugin-transform-optional-chaining": "^7.23.3",
- "@babel/plugin-transform-parameters": "^7.23.3",
- "@babel/plugin-transform-private-methods": "^7.23.3",
- "@babel/plugin-transform-private-property-in-object": "^7.23.3",
- "@babel/plugin-transform-property-literals": "^7.23.3",
- "@babel/plugin-transform-regenerator": "^7.23.3",
- "@babel/plugin-transform-reserved-words": "^7.23.3",
- "@babel/plugin-transform-shorthand-properties": "^7.23.3",
- "@babel/plugin-transform-spread": "^7.23.3",
- "@babel/plugin-transform-sticky-regex": "^7.23.3",
- "@babel/plugin-transform-template-literals": "^7.23.3",
- "@babel/plugin-transform-typeof-symbol": "^7.23.3",
- "@babel/plugin-transform-unicode-escapes": "^7.23.3",
- "@babel/plugin-transform-unicode-property-regex": "^7.23.3",
- "@babel/plugin-transform-unicode-regex": "^7.23.3",
- "@babel/plugin-transform-unicode-sets-regex": "^7.23.3",
- "@babel/preset-modules": "0.1.6-no-external-plugins",
- "babel-plugin-polyfill-corejs2": "^0.4.6",
- "babel-plugin-polyfill-corejs3": "^0.8.5",
- "babel-plugin-polyfill-regenerator": "^0.5.3",
- "core-js-compat": "^3.31.0",
- "semver": "^6.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/preset-env/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/@babel/preset-modules": {
- "version": "0.1.6-no-external-plugins",
- "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
- "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/types": "^7.4.4",
- "esutils": "^2.0.2"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
- }
- },
- "node_modules/@babel/preset-react": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz",
- "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/helper-validator-option": "^7.22.15",
- "@babel/plugin-transform-react-display-name": "^7.23.3",
- "@babel/plugin-transform-react-jsx": "^7.22.15",
- "@babel/plugin-transform-react-jsx-development": "^7.22.5",
- "@babel/plugin-transform-react-pure-annotations": "^7.23.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/preset-typescript": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz",
- "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/helper-validator-option": "^7.22.15",
- "@babel/plugin-syntax-jsx": "^7.23.3",
- "@babel/plugin-transform-modules-commonjs": "^7.23.3",
- "@babel/plugin-transform-typescript": "^7.23.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/regjsgen": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
- "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA=="
- },
- "node_modules/@babel/runtime": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.4.tgz",
- "integrity": "sha512-2Yv65nlWnWlSpe3fXEyX5i7fx5kIKo4Qbcj+hMO0odwaneFjfXw5fdum+4yL20O0QiaHpia0cYQ9xpNMqrBwHg==",
- "dependencies": {
- "regenerator-runtime": "^0.14.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/runtime-corejs3": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.23.4.tgz",
- "integrity": "sha512-zQyB4MJGM+rvd4pM58n26kf3xbiitw9MHzL8oLiBMKb8MCtVDfV5nDzzJWWzLMtbvKI9wN6XwJYl479qF4JluQ==",
- "dependencies": {
- "core-js-pure": "^3.30.2",
- "regenerator-runtime": "^0.14.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/template": {
- "version": "7.24.0",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz",
- "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==",
- "dependencies": {
- "@babel/code-frame": "^7.23.5",
- "@babel/parser": "^7.24.0",
- "@babel/types": "^7.24.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/traverse": {
- "version": "7.24.1",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz",
- "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==",
- "dependencies": {
- "@babel/code-frame": "^7.24.1",
- "@babel/generator": "^7.24.1",
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-function-name": "^7.23.0",
- "@babel/helper-hoist-variables": "^7.22.5",
- "@babel/helper-split-export-declaration": "^7.22.6",
- "@babel/parser": "^7.24.1",
- "@babel/types": "^7.24.0",
- "debug": "^4.3.1",
- "globals": "^11.1.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/types": {
- "version": "7.24.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz",
- "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==",
- "dependencies": {
- "@babel/helper-string-parser": "^7.23.4",
- "@babel/helper-validator-identifier": "^7.22.20",
- "to-fast-properties": "^2.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@colors/colors": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
- "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
- "optional": true,
- "engines": {
- "node": ">=0.1.90"
- }
- },
- "node_modules/@discoveryjs/json-ext": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
- "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/@docsearch/css": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.5.2.tgz",
- "integrity": "sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA=="
- },
- "node_modules/@docsearch/react": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.5.2.tgz",
- "integrity": "sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==",
- "dependencies": {
- "@algolia/autocomplete-core": "1.9.3",
- "@algolia/autocomplete-preset-algolia": "1.9.3",
- "@docsearch/css": "3.5.2",
- "algoliasearch": "^4.19.1"
- },
- "peerDependencies": {
- "@types/react": ">= 16.8.0 < 19.0.0",
- "react": ">= 16.8.0 < 19.0.0",
- "react-dom": ">= 16.8.0 < 19.0.0",
- "search-insights": ">= 1 < 3"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "react": {
- "optional": true
- },
- "react-dom": {
- "optional": true
- },
- "search-insights": {
- "optional": true
- }
- }
- },
- "node_modules/@docusaurus/core": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.4.0.tgz",
- "integrity": "sha512-g+0wwmN2UJsBqy2fQRQ6fhXruoEa62JDeEa5d8IdTJlMoaDaEDfHh7WjwGRn4opuTQWpjAwP/fbcgyHKlE+64w==",
- "dependencies": {
- "@babel/core": "^7.23.3",
- "@babel/generator": "^7.23.3",
- "@babel/plugin-syntax-dynamic-import": "^7.8.3",
- "@babel/plugin-transform-runtime": "^7.22.9",
- "@babel/preset-env": "^7.22.9",
- "@babel/preset-react": "^7.22.5",
- "@babel/preset-typescript": "^7.22.5",
- "@babel/runtime": "^7.22.6",
- "@babel/runtime-corejs3": "^7.22.6",
- "@babel/traverse": "^7.22.8",
- "@docusaurus/cssnano-preset": "3.4.0",
- "@docusaurus/logger": "3.4.0",
- "@docusaurus/mdx-loader": "3.4.0",
- "@docusaurus/utils": "3.4.0",
- "@docusaurus/utils-common": "3.4.0",
- "@docusaurus/utils-validation": "3.4.0",
- "autoprefixer": "^10.4.14",
- "babel-loader": "^9.1.3",
- "babel-plugin-dynamic-import-node": "^2.3.3",
- "boxen": "^6.2.1",
- "chalk": "^4.1.2",
- "chokidar": "^3.5.3",
- "clean-css": "^5.3.2",
- "cli-table3": "^0.6.3",
- "combine-promises": "^1.1.0",
- "commander": "^5.1.0",
- "copy-webpack-plugin": "^11.0.0",
- "core-js": "^3.31.1",
- "css-loader": "^6.8.1",
- "css-minimizer-webpack-plugin": "^5.0.1",
- "cssnano": "^6.1.2",
- "del": "^6.1.1",
- "detect-port": "^1.5.1",
- "escape-html": "^1.0.3",
- "eta": "^2.2.0",
- "eval": "^0.1.8",
- "file-loader": "^6.2.0",
- "fs-extra": "^11.1.1",
- "html-minifier-terser": "^7.2.0",
- "html-tags": "^3.3.1",
- "html-webpack-plugin": "^5.5.3",
- "leven": "^3.1.0",
- "lodash": "^4.17.21",
- "mini-css-extract-plugin": "^2.7.6",
- "p-map": "^4.0.0",
- "postcss": "^8.4.26",
- "postcss-loader": "^7.3.3",
- "prompts": "^2.4.2",
- "react-dev-utils": "^12.0.1",
- "react-helmet-async": "^1.3.0",
- "react-loadable": "npm:@docusaurus/react-loadable@6.0.0",
- "react-loadable-ssr-addon-v5-slorber": "^1.0.1",
- "react-router": "^5.3.4",
- "react-router-config": "^5.1.1",
- "react-router-dom": "^5.3.4",
- "rtl-detect": "^1.0.4",
- "semver": "^7.5.4",
- "serve-handler": "^6.1.5",
- "shelljs": "^0.8.5",
- "terser-webpack-plugin": "^5.3.9",
- "tslib": "^2.6.0",
- "update-notifier": "^6.0.2",
- "url-loader": "^4.1.1",
- "webpack": "^5.88.1",
- "webpack-bundle-analyzer": "^4.9.0",
- "webpack-dev-server": "^4.15.1",
- "webpack-merge": "^5.9.0",
- "webpackbar": "^5.0.2"
- },
- "bin": {
- "docusaurus": "bin/docusaurus.mjs"
- },
- "engines": {
- "node": ">=18.0"
- },
- "peerDependencies": {
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- }
- },
- "node_modules/@docusaurus/cssnano-preset": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.4.0.tgz",
- "integrity": "sha512-qwLFSz6v/pZHy/UP32IrprmH5ORce86BGtN0eBtG75PpzQJAzp9gefspox+s8IEOr0oZKuQ/nhzZ3xwyc3jYJQ==",
- "dependencies": {
- "cssnano-preset-advanced": "^6.1.2",
- "postcss": "^8.4.38",
- "postcss-sort-media-queries": "^5.2.0",
- "tslib": "^2.6.0"
- },
- "engines": {
- "node": ">=18.0"
- }
- },
- "node_modules/@docusaurus/logger": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.4.0.tgz",
- "integrity": "sha512-bZwkX+9SJ8lB9kVRkXw+xvHYSMGG4bpYHKGXeXFvyVc79NMeeBSGgzd4TQLHH+DYeOJoCdl8flrFJVxlZ0wo/Q==",
- "dependencies": {
- "chalk": "^4.1.2",
- "tslib": "^2.6.0"
- },
- "engines": {
- "node": ">=18.0"
- }
- },
- "node_modules/@docusaurus/mdx-loader": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.4.0.tgz",
- "integrity": "sha512-kSSbrrk4nTjf4d+wtBA9H+FGauf2gCax89kV8SUSJu3qaTdSIKdWERlngsiHaCFgZ7laTJ8a67UFf+xlFPtuTw==",
- "dependencies": {
- "@docusaurus/logger": "3.4.0",
- "@docusaurus/utils": "3.4.0",
- "@docusaurus/utils-validation": "3.4.0",
- "@mdx-js/mdx": "^3.0.0",
- "@slorber/remark-comment": "^1.0.0",
- "escape-html": "^1.0.3",
- "estree-util-value-to-estree": "^3.0.1",
- "file-loader": "^6.2.0",
- "fs-extra": "^11.1.1",
- "image-size": "^1.0.2",
- "mdast-util-mdx": "^3.0.0",
- "mdast-util-to-string": "^4.0.0",
- "rehype-raw": "^7.0.0",
- "remark-directive": "^3.0.0",
- "remark-emoji": "^4.0.0",
- "remark-frontmatter": "^5.0.0",
- "remark-gfm": "^4.0.0",
- "stringify-object": "^3.3.0",
- "tslib": "^2.6.0",
- "unified": "^11.0.3",
- "unist-util-visit": "^5.0.0",
- "url-loader": "^4.1.1",
- "vfile": "^6.0.1",
- "webpack": "^5.88.1"
- },
- "engines": {
- "node": ">=18.0"
- },
- "peerDependencies": {
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- }
- },
- "node_modules/@docusaurus/module-type-aliases": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.4.0.tgz",
- "integrity": "sha512-A1AyS8WF5Bkjnb8s+guTDuYmUiwJzNrtchebBHpc0gz0PyHJNMaybUlSrmJjHVcGrya0LKI4YcR3lBDQfXRYLw==",
- "dependencies": {
- "@docusaurus/types": "3.4.0",
- "@types/history": "^4.7.11",
- "@types/react": "*",
- "@types/react-router-config": "*",
- "@types/react-router-dom": "*",
- "react-helmet-async": "*",
- "react-loadable": "npm:@docusaurus/react-loadable@6.0.0"
- },
- "peerDependencies": {
- "react": "*",
- "react-dom": "*"
- }
- },
- "node_modules/@docusaurus/plugin-client-redirects": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.4.0.tgz",
- "integrity": "sha512-Pr8kyh/+OsmYCvdZhc60jy/FnrY6flD2TEAhl4rJxeVFxnvvRgEhoaIVX8q9MuJmaQoh6frPk94pjs7/6YgBDQ==",
- "dependencies": {
- "@docusaurus/core": "3.4.0",
- "@docusaurus/logger": "3.4.0",
- "@docusaurus/utils": "3.4.0",
- "@docusaurus/utils-common": "3.4.0",
- "@docusaurus/utils-validation": "3.4.0",
- "eta": "^2.2.0",
- "fs-extra": "^11.1.1",
- "lodash": "^4.17.21",
- "tslib": "^2.6.0"
- },
- "engines": {
- "node": ">=18.0"
- },
- "peerDependencies": {
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- }
- },
- "node_modules/@docusaurus/plugin-content-blog": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.4.0.tgz",
- "integrity": "sha512-vv6ZAj78ibR5Jh7XBUT4ndIjmlAxkijM3Sx5MAAzC1gyv0vupDQNhzuFg1USQmQVj3P5I6bquk12etPV3LJ+Xw==",
- "dependencies": {
- "@docusaurus/core": "3.4.0",
- "@docusaurus/logger": "3.4.0",
- "@docusaurus/mdx-loader": "3.4.0",
- "@docusaurus/types": "3.4.0",
- "@docusaurus/utils": "3.4.0",
- "@docusaurus/utils-common": "3.4.0",
- "@docusaurus/utils-validation": "3.4.0",
- "cheerio": "^1.0.0-rc.12",
- "feed": "^4.2.2",
- "fs-extra": "^11.1.1",
- "lodash": "^4.17.21",
- "reading-time": "^1.5.0",
- "srcset": "^4.0.0",
- "tslib": "^2.6.0",
- "unist-util-visit": "^5.0.0",
- "utility-types": "^3.10.0",
- "webpack": "^5.88.1"
- },
- "engines": {
- "node": ">=18.0"
- },
- "peerDependencies": {
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- }
- },
- "node_modules/@docusaurus/plugin-content-docs": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.4.0.tgz",
- "integrity": "sha512-HkUCZffhBo7ocYheD9oZvMcDloRnGhBMOZRyVcAQRFmZPmNqSyISlXA1tQCIxW+r478fty97XXAGjNYzBjpCsg==",
- "dependencies": {
- "@docusaurus/core": "3.4.0",
- "@docusaurus/logger": "3.4.0",
- "@docusaurus/mdx-loader": "3.4.0",
- "@docusaurus/module-type-aliases": "3.4.0",
- "@docusaurus/types": "3.4.0",
- "@docusaurus/utils": "3.4.0",
- "@docusaurus/utils-common": "3.4.0",
- "@docusaurus/utils-validation": "3.4.0",
- "@types/react-router-config": "^5.0.7",
- "combine-promises": "^1.1.0",
- "fs-extra": "^11.1.1",
- "js-yaml": "^4.1.0",
- "lodash": "^4.17.21",
- "tslib": "^2.6.0",
- "utility-types": "^3.10.0",
- "webpack": "^5.88.1"
- },
- "engines": {
- "node": ">=18.0"
- },
- "peerDependencies": {
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- }
- },
- "node_modules/@docusaurus/plugin-content-pages": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.4.0.tgz",
- "integrity": "sha512-h2+VN/0JjpR8fIkDEAoadNjfR3oLzB+v1qSXbIAKjQ46JAHx3X22n9nqS+BWSQnTnp1AjkjSvZyJMekmcwxzxg==",
- "dependencies": {
- "@docusaurus/core": "3.4.0",
- "@docusaurus/mdx-loader": "3.4.0",
- "@docusaurus/types": "3.4.0",
- "@docusaurus/utils": "3.4.0",
- "@docusaurus/utils-validation": "3.4.0",
- "fs-extra": "^11.1.1",
- "tslib": "^2.6.0",
- "webpack": "^5.88.1"
- },
- "engines": {
- "node": ">=18.0"
- },
- "peerDependencies": {
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- }
- },
- "node_modules/@docusaurus/plugin-debug": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.4.0.tgz",
- "integrity": "sha512-uV7FDUNXGyDSD3PwUaf5YijX91T5/H9SX4ErEcshzwgzWwBtK37nUWPU3ZLJfeTavX3fycTOqk9TglpOLaWkCg==",
- "dependencies": {
- "@docusaurus/core": "3.4.0",
- "@docusaurus/types": "3.4.0",
- "@docusaurus/utils": "3.4.0",
- "fs-extra": "^11.1.1",
- "react-json-view-lite": "^1.2.0",
- "tslib": "^2.6.0"
- },
- "engines": {
- "node": ">=18.0"
- },
- "peerDependencies": {
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- }
- },
- "node_modules/@docusaurus/plugin-google-analytics": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.4.0.tgz",
- "integrity": "sha512-mCArluxEGi3cmYHqsgpGGt3IyLCrFBxPsxNZ56Mpur0xSlInnIHoeLDH7FvVVcPJRPSQ9/MfRqLsainRw+BojA==",
- "dependencies": {
- "@docusaurus/core": "3.4.0",
- "@docusaurus/types": "3.4.0",
- "@docusaurus/utils-validation": "3.4.0",
- "tslib": "^2.6.0"
- },
- "engines": {
- "node": ">=18.0"
- },
- "peerDependencies": {
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- }
- },
- "node_modules/@docusaurus/plugin-google-gtag": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.4.0.tgz",
- "integrity": "sha512-Dsgg6PLAqzZw5wZ4QjUYc8Z2KqJqXxHxq3vIoyoBWiLEEfigIs7wHR+oiWUQy3Zk9MIk6JTYj7tMoQU0Jm3nqA==",
- "dependencies": {
- "@docusaurus/core": "3.4.0",
- "@docusaurus/types": "3.4.0",
- "@docusaurus/utils-validation": "3.4.0",
- "@types/gtag.js": "^0.0.12",
- "tslib": "^2.6.0"
- },
- "engines": {
- "node": ">=18.0"
- },
- "peerDependencies": {
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- }
- },
- "node_modules/@docusaurus/plugin-google-tag-manager": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.4.0.tgz",
- "integrity": "sha512-O9tX1BTwxIhgXpOLpFDueYA9DWk69WCbDRrjYoMQtFHSkTyE7RhNgyjSPREUWJb9i+YUg3OrsvrBYRl64FCPCQ==",
- "dependencies": {
- "@docusaurus/core": "3.4.0",
- "@docusaurus/types": "3.4.0",
- "@docusaurus/utils-validation": "3.4.0",
- "tslib": "^2.6.0"
- },
- "engines": {
- "node": ">=18.0"
- },
- "peerDependencies": {
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- }
- },
- "node_modules/@docusaurus/plugin-sitemap": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.4.0.tgz",
- "integrity": "sha512-+0VDvx9SmNrFNgwPoeoCha+tRoAjopwT0+pYO1xAbyLcewXSemq+eLxEa46Q1/aoOaJQ0qqHELuQM7iS2gp33Q==",
- "dependencies": {
- "@docusaurus/core": "3.4.0",
- "@docusaurus/logger": "3.4.0",
- "@docusaurus/types": "3.4.0",
- "@docusaurus/utils": "3.4.0",
- "@docusaurus/utils-common": "3.4.0",
- "@docusaurus/utils-validation": "3.4.0",
- "fs-extra": "^11.1.1",
- "sitemap": "^7.1.1",
- "tslib": "^2.6.0"
- },
- "engines": {
- "node": ">=18.0"
- },
- "peerDependencies": {
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- }
- },
- "node_modules/@docusaurus/preset-classic": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.4.0.tgz",
- "integrity": "sha512-Ohj6KB7siKqZaQhNJVMBBUzT3Nnp6eTKqO+FXO3qu/n1hJl3YLwVKTWBg28LF7MWrKu46UuYavwMRxud0VyqHg==",
- "dependencies": {
- "@docusaurus/core": "3.4.0",
- "@docusaurus/plugin-content-blog": "3.4.0",
- "@docusaurus/plugin-content-docs": "3.4.0",
- "@docusaurus/plugin-content-pages": "3.4.0",
- "@docusaurus/plugin-debug": "3.4.0",
- "@docusaurus/plugin-google-analytics": "3.4.0",
- "@docusaurus/plugin-google-gtag": "3.4.0",
- "@docusaurus/plugin-google-tag-manager": "3.4.0",
- "@docusaurus/plugin-sitemap": "3.4.0",
- "@docusaurus/theme-classic": "3.4.0",
- "@docusaurus/theme-common": "3.4.0",
- "@docusaurus/theme-search-algolia": "3.4.0",
- "@docusaurus/types": "3.4.0"
- },
- "engines": {
- "node": ">=18.0"
- },
- "peerDependencies": {
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- }
- },
- "node_modules/@docusaurus/theme-classic": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.4.0.tgz",
- "integrity": "sha512-0IPtmxsBYv2adr1GnZRdMkEQt1YW6tpzrUPj02YxNpvJ5+ju4E13J5tB4nfdaen/tfR1hmpSPlTFPvTf4kwy8Q==",
- "dependencies": {
- "@docusaurus/core": "3.4.0",
- "@docusaurus/mdx-loader": "3.4.0",
- "@docusaurus/module-type-aliases": "3.4.0",
- "@docusaurus/plugin-content-blog": "3.4.0",
- "@docusaurus/plugin-content-docs": "3.4.0",
- "@docusaurus/plugin-content-pages": "3.4.0",
- "@docusaurus/theme-common": "3.4.0",
- "@docusaurus/theme-translations": "3.4.0",
- "@docusaurus/types": "3.4.0",
- "@docusaurus/utils": "3.4.0",
- "@docusaurus/utils-common": "3.4.0",
- "@docusaurus/utils-validation": "3.4.0",
- "@mdx-js/react": "^3.0.0",
- "clsx": "^2.0.0",
- "copy-text-to-clipboard": "^3.2.0",
- "infima": "0.2.0-alpha.43",
- "lodash": "^4.17.21",
- "nprogress": "^0.2.0",
- "postcss": "^8.4.26",
- "prism-react-renderer": "^2.3.0",
- "prismjs": "^1.29.0",
- "react-router-dom": "^5.3.4",
- "rtlcss": "^4.1.0",
- "tslib": "^2.6.0",
- "utility-types": "^3.10.0"
- },
- "engines": {
- "node": ">=18.0"
- },
- "peerDependencies": {
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- }
- },
- "node_modules/@docusaurus/theme-classic/node_modules/clsx": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz",
- "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@docusaurus/theme-common": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.4.0.tgz",
- "integrity": "sha512-0A27alXuv7ZdCg28oPE8nH/Iz73/IUejVaCazqu9elS4ypjiLhK3KfzdSQBnL/g7YfHSlymZKdiOHEo8fJ0qMA==",
- "dependencies": {
- "@docusaurus/mdx-loader": "3.4.0",
- "@docusaurus/module-type-aliases": "3.4.0",
- "@docusaurus/plugin-content-blog": "3.4.0",
- "@docusaurus/plugin-content-docs": "3.4.0",
- "@docusaurus/plugin-content-pages": "3.4.0",
- "@docusaurus/utils": "3.4.0",
- "@docusaurus/utils-common": "3.4.0",
- "@types/history": "^4.7.11",
- "@types/react": "*",
- "@types/react-router-config": "*",
- "clsx": "^2.0.0",
- "parse-numeric-range": "^1.3.0",
- "prism-react-renderer": "^2.3.0",
- "tslib": "^2.6.0",
- "utility-types": "^3.10.0"
- },
- "engines": {
- "node": ">=18.0"
- },
- "peerDependencies": {
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- }
- },
- "node_modules/@docusaurus/theme-common/node_modules/clsx": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz",
- "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@docusaurus/theme-search-algolia": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.4.0.tgz",
- "integrity": "sha512-aiHFx7OCw4Wck1z6IoShVdUWIjntC8FHCw9c5dR8r3q4Ynh+zkS8y2eFFunN/DL6RXPzpnvKCg3vhLQYJDmT9Q==",
- "dependencies": {
- "@docsearch/react": "^3.5.2",
- "@docusaurus/core": "3.4.0",
- "@docusaurus/logger": "3.4.0",
- "@docusaurus/plugin-content-docs": "3.4.0",
- "@docusaurus/theme-common": "3.4.0",
- "@docusaurus/theme-translations": "3.4.0",
- "@docusaurus/utils": "3.4.0",
- "@docusaurus/utils-validation": "3.4.0",
- "algoliasearch": "^4.18.0",
- "algoliasearch-helper": "^3.13.3",
- "clsx": "^2.0.0",
- "eta": "^2.2.0",
- "fs-extra": "^11.1.1",
- "lodash": "^4.17.21",
- "tslib": "^2.6.0",
- "utility-types": "^3.10.0"
- },
- "engines": {
- "node": ">=18.0"
- },
- "peerDependencies": {
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- }
- },
- "node_modules/@docusaurus/theme-search-algolia/node_modules/clsx": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz",
- "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@docusaurus/theme-translations": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.4.0.tgz",
- "integrity": "sha512-zSxCSpmQCCdQU5Q4CnX/ID8CSUUI3fvmq4hU/GNP/XoAWtXo9SAVnM3TzpU8Gb//H3WCsT8mJcTfyOk3d9ftNg==",
- "dependencies": {
- "fs-extra": "^11.1.1",
- "tslib": "^2.6.0"
- },
- "engines": {
- "node": ">=18.0"
- }
- },
- "node_modules/@docusaurus/tsconfig": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.4.0.tgz",
- "integrity": "sha512-0qENiJ+TRaeTzcg4olrnh0BQ7eCxTgbYWBnWUeQDc84UYkt/T3pDNnm3SiQkqPb+YQ1qtYFlC0RriAElclo8Dg==",
- "dev": true
- },
- "node_modules/@docusaurus/types": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.4.0.tgz",
- "integrity": "sha512-4jcDO8kXi5Cf9TcyikB/yKmz14f2RZ2qTRerbHAsS+5InE9ZgSLBNLsewtFTcTOXSVcbU3FoGOzcNWAmU1TR0A==",
- "dependencies": {
- "@mdx-js/mdx": "^3.0.0",
- "@types/history": "^4.7.11",
- "@types/react": "*",
- "commander": "^5.1.0",
- "joi": "^17.9.2",
- "react-helmet-async": "^1.3.0",
- "utility-types": "^3.10.0",
- "webpack": "^5.88.1",
- "webpack-merge": "^5.9.0"
- },
- "peerDependencies": {
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- }
- },
- "node_modules/@docusaurus/utils": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.4.0.tgz",
- "integrity": "sha512-fRwnu3L3nnWaXOgs88BVBmG1yGjcQqZNHG+vInhEa2Sz2oQB+ZjbEMO5Rh9ePFpZ0YDiDUhpaVjwmS+AU2F14g==",
- "dependencies": {
- "@docusaurus/logger": "3.4.0",
- "@docusaurus/utils-common": "3.4.0",
- "@svgr/webpack": "^8.1.0",
- "escape-string-regexp": "^4.0.0",
- "file-loader": "^6.2.0",
- "fs-extra": "^11.1.1",
- "github-slugger": "^1.5.0",
- "globby": "^11.1.0",
- "gray-matter": "^4.0.3",
- "jiti": "^1.20.0",
- "js-yaml": "^4.1.0",
- "lodash": "^4.17.21",
- "micromatch": "^4.0.5",
- "prompts": "^2.4.2",
- "resolve-pathname": "^3.0.0",
- "shelljs": "^0.8.5",
- "tslib": "^2.6.0",
- "url-loader": "^4.1.1",
- "utility-types": "^3.10.0",
- "webpack": "^5.88.1"
- },
- "engines": {
- "node": ">=18.0"
- },
- "peerDependencies": {
- "@docusaurus/types": "*"
- },
- "peerDependenciesMeta": {
- "@docusaurus/types": {
- "optional": true
- }
- }
- },
- "node_modules/@docusaurus/utils-common": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.4.0.tgz",
- "integrity": "sha512-NVx54Wr4rCEKsjOH5QEVvxIqVvm+9kh7q8aYTU5WzUU9/Hctd6aTrcZ3G0Id4zYJ+AeaG5K5qHA4CY5Kcm2iyQ==",
- "dependencies": {
- "tslib": "^2.6.0"
- },
- "engines": {
- "node": ">=18.0"
- },
- "peerDependencies": {
- "@docusaurus/types": "*"
- },
- "peerDependenciesMeta": {
- "@docusaurus/types": {
- "optional": true
- }
- }
- },
- "node_modules/@docusaurus/utils-validation": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.4.0.tgz",
- "integrity": "sha512-hYQ9fM+AXYVTWxJOT1EuNaRnrR2WGpRdLDQG07O8UOpsvCPWUVOeo26Rbm0JWY2sGLfzAb+tvJ62yF+8F+TV0g==",
- "dependencies": {
- "@docusaurus/logger": "3.4.0",
- "@docusaurus/utils": "3.4.0",
- "@docusaurus/utils-common": "3.4.0",
- "fs-extra": "^11.2.0",
- "joi": "^17.9.2",
- "js-yaml": "^4.1.0",
- "lodash": "^4.17.21",
- "tslib": "^2.6.0"
- },
- "engines": {
- "node": ">=18.0"
- }
- },
- "node_modules/@hapi/hoek": {
- "version": "9.3.0",
- "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
- "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ=="
- },
- "node_modules/@hapi/topo": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz",
- "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==",
- "dependencies": {
- "@hapi/hoek": "^9.0.0"
- }
- },
- "node_modules/@jest/schemas": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
- "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
- "dependencies": {
- "@sinclair/typebox": "^0.27.8"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jest/types": {
- "version": "29.6.3",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
- "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
- "dependencies": {
- "@jest/schemas": "^29.6.3",
- "@types/istanbul-lib-coverage": "^2.0.0",
- "@types/istanbul-reports": "^3.0.0",
- "@types/node": "*",
- "@types/yargs": "^17.0.8",
- "chalk": "^4.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
- "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
- "dependencies": {
- "@jridgewell/set-array": "^1.2.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.24"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
- "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/set-array": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
- "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/source-map": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz",
- "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.15",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
- "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.25",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
- "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
- }
- },
- "node_modules/@leichtgewicht/ip-codec": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz",
- "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A=="
- },
- "node_modules/@mdx-js/mdx": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.0.tgz",
- "integrity": "sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw==",
- "dependencies": {
- "@types/estree": "^1.0.0",
- "@types/estree-jsx": "^1.0.0",
- "@types/hast": "^3.0.0",
- "@types/mdx": "^2.0.0",
- "collapse-white-space": "^2.0.0",
- "devlop": "^1.0.0",
- "estree-util-build-jsx": "^3.0.0",
- "estree-util-is-identifier-name": "^3.0.0",
- "estree-util-to-js": "^2.0.0",
- "estree-walker": "^3.0.0",
- "hast-util-to-estree": "^3.0.0",
- "hast-util-to-jsx-runtime": "^2.0.0",
- "markdown-extensions": "^2.0.0",
- "periscopic": "^3.0.0",
- "remark-mdx": "^3.0.0",
- "remark-parse": "^11.0.0",
- "remark-rehype": "^11.0.0",
- "source-map": "^0.7.0",
- "unified": "^11.0.0",
- "unist-util-position-from-estree": "^2.0.0",
- "unist-util-stringify-position": "^4.0.0",
- "unist-util-visit": "^5.0.0",
- "vfile": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/@mdx-js/react": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.0.0.tgz",
- "integrity": "sha512-nDctevR9KyYFyV+m+/+S4cpzCWHqj+iHDHq3QrsWezcC+B17uZdIWgCguESUkwFhM3n/56KxWVE3V6EokrmONQ==",
- "dependencies": {
- "@types/mdx": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- },
- "peerDependencies": {
- "@types/react": ">=16",
- "react": ">=16"
- }
- },
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@pnpm/config.env-replace": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz",
- "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==",
- "engines": {
- "node": ">=12.22.0"
- }
- },
- "node_modules/@pnpm/network.ca-file": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz",
- "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==",
- "dependencies": {
- "graceful-fs": "4.2.10"
- },
- "engines": {
- "node": ">=12.22.0"
- }
- },
- "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": {
- "version": "4.2.10",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
- "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
- },
- "node_modules/@pnpm/npm-conf": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz",
- "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==",
- "dependencies": {
- "@pnpm/config.env-replace": "^1.1.0",
- "@pnpm/network.ca-file": "^1.0.1",
- "config-chain": "^1.1.11"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@polka/url": {
- "version": "1.0.0-next.23",
- "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.23.tgz",
- "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg=="
- },
- "node_modules/@sideway/address": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz",
- "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==",
- "dependencies": {
- "@hapi/hoek": "^9.0.0"
- }
- },
- "node_modules/@sideway/formula": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz",
- "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg=="
- },
- "node_modules/@sideway/pinpoint": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
- "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ=="
- },
- "node_modules/@sinclair/typebox": {
- "version": "0.27.8",
- "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
- "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA=="
- },
- "node_modules/@sindresorhus/is": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
- "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/is?sponsor=1"
- }
- },
- "node_modules/@slorber/remark-comment": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz",
- "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==",
- "dependencies": {
- "micromark-factory-space": "^1.0.0",
- "micromark-util-character": "^1.1.0",
- "micromark-util-symbol": "^1.0.1"
- }
- },
- "node_modules/@svgr/babel-plugin-add-jsx-attribute": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz",
- "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz",
- "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz",
- "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz",
- "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@svgr/babel-plugin-svg-dynamic-title": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz",
- "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@svgr/babel-plugin-svg-em-dimensions": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz",
- "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@svgr/babel-plugin-transform-react-native-svg": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz",
- "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@svgr/babel-plugin-transform-svg-component": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz",
- "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@svgr/babel-preset": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz",
- "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==",
- "dependencies": {
- "@svgr/babel-plugin-add-jsx-attribute": "8.0.0",
- "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0",
- "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0",
- "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0",
- "@svgr/babel-plugin-svg-dynamic-title": "8.0.0",
- "@svgr/babel-plugin-svg-em-dimensions": "8.0.0",
- "@svgr/babel-plugin-transform-react-native-svg": "8.1.0",
- "@svgr/babel-plugin-transform-svg-component": "8.0.0"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@svgr/core": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz",
- "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==",
- "dependencies": {
- "@babel/core": "^7.21.3",
- "@svgr/babel-preset": "8.1.0",
- "camelcase": "^6.2.0",
- "cosmiconfig": "^8.1.3",
- "snake-case": "^3.0.4"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- }
- },
- "node_modules/@svgr/hast-util-to-babel-ast": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz",
- "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==",
- "dependencies": {
- "@babel/types": "^7.21.3",
- "entities": "^4.4.0"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- }
- },
- "node_modules/@svgr/plugin-jsx": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz",
- "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==",
- "dependencies": {
- "@babel/core": "^7.21.3",
- "@svgr/babel-preset": "8.1.0",
- "@svgr/hast-util-to-babel-ast": "8.0.0",
- "svg-parser": "^2.0.4"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@svgr/core": "*"
- }
- },
- "node_modules/@svgr/plugin-svgo": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz",
- "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==",
- "dependencies": {
- "cosmiconfig": "^8.1.3",
- "deepmerge": "^4.3.1",
- "svgo": "^3.0.2"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- },
- "peerDependencies": {
- "@svgr/core": "*"
- }
- },
- "node_modules/@svgr/webpack": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz",
- "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==",
- "dependencies": {
- "@babel/core": "^7.21.3",
- "@babel/plugin-transform-react-constant-elements": "^7.21.3",
- "@babel/preset-env": "^7.20.2",
- "@babel/preset-react": "^7.18.6",
- "@babel/preset-typescript": "^7.21.0",
- "@svgr/core": "8.1.0",
- "@svgr/plugin-jsx": "8.1.0",
- "@svgr/plugin-svgo": "8.1.0"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/gregberge"
- }
- },
- "node_modules/@szmarczak/http-timer": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz",
- "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==",
- "dependencies": {
- "defer-to-connect": "^2.0.1"
- },
- "engines": {
- "node": ">=14.16"
- }
- },
- "node_modules/@trysound/sax": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
- "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/@types/acorn": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz",
- "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==",
- "dependencies": {
- "@types/estree": "*"
- }
- },
- "node_modules/@types/body-parser": {
- "version": "1.19.5",
- "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
- "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==",
- "dependencies": {
- "@types/connect": "*",
- "@types/node": "*"
- }
- },
- "node_modules/@types/bonjour": {
- "version": "3.5.13",
- "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz",
- "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/connect": {
- "version": "3.4.38",
- "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
- "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/connect-history-api-fallback": {
- "version": "1.5.4",
- "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz",
- "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==",
- "dependencies": {
- "@types/express-serve-static-core": "*",
- "@types/node": "*"
- }
- },
- "node_modules/@types/debug": {
- "version": "4.1.12",
- "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
- "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
- "dependencies": {
- "@types/ms": "*"
- }
- },
- "node_modules/@types/eslint": {
- "version": "8.44.7",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.7.tgz",
- "integrity": "sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ==",
- "dependencies": {
- "@types/estree": "*",
- "@types/json-schema": "*"
- }
- },
- "node_modules/@types/eslint-scope": {
- "version": "3.7.7",
- "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
- "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
- "dependencies": {
- "@types/eslint": "*",
- "@types/estree": "*"
- }
- },
- "node_modules/@types/estree": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
- "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw=="
- },
- "node_modules/@types/estree-jsx": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.3.tgz",
- "integrity": "sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==",
- "dependencies": {
- "@types/estree": "*"
- }
- },
- "node_modules/@types/express": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
- "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
- "dependencies": {
- "@types/body-parser": "*",
- "@types/express-serve-static-core": "^4.17.33",
- "@types/qs": "*",
- "@types/serve-static": "*"
- }
- },
- "node_modules/@types/express-serve-static-core": {
- "version": "4.17.41",
- "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz",
- "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==",
- "dependencies": {
- "@types/node": "*",
- "@types/qs": "*",
- "@types/range-parser": "*",
- "@types/send": "*"
- }
- },
- "node_modules/@types/gtag.js": {
- "version": "0.0.12",
- "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz",
- "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg=="
- },
- "node_modules/@types/hast": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.3.tgz",
- "integrity": "sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==",
- "dependencies": {
- "@types/unist": "*"
- }
- },
- "node_modules/@types/history": {
- "version": "4.7.11",
- "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz",
- "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA=="
- },
- "node_modules/@types/html-minifier-terser": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
- "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg=="
- },
- "node_modules/@types/http-cache-semantics": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz",
- "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA=="
- },
- "node_modules/@types/http-errors": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
- "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA=="
- },
- "node_modules/@types/http-proxy": {
- "version": "1.17.14",
- "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz",
- "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/istanbul-lib-coverage": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
- "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w=="
- },
- "node_modules/@types/istanbul-lib-report": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
- "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
- "dependencies": {
- "@types/istanbul-lib-coverage": "*"
- }
- },
- "node_modules/@types/istanbul-reports": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
- "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
- "dependencies": {
- "@types/istanbul-lib-report": "*"
- }
- },
- "node_modules/@types/json-schema": {
- "version": "7.0.15",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
- "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="
- },
- "node_modules/@types/mdast": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz",
- "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==",
- "dependencies": {
- "@types/unist": "*"
- }
- },
- "node_modules/@types/mdx": {
- "version": "2.0.10",
- "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.10.tgz",
- "integrity": "sha512-Rllzc5KHk0Al5/WANwgSPl1/CwjqCy+AZrGd78zuK+jO9aDM6ffblZ+zIjgPNAaEBmlO0RYDvLNh7wD0zKVgEg=="
- },
- "node_modules/@types/mime": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
- "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w=="
- },
- "node_modules/@types/ms": {
- "version": "0.7.34",
- "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz",
- "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g=="
- },
- "node_modules/@types/node": {
- "version": "20.10.0",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.0.tgz",
- "integrity": "sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==",
- "dependencies": {
- "undici-types": "~5.26.4"
- }
- },
- "node_modules/@types/node-forge": {
- "version": "1.3.10",
- "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.10.tgz",
- "integrity": "sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/parse-json": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
- "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="
- },
- "node_modules/@types/prismjs": {
- "version": "1.26.3",
- "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.3.tgz",
- "integrity": "sha512-A0D0aTXvjlqJ5ZILMz3rNfDBOx9hHxLZYv2by47Sm/pqW35zzjusrZTryatjN/Rf8Us2gZrJD+KeHbUSTux1Cw=="
- },
- "node_modules/@types/prop-types": {
- "version": "15.7.11",
- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz",
- "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng=="
- },
- "node_modules/@types/qs": {
- "version": "6.9.10",
- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz",
- "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw=="
- },
- "node_modules/@types/range-parser": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
- "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ=="
- },
- "node_modules/@types/react": {
- "version": "18.3.3",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz",
- "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==",
- "dependencies": {
- "@types/prop-types": "*",
- "csstype": "^3.0.2"
- }
- },
- "node_modules/@types/react-router": {
- "version": "5.1.20",
- "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz",
- "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==",
- "dependencies": {
- "@types/history": "^4.7.11",
- "@types/react": "*"
- }
- },
- "node_modules/@types/react-router-config": {
- "version": "5.0.10",
- "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.10.tgz",
- "integrity": "sha512-Wn6c/tXdEgi9adCMtDwx8Q2vGty6TsPTc/wCQQ9kAlye8UqFxj0vGFWWuhywNfkwqth+SOgJxQTLTZukrqDQmQ==",
- "dependencies": {
- "@types/history": "^4.7.11",
- "@types/react": "*",
- "@types/react-router": "^5.1.0"
- }
- },
- "node_modules/@types/react-router-dom": {
- "version": "5.3.3",
- "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz",
- "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==",
- "dependencies": {
- "@types/history": "^4.7.11",
- "@types/react": "*",
- "@types/react-router": "*"
- }
- },
- "node_modules/@types/retry": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz",
- "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA=="
- },
- "node_modules/@types/sax": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz",
- "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/send": {
- "version": "0.17.4",
- "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
- "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==",
- "dependencies": {
- "@types/mime": "^1",
- "@types/node": "*"
- }
- },
- "node_modules/@types/serve-index": {
- "version": "1.9.4",
- "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz",
- "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==",
- "dependencies": {
- "@types/express": "*"
- }
- },
- "node_modules/@types/serve-static": {
- "version": "1.15.5",
- "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz",
- "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==",
- "dependencies": {
- "@types/http-errors": "*",
- "@types/mime": "*",
- "@types/node": "*"
- }
- },
- "node_modules/@types/sockjs": {
- "version": "0.3.36",
- "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz",
- "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/unist": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
- "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
- },
- "node_modules/@types/ws": {
- "version": "8.5.10",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz",
- "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/yargs": {
- "version": "17.0.32",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz",
- "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/@types/yargs-parser": {
- "version": "21.0.3",
- "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
- "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="
- },
- "node_modules/@ungap/structured-clone": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
- "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ=="
- },
- "node_modules/@webassemblyjs/ast": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz",
- "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==",
- "dependencies": {
- "@webassemblyjs/helper-numbers": "1.11.6",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6"
- }
- },
- "node_modules/@webassemblyjs/floating-point-hex-parser": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz",
- "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw=="
- },
- "node_modules/@webassemblyjs/helper-api-error": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz",
- "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q=="
- },
- "node_modules/@webassemblyjs/helper-buffer": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz",
- "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA=="
- },
- "node_modules/@webassemblyjs/helper-numbers": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz",
- "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==",
- "dependencies": {
- "@webassemblyjs/floating-point-hex-parser": "1.11.6",
- "@webassemblyjs/helper-api-error": "1.11.6",
- "@xtuc/long": "4.2.2"
- }
- },
- "node_modules/@webassemblyjs/helper-wasm-bytecode": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz",
- "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA=="
- },
- "node_modules/@webassemblyjs/helper-wasm-section": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz",
- "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==",
- "dependencies": {
- "@webassemblyjs/ast": "1.11.6",
- "@webassemblyjs/helper-buffer": "1.11.6",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/wasm-gen": "1.11.6"
- }
- },
- "node_modules/@webassemblyjs/ieee754": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
- "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
- "dependencies": {
- "@xtuc/ieee754": "^1.2.0"
- }
- },
- "node_modules/@webassemblyjs/leb128": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz",
- "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==",
- "dependencies": {
- "@xtuc/long": "4.2.2"
- }
- },
- "node_modules/@webassemblyjs/utf8": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz",
- "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA=="
- },
- "node_modules/@webassemblyjs/wasm-edit": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz",
- "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==",
- "dependencies": {
- "@webassemblyjs/ast": "1.11.6",
- "@webassemblyjs/helper-buffer": "1.11.6",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/helper-wasm-section": "1.11.6",
- "@webassemblyjs/wasm-gen": "1.11.6",
- "@webassemblyjs/wasm-opt": "1.11.6",
- "@webassemblyjs/wasm-parser": "1.11.6",
- "@webassemblyjs/wast-printer": "1.11.6"
- }
- },
- "node_modules/@webassemblyjs/wasm-gen": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz",
- "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==",
- "dependencies": {
- "@webassemblyjs/ast": "1.11.6",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/ieee754": "1.11.6",
- "@webassemblyjs/leb128": "1.11.6",
- "@webassemblyjs/utf8": "1.11.6"
- }
- },
- "node_modules/@webassemblyjs/wasm-opt": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz",
- "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==",
- "dependencies": {
- "@webassemblyjs/ast": "1.11.6",
- "@webassemblyjs/helper-buffer": "1.11.6",
- "@webassemblyjs/wasm-gen": "1.11.6",
- "@webassemblyjs/wasm-parser": "1.11.6"
- }
- },
- "node_modules/@webassemblyjs/wasm-parser": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz",
- "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==",
- "dependencies": {
- "@webassemblyjs/ast": "1.11.6",
- "@webassemblyjs/helper-api-error": "1.11.6",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/ieee754": "1.11.6",
- "@webassemblyjs/leb128": "1.11.6",
- "@webassemblyjs/utf8": "1.11.6"
- }
- },
- "node_modules/@webassemblyjs/wast-printer": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz",
- "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==",
- "dependencies": {
- "@webassemblyjs/ast": "1.11.6",
- "@xtuc/long": "4.2.2"
- }
- },
- "node_modules/@xtuc/ieee754": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
- "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
- },
- "node_modules/@xtuc/long": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
- "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
- },
- "node_modules/accepts": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
- "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
- "dependencies": {
- "mime-types": "~2.1.34",
- "negotiator": "0.6.3"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/accepts/node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/accepts/node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/acorn": {
- "version": "8.11.2",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz",
- "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==",
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-import-assertions": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
- "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
- "peerDependencies": {
- "acorn": "^8"
- }
- },
- "node_modules/acorn-jsx": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "peerDependencies": {
- "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
- }
- },
- "node_modules/acorn-walk": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz",
- "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==",
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/address": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz",
- "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==",
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/aggregate-error": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
- "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
- "dependencies": {
- "clean-stack": "^2.0.0",
- "indent-string": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ajv": {
- "version": "8.12.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
- "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/ajv-formats": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
- "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
- "dependencies": {
- "ajv": "^8.0.0"
- },
- "peerDependencies": {
- "ajv": "^8.0.0"
- },
- "peerDependenciesMeta": {
- "ajv": {
- "optional": true
- }
- }
- },
- "node_modules/ajv-keywords": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
- "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
- "dependencies": {
- "fast-deep-equal": "^3.1.3"
- },
- "peerDependencies": {
- "ajv": "^8.8.2"
- }
- },
- "node_modules/algoliasearch": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.20.0.tgz",
- "integrity": "sha512-y+UHEjnOItoNy0bYO+WWmLWBlPwDjKHW6mNHrPi0NkuhpQOOEbrkwQH/wgKFDLh7qlKjzoKeiRtlpewDPDG23g==",
- "dependencies": {
- "@algolia/cache-browser-local-storage": "4.20.0",
- "@algolia/cache-common": "4.20.0",
- "@algolia/cache-in-memory": "4.20.0",
- "@algolia/client-account": "4.20.0",
- "@algolia/client-analytics": "4.20.0",
- "@algolia/client-common": "4.20.0",
- "@algolia/client-personalization": "4.20.0",
- "@algolia/client-search": "4.20.0",
- "@algolia/logger-common": "4.20.0",
- "@algolia/logger-console": "4.20.0",
- "@algolia/requester-browser-xhr": "4.20.0",
- "@algolia/requester-common": "4.20.0",
- "@algolia/requester-node-http": "4.20.0",
- "@algolia/transporter": "4.20.0"
- }
- },
- "node_modules/algoliasearch-helper": {
- "version": "3.15.0",
- "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.15.0.tgz",
- "integrity": "sha512-DGUnK3TGtDQsaUE4ayF/LjSN0DGsuYThB8WBgnnDY0Wq04K6lNVruO3LfqJOgSfDiezp+Iyt8Tj4YKHi+/ivSA==",
- "dependencies": {
- "@algolia/events": "^4.0.1"
- },
- "peerDependencies": {
- "algoliasearch": ">= 3.1 < 6"
- }
- },
- "node_modules/algoliasearch/node_modules/@algolia/cache-common": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.20.0.tgz",
- "integrity": "sha512-vCfxauaZutL3NImzB2G9LjLt36vKAckc6DhMp05An14kVo8F1Yofb6SIl6U3SaEz8pG2QOB9ptwM5c+zGevwIQ=="
- },
- "node_modules/algoliasearch/node_modules/@algolia/client-common": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.20.0.tgz",
- "integrity": "sha512-P3WgMdEss915p+knMMSd/fwiHRHKvDu4DYRrCRaBrsfFw7EQHon+EbRSm4QisS9NYdxbS04kcvNoavVGthyfqQ==",
- "dependencies": {
- "@algolia/requester-common": "4.20.0",
- "@algolia/transporter": "4.20.0"
- }
- },
- "node_modules/algoliasearch/node_modules/@algolia/client-search": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.20.0.tgz",
- "integrity": "sha512-zgwqnMvhWLdpzKTpd3sGmMlr4c+iS7eyyLGiaO51zDZWGMkpgoNVmltkzdBwxOVXz0RsFMznIxB9zuarUv4TZg==",
- "dependencies": {
- "@algolia/client-common": "4.20.0",
- "@algolia/requester-common": "4.20.0",
- "@algolia/transporter": "4.20.0"
- }
- },
- "node_modules/algoliasearch/node_modules/@algolia/logger-common": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.20.0.tgz",
- "integrity": "sha512-xouigCMB5WJYEwvoWW5XDv7Z9f0A8VoXJc3VKwlHJw/je+3p2RcDXfksLI4G4lIVncFUYMZx30tP/rsdlvvzHQ=="
- },
- "node_modules/algoliasearch/node_modules/@algolia/requester-common": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.20.0.tgz",
- "integrity": "sha512-9h6ye6RY/BkfmeJp7Z8gyyeMrmmWsMOCRBXQDs4mZKKsyVlfIVICpcSibbeYcuUdurLhIlrOUkH3rQEgZzonng=="
- },
- "node_modules/algoliasearch/node_modules/@algolia/transporter": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.20.0.tgz",
- "integrity": "sha512-Lsii1pGWOAISbzeyuf+r/GPhvHMPHSPrTDWNcIzOE1SG1inlJHICaVe2ikuoRjcpgxZNU54Jl+if15SUCsaTUg==",
- "dependencies": {
- "@algolia/cache-common": "4.20.0",
- "@algolia/logger-common": "4.20.0",
- "@algolia/requester-common": "4.20.0"
- }
- },
- "node_modules/ansi-align": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
- "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
- "dependencies": {
- "string-width": "^4.1.0"
- }
- },
- "node_modules/ansi-align/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
- },
- "node_modules/ansi-align/node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ansi-html-community": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
- "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
- "engines": [
- "node >= 0.8.0"
- ],
- "bin": {
- "ansi-html": "bin/ansi-html"
- }
- },
- "node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/anymatch": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
- "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/arg": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
- "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="
- },
- "node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
- },
- "node_modules/array-flatten": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
- "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ=="
- },
- "node_modules/array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/astring": {
- "version": "1.8.6",
- "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz",
- "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==",
- "bin": {
- "astring": "bin/astring"
- }
- },
- "node_modules/at-least-node": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
- "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
- "engines": {
- "node": ">= 4.0.0"
- }
- },
- "node_modules/autoprefixer": {
- "version": "10.4.19",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz",
- "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/autoprefixer"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "dependencies": {
- "browserslist": "^4.23.0",
- "caniuse-lite": "^1.0.30001599",
- "fraction.js": "^4.3.7",
- "normalize-range": "^0.1.2",
- "picocolors": "^1.0.0",
- "postcss-value-parser": "^4.2.0"
- },
- "bin": {
- "autoprefixer": "bin/autoprefixer"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/babel-loader": {
- "version": "9.1.3",
- "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz",
- "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==",
- "dependencies": {
- "find-cache-dir": "^4.0.0",
- "schema-utils": "^4.0.0"
- },
- "engines": {
- "node": ">= 14.15.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.12.0",
- "webpack": ">=5"
- }
- },
- "node_modules/babel-plugin-dynamic-import-node": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
- "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
- "dependencies": {
- "object.assign": "^4.1.0"
- }
- },
- "node_modules/babel-plugin-polyfill-corejs2": {
- "version": "0.4.6",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz",
- "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==",
- "dependencies": {
- "@babel/compat-data": "^7.22.6",
- "@babel/helper-define-polyfill-provider": "^0.4.3",
- "semver": "^6.3.1"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
- }
- },
- "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/babel-plugin-polyfill-corejs3": {
- "version": "0.8.6",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz",
- "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==",
- "dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.4.3",
- "core-js-compat": "^3.33.1"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
- }
- },
- "node_modules/babel-plugin-polyfill-regenerator": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz",
- "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==",
- "dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.4.3"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
- }
- },
- "node_modules/bail": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
- "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
- },
- "node_modules/batch": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
- "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw=="
- },
- "node_modules/big.js": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
- "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/body-parser": {
- "version": "1.20.1",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
- "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
- "dependencies": {
- "bytes": "3.1.2",
- "content-type": "~1.0.4",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "on-finished": "2.4.1",
- "qs": "6.11.0",
- "raw-body": "2.5.1",
- "type-is": "~1.6.18",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/body-parser/node_modules/bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/body-parser/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/body-parser/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- },
- "node_modules/bonjour-service": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz",
- "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==",
- "dependencies": {
- "array-flatten": "^2.1.2",
- "dns-equal": "^1.0.0",
- "fast-deep-equal": "^3.1.3",
- "multicast-dns": "^7.2.5"
- }
- },
- "node_modules/boolbase": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
- "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
- },
- "node_modules/boxen": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz",
- "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==",
- "dependencies": {
- "ansi-align": "^3.0.1",
- "camelcase": "^6.2.0",
- "chalk": "^4.1.2",
- "cli-boxes": "^3.0.0",
- "string-width": "^5.0.1",
- "type-fest": "^2.5.0",
- "widest-line": "^4.0.1",
- "wrap-ansi": "^8.0.1"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dependencies": {
- "fill-range": "^7.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/browserslist": {
- "version": "4.23.0",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
- "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "dependencies": {
- "caniuse-lite": "^1.0.30001587",
- "electron-to-chromium": "^1.4.668",
- "node-releases": "^2.0.14",
- "update-browserslist-db": "^1.0.13"
- },
- "bin": {
- "browserslist": "cli.js"
- },
- "engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
- }
- },
- "node_modules/buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
- },
- "node_modules/bytes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
- "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/cacheable-lookup": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz",
- "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==",
- "engines": {
- "node": ">=14.16"
- }
- },
- "node_modules/cacheable-request": {
- "version": "10.2.14",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz",
- "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==",
- "dependencies": {
- "@types/http-cache-semantics": "^4.0.2",
- "get-stream": "^6.0.1",
- "http-cache-semantics": "^4.1.1",
- "keyv": "^4.5.3",
- "mimic-response": "^4.0.0",
- "normalize-url": "^8.0.0",
- "responselike": "^3.0.0"
- },
- "engines": {
- "node": ">=14.16"
- }
- },
- "node_modules/call-bind": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
- "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
- "dependencies": {
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.1",
- "set-function-length": "^1.1.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/camel-case": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
- "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
- "dependencies": {
- "pascal-case": "^3.1.2",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/camelcase": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/caniuse-api": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
- "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
- "dependencies": {
- "browserslist": "^4.0.0",
- "caniuse-lite": "^1.0.0",
- "lodash.memoize": "^4.1.2",
- "lodash.uniq": "^4.5.0"
- }
- },
- "node_modules/caniuse-lite": {
- "version": "1.0.30001723",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001723.tgz",
- "integrity": "sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ]
- },
- "node_modules/ccount": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
- "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/char-regex": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
- "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/character-entities": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
- "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/character-entities-html4": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
- "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/character-entities-legacy": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
- "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/character-reference-invalid": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz",
- "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/cheerio": {
- "version": "1.0.0-rc.12",
- "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz",
- "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==",
- "dependencies": {
- "cheerio-select": "^2.1.0",
- "dom-serializer": "^2.0.0",
- "domhandler": "^5.0.3",
- "domutils": "^3.0.1",
- "htmlparser2": "^8.0.1",
- "parse5": "^7.0.0",
- "parse5-htmlparser2-tree-adapter": "^7.0.0"
- },
- "engines": {
- "node": ">= 6"
- },
- "funding": {
- "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
- }
- },
- "node_modules/cheerio-select": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
- "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
- "dependencies": {
- "boolbase": "^1.0.0",
- "css-select": "^5.1.0",
- "css-what": "^6.1.0",
- "domelementtype": "^2.3.0",
- "domhandler": "^5.0.3",
- "domutils": "^3.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/fb55"
- }
- },
- "node_modules/chokidar": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
- "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
- "funding": [
- {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- ],
- "dependencies": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/chrome-trace-event": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
- "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
- "engines": {
- "node": ">=6.0"
- }
- },
- "node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/classnames": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
- "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="
- },
- "node_modules/clean-css": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz",
- "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==",
- "dependencies": {
- "source-map": "~0.6.0"
- },
- "engines": {
- "node": ">= 10.0"
- }
- },
- "node_modules/clean-css/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/clean-stack": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
- "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/cli-boxes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz",
- "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/cli-table3": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz",
- "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==",
- "dependencies": {
- "string-width": "^4.2.0"
- },
- "engines": {
- "node": "10.* || >= 12.*"
- },
- "optionalDependencies": {
- "@colors/colors": "1.5.0"
- }
- },
- "node_modules/cli-table3/node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
- },
- "node_modules/cli-table3/node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/clone-deep": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
- "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
- "dependencies": {
- "is-plain-object": "^2.0.4",
- "kind-of": "^6.0.2",
- "shallow-clone": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/clone-deep/node_modules/is-plain-object": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
- "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
- "dependencies": {
- "isobject": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/clsx": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz",
- "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/collapse-white-space": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz",
- "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "node_modules/colord": {
- "version": "2.9.3",
- "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
- "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw=="
- },
- "node_modules/colorette": {
- "version": "2.0.20",
- "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
- "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="
- },
- "node_modules/combine-promises": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz",
- "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/comma-separated-tokens": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
- "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/commander": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
- "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/common-path-prefix": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz",
- "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w=="
- },
- "node_modules/compressible": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
- "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
- "dependencies": {
- "mime-db": ">= 1.43.0 < 2"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/compressible/node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/compression": {
- "version": "1.7.4",
- "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
- "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
- "dependencies": {
- "accepts": "~1.3.5",
- "bytes": "3.0.0",
- "compressible": "~2.0.16",
- "debug": "2.6.9",
- "on-headers": "~1.0.2",
- "safe-buffer": "5.1.2",
- "vary": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/compression/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/compression/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- },
- "node_modules/compression/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
- },
- "node_modules/config-chain": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
- "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
- "dependencies": {
- "ini": "^1.3.4",
- "proto-list": "~1.2.1"
- }
- },
- "node_modules/configstore": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz",
- "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==",
- "dependencies": {
- "dot-prop": "^6.0.1",
- "graceful-fs": "^4.2.6",
- "unique-string": "^3.0.0",
- "write-file-atomic": "^3.0.3",
- "xdg-basedir": "^5.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/yeoman/configstore?sponsor=1"
- }
- },
- "node_modules/connect-history-api-fallback": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz",
- "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==",
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/consola": {
- "version": "2.15.3",
- "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz",
- "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw=="
- },
- "node_modules/content-disposition": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
- "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/content-type": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
- "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/convert-source-map": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
- "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="
- },
- "node_modules/cookie": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
- "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
- },
- "node_modules/copy-text-to-clipboard": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz",
- "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/copy-webpack-plugin": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz",
- "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==",
- "dependencies": {
- "fast-glob": "^3.2.11",
- "glob-parent": "^6.0.1",
- "globby": "^13.1.1",
- "normalize-path": "^3.0.0",
- "schema-utils": "^4.0.0",
- "serialize-javascript": "^6.0.0"
- },
- "engines": {
- "node": ">= 14.15.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.1.0"
- }
- },
- "node_modules/copy-webpack-plugin/node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/copy-webpack-plugin/node_modules/globby": {
- "version": "13.2.2",
- "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz",
- "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==",
- "dependencies": {
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.3.0",
- "ignore": "^5.2.4",
- "merge2": "^1.4.1",
- "slash": "^4.0.0"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/copy-webpack-plugin/node_modules/slash": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
- "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/core-js": {
- "version": "3.33.3",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.3.tgz",
- "integrity": "sha512-lo0kOocUlLKmm6kv/FswQL8zbkH7mVsLJ/FULClOhv8WRVmKLVcs6XPNQAzstfeJTCHMyButEwG+z1kHxHoDZw==",
- "hasInstallScript": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/core-js"
- }
- },
- "node_modules/core-js-compat": {
- "version": "3.33.3",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.3.tgz",
- "integrity": "sha512-cNzGqFsh3Ot+529GIXacjTJ7kegdt5fPXxCBVS1G0iaZpuo/tBz399ymceLJveQhFFZ8qThHiP3fzuoQjKN2ow==",
- "dependencies": {
- "browserslist": "^4.22.1"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/core-js"
- }
- },
- "node_modules/core-js-pure": {
- "version": "3.33.3",
- "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.33.3.tgz",
- "integrity": "sha512-taJ00IDOP+XYQEA2dAe4ESkmHt1fL8wzYDo3mRWQey8uO9UojlBFMneA65kMyxfYP7106c6LzWaq7/haDT6BCQ==",
- "hasInstallScript": true,
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/core-js"
- }
- },
- "node_modules/core-util-is": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
- "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
- },
- "node_modules/cosmiconfig": {
- "version": "8.3.6",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
- "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
- "dependencies": {
- "import-fresh": "^3.3.0",
- "js-yaml": "^4.1.0",
- "parse-json": "^5.2.0",
- "path-type": "^4.0.0"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/d-fischer"
- },
- "peerDependencies": {
- "typescript": ">=4.9.5"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/crypto-random-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz",
- "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==",
- "dependencies": {
- "type-fest": "^1.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/crypto-random-string/node_modules/type-fest": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
- "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/css-declaration-sorter": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz",
- "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==",
- "engines": {
- "node": "^14 || ^16 || >=18"
- },
- "peerDependencies": {
- "postcss": "^8.0.9"
- }
- },
- "node_modules/css-loader": {
- "version": "6.8.1",
- "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz",
- "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==",
- "dependencies": {
- "icss-utils": "^5.1.0",
- "postcss": "^8.4.21",
- "postcss-modules-extract-imports": "^3.0.0",
- "postcss-modules-local-by-default": "^4.0.3",
- "postcss-modules-scope": "^3.0.0",
- "postcss-modules-values": "^4.0.0",
- "postcss-value-parser": "^4.2.0",
- "semver": "^7.3.8"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.0.0"
- }
- },
- "node_modules/css-minimizer-webpack-plugin": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz",
- "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==",
- "dependencies": {
- "@jridgewell/trace-mapping": "^0.3.18",
- "cssnano": "^6.0.1",
- "jest-worker": "^29.4.3",
- "postcss": "^8.4.24",
- "schema-utils": "^4.0.1",
- "serialize-javascript": "^6.0.1"
- },
- "engines": {
- "node": ">= 14.15.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.0.0"
- },
- "peerDependenciesMeta": {
- "@parcel/css": {
- "optional": true
- },
- "@swc/css": {
- "optional": true
- },
- "clean-css": {
- "optional": true
- },
- "csso": {
- "optional": true
- },
- "esbuild": {
- "optional": true
- },
- "lightningcss": {
- "optional": true
- }
- }
- },
- "node_modules/css-select": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
- "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
- "dependencies": {
- "boolbase": "^1.0.0",
- "css-what": "^6.1.0",
- "domhandler": "^5.0.2",
- "domutils": "^3.0.1",
- "nth-check": "^2.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/fb55"
- }
- },
- "node_modules/css-tree": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
- "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
- "dependencies": {
- "mdn-data": "2.0.30",
- "source-map-js": "^1.0.1"
- },
- "engines": {
- "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
- }
- },
- "node_modules/css-what": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
- "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
- "engines": {
- "node": ">= 6"
- },
- "funding": {
- "url": "https://github.com/sponsors/fb55"
- }
- },
- "node_modules/cssesc": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
- "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
- "bin": {
- "cssesc": "bin/cssesc"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/cssnano": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz",
- "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==",
- "dependencies": {
- "cssnano-preset-default": "^6.1.2",
- "lilconfig": "^3.1.1"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/cssnano"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/cssnano-preset-advanced": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz",
- "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==",
- "dependencies": {
- "autoprefixer": "^10.4.19",
- "browserslist": "^4.23.0",
- "cssnano-preset-default": "^6.1.2",
- "postcss-discard-unused": "^6.0.5",
- "postcss-merge-idents": "^6.0.3",
- "postcss-reduce-idents": "^6.0.3",
- "postcss-zindex": "^6.0.2"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/cssnano-preset-default": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz",
- "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==",
- "dependencies": {
- "browserslist": "^4.23.0",
- "css-declaration-sorter": "^7.2.0",
- "cssnano-utils": "^4.0.2",
- "postcss-calc": "^9.0.1",
- "postcss-colormin": "^6.1.0",
- "postcss-convert-values": "^6.1.0",
- "postcss-discard-comments": "^6.0.2",
- "postcss-discard-duplicates": "^6.0.3",
- "postcss-discard-empty": "^6.0.3",
- "postcss-discard-overridden": "^6.0.2",
- "postcss-merge-longhand": "^6.0.5",
- "postcss-merge-rules": "^6.1.1",
- "postcss-minify-font-values": "^6.1.0",
- "postcss-minify-gradients": "^6.0.3",
- "postcss-minify-params": "^6.1.0",
- "postcss-minify-selectors": "^6.0.4",
- "postcss-normalize-charset": "^6.0.2",
- "postcss-normalize-display-values": "^6.0.2",
- "postcss-normalize-positions": "^6.0.2",
- "postcss-normalize-repeat-style": "^6.0.2",
- "postcss-normalize-string": "^6.0.2",
- "postcss-normalize-timing-functions": "^6.0.2",
- "postcss-normalize-unicode": "^6.1.0",
- "postcss-normalize-url": "^6.0.2",
- "postcss-normalize-whitespace": "^6.0.2",
- "postcss-ordered-values": "^6.0.2",
- "postcss-reduce-initial": "^6.1.0",
- "postcss-reduce-transforms": "^6.0.2",
- "postcss-svgo": "^6.0.3",
- "postcss-unique-selectors": "^6.0.4"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/cssnano-utils": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz",
- "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==",
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/csso": {
- "version": "5.0.5",
- "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
- "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
- "dependencies": {
- "css-tree": "~2.2.0"
- },
- "engines": {
- "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
- "npm": ">=7.0.0"
- }
- },
- "node_modules/csso/node_modules/css-tree": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
- "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
- "dependencies": {
- "mdn-data": "2.0.28",
- "source-map-js": "^1.0.1"
- },
- "engines": {
- "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
- "npm": ">=7.0.0"
- }
- },
- "node_modules/csso/node_modules/mdn-data": {
- "version": "2.0.28",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
- "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="
- },
- "node_modules/csstype": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
- "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
- },
- "node_modules/debounce": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz",
- "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug=="
- },
- "node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/decode-named-character-reference": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz",
- "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==",
- "dependencies": {
- "character-entities": "^2.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/decompress-response": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
- "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
- "dependencies": {
- "mimic-response": "^3.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/decompress-response/node_modules/mimic-response": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
- "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/deep-extend": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/deepmerge": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
- "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/default-gateway": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz",
- "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
- "dependencies": {
- "execa": "^5.0.0"
- },
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/defer-to-connect": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
- "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/define-data-property": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
- "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
- "dependencies": {
- "get-intrinsic": "^1.2.1",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/define-lazy-prop": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
- "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/define-properties": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
- "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
- "dependencies": {
- "define-data-property": "^1.0.1",
- "has-property-descriptors": "^1.0.0",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/del": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz",
- "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==",
- "dependencies": {
- "globby": "^11.0.1",
- "graceful-fs": "^4.2.4",
- "is-glob": "^4.0.1",
- "is-path-cwd": "^2.2.0",
- "is-path-inside": "^3.0.2",
- "p-map": "^4.0.0",
- "rimraf": "^3.0.2",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/dequal": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
- "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/destroy": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
- "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/detect-node": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
- "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="
- },
- "node_modules/detect-port": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz",
- "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==",
- "dependencies": {
- "address": "^1.0.1",
- "debug": "4"
- },
- "bin": {
- "detect": "bin/detect-port.js",
- "detect-port": "bin/detect-port.js"
- }
- },
- "node_modules/detect-port-alt": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz",
- "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==",
- "dependencies": {
- "address": "^1.0.1",
- "debug": "^2.6.0"
- },
- "bin": {
- "detect": "bin/detect-port",
- "detect-port": "bin/detect-port"
- },
- "engines": {
- "node": ">= 4.2.1"
- }
- },
- "node_modules/detect-port-alt/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/detect-port-alt/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- },
- "node_modules/devlop": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
- "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
- "dependencies": {
- "dequal": "^2.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "dependencies": {
- "path-type": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/dns-equal": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
- "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg=="
- },
- "node_modules/dns-packet": {
- "version": "5.6.1",
- "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz",
- "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==",
- "dependencies": {
- "@leichtgewicht/ip-codec": "^2.0.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/docusaurus-plugin-llms": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/docusaurus-plugin-llms/-/docusaurus-plugin-llms-0.1.5.tgz",
- "integrity": "sha512-TKcHQG6MyTTleDdOFJL+5OpmW9Le6XGiagClgSX05GXhxD//4PQlY2Iq9HVETLBIsHVETVp8AxjZQ6e3E/fr/Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "gray-matter": "^4.0.3",
- "minimatch": "^9.0.3"
- },
- "engines": {
- "node": ">=18.0"
- },
- "peerDependencies": {
- "@docusaurus/core": "^3.0.0"
- }
- },
- "node_modules/docusaurus-plugin-llms/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/docusaurus-plugin-llms/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/docusaurus-plugin-sass": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/docusaurus-plugin-sass/-/docusaurus-plugin-sass-0.2.5.tgz",
- "integrity": "sha512-Z+D0fLFUKcFpM+bqSUmqKIU+vO+YF1xoEQh5hoFreg2eMf722+siwXDD+sqtwU8E4MvVpuvsQfaHwODNlxJAEg==",
- "dependencies": {
- "sass-loader": "^10.1.1"
- },
- "peerDependencies": {
- "@docusaurus/core": "^2.0.0-beta || ^3.0.0-alpha",
- "sass": "^1.30.0"
- }
- },
- "node_modules/dom-converter": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
- "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
- "dependencies": {
- "utila": "~0.4"
- }
- },
- "node_modules/dom-serializer": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
- "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
- "dependencies": {
- "domelementtype": "^2.3.0",
- "domhandler": "^5.0.2",
- "entities": "^4.2.0"
- },
- "funding": {
- "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
- }
- },
- "node_modules/domelementtype": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
- "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/fb55"
- }
- ]
- },
- "node_modules/domhandler": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
- "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
- "dependencies": {
- "domelementtype": "^2.3.0"
- },
- "engines": {
- "node": ">= 4"
- },
- "funding": {
- "url": "https://github.com/fb55/domhandler?sponsor=1"
- }
- },
- "node_modules/domutils": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
- "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
- "dependencies": {
- "dom-serializer": "^2.0.0",
- "domelementtype": "^2.3.0",
- "domhandler": "^5.0.3"
- },
- "funding": {
- "url": "https://github.com/fb55/domutils?sponsor=1"
- }
- },
- "node_modules/dot-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
- "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
- "dependencies": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/dot-prop": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz",
- "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==",
- "dependencies": {
- "is-obj": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/dot-prop/node_modules/is-obj": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
- "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/dotenv": {
- "version": "16.4.5",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
- "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://dotenvx.com"
- }
- },
- "node_modules/duplexer": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
- "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="
- },
- "node_modules/eastasianwidth": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
- "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="
- },
- "node_modules/ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
- },
- "node_modules/electron-to-chromium": {
- "version": "1.4.715",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.715.tgz",
- "integrity": "sha512-XzWNH4ZSa9BwVUQSDorPWAUQ5WGuYz7zJUNpNif40zFCiCl20t8zgylmreNmn26h5kiyw2lg7RfTmeMBsDklqg=="
- },
- "node_modules/emoji-regex": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="
- },
- "node_modules/emojilib": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz",
- "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw=="
- },
- "node_modules/emojis-list": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
- "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/emoticon": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.0.1.tgz",
- "integrity": "sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/enhanced-resolve": {
- "version": "5.15.0",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz",
- "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==",
- "dependencies": {
- "graceful-fs": "^4.2.4",
- "tapable": "^2.2.0"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/entities": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
- "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
- "engines": {
- "node": ">=0.12"
- },
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
- }
- },
- "node_modules/error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "dependencies": {
- "is-arrayish": "^0.2.1"
- }
- },
- "node_modules/es-module-lexer": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz",
- "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w=="
- },
- "node_modules/escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/escape-goat": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz",
- "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
- },
- "node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint-scope": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
- "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^4.1.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "dependencies": {
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esrecurse/node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estree-util-attach-comments": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz",
- "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==",
- "dependencies": {
- "@types/estree": "^1.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/estree-util-build-jsx": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz",
- "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==",
- "dependencies": {
- "@types/estree-jsx": "^1.0.0",
- "devlop": "^1.0.0",
- "estree-util-is-identifier-name": "^3.0.0",
- "estree-walker": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/estree-util-is-identifier-name": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz",
- "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/estree-util-to-js": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz",
- "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==",
- "dependencies": {
- "@types/estree-jsx": "^1.0.0",
- "astring": "^1.8.0",
- "source-map": "^0.7.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/estree-util-value-to-estree": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.0.1.tgz",
- "integrity": "sha512-b2tdzTurEIbwRh+mKrEcaWfu1wgb8J1hVsgREg7FFiecWwK/PhO8X0kyc+0bIcKNtD4sqxIdNoRy6/p/TvECEA==",
- "dependencies": {
- "@types/estree": "^1.0.0",
- "is-plain-obj": "^4.0.0"
- },
- "engines": {
- "node": ">=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/remcohaszing"
- }
- },
- "node_modules/estree-util-visit": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz",
- "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==",
- "dependencies": {
- "@types/estree-jsx": "^1.0.0",
- "@types/unist": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/estree-walker": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
- "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
- "dependencies": {
- "@types/estree": "^1.0.0"
- }
- },
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/eta": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz",
- "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==",
- "engines": {
- "node": ">=6.0.0"
- },
- "funding": {
- "url": "https://github.com/eta-dev/eta?sponsor=1"
- }
- },
- "node_modules/etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/eval": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz",
- "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==",
- "dependencies": {
- "@types/node": "*",
- "require-like": ">= 0.1.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/eventemitter3": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
- "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
- },
- "node_modules/events": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
- "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
- "engines": {
- "node": ">=0.8.x"
- }
- },
- "node_modules/execa": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
- "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
- "dependencies": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.0",
- "human-signals": "^2.1.0",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.1",
- "onetime": "^5.1.2",
- "signal-exit": "^3.0.3",
- "strip-final-newline": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
- }
- },
- "node_modules/express": {
- "version": "4.18.2",
- "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
- "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
- "dependencies": {
- "accepts": "~1.3.8",
- "array-flatten": "1.1.1",
- "body-parser": "1.20.1",
- "content-disposition": "0.5.4",
- "content-type": "~1.0.4",
- "cookie": "0.5.0",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "1.2.0",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "merge-descriptors": "1.0.1",
- "methods": "~1.1.2",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
- "proxy-addr": "~2.0.7",
- "qs": "6.11.0",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.2.1",
- "send": "0.18.0",
- "serve-static": "1.15.0",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.10.0"
- }
- },
- "node_modules/express/node_modules/array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
- },
- "node_modules/express/node_modules/content-disposition": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
- "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
- "dependencies": {
- "safe-buffer": "5.2.1"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/express/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/express/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- },
- "node_modules/express/node_modules/path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
- },
- "node_modules/express/node_modules/range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
- },
- "node_modules/extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
- "dependencies": {
- "is-extendable": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
- },
- "node_modules/fast-glob": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
- "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
- "dependencies": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.4"
- },
- "engines": {
- "node": ">=8.6.0"
- }
- },
- "node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
- },
- "node_modules/fast-url-parser": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz",
- "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==",
- "dependencies": {
- "punycode": "^1.3.2"
- }
- },
- "node_modules/fastq": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
- "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
- "node_modules/fault": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz",
- "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==",
- "dependencies": {
- "format": "^0.2.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/faye-websocket": {
- "version": "0.11.4",
- "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
- "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
- "dependencies": {
- "websocket-driver": ">=0.5.1"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/feed": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz",
- "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==",
- "dependencies": {
- "xml-js": "^1.6.11"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/file-loader": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
- "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==",
- "dependencies": {
- "loader-utils": "^2.0.0",
- "schema-utils": "^3.0.0"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^4.0.0 || ^5.0.0"
- }
- },
- "node_modules/file-loader/node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/file-loader/node_modules/ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "peerDependencies": {
- "ajv": "^6.9.1"
- }
- },
- "node_modules/file-loader/node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
- },
- "node_modules/file-loader/node_modules/schema-utils": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
- "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
- "dependencies": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/filesize": {
- "version": "8.0.7",
- "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz",
- "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==",
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/finalhandler": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
- "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
- "dependencies": {
- "debug": "2.6.9",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "statuses": "2.0.1",
- "unpipe": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/finalhandler/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/finalhandler/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- },
- "node_modules/find-cache-dir": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz",
- "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==",
- "dependencies": {
- "common-path-prefix": "^3.0.0",
- "pkg-dir": "^7.0.0"
- },
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/find-up": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz",
- "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==",
- "dependencies": {
- "locate-path": "^7.1.0",
- "path-exists": "^5.0.0"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/flat": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
- "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
- "bin": {
- "flat": "cli.js"
- }
- },
- "node_modules/follow-redirects": {
- "version": "1.15.3",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz",
- "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==",
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
- "engines": {
- "node": ">=4.0"
- },
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
- }
- },
- "node_modules/fork-ts-checker-webpack-plugin": {
- "version": "6.5.3",
- "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz",
- "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==",
- "dependencies": {
- "@babel/code-frame": "^7.8.3",
- "@types/json-schema": "^7.0.5",
- "chalk": "^4.1.0",
- "chokidar": "^3.4.2",
- "cosmiconfig": "^6.0.0",
- "deepmerge": "^4.2.2",
- "fs-extra": "^9.0.0",
- "glob": "^7.1.6",
- "memfs": "^3.1.2",
- "minimatch": "^3.0.4",
- "schema-utils": "2.7.0",
- "semver": "^7.3.2",
- "tapable": "^1.0.0"
- },
- "engines": {
- "node": ">=10",
- "yarn": ">=1.0.0"
- },
- "peerDependencies": {
- "eslint": ">= 6",
- "typescript": ">= 2.7",
- "vue-template-compiler": "*",
- "webpack": ">= 4"
- },
- "peerDependenciesMeta": {
- "eslint": {
- "optional": true
- },
- "vue-template-compiler": {
- "optional": true
- }
- }
- },
- "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "peerDependencies": {
- "ajv": "^6.9.1"
- }
- },
- "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
- "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
- "dependencies": {
- "@types/parse-json": "^4.0.0",
- "import-fresh": "^3.1.0",
- "parse-json": "^5.0.0",
- "path-type": "^4.0.0",
- "yaml": "^1.7.2"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
- "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
- "dependencies": {
- "at-least-node": "^1.0.0",
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
- },
- "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz",
- "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==",
- "dependencies": {
- "@types/json-schema": "^7.0.4",
- "ajv": "^6.12.2",
- "ajv-keywords": "^3.4.1"
- },
- "engines": {
- "node": ">= 8.9.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
- "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/form-data-encoder": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz",
- "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==",
- "engines": {
- "node": ">= 14.17"
- }
- },
- "node_modules/format": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz",
- "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==",
- "engines": {
- "node": ">=0.4.x"
- }
- },
- "node_modules/forwarded": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/fraction.js": {
- "version": "4.3.7",
- "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
- "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
- "engines": {
- "node": "*"
- },
- "funding": {
- "type": "patreon",
- "url": "https://github.com/sponsors/rawify"
- }
- },
- "node_modules/fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/fs-extra": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
- "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=14.14"
- }
- },
- "node_modules/fs-monkey": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz",
- "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew=="
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
- },
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/gensync": {
- "version": "1.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/get-intrinsic": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
- "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
- "dependencies": {
- "function-bind": "^1.1.2",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "hasown": "^2.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-own-enumerable-property-symbols": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
- "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g=="
- },
- "node_modules/get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/github-slugger": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz",
- "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw=="
- },
- "node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "deprecated": "Glob versions prior to v9 are no longer supported",
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/glob-to-regexp": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
- "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
- },
- "node_modules/global-dirs": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz",
- "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==",
- "dependencies": {
- "ini": "2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/global-dirs/node_modules/ini": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
- "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/global-modules": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
- "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
- "dependencies": {
- "global-prefix": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/global-prefix": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
- "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
- "dependencies": {
- "ini": "^1.3.5",
- "kind-of": "^6.0.2",
- "which": "^1.3.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/global-prefix/node_modules/which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "which": "bin/which"
- }
- },
- "node_modules/globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/globby": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
- "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
- "dependencies": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.9",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/gopd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
- "dependencies": {
- "get-intrinsic": "^1.1.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/got": {
- "version": "12.6.1",
- "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz",
- "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==",
- "dependencies": {
- "@sindresorhus/is": "^5.2.0",
- "@szmarczak/http-timer": "^5.0.1",
- "cacheable-lookup": "^7.0.0",
- "cacheable-request": "^10.2.8",
- "decompress-response": "^6.0.0",
- "form-data-encoder": "^2.1.2",
- "get-stream": "^6.0.1",
- "http2-wrapper": "^2.1.10",
- "lowercase-keys": "^3.0.0",
- "p-cancelable": "^3.0.0",
- "responselike": "^3.0.0"
- },
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/got?sponsor=1"
- }
- },
- "node_modules/got/node_modules/@sindresorhus/is": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz",
- "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==",
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/is?sponsor=1"
- }
- },
- "node_modules/graceful-fs": {
- "version": "4.2.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
- },
- "node_modules/gray-matter": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz",
- "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==",
- "dependencies": {
- "js-yaml": "^3.13.1",
- "kind-of": "^6.0.2",
- "section-matter": "^1.0.0",
- "strip-bom-string": "^1.0.0"
- },
- "engines": {
- "node": ">=6.0"
- }
- },
- "node_modules/gray-matter/node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dependencies": {
- "sprintf-js": "~1.0.2"
- }
- },
- "node_modules/gray-matter/node_modules/js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/gzip-size": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz",
- "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==",
- "dependencies": {
- "duplexer": "^0.1.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/handle-thing": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
- "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg=="
- },
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/has-property-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
- "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
- "dependencies": {
- "get-intrinsic": "^1.2.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
- "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-yarn": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz",
- "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==",
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/hasown": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
- "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
- "dependencies": {
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/hast-util-from-parse5": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz",
- "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==",
- "dependencies": {
- "@types/hast": "^3.0.0",
- "@types/unist": "^3.0.0",
- "devlop": "^1.0.0",
- "hastscript": "^8.0.0",
- "property-information": "^6.0.0",
- "vfile": "^6.0.0",
- "vfile-location": "^5.0.0",
- "web-namespaces": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hast-util-parse-selector": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz",
- "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==",
- "dependencies": {
- "@types/hast": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hast-util-raw": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.1.tgz",
- "integrity": "sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==",
- "dependencies": {
- "@types/hast": "^3.0.0",
- "@types/unist": "^3.0.0",
- "@ungap/structured-clone": "^1.0.0",
- "hast-util-from-parse5": "^8.0.0",
- "hast-util-to-parse5": "^8.0.0",
- "html-void-elements": "^3.0.0",
- "mdast-util-to-hast": "^13.0.0",
- "parse5": "^7.0.0",
- "unist-util-position": "^5.0.0",
- "unist-util-visit": "^5.0.0",
- "vfile": "^6.0.0",
- "web-namespaces": "^2.0.0",
- "zwitch": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hast-util-to-estree": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz",
- "integrity": "sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==",
- "dependencies": {
- "@types/estree": "^1.0.0",
- "@types/estree-jsx": "^1.0.0",
- "@types/hast": "^3.0.0",
- "comma-separated-tokens": "^2.0.0",
- "devlop": "^1.0.0",
- "estree-util-attach-comments": "^3.0.0",
- "estree-util-is-identifier-name": "^3.0.0",
- "hast-util-whitespace": "^3.0.0",
- "mdast-util-mdx-expression": "^2.0.0",
- "mdast-util-mdx-jsx": "^3.0.0",
- "mdast-util-mdxjs-esm": "^2.0.0",
- "property-information": "^6.0.0",
- "space-separated-tokens": "^2.0.0",
- "style-to-object": "^0.4.0",
- "unist-util-position": "^5.0.0",
- "zwitch": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hast-util-to-jsx-runtime": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.2.0.tgz",
- "integrity": "sha512-wSlp23N45CMjDg/BPW8zvhEi3R+8eRE1qFbjEyAUzMCzu2l1Wzwakq+Tlia9nkCtEl5mDxa7nKHsvYJ6Gfn21A==",
- "dependencies": {
- "@types/hast": "^3.0.0",
- "@types/unist": "^3.0.0",
- "comma-separated-tokens": "^2.0.0",
- "hast-util-whitespace": "^3.0.0",
- "property-information": "^6.0.0",
- "space-separated-tokens": "^2.0.0",
- "style-to-object": "^0.4.0",
- "unist-util-position": "^5.0.0",
- "vfile-message": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hast-util-to-parse5": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz",
- "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==",
- "dependencies": {
- "@types/hast": "^3.0.0",
- "comma-separated-tokens": "^2.0.0",
- "devlop": "^1.0.0",
- "property-information": "^6.0.0",
- "space-separated-tokens": "^2.0.0",
- "web-namespaces": "^2.0.0",
- "zwitch": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hast-util-whitespace": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
- "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
- "dependencies": {
- "@types/hast": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/hastscript": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz",
- "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==",
- "dependencies": {
- "@types/hast": "^3.0.0",
- "comma-separated-tokens": "^2.0.0",
- "hast-util-parse-selector": "^4.0.0",
- "property-information": "^6.0.0",
- "space-separated-tokens": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/he": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
- "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
- "bin": {
- "he": "bin/he"
- }
- },
- "node_modules/history": {
- "version": "4.10.1",
- "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz",
- "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==",
- "dependencies": {
- "@babel/runtime": "^7.1.2",
- "loose-envify": "^1.2.0",
- "resolve-pathname": "^3.0.0",
- "tiny-invariant": "^1.0.2",
- "tiny-warning": "^1.0.0",
- "value-equal": "^1.0.1"
- }
- },
- "node_modules/hoist-non-react-statics": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
- "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
- "dependencies": {
- "react-is": "^16.7.0"
- }
- },
- "node_modules/hpack.js": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
- "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
- "dependencies": {
- "inherits": "^2.0.1",
- "obuf": "^1.0.0",
- "readable-stream": "^2.0.1",
- "wbuf": "^1.1.0"
- }
- },
- "node_modules/hpack.js/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
- },
- "node_modules/hpack.js/node_modules/readable-stream": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
- "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/hpack.js/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
- "node_modules/hpack.js/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/html-entities": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz",
- "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/mdevils"
- },
- {
- "type": "patreon",
- "url": "https://patreon.com/mdevils"
- }
- ]
- },
- "node_modules/html-escaper": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
- "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="
- },
- "node_modules/html-minifier-terser": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz",
- "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==",
- "dependencies": {
- "camel-case": "^4.1.2",
- "clean-css": "~5.3.2",
- "commander": "^10.0.0",
- "entities": "^4.4.0",
- "param-case": "^3.0.4",
- "relateurl": "^0.2.7",
- "terser": "^5.15.1"
- },
- "bin": {
- "html-minifier-terser": "cli.js"
- },
- "engines": {
- "node": "^14.13.1 || >=16.0.0"
- }
- },
- "node_modules/html-minifier-terser/node_modules/commander": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
- "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/html-tags": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz",
- "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/html-void-elements": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz",
- "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/html-webpack-plugin": {
- "version": "5.5.3",
- "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz",
- "integrity": "sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==",
- "dependencies": {
- "@types/html-minifier-terser": "^6.0.0",
- "html-minifier-terser": "^6.0.2",
- "lodash": "^4.17.21",
- "pretty-error": "^4.0.0",
- "tapable": "^2.0.0"
- },
- "engines": {
- "node": ">=10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/html-webpack-plugin"
- },
- "peerDependencies": {
- "webpack": "^5.20.0"
- }
- },
- "node_modules/html-webpack-plugin/node_modules/commander": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz",
- "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==",
- "engines": {
- "node": ">= 12"
- }
- },
- "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
- "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==",
- "dependencies": {
- "camel-case": "^4.1.2",
- "clean-css": "^5.2.2",
- "commander": "^8.3.0",
- "he": "^1.2.0",
- "param-case": "^3.0.4",
- "relateurl": "^0.2.7",
- "terser": "^5.10.0"
- },
- "bin": {
- "html-minifier-terser": "cli.js"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/htmlparser2": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
- "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==",
- "funding": [
- "https://github.com/fb55/htmlparser2?sponsor=1",
- {
- "type": "github",
- "url": "https://github.com/sponsors/fb55"
- }
- ],
- "dependencies": {
- "domelementtype": "^2.3.0",
- "domhandler": "^5.0.3",
- "domutils": "^3.0.1",
- "entities": "^4.4.0"
- }
- },
- "node_modules/http-cache-semantics": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
- "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ=="
- },
- "node_modules/http-deceiver": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
- "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw=="
- },
- "node_modules/http-errors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
- "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
- "dependencies": {
- "depd": "2.0.0",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "toidentifier": "1.0.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/http-parser-js": {
- "version": "0.5.8",
- "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz",
- "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q=="
- },
- "node_modules/http-proxy": {
- "version": "1.18.1",
- "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
- "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
- "dependencies": {
- "eventemitter3": "^4.0.0",
- "follow-redirects": "^1.0.0",
- "requires-port": "^1.0.0"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/http-proxy-middleware": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz",
- "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==",
- "dependencies": {
- "@types/http-proxy": "^1.17.8",
- "http-proxy": "^1.18.1",
- "is-glob": "^4.0.1",
- "is-plain-obj": "^3.0.0",
- "micromatch": "^4.0.2"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "@types/express": "^4.17.13"
- },
- "peerDependenciesMeta": {
- "@types/express": {
- "optional": true
- }
- }
- },
- "node_modules/http-proxy-middleware/node_modules/is-plain-obj": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
- "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/http2-wrapper": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz",
- "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==",
- "dependencies": {
- "quick-lru": "^5.1.1",
- "resolve-alpn": "^1.2.0"
- },
- "engines": {
- "node": ">=10.19.0"
- }
- },
- "node_modules/human-signals": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
- "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
- "engines": {
- "node": ">=10.17.0"
- }
- },
- "node_modules/iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/icss-utils": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
- "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
- "engines": {
- "node": "^10 || ^12 || >= 14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/ignore": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz",
- "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/image-size": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz",
- "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==",
- "dependencies": {
- "queue": "6.0.2"
- },
- "bin": {
- "image-size": "bin/image-size.js"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/immer": {
- "version": "9.0.21",
- "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz",
- "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/immer"
- }
- },
- "node_modules/immutable": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz",
- "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ=="
- },
- "node_modules/import-fresh": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
- "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
- "dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/import-lazy": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
- "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
- "engines": {
- "node": ">=0.8.19"
- }
- },
- "node_modules/indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/infima": {
- "version": "0.2.0-alpha.43",
- "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz",
- "integrity": "sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ==",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
- "node_modules/ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
- },
- "node_modules/inline-style-parser": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz",
- "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q=="
- },
- "node_modules/interpret": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
- "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/invariant": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
- "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
- "dependencies": {
- "loose-envify": "^1.0.0"
- }
- },
- "node_modules/ipaddr.js": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz",
- "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==",
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/is-alphabetical": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
- "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/is-alphanumerical": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
- "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
- "dependencies": {
- "is-alphabetical": "^2.0.0",
- "is-decimal": "^2.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
- },
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-ci": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz",
- "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==",
- "dependencies": {
- "ci-info": "^3.2.0"
- },
- "bin": {
- "is-ci": "bin.js"
- }
- },
- "node_modules/is-core-module": {
- "version": "2.13.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
- "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
- "dependencies": {
- "hasown": "^2.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-decimal": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
- "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/is-docker": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
- "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
- "bin": {
- "is-docker": "cli.js"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-hexadecimal": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz",
- "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/is-installed-globally": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
- "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
- "dependencies": {
- "global-dirs": "^3.0.0",
- "is-path-inside": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-npm": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz",
- "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==",
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/is-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
- "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-path-cwd": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
- "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/is-path-inside": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-plain-obj": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
- "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-plain-object": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
- "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-reference": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz",
- "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==",
- "dependencies": {
- "@types/estree": "*"
- }
- },
- "node_modules/is-regexp": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
- "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-root": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz",
- "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
- },
- "node_modules/is-wsl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
- "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
- "dependencies": {
- "is-docker": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-yarn-global": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz",
- "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
- },
- "node_modules/isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/jest-util": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
- "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
- "dependencies": {
- "@jest/types": "^29.6.3",
- "@types/node": "*",
- "chalk": "^4.0.0",
- "ci-info": "^3.2.0",
- "graceful-fs": "^4.2.9",
- "picomatch": "^2.2.3"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-worker": {
- "version": "29.7.0",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
- "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==",
- "dependencies": {
- "@types/node": "*",
- "jest-util": "^29.7.0",
- "merge-stream": "^2.0.0",
- "supports-color": "^8.0.0"
- },
- "engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
- }
- },
- "node_modules/jest-worker/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
- }
- },
- "node_modules/jiti": {
- "version": "1.21.0",
- "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz",
- "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==",
- "bin": {
- "jiti": "bin/jiti.js"
- }
- },
- "node_modules/joi": {
- "version": "17.11.0",
- "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz",
- "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==",
- "dependencies": {
- "@hapi/hoek": "^9.0.0",
- "@hapi/topo": "^5.0.0",
- "@sideway/address": "^4.1.3",
- "@sideway/formula": "^3.0.1",
- "@sideway/pinpoint": "^2.0.0"
- }
- },
- "node_modules/js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
- },
- "node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
- "dependencies": {
- "argparse": "^2.0.1"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/jsesc": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
- "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
- "bin": {
- "jsesc": "bin/jsesc"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/json-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
- "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
- },
- "node_modules/json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
- },
- "node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
- },
- "node_modules/json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "bin": {
- "json5": "lib/cli.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/keyv": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
- "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
- "dependencies": {
- "json-buffer": "3.0.1"
- }
- },
- "node_modules/kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/kleur": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
- "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/klona": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz",
- "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/latest-version": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz",
- "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==",
- "dependencies": {
- "package-json": "^8.1.0"
- },
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/launch-editor": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz",
- "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==",
- "dependencies": {
- "picocolors": "^1.0.0",
- "shell-quote": "^1.8.1"
- }
- },
- "node_modules/leven": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
- "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/lilconfig": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz",
- "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/antonk52"
- }
- },
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
- },
- "node_modules/load-script": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz",
- "integrity": "sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA=="
- },
- "node_modules/loader-runner": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
- "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
- "engines": {
- "node": ">=6.11.5"
- }
- },
- "node_modules/loader-utils": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
- "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
- "dependencies": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^2.1.2"
- },
- "engines": {
- "node": ">=8.9.0"
- }
- },
- "node_modules/locate-path": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz",
- "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==",
- "dependencies": {
- "p-locate": "^6.0.0"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
- },
- "node_modules/lodash.debounce": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
- "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="
- },
- "node_modules/lodash.memoize": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
- "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag=="
- },
- "node_modules/lodash.uniq": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
- "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ=="
- },
- "node_modules/longest-streak": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
- "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/loose-envify": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
- "dependencies": {
- "js-tokens": "^3.0.0 || ^4.0.0"
- },
- "bin": {
- "loose-envify": "cli.js"
- }
- },
- "node_modules/lower-case": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
- "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
- "dependencies": {
- "tslib": "^2.0.3"
- }
- },
- "node_modules/lowercase-keys": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz",
- "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==",
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
- "dependencies": {
- "yallist": "^3.0.2"
- }
- },
- "node_modules/markdown-extensions": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz",
- "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==",
- "engines": {
- "node": ">=16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/markdown-table": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz",
- "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/mdast-util-directive": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz",
- "integrity": "sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "@types/unist": "^3.0.0",
- "devlop": "^1.0.0",
- "mdast-util-from-markdown": "^2.0.0",
- "mdast-util-to-markdown": "^2.0.0",
- "parse-entities": "^4.0.0",
- "stringify-entities": "^4.0.0",
- "unist-util-visit-parents": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-find-and-replace": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz",
- "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "escape-string-regexp": "^5.0.0",
- "unist-util-is": "^6.0.0",
- "unist-util-visit-parents": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
- "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/mdast-util-from-markdown": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz",
- "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "@types/unist": "^3.0.0",
- "decode-named-character-reference": "^1.0.0",
- "devlop": "^1.0.0",
- "mdast-util-to-string": "^4.0.0",
- "micromark": "^4.0.0",
- "micromark-util-decode-numeric-character-reference": "^2.0.0",
- "micromark-util-decode-string": "^2.0.0",
- "micromark-util-normalize-identifier": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0",
- "unist-util-stringify-position": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/mdast-util-frontmatter": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz",
- "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "devlop": "^1.0.0",
- "escape-string-regexp": "^5.0.0",
- "mdast-util-from-markdown": "^2.0.0",
- "mdast-util-to-markdown": "^2.0.0",
- "micromark-extension-frontmatter": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
- "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/mdast-util-gfm": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz",
- "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==",
- "dependencies": {
- "mdast-util-from-markdown": "^2.0.0",
- "mdast-util-gfm-autolink-literal": "^2.0.0",
- "mdast-util-gfm-footnote": "^2.0.0",
- "mdast-util-gfm-strikethrough": "^2.0.0",
- "mdast-util-gfm-table": "^2.0.0",
- "mdast-util-gfm-task-list-item": "^2.0.0",
- "mdast-util-to-markdown": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm-autolink-literal": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz",
- "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "ccount": "^2.0.0",
- "devlop": "^1.0.0",
- "mdast-util-find-and-replace": "^3.0.0",
- "micromark-util-character": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz",
- "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/mdast-util-gfm-footnote": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz",
- "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "devlop": "^1.1.0",
- "mdast-util-from-markdown": "^2.0.0",
- "mdast-util-to-markdown": "^2.0.0",
- "micromark-util-normalize-identifier": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm-strikethrough": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz",
- "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "mdast-util-from-markdown": "^2.0.0",
- "mdast-util-to-markdown": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm-table": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz",
- "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "devlop": "^1.0.0",
- "markdown-table": "^3.0.0",
- "mdast-util-from-markdown": "^2.0.0",
- "mdast-util-to-markdown": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-gfm-task-list-item": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz",
- "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "devlop": "^1.0.0",
- "mdast-util-from-markdown": "^2.0.0",
- "mdast-util-to-markdown": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-mdx": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz",
- "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==",
- "dependencies": {
- "mdast-util-from-markdown": "^2.0.0",
- "mdast-util-mdx-expression": "^2.0.0",
- "mdast-util-mdx-jsx": "^3.0.0",
- "mdast-util-mdxjs-esm": "^2.0.0",
- "mdast-util-to-markdown": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-mdx-expression": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz",
- "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==",
- "dependencies": {
- "@types/estree-jsx": "^1.0.0",
- "@types/hast": "^3.0.0",
- "@types/mdast": "^4.0.0",
- "devlop": "^1.0.0",
- "mdast-util-from-markdown": "^2.0.0",
- "mdast-util-to-markdown": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-mdx-jsx": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.0.0.tgz",
- "integrity": "sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA==",
- "dependencies": {
- "@types/estree-jsx": "^1.0.0",
- "@types/hast": "^3.0.0",
- "@types/mdast": "^4.0.0",
- "@types/unist": "^3.0.0",
- "ccount": "^2.0.0",
- "devlop": "^1.1.0",
- "mdast-util-from-markdown": "^2.0.0",
- "mdast-util-to-markdown": "^2.0.0",
- "parse-entities": "^4.0.0",
- "stringify-entities": "^4.0.0",
- "unist-util-remove-position": "^5.0.0",
- "unist-util-stringify-position": "^4.0.0",
- "vfile-message": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-mdxjs-esm": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz",
- "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==",
- "dependencies": {
- "@types/estree-jsx": "^1.0.0",
- "@types/hast": "^3.0.0",
- "@types/mdast": "^4.0.0",
- "devlop": "^1.0.0",
- "mdast-util-from-markdown": "^2.0.0",
- "mdast-util-to-markdown": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-phrasing": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.0.0.tgz",
- "integrity": "sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "unist-util-is": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-to-hast": {
- "version": "13.0.2",
- "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz",
- "integrity": "sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==",
- "dependencies": {
- "@types/hast": "^3.0.0",
- "@types/mdast": "^4.0.0",
- "@ungap/structured-clone": "^1.0.0",
- "devlop": "^1.0.0",
- "micromark-util-sanitize-uri": "^2.0.0",
- "trim-lines": "^3.0.0",
- "unist-util-position": "^5.0.0",
- "unist-util-visit": "^5.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-to-markdown": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz",
- "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "@types/unist": "^3.0.0",
- "longest-streak": "^3.0.0",
- "mdast-util-phrasing": "^4.0.0",
- "mdast-util-to-string": "^4.0.0",
- "micromark-util-decode-string": "^2.0.0",
- "unist-util-visit": "^5.0.0",
- "zwitch": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdast-util-to-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
- "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
- "dependencies": {
- "@types/mdast": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/mdn-data": {
- "version": "2.0.30",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
- "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA=="
- },
- "node_modules/media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/memfs": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.6.0.tgz",
- "integrity": "sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ==",
- "deprecated": "this will be v4",
- "dependencies": {
- "fs-monkey": "^1.0.4"
- },
- "engines": {
- "node": ">= 4.0.0"
- }
- },
- "node_modules/memoize-one": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz",
- "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q=="
- },
- "node_modules/merge-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
- },
- "node_modules/merge-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
- },
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/micromark": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz",
- "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "@types/debug": "^4.0.0",
- "debug": "^4.0.0",
- "decode-named-character-reference": "^1.0.0",
- "devlop": "^1.0.0",
- "micromark-core-commonmark": "^2.0.0",
- "micromark-factory-space": "^2.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-chunked": "^2.0.0",
- "micromark-util-combine-extensions": "^2.0.0",
- "micromark-util-decode-numeric-character-reference": "^2.0.0",
- "micromark-util-encode": "^2.0.0",
- "micromark-util-normalize-identifier": "^2.0.0",
- "micromark-util-resolve-all": "^2.0.0",
- "micromark-util-sanitize-uri": "^2.0.0",
- "micromark-util-subtokenize": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-core-commonmark": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz",
- "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "decode-named-character-reference": "^1.0.0",
- "devlop": "^1.0.0",
- "micromark-factory-destination": "^2.0.0",
- "micromark-factory-label": "^2.0.0",
- "micromark-factory-space": "^2.0.0",
- "micromark-factory-title": "^2.0.0",
- "micromark-factory-whitespace": "^2.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-chunked": "^2.0.0",
- "micromark-util-classify-character": "^2.0.0",
- "micromark-util-html-tag-name": "^2.0.0",
- "micromark-util-normalize-identifier": "^2.0.0",
- "micromark-util-resolve-all": "^2.0.0",
- "micromark-util-subtokenize": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz",
- "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz",
- "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-extension-directive": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.0.tgz",
- "integrity": "sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==",
- "dependencies": {
- "devlop": "^1.0.0",
- "micromark-factory-space": "^2.0.0",
- "micromark-factory-whitespace": "^2.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0",
- "parse-entities": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz",
- "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-extension-directive/node_modules/micromark-util-character": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz",
- "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-extension-frontmatter": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz",
- "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==",
- "dependencies": {
- "fault": "^2.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz",
- "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-extension-gfm": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz",
- "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==",
- "dependencies": {
- "micromark-extension-gfm-autolink-literal": "^2.0.0",
- "micromark-extension-gfm-footnote": "^2.0.0",
- "micromark-extension-gfm-strikethrough": "^2.0.0",
- "micromark-extension-gfm-table": "^2.0.0",
- "micromark-extension-gfm-tagfilter": "^2.0.0",
- "micromark-extension-gfm-task-list-item": "^2.0.0",
- "micromark-util-combine-extensions": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-autolink-literal": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz",
- "integrity": "sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==",
- "dependencies": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-sanitize-uri": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz",
- "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-extension-gfm-footnote": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz",
- "integrity": "sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==",
- "dependencies": {
- "devlop": "^1.0.0",
- "micromark-core-commonmark": "^2.0.0",
- "micromark-factory-space": "^2.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-normalize-identifier": "^2.0.0",
- "micromark-util-sanitize-uri": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz",
- "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz",
- "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-extension-gfm-strikethrough": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz",
- "integrity": "sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==",
- "dependencies": {
- "devlop": "^1.0.0",
- "micromark-util-chunked": "^2.0.0",
- "micromark-util-classify-character": "^2.0.0",
- "micromark-util-resolve-all": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-extension-gfm-table": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz",
- "integrity": "sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==",
- "dependencies": {
- "devlop": "^1.0.0",
- "micromark-factory-space": "^2.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz",
- "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz",
- "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-extension-gfm-tagfilter": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz",
- "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==",
- "dependencies": {
- "micromark-util-types": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-task-list-item": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz",
- "integrity": "sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==",
- "dependencies": {
- "devlop": "^1.0.0",
- "micromark-factory-space": "^2.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz",
- "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz",
- "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-extension-mdx-expression": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz",
- "integrity": "sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "@types/estree": "^1.0.0",
- "devlop": "^1.0.0",
- "micromark-factory-mdx-expression": "^2.0.0",
- "micromark-factory-space": "^2.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-events-to-acorn": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz",
- "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz",
- "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-extension-mdx-jsx": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz",
- "integrity": "sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==",
- "dependencies": {
- "@types/acorn": "^4.0.0",
- "@types/estree": "^1.0.0",
- "devlop": "^1.0.0",
- "estree-util-is-identifier-name": "^3.0.0",
- "micromark-factory-mdx-expression": "^2.0.0",
- "micromark-factory-space": "^2.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0",
- "vfile-message": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz",
- "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz",
- "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-extension-mdx-md": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz",
- "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==",
- "dependencies": {
- "micromark-util-types": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-mdxjs": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz",
- "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==",
- "dependencies": {
- "acorn": "^8.0.0",
- "acorn-jsx": "^5.0.0",
- "micromark-extension-mdx-expression": "^3.0.0",
- "micromark-extension-mdx-jsx": "^3.0.0",
- "micromark-extension-mdx-md": "^2.0.0",
- "micromark-extension-mdxjs-esm": "^3.0.0",
- "micromark-util-combine-extensions": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-mdxjs-esm": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz",
- "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==",
- "dependencies": {
- "@types/estree": "^1.0.0",
- "devlop": "^1.0.0",
- "micromark-core-commonmark": "^2.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-events-to-acorn": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0",
- "unist-util-position-from-estree": "^2.0.0",
- "vfile-message": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz",
- "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-factory-destination": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz",
- "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-factory-destination/node_modules/micromark-util-character": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz",
- "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-factory-label": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz",
- "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "devlop": "^1.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-factory-label/node_modules/micromark-util-character": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz",
- "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-factory-mdx-expression": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz",
- "integrity": "sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "@types/estree": "^1.0.0",
- "devlop": "^1.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-events-to-acorn": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0",
- "unist-util-position-from-estree": "^2.0.0",
- "vfile-message": "^4.0.0"
- }
- },
- "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz",
- "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-factory-space": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz",
- "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-character": "^1.0.0",
- "micromark-util-types": "^1.0.0"
- }
- },
- "node_modules/micromark-factory-space/node_modules/micromark-util-types": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz",
- "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-factory-title": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz",
- "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-factory-space": "^2.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-factory-title/node_modules/micromark-factory-space": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz",
- "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-factory-title/node_modules/micromark-util-character": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz",
- "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-factory-whitespace": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz",
- "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-factory-space": "^2.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz",
- "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz",
- "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-util-character": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz",
- "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^1.0.0",
- "micromark-util-types": "^1.0.0"
- }
- },
- "node_modules/micromark-util-character/node_modules/micromark-util-types": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz",
- "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-util-chunked": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz",
- "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^2.0.0"
- }
- },
- "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-util-classify-character": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz",
- "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz",
- "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-util-combine-extensions": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz",
- "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-chunked": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-util-decode-numeric-character-reference": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz",
- "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^2.0.0"
- }
- },
- "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-util-decode-string": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz",
- "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "decode-named-character-reference": "^1.0.0",
- "micromark-util-character": "^2.0.0",
- "micromark-util-decode-numeric-character-reference": "^2.0.0",
- "micromark-util-symbol": "^2.0.0"
- }
- },
- "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz",
- "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-util-encode": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz",
- "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-util-events-to-acorn": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz",
- "integrity": "sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "@types/acorn": "^4.0.0",
- "@types/estree": "^1.0.0",
- "@types/unist": "^3.0.0",
- "devlop": "^1.0.0",
- "estree-util-visit": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0",
- "vfile-message": "^4.0.0"
- }
- },
- "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-util-html-tag-name": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz",
- "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-util-normalize-identifier": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz",
- "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^2.0.0"
- }
- },
- "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-util-resolve-all": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz",
- "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-util-sanitize-uri": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz",
- "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-encode": "^2.0.0",
- "micromark-util-symbol": "^2.0.0"
- }
- },
- "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz",
- "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-util-subtokenize": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz",
- "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "devlop": "^1.0.0",
- "micromark-util-chunked": "^2.0.0",
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-util-symbol": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz",
- "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark-util-types": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz",
- "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromark/node_modules/micromark-factory-space": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz",
- "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-character": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark/node_modules/micromark-util-character": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz",
- "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ],
- "dependencies": {
- "micromark-util-symbol": "^2.0.0",
- "micromark-util-types": "^2.0.0"
- }
- },
- "node_modules/micromark/node_modules/micromark-util-symbol": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
- "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
- "funding": [
- {
- "type": "GitHub Sponsors",
- "url": "https://github.com/sponsors/unifiedjs"
- },
- {
- "type": "OpenCollective",
- "url": "https://opencollective.com/unified"
- }
- ]
- },
- "node_modules/micromatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
- "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
- "dependencies": {
- "braces": "^3.0.2",
- "picomatch": "^2.3.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
- "bin": {
- "mime": "cli.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/mime-db": {
- "version": "1.33.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
- "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime-types": {
- "version": "2.1.18",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
- "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
- "dependencies": {
- "mime-db": "~1.33.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/mimic-response": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz",
- "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==",
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/mini-css-extract-plugin": {
- "version": "2.7.6",
- "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz",
- "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==",
- "dependencies": {
- "schema-utils": "^4.0.0"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.0.0"
- }
- },
- "node_modules/minimalistic-assert": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
- "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
- },
- "node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/minimist": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
- "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/mrmime": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz",
- "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "node_modules/multicast-dns": {
- "version": "7.2.5",
- "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz",
- "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==",
- "dependencies": {
- "dns-packet": "^5.2.2",
- "thunky": "^1.0.2"
- },
- "bin": {
- "multicast-dns": "cli.js"
- }
- },
- "node_modules/nanoid": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
- "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/negotiator": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/neo-async": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
- "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
- },
- "node_modules/no-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
- "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
- "dependencies": {
- "lower-case": "^2.0.2",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/node-emoji": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz",
- "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==",
- "dependencies": {
- "@sindresorhus/is": "^4.6.0",
- "char-regex": "^1.0.2",
- "emojilib": "^2.4.0",
- "skin-tone": "^2.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/node-forge": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
- "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
- "engines": {
- "node": ">= 6.13.0"
- }
- },
- "node_modules/node-releases": {
- "version": "2.0.14",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
- "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw=="
- },
- "node_modules/normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/normalize-range": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
- "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/normalize-url": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz",
- "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==",
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/npm-run-path": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
- "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
- "dependencies": {
- "path-key": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/nprogress": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz",
- "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA=="
- },
- "node_modules/nth-check": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
- "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
- "dependencies": {
- "boolbase": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/fb55/nth-check?sponsor=1"
- }
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-inspect": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
- "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/object.assign": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
- "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "has-symbols": "^1.0.3",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/obuf": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
- "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg=="
- },
- "node_modules/on-finished": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
- "dependencies": {
- "ee-first": "1.1.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/on-headers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
- "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/onetime": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
- "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
- "dependencies": {
- "mimic-fn": "^2.1.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/open": {
- "version": "8.4.2",
- "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
- "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
- "dependencies": {
- "define-lazy-prop": "^2.0.0",
- "is-docker": "^2.1.1",
- "is-wsl": "^2.2.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/opener": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz",
- "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
- "bin": {
- "opener": "bin/opener-bin.js"
- }
- },
- "node_modules/p-cancelable": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz",
- "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==",
- "engines": {
- "node": ">=12.20"
- }
- },
- "node_modules/p-limit": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
- "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
- "dependencies": {
- "yocto-queue": "^1.0.0"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-locate": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
- "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
- "dependencies": {
- "p-limit": "^4.0.0"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-map": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
- "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
- "dependencies": {
- "aggregate-error": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-retry": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz",
- "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==",
- "dependencies": {
- "@types/retry": "0.12.0",
- "retry": "^0.13.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/package-json": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz",
- "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==",
- "dependencies": {
- "got": "^12.1.0",
- "registry-auth-token": "^5.0.1",
- "registry-url": "^6.0.0",
- "semver": "^7.3.7"
- },
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/param-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
- "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
- "dependencies": {
- "dot-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "dependencies": {
- "callsites": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/parse-entities": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz",
- "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==",
- "dependencies": {
- "@types/unist": "^2.0.0",
- "character-entities": "^2.0.0",
- "character-entities-legacy": "^3.0.0",
- "character-reference-invalid": "^2.0.0",
- "decode-named-character-reference": "^1.0.0",
- "is-alphanumerical": "^2.0.0",
- "is-decimal": "^2.0.0",
- "is-hexadecimal": "^2.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/parse-entities/node_modules/@types/unist": {
- "version": "2.0.10",
- "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
- "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
- },
- "node_modules/parse-json": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
- "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
- "dependencies": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-even-better-errors": "^2.3.0",
- "lines-and-columns": "^1.1.6"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/parse-numeric-range": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz",
- "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ=="
- },
- "node_modules/parse5": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
- "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
- "dependencies": {
- "entities": "^4.4.0"
- },
- "funding": {
- "url": "https://github.com/inikulin/parse5?sponsor=1"
- }
- },
- "node_modules/parse5-htmlparser2-tree-adapter": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz",
- "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==",
- "dependencies": {
- "domhandler": "^5.0.2",
- "parse5": "^7.0.0"
- },
- "funding": {
- "url": "https://github.com/inikulin/parse5?sponsor=1"
- }
- },
- "node_modules/parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/pascal-case": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
- "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
- "dependencies": {
- "no-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/path-exists": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
- "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- }
- },
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/path-is-inside": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
- "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w=="
- },
- "node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
- },
- "node_modules/path-to-regexp": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
- "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
- "dependencies": {
- "isarray": "0.0.1"
- }
- },
- "node_modules/path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/periscopic": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz",
- "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==",
- "dependencies": {
- "@types/estree": "^1.0.0",
- "estree-walker": "^3.0.0",
- "is-reference": "^3.0.0"
- }
- },
- "node_modules/picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
- },
- "node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pkg-dir": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz",
- "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==",
- "dependencies": {
- "find-up": "^6.3.0"
- },
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/pkg-up": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz",
- "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==",
- "dependencies": {
- "find-up": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/pkg-up/node_modules/find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
- "dependencies": {
- "locate-path": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/pkg-up/node_modules/locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
- "dependencies": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/pkg-up/node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dependencies": {
- "p-try": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/pkg-up/node_modules/p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
- "dependencies": {
- "p-limit": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/pkg-up/node_modules/path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/postcss": {
- "version": "8.4.38",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
- "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "dependencies": {
- "nanoid": "^3.3.7",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.2.0"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/postcss-calc": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz",
- "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==",
- "dependencies": {
- "postcss-selector-parser": "^6.0.11",
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.2.2"
- }
- },
- "node_modules/postcss-colormin": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz",
- "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==",
- "dependencies": {
- "browserslist": "^4.23.0",
- "caniuse-api": "^3.0.0",
- "colord": "^2.9.3",
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-convert-values": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz",
- "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==",
- "dependencies": {
- "browserslist": "^4.23.0",
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-discard-comments": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz",
- "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==",
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-discard-duplicates": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz",
- "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==",
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-discard-empty": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz",
- "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==",
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-discard-overridden": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz",
- "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==",
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-discard-unused": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz",
- "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==",
- "dependencies": {
- "postcss-selector-parser": "^6.0.16"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-loader": {
- "version": "7.3.3",
- "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz",
- "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==",
- "dependencies": {
- "cosmiconfig": "^8.2.0",
- "jiti": "^1.18.2",
- "semver": "^7.3.8"
- },
- "engines": {
- "node": ">= 14.15.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "postcss": "^7.0.0 || ^8.0.1",
- "webpack": "^5.0.0"
- }
- },
- "node_modules/postcss-merge-idents": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz",
- "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==",
- "dependencies": {
- "cssnano-utils": "^4.0.2",
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-merge-longhand": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz",
- "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==",
- "dependencies": {
- "postcss-value-parser": "^4.2.0",
- "stylehacks": "^6.1.1"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-merge-rules": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz",
- "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==",
- "dependencies": {
- "browserslist": "^4.23.0",
- "caniuse-api": "^3.0.0",
- "cssnano-utils": "^4.0.2",
- "postcss-selector-parser": "^6.0.16"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-minify-font-values": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz",
- "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-minify-gradients": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz",
- "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==",
- "dependencies": {
- "colord": "^2.9.3",
- "cssnano-utils": "^4.0.2",
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-minify-params": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz",
- "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==",
- "dependencies": {
- "browserslist": "^4.23.0",
- "cssnano-utils": "^4.0.2",
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-minify-selectors": {
- "version": "6.0.4",
- "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz",
- "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==",
- "dependencies": {
- "postcss-selector-parser": "^6.0.16"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-modules-extract-imports": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
- "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
- "engines": {
- "node": "^10 || ^12 || >= 14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/postcss-modules-local-by-default": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz",
- "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==",
- "dependencies": {
- "icss-utils": "^5.0.0",
- "postcss-selector-parser": "^6.0.2",
- "postcss-value-parser": "^4.1.0"
- },
- "engines": {
- "node": "^10 || ^12 || >= 14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/postcss-modules-scope": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
- "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
- "dependencies": {
- "postcss-selector-parser": "^6.0.4"
- },
- "engines": {
- "node": "^10 || ^12 || >= 14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/postcss-modules-values": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
- "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
- "dependencies": {
- "icss-utils": "^5.0.0"
- },
- "engines": {
- "node": "^10 || ^12 || >= 14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/postcss-normalize-charset": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz",
- "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==",
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-normalize-display-values": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz",
- "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-normalize-positions": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz",
- "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-normalize-repeat-style": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz",
- "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-normalize-string": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz",
- "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-normalize-timing-functions": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz",
- "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-normalize-unicode": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz",
- "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==",
- "dependencies": {
- "browserslist": "^4.23.0",
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-normalize-url": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz",
- "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-normalize-whitespace": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz",
- "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-ordered-values": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz",
- "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==",
- "dependencies": {
- "cssnano-utils": "^4.0.2",
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-reduce-idents": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz",
- "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-reduce-initial": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz",
- "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==",
- "dependencies": {
- "browserslist": "^4.23.0",
- "caniuse-api": "^3.0.0"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-reduce-transforms": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz",
- "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==",
- "dependencies": {
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-selector-parser": {
- "version": "6.0.16",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz",
- "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==",
- "dependencies": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/postcss-sort-media-queries": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz",
- "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==",
- "dependencies": {
- "sort-css-media-queries": "2.2.0"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.23"
- }
- },
- "node_modules/postcss-svgo": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz",
- "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==",
- "dependencies": {
- "postcss-value-parser": "^4.2.0",
- "svgo": "^3.2.0"
- },
- "engines": {
- "node": "^14 || ^16 || >= 18"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-unique-selectors": {
- "version": "6.0.4",
- "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz",
- "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==",
- "dependencies": {
- "postcss-selector-parser": "^6.0.16"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-value-parser": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
- "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
- },
- "node_modules/postcss-zindex": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz",
- "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==",
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/pretty-error": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz",
- "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==",
- "dependencies": {
- "lodash": "^4.17.20",
- "renderkid": "^3.0.0"
- }
- },
- "node_modules/pretty-time": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz",
- "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/prism-react-renderer": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.3.0.tgz",
- "integrity": "sha512-UYRg2TkVIaI6tRVHC5OJ4/BxqPUxJkJvq/odLT/ykpt1zGYXooNperUxQcCvi87LyRnR4nCh81ceOA+e7nrydg==",
- "dependencies": {
- "@types/prismjs": "^1.26.0",
- "clsx": "^2.0.0"
- },
- "peerDependencies": {
- "react": ">=16.0.0"
- }
- },
- "node_modules/prism-react-renderer/node_modules/clsx": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz",
- "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/prismjs": {
- "version": "1.29.0",
- "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
- "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
- },
- "node_modules/prompts": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
- "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
- "dependencies": {
- "kleur": "^3.0.3",
- "sisteransi": "^1.0.5"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/prop-types": {
- "version": "15.8.1",
- "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
- "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
- "dependencies": {
- "loose-envify": "^1.4.0",
- "object-assign": "^4.1.1",
- "react-is": "^16.13.1"
- }
- },
- "node_modules/property-information": {
- "version": "6.4.0",
- "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.0.tgz",
- "integrity": "sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/proto-list": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
- "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA=="
- },
- "node_modules/proxy-addr": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
- "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
- "dependencies": {
- "forwarded": "0.2.0",
- "ipaddr.js": "1.9.1"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/proxy-addr/node_modules/ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/punycode": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ=="
- },
- "node_modules/pupa": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz",
- "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==",
- "dependencies": {
- "escape-goat": "^4.0.0"
- },
- "engines": {
- "node": ">=12.20"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/qs": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
- "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
- "dependencies": {
- "side-channel": "^1.0.4"
- },
- "engines": {
- "node": ">=0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/queue": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz",
- "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==",
- "dependencies": {
- "inherits": "~2.0.3"
- }
- },
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/quick-lru": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
- "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "dependencies": {
- "safe-buffer": "^5.1.0"
- }
- },
- "node_modules/range-parser": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
- "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/raw-body": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
- "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
- "dependencies": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/raw-body/node_modules/bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/rc": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
- "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
- "dependencies": {
- "deep-extend": "^0.6.0",
- "ini": "~1.3.0",
- "minimist": "^1.2.0",
- "strip-json-comments": "~2.0.1"
- },
- "bin": {
- "rc": "cli.js"
- }
- },
- "node_modules/rc/node_modules/strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/react": {
- "version": "18.2.0",
- "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
- "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
- "dependencies": {
- "loose-envify": "^1.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/react-dev-utils": {
- "version": "12.0.1",
- "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz",
- "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==",
- "dependencies": {
- "@babel/code-frame": "^7.16.0",
- "address": "^1.1.2",
- "browserslist": "^4.18.1",
- "chalk": "^4.1.2",
- "cross-spawn": "^7.0.3",
- "detect-port-alt": "^1.1.6",
- "escape-string-regexp": "^4.0.0",
- "filesize": "^8.0.6",
- "find-up": "^5.0.0",
- "fork-ts-checker-webpack-plugin": "^6.5.0",
- "global-modules": "^2.0.0",
- "globby": "^11.0.4",
- "gzip-size": "^6.0.0",
- "immer": "^9.0.7",
- "is-root": "^2.1.0",
- "loader-utils": "^3.2.0",
- "open": "^8.4.0",
- "pkg-up": "^3.1.0",
- "prompts": "^2.4.2",
- "react-error-overlay": "^6.0.11",
- "recursive-readdir": "^2.2.2",
- "shell-quote": "^1.7.3",
- "strip-ansi": "^6.0.1",
- "text-table": "^0.2.0"
- },
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/react-dev-utils/node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/react-dev-utils/node_modules/loader-utils": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz",
- "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==",
- "engines": {
- "node": ">= 12.13.0"
- }
- },
- "node_modules/react-dev-utils/node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "dependencies": {
- "p-locate": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/react-dev-utils/node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dependencies": {
- "yocto-queue": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/react-dev-utils/node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "dependencies": {
- "p-limit": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/react-dev-utils/node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/react-dev-utils/node_modules/yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/react-dom": {
- "version": "18.2.0",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
- "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
- "dependencies": {
- "loose-envify": "^1.1.0",
- "scheduler": "^0.23.0"
- },
- "peerDependencies": {
- "react": "^18.2.0"
- }
- },
- "node_modules/react-error-overlay": {
- "version": "6.0.11",
- "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz",
- "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg=="
- },
- "node_modules/react-fast-compare": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz",
- "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ=="
- },
- "node_modules/react-helmet-async": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz",
- "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==",
- "dependencies": {
- "@babel/runtime": "^7.12.5",
- "invariant": "^2.2.4",
- "prop-types": "^15.7.2",
- "react-fast-compare": "^3.2.0",
- "shallowequal": "^1.1.0"
- },
- "peerDependencies": {
- "react": "^16.6.0 || ^17.0.0 || ^18.0.0",
- "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0"
- }
- },
- "node_modules/react-is": {
- "version": "16.13.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
- },
- "node_modules/react-json-view-lite": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.3.0.tgz",
- "integrity": "sha512-aN1biKC5v4DQkmQBlZjuMFR09MKZGMPtIg+cut8zEeg2HXd6gl2gRy0n4HMacHf0dznQgo0SVXN7eT8zV3hEuQ==",
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "react": "^16.13.1 || ^17.0.0 || ^18.0.0"
- }
- },
- "node_modules/react-loadable": {
- "name": "@docusaurus/react-loadable",
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz",
- "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==",
- "dependencies": {
- "@types/react": "*"
- },
- "peerDependencies": {
- "react": "*"
- }
- },
- "node_modules/react-loadable-ssr-addon-v5-slorber": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz",
- "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==",
- "dependencies": {
- "@babel/runtime": "^7.10.3"
- },
- "engines": {
- "node": ">=10.13.0"
- },
- "peerDependencies": {
- "react-loadable": "*",
- "webpack": ">=4.41.1 || 5.x"
- }
- },
- "node_modules/react-player": {
- "version": "2.16.0",
- "resolved": "https://registry.npmjs.org/react-player/-/react-player-2.16.0.tgz",
- "integrity": "sha512-mAIPHfioD7yxO0GNYVFD1303QFtI3lyyQZLY229UEAp/a10cSW+hPcakg0Keq8uWJxT2OiT/4Gt+Lc9bD6bJmQ==",
- "dependencies": {
- "deepmerge": "^4.0.0",
- "load-script": "^1.0.0",
- "memoize-one": "^5.1.1",
- "prop-types": "^15.7.2",
- "react-fast-compare": "^3.0.1"
- },
- "peerDependencies": {
- "react": ">=16.6.0"
- }
- },
- "node_modules/react-router": {
- "version": "5.3.4",
- "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz",
- "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==",
- "dependencies": {
- "@babel/runtime": "^7.12.13",
- "history": "^4.9.0",
- "hoist-non-react-statics": "^3.1.0",
- "loose-envify": "^1.3.1",
- "path-to-regexp": "^1.7.0",
- "prop-types": "^15.6.2",
- "react-is": "^16.6.0",
- "tiny-invariant": "^1.0.2",
- "tiny-warning": "^1.0.0"
- },
- "peerDependencies": {
- "react": ">=15"
- }
- },
- "node_modules/react-router-config": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz",
- "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==",
- "dependencies": {
- "@babel/runtime": "^7.1.2"
- },
- "peerDependencies": {
- "react": ">=15",
- "react-router": ">=5"
- }
- },
- "node_modules/react-router-dom": {
- "version": "5.3.4",
- "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz",
- "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==",
- "dependencies": {
- "@babel/runtime": "^7.12.13",
- "history": "^4.9.0",
- "loose-envify": "^1.3.1",
- "prop-types": "^15.6.2",
- "react-router": "5.3.4",
- "tiny-invariant": "^1.0.2",
- "tiny-warning": "^1.0.0"
- },
- "peerDependencies": {
- "react": ">=15"
- }
- },
- "node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
- "dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dependencies": {
- "picomatch": "^2.2.1"
- },
- "engines": {
- "node": ">=8.10.0"
- }
- },
- "node_modules/reading-time": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz",
- "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg=="
- },
- "node_modules/rechoir": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
- "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==",
- "dependencies": {
- "resolve": "^1.1.6"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/recursive-readdir": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz",
- "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==",
- "dependencies": {
- "minimatch": "^3.0.5"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/regenerate": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
- "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="
- },
- "node_modules/regenerate-unicode-properties": {
- "version": "10.1.1",
- "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz",
- "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==",
- "dependencies": {
- "regenerate": "^1.4.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/regenerator-runtime": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz",
- "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA=="
- },
- "node_modules/regenerator-transform": {
- "version": "0.15.2",
- "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
- "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
- "dependencies": {
- "@babel/runtime": "^7.8.4"
- }
- },
- "node_modules/regexpu-core": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz",
- "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==",
- "dependencies": {
- "@babel/regjsgen": "^0.8.0",
- "regenerate": "^1.4.2",
- "regenerate-unicode-properties": "^10.1.0",
- "regjsparser": "^0.9.1",
- "unicode-match-property-ecmascript": "^2.0.0",
- "unicode-match-property-value-ecmascript": "^2.1.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/registry-auth-token": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz",
- "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==",
- "dependencies": {
- "@pnpm/npm-conf": "^2.1.0"
- },
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/registry-url": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz",
- "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==",
- "dependencies": {
- "rc": "1.2.8"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/regjsparser": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
- "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
- "dependencies": {
- "jsesc": "~0.5.0"
- },
- "bin": {
- "regjsparser": "bin/parser"
- }
- },
- "node_modules/regjsparser/node_modules/jsesc": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
- "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
- "bin": {
- "jsesc": "bin/jsesc"
- }
- },
- "node_modules/rehype-raw": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz",
- "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==",
- "dependencies": {
- "@types/hast": "^3.0.0",
- "hast-util-raw": "^9.0.0",
- "vfile": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/relateurl": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
- "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/remark-directive": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.0.tgz",
- "integrity": "sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "mdast-util-directive": "^3.0.0",
- "micromark-extension-directive": "^3.0.0",
- "unified": "^11.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-emoji": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz",
- "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==",
- "dependencies": {
- "@types/mdast": "^4.0.2",
- "emoticon": "^4.0.1",
- "mdast-util-find-and-replace": "^3.0.1",
- "node-emoji": "^2.1.0",
- "unified": "^11.0.4"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- }
- },
- "node_modules/remark-frontmatter": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz",
- "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "mdast-util-frontmatter": "^2.0.0",
- "micromark-extension-frontmatter": "^2.0.0",
- "unified": "^11.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-gfm": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz",
- "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "mdast-util-gfm": "^3.0.0",
- "micromark-extension-gfm": "^3.0.0",
- "remark-parse": "^11.0.0",
- "remark-stringify": "^11.0.0",
- "unified": "^11.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-mdx": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.0.tgz",
- "integrity": "sha512-O7yfjuC6ra3NHPbRVxfflafAj3LTwx3b73aBvkEFU5z4PsD6FD4vrqJAkE5iNGLz71GdjXfgRqm3SQ0h0VuE7g==",
- "dependencies": {
- "mdast-util-mdx": "^3.0.0",
- "micromark-extension-mdxjs": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-parse": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz",
- "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "mdast-util-from-markdown": "^2.0.0",
- "micromark-util-types": "^2.0.0",
- "unified": "^11.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-rehype": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.0.0.tgz",
- "integrity": "sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw==",
- "dependencies": {
- "@types/hast": "^3.0.0",
- "@types/mdast": "^4.0.0",
- "mdast-util-to-hast": "^13.0.0",
- "unified": "^11.0.0",
- "vfile": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/remark-stringify": {
- "version": "11.0.0",
- "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz",
- "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==",
- "dependencies": {
- "@types/mdast": "^4.0.0",
- "mdast-util-to-markdown": "^2.0.0",
- "unified": "^11.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/renderkid": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz",
- "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==",
- "dependencies": {
- "css-select": "^4.1.3",
- "dom-converter": "^0.2.0",
- "htmlparser2": "^6.1.0",
- "lodash": "^4.17.21",
- "strip-ansi": "^6.0.1"
- }
- },
- "node_modules/renderkid/node_modules/css-select": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
- "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
- "dependencies": {
- "boolbase": "^1.0.0",
- "css-what": "^6.0.1",
- "domhandler": "^4.3.1",
- "domutils": "^2.8.0",
- "nth-check": "^2.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/fb55"
- }
- },
- "node_modules/renderkid/node_modules/dom-serializer": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
- "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
- "dependencies": {
- "domelementtype": "^2.0.1",
- "domhandler": "^4.2.0",
- "entities": "^2.0.0"
- },
- "funding": {
- "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
- }
- },
- "node_modules/renderkid/node_modules/domhandler": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
- "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
- "dependencies": {
- "domelementtype": "^2.2.0"
- },
- "engines": {
- "node": ">= 4"
- },
- "funding": {
- "url": "https://github.com/fb55/domhandler?sponsor=1"
- }
- },
- "node_modules/renderkid/node_modules/domutils": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
- "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
- "dependencies": {
- "dom-serializer": "^1.0.1",
- "domelementtype": "^2.2.0",
- "domhandler": "^4.2.0"
- },
- "funding": {
- "url": "https://github.com/fb55/domutils?sponsor=1"
- }
- },
- "node_modules/renderkid/node_modules/entities": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
- "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
- }
- },
- "node_modules/renderkid/node_modules/htmlparser2": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
- "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
- "funding": [
- "https://github.com/fb55/htmlparser2?sponsor=1",
- {
- "type": "github",
- "url": "https://github.com/sponsors/fb55"
- }
- ],
- "dependencies": {
- "domelementtype": "^2.0.1",
- "domhandler": "^4.0.0",
- "domutils": "^2.5.2",
- "entities": "^2.0.0"
- }
- },
- "node_modules/require-from-string": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
- "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/require-like": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz",
- "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/requires-port": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
- },
- "node_modules/resolve": {
- "version": "1.22.8",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
- "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
- "dependencies": {
- "is-core-module": "^2.13.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/resolve-alpn": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
- "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="
- },
- "node_modules/resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/resolve-pathname": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz",
- "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng=="
- },
- "node_modules/responselike": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz",
- "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==",
- "dependencies": {
- "lowercase-keys": "^3.0.0"
- },
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/retry": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
- "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
- }
- },
- "node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "deprecated": "Rimraf versions prior to v4 are no longer supported",
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/rtl-detect": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.1.2.tgz",
- "integrity": "sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ=="
- },
- "node_modules/rtlcss": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.1.1.tgz",
- "integrity": "sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==",
- "dependencies": {
- "escalade": "^3.1.1",
- "picocolors": "^1.0.0",
- "postcss": "^8.4.21",
- "strip-json-comments": "^3.1.1"
- },
- "bin": {
- "rtlcss": "bin/rtlcss.js"
- },
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "queue-microtask": "^1.2.2"
- }
- },
- "node_modules/safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
- },
- "node_modules/sass": {
- "version": "1.77.2",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.2.tgz",
- "integrity": "sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA==",
- "dependencies": {
- "chokidar": ">=3.0.0 <4.0.0",
- "immutable": "^4.0.0",
- "source-map-js": ">=0.6.2 <2.0.0"
- },
- "bin": {
- "sass": "sass.js"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/sass-loader": {
- "version": "10.5.2",
- "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.5.2.tgz",
- "integrity": "sha512-vMUoSNOUKJILHpcNCCyD23X34gve1TS7Rjd9uXHeKqhvBG39x6XbswFDtpbTElj6XdMFezoWhkh5vtKudf2cgQ==",
- "dependencies": {
- "klona": "^2.0.4",
- "loader-utils": "^2.0.0",
- "neo-async": "^2.6.2",
- "schema-utils": "^3.0.0",
- "semver": "^7.3.2"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "fibers": ">= 3.1.0",
- "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0",
- "sass": "^1.3.0",
- "webpack": "^4.36.0 || ^5.0.0"
- },
- "peerDependenciesMeta": {
- "fibers": {
- "optional": true
- },
- "node-sass": {
- "optional": true
- },
- "sass": {
- "optional": true
- }
- }
- },
- "node_modules/sass-loader/node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/sass-loader/node_modules/ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "peerDependencies": {
- "ajv": "^6.9.1"
- }
- },
- "node_modules/sass-loader/node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
- },
- "node_modules/sass-loader/node_modules/schema-utils": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
- "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
- "dependencies": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/sax": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz",
- "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA=="
- },
- "node_modules/scheduler": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
- "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
- "dependencies": {
- "loose-envify": "^1.1.0"
- }
- },
- "node_modules/schema-utils": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz",
- "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
- "dependencies": {
- "@types/json-schema": "^7.0.9",
- "ajv": "^8.9.0",
- "ajv-formats": "^2.1.1",
- "ajv-keywords": "^5.1.0"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/search-insights": {
- "version": "2.14.0",
- "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.14.0.tgz",
- "integrity": "sha512-OLN6MsPMCghDOqlCtsIsYgtsC0pnwVTyT9Mu6A3ewOj1DxvzZF6COrn2g86E/c05xbktB0XN04m/t1Z+n+fTGw==",
- "peer": true
- },
- "node_modules/section-matter": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz",
- "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==",
- "dependencies": {
- "extend-shallow": "^2.0.1",
- "kind-of": "^6.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/select-hose": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
- "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg=="
- },
- "node_modules/selfsigned": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz",
- "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==",
- "dependencies": {
- "@types/node-forge": "^1.3.0",
- "node-forge": "^1"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/semver-diff": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz",
- "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==",
- "dependencies": {
- "semver": "^7.3.5"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/semver/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/semver/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- },
- "node_modules/send": {
- "version": "0.18.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
- "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
- "dependencies": {
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "mime": "1.6.0",
- "ms": "2.1.3",
- "on-finished": "2.4.1",
- "range-parser": "~1.2.1",
- "statuses": "2.0.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/send/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/send/node_modules/debug/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- },
- "node_modules/send/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
- },
- "node_modules/send/node_modules/range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/serialize-javascript": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
- "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
- "dependencies": {
- "randombytes": "^2.1.0"
- }
- },
- "node_modules/serve-handler": {
- "version": "6.1.5",
- "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz",
- "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==",
- "dependencies": {
- "bytes": "3.0.0",
- "content-disposition": "0.5.2",
- "fast-url-parser": "1.1.3",
- "mime-types": "2.1.18",
- "minimatch": "3.1.2",
- "path-is-inside": "1.0.2",
- "path-to-regexp": "2.2.1",
- "range-parser": "1.2.0"
- }
- },
- "node_modules/serve-handler/node_modules/path-to-regexp": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz",
- "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ=="
- },
- "node_modules/serve-index": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
- "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
- "dependencies": {
- "accepts": "~1.3.4",
- "batch": "0.6.1",
- "debug": "2.6.9",
- "escape-html": "~1.0.3",
- "http-errors": "~1.6.2",
- "mime-types": "~2.1.17",
- "parseurl": "~1.3.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/serve-index/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/serve-index/node_modules/depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/serve-index/node_modules/http-errors": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
- "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
- "dependencies": {
- "depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.0",
- "statuses": ">= 1.4.0 < 2"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/serve-index/node_modules/inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw=="
- },
- "node_modules/serve-index/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- },
- "node_modules/serve-index/node_modules/setprototypeof": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
- "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
- },
- "node_modules/serve-index/node_modules/statuses": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/serve-static": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
- "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
- "dependencies": {
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.18.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/set-function-length": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz",
- "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==",
- "dependencies": {
- "define-data-property": "^1.1.1",
- "get-intrinsic": "^1.2.1",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
- },
- "node_modules/shallow-clone": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
- "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
- "dependencies": {
- "kind-of": "^6.0.2"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shallowequal": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
- "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
- },
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shell-quote": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz",
- "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/shelljs": {
- "version": "0.8.5",
- "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz",
- "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==",
- "dependencies": {
- "glob": "^7.0.0",
- "interpret": "^1.0.0",
- "rechoir": "^0.6.2"
- },
- "bin": {
- "shjs": "bin/shjs"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
- "dependencies": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
- },
- "node_modules/sirv": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz",
- "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==",
- "dependencies": {
- "@polka/url": "^1.0.0-next.20",
- "mrmime": "^1.0.0",
- "totalist": "^3.0.0"
- },
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/sisteransi": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
- "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="
- },
- "node_modules/sitemap": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz",
- "integrity": "sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==",
- "dependencies": {
- "@types/node": "^17.0.5",
- "@types/sax": "^1.2.1",
- "arg": "^5.0.0",
- "sax": "^1.2.4"
- },
- "bin": {
- "sitemap": "dist/cli.js"
- },
- "engines": {
- "node": ">=12.0.0",
- "npm": ">=5.6.0"
- }
- },
- "node_modules/sitemap/node_modules/@types/node": {
- "version": "17.0.45",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz",
- "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw=="
- },
- "node_modules/skin-tone": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz",
- "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==",
- "dependencies": {
- "unicode-emoji-modifier-base": "^1.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/snake-case": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz",
- "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==",
- "dependencies": {
- "dot-case": "^3.0.4",
- "tslib": "^2.0.3"
- }
- },
- "node_modules/sockjs": {
- "version": "0.3.24",
- "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
- "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
- "dependencies": {
- "faye-websocket": "^0.11.3",
- "uuid": "^8.3.2",
- "websocket-driver": "^0.7.4"
- }
- },
- "node_modules/sort-css-media-queries": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz",
- "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==",
- "engines": {
- "node": ">= 6.3.0"
- }
- },
- "node_modules/source-map": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
- "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/source-map-js": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
- "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "node_modules/source-map-support/node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/space-separated-tokens": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
- "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/spdy": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
- "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
- "dependencies": {
- "debug": "^4.1.0",
- "handle-thing": "^2.0.0",
- "http-deceiver": "^1.2.7",
- "select-hose": "^2.0.0",
- "spdy-transport": "^3.0.0"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/spdy-transport": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
- "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
- "dependencies": {
- "debug": "^4.1.0",
- "detect-node": "^2.0.4",
- "hpack.js": "^2.1.6",
- "obuf": "^1.1.2",
- "readable-stream": "^3.0.6",
- "wbuf": "^1.7.3"
- }
- },
- "node_modules/sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
- },
- "node_modules/srcset": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz",
- "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/std-env": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.5.0.tgz",
- "integrity": "sha512-JGUEaALvL0Mf6JCfYnJOTcobY+Nc7sG/TemDRBqCA0wEr4DER7zDchaaixTlmOxAjG1uRJmX82EQcxwTQTkqVA=="
- },
- "node_modules/string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "dependencies": {
- "safe-buffer": "~5.2.0"
- }
- },
- "node_modules/string-width": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
- "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
- "dependencies": {
- "eastasianwidth": "^0.2.0",
- "emoji-regex": "^9.2.2",
- "strip-ansi": "^7.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/string-width/node_modules/ansi-regex": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
- "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
- }
- },
- "node_modules/string-width/node_modules/strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
- "dependencies": {
- "ansi-regex": "^6.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
- }
- },
- "node_modules/stringify-entities": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.3.tgz",
- "integrity": "sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==",
- "dependencies": {
- "character-entities-html4": "^2.0.0",
- "character-entities-legacy": "^3.0.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/stringify-object": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
- "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
- "dependencies": {
- "get-own-enumerable-property-symbols": "^3.0.0",
- "is-obj": "^1.0.1",
- "is-regexp": "^1.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-bom-string": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz",
- "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/strip-final-newline": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
- "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/style-to-object": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz",
- "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==",
- "dependencies": {
- "inline-style-parser": "0.1.1"
- }
- },
- "node_modules/stylehacks": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz",
- "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==",
- "dependencies": {
- "browserslist": "^4.23.0",
- "postcss-selector-parser": "^6.0.16"
- },
- "engines": {
- "node": "^14 || ^16 || >=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/svg-parser": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz",
- "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ=="
- },
- "node_modules/svgo": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.0.tgz",
- "integrity": "sha512-y350OL6eAmhDbWcASdukXoG0MbpdfJQPHwEUAaTW1HBNSO2VErJ35fs7uNLSWjzFDhfua517RcouBzjZoO1JFg==",
- "deprecated": "introduced breaking changes, reverted in v3.3.2",
- "dependencies": {
- "@trysound/sax": "0.2.0",
- "commander": "^7.2.0",
- "css-select": "^5.1.0",
- "css-tree": "^2.3.1",
- "css-what": "^6.1.0",
- "csso": "^5.0.5",
- "picocolors": "^1.0.0"
- },
- "bin": {
- "svgo": "bin/svgo.js"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/svgo"
- }
- },
- "node_modules/svgo/node_modules/commander": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
- "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/tapable": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
- "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/terser": {
- "version": "5.24.0",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz",
- "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==",
- "dependencies": {
- "@jridgewell/source-map": "^0.3.3",
- "acorn": "^8.8.2",
- "commander": "^2.20.0",
- "source-map-support": "~0.5.20"
- },
- "bin": {
- "terser": "bin/terser"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/terser-webpack-plugin": {
- "version": "5.3.9",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz",
- "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==",
- "dependencies": {
- "@jridgewell/trace-mapping": "^0.3.17",
- "jest-worker": "^27.4.5",
- "schema-utils": "^3.1.1",
- "serialize-javascript": "^6.0.1",
- "terser": "^5.16.8"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.1.0"
- },
- "peerDependenciesMeta": {
- "@swc/core": {
- "optional": true
- },
- "esbuild": {
- "optional": true
- },
- "uglify-js": {
- "optional": true
- }
- }
- },
- "node_modules/terser-webpack-plugin/node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "peerDependencies": {
- "ajv": "^6.9.1"
- }
- },
- "node_modules/terser-webpack-plugin/node_modules/jest-worker": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
- "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
- "dependencies": {
- "@types/node": "*",
- "merge-stream": "^2.0.0",
- "supports-color": "^8.0.0"
- },
- "engines": {
- "node": ">= 10.13.0"
- }
- },
- "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
- },
- "node_modules/terser-webpack-plugin/node_modules/schema-utils": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
- "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
- "dependencies": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/terser-webpack-plugin/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
- }
- },
- "node_modules/terser/node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
- },
- "node_modules/text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="
- },
- "node_modules/thunky": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
- "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA=="
- },
- "node_modules/tiny-invariant": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz",
- "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw=="
- },
- "node_modules/tiny-warning": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
- "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
- },
- "node_modules/to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/toidentifier": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/totalist": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz",
- "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/trim-lines": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
- "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/trough": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/trough/-/trough-2.1.0.tgz",
- "integrity": "sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
- },
- "node_modules/type-fest": {
- "version": "2.19.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
- "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
- "engines": {
- "node": ">=12.20"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/type-is": {
- "version": "1.6.18",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
- "dependencies": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/type-is/node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/type-is/node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/typedarray-to-buffer": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
- "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
- "dependencies": {
- "is-typedarray": "^1.0.0"
- }
- },
- "node_modules/typescript": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz",
- "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==",
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=14.17"
- }
- },
- "node_modules/undici-types": {
- "version": "5.26.5",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
- "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
- },
- "node_modules/unicode-canonical-property-names-ecmascript": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
- "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/unicode-emoji-modifier-base": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz",
- "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/unicode-match-property-ecmascript": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
- "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
- "dependencies": {
- "unicode-canonical-property-names-ecmascript": "^2.0.0",
- "unicode-property-aliases-ecmascript": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/unicode-match-property-value-ecmascript": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz",
- "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/unicode-property-aliases-ecmascript": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
- "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/unified": {
- "version": "11.0.4",
- "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz",
- "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "bail": "^2.0.0",
- "devlop": "^1.0.0",
- "extend": "^3.0.0",
- "is-plain-obj": "^4.0.0",
- "trough": "^2.0.0",
- "vfile": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unique-string": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz",
- "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==",
- "dependencies": {
- "crypto-random-string": "^4.0.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/unist-util-is": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
- "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==",
- "dependencies": {
- "@types/unist": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-position": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
- "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
- "dependencies": {
- "@types/unist": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-position-from-estree": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz",
- "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==",
- "dependencies": {
- "@types/unist": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-remove-position": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz",
- "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "unist-util-visit": "^5.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-stringify-position": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
- "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
- "dependencies": {
- "@types/unist": "^3.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-visit": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz",
- "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "unist-util-is": "^6.0.0",
- "unist-util-visit-parents": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/unist-util-visit-parents": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz",
- "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "unist-util-is": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/update-browserslist-db": {
- "version": "1.0.13",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
- "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "dependencies": {
- "escalade": "^3.1.1",
- "picocolors": "^1.0.0"
- },
- "bin": {
- "update-browserslist-db": "cli.js"
- },
- "peerDependencies": {
- "browserslist": ">= 4.21.0"
- }
- },
- "node_modules/update-notifier": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz",
- "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==",
- "dependencies": {
- "boxen": "^7.0.0",
- "chalk": "^5.0.1",
- "configstore": "^6.0.0",
- "has-yarn": "^3.0.0",
- "import-lazy": "^4.0.0",
- "is-ci": "^3.0.1",
- "is-installed-globally": "^0.4.0",
- "is-npm": "^6.0.0",
- "is-yarn-global": "^0.4.0",
- "latest-version": "^7.0.0",
- "pupa": "^3.1.0",
- "semver": "^7.3.7",
- "semver-diff": "^4.0.0",
- "xdg-basedir": "^5.1.0"
- },
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/yeoman/update-notifier?sponsor=1"
- }
- },
- "node_modules/update-notifier/node_modules/boxen": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz",
- "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==",
- "dependencies": {
- "ansi-align": "^3.0.1",
- "camelcase": "^7.0.1",
- "chalk": "^5.2.0",
- "cli-boxes": "^3.0.0",
- "string-width": "^5.1.2",
- "type-fest": "^2.13.0",
- "widest-line": "^4.0.1",
- "wrap-ansi": "^8.1.0"
- },
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/update-notifier/node_modules/camelcase": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz",
- "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==",
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/update-notifier/node_modules/chalk": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz",
- "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==",
- "engines": {
- "node": "^12.17.0 || ^14.13 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "dependencies": {
- "punycode": "^2.1.0"
- }
- },
- "node_modules/uri-js/node_modules/punycode": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
- "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/url-loader": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz",
- "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==",
- "dependencies": {
- "loader-utils": "^2.0.0",
- "mime-types": "^2.1.27",
- "schema-utils": "^3.0.0"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "file-loader": "*",
- "webpack": "^4.0.0 || ^5.0.0"
- },
- "peerDependenciesMeta": {
- "file-loader": {
- "optional": true
- }
- }
- },
- "node_modules/url-loader/node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/url-loader/node_modules/ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "peerDependencies": {
- "ajv": "^6.9.1"
- }
- },
- "node_modules/url-loader/node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
- },
- "node_modules/url-loader/node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/url-loader/node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/url-loader/node_modules/schema-utils": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
- "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
- "dependencies": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
- },
- "node_modules/utila": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
- "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA=="
- },
- "node_modules/utility-types": {
- "version": "3.10.0",
- "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz",
- "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
- "node_modules/value-equal": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz",
- "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw=="
- },
- "node_modules/vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/vfile": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz",
- "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "unist-util-stringify-position": "^4.0.0",
- "vfile-message": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/vfile-location": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz",
- "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "vfile": "^6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/vfile-message": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz",
- "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==",
- "dependencies": {
- "@types/unist": "^3.0.0",
- "unist-util-stringify-position": "^4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/unified"
- }
- },
- "node_modules/watchpack": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
- "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
- "dependencies": {
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.1.2"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/wbuf": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
- "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
- "dependencies": {
- "minimalistic-assert": "^1.0.0"
- }
- },
- "node_modules/web-namespaces": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz",
- "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/webpack": {
- "version": "5.89.0",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz",
- "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==",
- "dependencies": {
- "@types/eslint-scope": "^3.7.3",
- "@types/estree": "^1.0.0",
- "@webassemblyjs/ast": "^1.11.5",
- "@webassemblyjs/wasm-edit": "^1.11.5",
- "@webassemblyjs/wasm-parser": "^1.11.5",
- "acorn": "^8.7.1",
- "acorn-import-assertions": "^1.9.0",
- "browserslist": "^4.14.5",
- "chrome-trace-event": "^1.0.2",
- "enhanced-resolve": "^5.15.0",
- "es-module-lexer": "^1.2.1",
- "eslint-scope": "5.1.1",
- "events": "^3.2.0",
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.2.9",
- "json-parse-even-better-errors": "^2.3.1",
- "loader-runner": "^4.2.0",
- "mime-types": "^2.1.27",
- "neo-async": "^2.6.2",
- "schema-utils": "^3.2.0",
- "tapable": "^2.1.1",
- "terser-webpack-plugin": "^5.3.7",
- "watchpack": "^2.4.0",
- "webpack-sources": "^3.2.3"
- },
- "bin": {
- "webpack": "bin/webpack.js"
- },
- "engines": {
- "node": ">=10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependenciesMeta": {
- "webpack-cli": {
- "optional": true
- }
- }
- },
- "node_modules/webpack-bundle-analyzer": {
- "version": "4.10.1",
- "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz",
- "integrity": "sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==",
- "dependencies": {
- "@discoveryjs/json-ext": "0.5.7",
- "acorn": "^8.0.4",
- "acorn-walk": "^8.0.0",
- "commander": "^7.2.0",
- "debounce": "^1.2.1",
- "escape-string-regexp": "^4.0.0",
- "gzip-size": "^6.0.0",
- "html-escaper": "^2.0.2",
- "is-plain-object": "^5.0.0",
- "opener": "^1.5.2",
- "picocolors": "^1.0.0",
- "sirv": "^2.0.3",
- "ws": "^7.3.1"
- },
- "bin": {
- "webpack-bundle-analyzer": "lib/bin/analyzer.js"
- },
- "engines": {
- "node": ">= 10.13.0"
- }
- },
- "node_modules/webpack-bundle-analyzer/node_modules/commander": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
- "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/webpack-dev-middleware": {
- "version": "5.3.3",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz",
- "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==",
- "dependencies": {
- "colorette": "^2.0.10",
- "memfs": "^3.4.3",
- "mime-types": "^2.1.31",
- "range-parser": "^1.2.1",
- "schema-utils": "^4.0.0"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^4.0.0 || ^5.0.0"
- }
- },
- "node_modules/webpack-dev-middleware/node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/webpack-dev-middleware/node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/webpack-dev-middleware/node_modules/range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/webpack-dev-server": {
- "version": "4.15.1",
- "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz",
- "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==",
- "dependencies": {
- "@types/bonjour": "^3.5.9",
- "@types/connect-history-api-fallback": "^1.3.5",
- "@types/express": "^4.17.13",
- "@types/serve-index": "^1.9.1",
- "@types/serve-static": "^1.13.10",
- "@types/sockjs": "^0.3.33",
- "@types/ws": "^8.5.5",
- "ansi-html-community": "^0.0.8",
- "bonjour-service": "^1.0.11",
- "chokidar": "^3.5.3",
- "colorette": "^2.0.10",
- "compression": "^1.7.4",
- "connect-history-api-fallback": "^2.0.0",
- "default-gateway": "^6.0.3",
- "express": "^4.17.3",
- "graceful-fs": "^4.2.6",
- "html-entities": "^2.3.2",
- "http-proxy-middleware": "^2.0.3",
- "ipaddr.js": "^2.0.1",
- "launch-editor": "^2.6.0",
- "open": "^8.0.9",
- "p-retry": "^4.5.0",
- "rimraf": "^3.0.2",
- "schema-utils": "^4.0.0",
- "selfsigned": "^2.1.1",
- "serve-index": "^1.9.1",
- "sockjs": "^0.3.24",
- "spdy": "^4.0.2",
- "webpack-dev-middleware": "^5.3.1",
- "ws": "^8.13.0"
- },
- "bin": {
- "webpack-dev-server": "bin/webpack-dev-server.js"
- },
- "engines": {
- "node": ">= 12.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^4.37.0 || ^5.0.0"
- },
- "peerDependenciesMeta": {
- "webpack": {
- "optional": true
- },
- "webpack-cli": {
- "optional": true
- }
- }
- },
- "node_modules/webpack-dev-server/node_modules/ws": {
- "version": "8.14.2",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz",
- "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==",
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": ">=5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- },
- "node_modules/webpack-merge": {
- "version": "5.10.0",
- "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz",
- "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==",
- "dependencies": {
- "clone-deep": "^4.0.1",
- "flat": "^5.0.2",
- "wildcard": "^2.0.0"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/webpack-sources": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
- "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/webpack/node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/webpack/node_modules/ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "peerDependencies": {
- "ajv": "^6.9.1"
- }
- },
- "node_modules/webpack/node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
- },
- "node_modules/webpack/node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/webpack/node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/webpack/node_modules/schema-utils": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
- "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
- "dependencies": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/webpackbar": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz",
- "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==",
- "dependencies": {
- "chalk": "^4.1.0",
- "consola": "^2.15.3",
- "pretty-time": "^1.1.0",
- "std-env": "^3.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "peerDependencies": {
- "webpack": "3 || 4 || 5"
- }
- },
- "node_modules/websocket-driver": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
- "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
- "dependencies": {
- "http-parser-js": ">=0.5.1",
- "safe-buffer": ">=5.1.0",
- "websocket-extensions": ">=0.1.1"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/websocket-extensions": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
- "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/widest-line": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz",
- "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==",
- "dependencies": {
- "string-width": "^5.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/wildcard": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz",
- "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ=="
- },
- "node_modules/wrap-ansi": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
- "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
- "dependencies": {
- "ansi-styles": "^6.1.0",
- "string-width": "^5.0.1",
- "strip-ansi": "^7.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/wrap-ansi/node_modules/ansi-regex": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
- "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
- }
- },
- "node_modules/wrap-ansi/node_modules/ansi-styles": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
- "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/wrap-ansi/node_modules/strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
- "dependencies": {
- "ansi-regex": "^6.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
- }
- },
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
- },
- "node_modules/write-file-atomic": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
- "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
- "dependencies": {
- "imurmurhash": "^0.1.4",
- "is-typedarray": "^1.0.0",
- "signal-exit": "^3.0.2",
- "typedarray-to-buffer": "^3.1.5"
- }
- },
- "node_modules/ws": {
- "version": "7.5.9",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
- "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
- "engines": {
- "node": ">=8.3.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": "^5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- },
- "node_modules/xdg-basedir": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz",
- "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/xml-js": {
- "version": "1.6.11",
- "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz",
- "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==",
- "dependencies": {
- "sax": "^1.2.4"
- },
- "bin": {
- "xml-js": "bin/cli.js"
- }
- },
- "node_modules/yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
- },
- "node_modules/yaml": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
- "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/yocto-queue": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz",
- "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==",
- "engines": {
- "node": ">=12.20"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/zwitch": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
- "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- }
- }
-}
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index babf9cd4fe..db7f237817 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -294,7 +294,12 @@ function orderedSegments($: cheerio.CheerioAPI, el: any): string[] {
const wrap = $("");
for (const nd of pending) wrap.append($(nd).clone());
const t = inlineText($, wrap[0]);
- if (t) segs.push(t);
+ // Returning a wrapper's bare text children surfaced SSR loading placeholders
+ // - "Loading features..." is what FeatureList renders before it hydrates, so
+ // nine label-definitions pages started asserting that where their feature
+ // tables should be. Matched narrowly: "Loading" plus a trailing ellipsis, so
+ // real prose that merely starts with the word survives.
+ if (t && !/^loading\b.{0,40}(\.{2,}|\u2026)$/i.test(t)) segs.push(t);
pending = [];
};
const isBlockTag = (tag: string, node: any) =>
@@ -686,26 +691,33 @@ function contributingFiles(siteDir: string, pathname: string): string[] {
continue;
}
const dir = path.posix.dirname(rel.split(path.sep).join("/"));
- // Follow partials AND local components: the nine agent-skills pages are
- // shells around @site/src/components/SkillsPage, whose prose lives in the
- // component - so editing it changes what those pages say. Same staleness the
- // partial-following fixes, one directory over. gitDates covers src/ for this.
- const re = /from\s+['"]([^'"]*(?:partials\/|@site\/src\/components\/)[^'"]+)['"]/g;
+ // Match EVERY import spec and decide by where it RESOLVES, rather than by
+ // pattern. Matching only `partials/` and `@site/src/components/` stopped one
+ // hop short of the prose it was added for: it reached SkillsPage/index.tsx
+ // but not the src/data/skills.json that page renders, so adding a skill would
+ // change what nine pages say and move none of their dates. Package imports
+ // (react, @docusaurus/...) resolve outside docs/ and src/ and are dropped by
+ // the filter below, so widening the match costs nothing.
+ const re = /from\s+['"]([^'"]+)['"]/g;
let m: RegExpExecArray | null;
while ((m = re.exec(body))) {
const spec = m[1].replace(/^@site\//, "");
+ // A bare package name has no path shape; only relative and @site specs can
+ // point at repo files.
+ if (!spec.startsWith(".") && !spec.startsWith("docs/") && !spec.startsWith("src/")) continue;
const resolved =
spec.startsWith("docs/") || spec.startsWith("src/")
? spec
: path.posix.normalize(path.posix.join(dir, spec));
if (!resolved.startsWith("docs/") && !resolved.startsWith("src/")) continue;
- const withExt = /\.(mdx?|tsx?|jsx?)$/.test(resolved)
+ const withExt = /\.(mdx?|tsx?|jsx?|json)$/.test(resolved)
? [resolved]
: [
`${resolved}.mdx`,
`${resolved}.md`,
`${resolved}.tsx`,
`${resolved}.ts`,
+ `${resolved}.json`,
`${resolved}/index.tsx`,
`${resolved}/index.ts`,
];
@@ -900,7 +912,11 @@ function toIndexRecord(m: KModule) {
// real newlines in code samples made it more likely, not less (measured 693
// -> 783 records). Cut at the last safe point instead.
docs_excerpt: clipMarkdown(m.content.docs_markdown, 400),
- assistant_excerpt: m.content.assistant_context.slice(0, 300),
+ // Same treatment as docs_excerpt directly above. Applying clipMarkdown to one
+ // and leaving its sibling on a hard slice left 466 records handing an
+ // assistant raw code with a dangling ``` - the identical defect, on the other
+ // published text field of the same record.
+ assistant_excerpt: clipMarkdown(m.content.assistant_context, 300),
url: m.metadata.url,
heading: m.metadata.heading,
framework: m.metadata.framework,
From 4b71a6740c2c142668e97e7d93f576dd0696445c Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Fri, 4 Sep 2026 14:13:07 +0100
Subject: [PATCH 16/53] fix(knowledge-extractor): the assistant excerpt kept
its content; real tables
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Round 6. The MEDIUM was mine again, and it was the round-5 fix eating the field
it was meant to repair.
assistant_context is " + \n\n + ", and the
boilerplate alone is typically 200-270 of the 300-char budget. Clipping the WHOLE
string at a fence boundary therefore discarded the chunk and left the template -
448 records lost their entire content preview, taking boilerplate-only records
from 39 to 487. The limit/3 "don't throw away almost everything" guard never
fired, because the boilerplate satisfied it by itself. Now the CHUNK is clipped to
its own budget and the prefix is left alone: 487 -> 0 boilerplate-only, still 0
dangling fences. The field averages 515 chars rather than ~300, which is the
point of it existing; index 9.9 -> 11.1 MB against the 14 MB soft cap.
Tables were not markdown. 595 chunks shipped a `| … |` table and none had a
`|---|` delimiter row, so to any parser they are a run of literal pipe lines with
the header indistinguishable from the data. The delimiter is emitted after the
header now, and `|` inside a cell is escaped - it would otherwise end the cell.
505 of 515 table chunks carry it; the remaining 10 are tables whose header sits
in a neighbouring chunk or past the excerpt cut, not a formatting failure.
The placeholder filter guarded only one of two push sites. It worked purely
because FeatureList happens to use a , which recurses back through the
inline path - a , or any sibling element beside the text, and "Loading
features..." would be published as documentation again. Named the test once and
applied it at both sites.
The import-candidate list omitted .js/.jsx while the has-extension test in the
same expression accepted them, so an extension-less import of one of the ~40
JS components in src/ was silently not followed - quietly reintroducing the
shell-staleness contributingFiles exists to prevent.
The fail-loud guard only caught TOTAL failure. Realistic selector drift is
partial: `!root.length` and `!bodyMd.trim()` skip a page without counting as an
error, so a theme upgrade that broke most page types would publish a tenth of the
corpus over a green build. Now also throws when fewer than half of the candidate
HTML files produce content. Measured against files.length deliberately, not
against a counter taken after the selector check - drift makes that counter fall
with the result, so the ratio would stay at 1 and prove nothing. ~13% of files
are legitimately skipped (redirect stubs, homepage), so today's ratio is ~0.87.
The gold set was scoring a correct answer as a miss: "data matrix" rejected
/symbology-properties/ while "supported symbologies" two lines above accepts it
for the same content. That spent CI headroom on bookkeeping rather than
retrieval. Evals now: success@3 0.95, precision@3 0.90, MRR 0.95 (floors
0.8/0.6/0.6) - best of the six rounds.
NOT FIXED, and worth its own work rather than a patch here: the ten
label-definitions chunks still promise a table they cannot deliver ("There are
two types of custom fields you can define:" followed by nothing), because
FeatureList renders client-side and the real tables are never in the SSR HTML.
That also means readers without JS - and every crawler - see the same nothing.
The fix is to server-render FeatureList from src/data/features.json, which is a
docs change, not an extractor one.
Verified: tsc reports no errors in the file; 4703 modules from 616 pages, 0 page
errors; 0 dangling fences in either published field; 0 boilerplate-only records;
0 placeholders; index 11.1 MB / graph 12.4 MB within budget.
Co-Authored-By: Claude Opus 5 (1M context)
---
scripts/retrieval-evals/gold-set.json | 2 +-
src/plugins/knowledge-extractor/index.ts | 94 ++++++++++++++++++++----
2 files changed, 80 insertions(+), 16 deletions(-)
diff --git a/scripts/retrieval-evals/gold-set.json b/scripts/retrieval-evals/gold-set.json
index 7743f6cda2..123e952e46 100644
--- a/scripts/retrieval-evals/gold-set.json
+++ b/scripts/retrieval-evals/gold-set.json
@@ -16,7 +16,7 @@
{ "query": "how to initialize data capture context", "expect": ["/add-sdk", "/get-started"] },
{ "query": "supported symbologies", "expect": ["barcode-symbologies", "symbology-properties"] },
{ "query": "qr code scanning", "expect": ["barcode-symbologies", "/barcode-capture/"] },
- { "query": "data matrix", "expect": ["barcode-symbologies"] },
+ { "query": "data matrix", "expect": ["barcode-symbologies", "symbology-properties"] },
{ "query": "ai powered barcode scanning", "expect": ["ai-powered-barcode-scanning"] },
{ "query": "scandit express inventory count", "expect": ["/express/", "inventory-count"] },
{ "query": "release notes", "expect": ["/release-notes"] },
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index db7f237817..4c5eb76b34 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -67,6 +67,19 @@ function clipMarkdown(text: string, limit: number): string {
return `${cut.trimEnd()}\n\u0060\u0060\u0060`;
}
+/**
+ * `assistant_context` with its chunk clipped fence-safely, and its boilerplate
+ * prefix left alone. Splitting on the chunk rather than on a character count is
+ * what stops the clip from eating all the content.
+ */
+const ASSISTANT_CHUNK_CHARS = 300;
+function assistantExcerpt(assistantContext: string, chunk: string): string {
+ const at = chunk ? assistantContext.lastIndexOf(chunk) : -1;
+ if (at < 0) return clipMarkdown(assistantContext, ASSISTANT_CHUNK_CHARS);
+ const prefix = assistantContext.slice(0, at);
+ return `${prefix}${clipMarkdown(chunk, ASSISTANT_CHUNK_CHARS)}`;
+}
+
function slug(value: string): string {
const clean = String(value)
.toLowerCase()
@@ -256,14 +269,24 @@ function inlineText($: cheerio.CheerioAPI, el: any): string {
function tableToMd($: cheerio.CheerioAPI, el: any): string {
const rows: string[] = [];
+ let width = 0;
$(el)
.find("tr")
.each((_i, tr) => {
const cells: string[] = [];
$(tr)
.children("th,td")
- .each((_j, c) => cells.push(inlineText($, c)));
- if (cells.length) rows.push(`| ${cells.join(" | ")} |`);
+ // A literal | inside a cell ends the cell for any markdown parser.
+ .each((_j, c) => cells.push(inlineText($, c).replace(/\|/g, "\\|")));
+ if (!cells.length) return;
+ rows.push(`| ${cells.join(" | ")} |`);
+ // Without the delimiter row after the header, none of this is a table to a
+ // markdown parser - it is a run of literal pipe lines, and the header is
+ // indistinguishable from data. 595 chunks shipped tables; none had one.
+ if (rows.length === 1) {
+ width = cells.length;
+ rows.push(`|${" --- |".repeat(width)}`);
+ }
});
return rows.join("\n");
}
@@ -286,6 +309,17 @@ function tableToMd($: cheerio.CheerioAPI, el: any): string {
* not hoisted above it, and a text node that CONTINUES a sentence across an
* inline element stays in the same segment instead of becoming its own paragraph.
*/
+/**
+ * SSR loading placeholders are not documentation. FeatureList renders
+ * "Loading features..." before it hydrates, and a walk that returns bare text
+ * children publishes it. Matched narrowly - the word plus a trailing ellipsis -
+ * so prose that merely begins with "Loading" survives ("Loading Dialog",
+ * `setProgressBarMessage("Loading ...")` and the like all stay).
+ */
+function isLoadingPlaceholder(text: string): boolean {
+ return /^loading\b.{0,40}(\.{2,}|\u2026)$/i.test(text.trim());
+}
+
function orderedSegments($: cheerio.CheerioAPI, el: any): string[] {
const segs: string[] = [];
let pending: any[] = [];
@@ -294,12 +328,7 @@ function orderedSegments($: cheerio.CheerioAPI, el: any): string[] {
const wrap = $("");
for (const nd of pending) wrap.append($(nd).clone());
const t = inlineText($, wrap[0]);
- // Returning a wrapper's bare text children surfaced SSR loading placeholders
- // - "Loading features..." is what FeatureList renders before it hydrates, so
- // nine label-definitions pages started asserting that where their feature
- // tables should be. Matched narrowly: "Loading" plus a trailing ellipsis, so
- // real prose that merely starts with the word survives.
- if (t && !/^loading\b.{0,40}(\.{2,}|\u2026)$/i.test(t)) segs.push(t);
+ if (t && !isLoadingPlaceholder(t)) segs.push(t);
pending = [];
};
const isBlockTag = (tag: string, node: any) =>
@@ -332,7 +361,10 @@ function orderedSegments($: cheerio.CheerioAPI, el: any): string[] {
}
flush();
const sub = blockToMd($, c);
- if (sub.trim()) segs.push(sub.trim());
+ // Guarded here as well: it worked only because FeatureList happens to use a
+ // , which recurses back through the inline path. A , or anything
+ // beside the text, and the placeholder was published again.
+ if (sub.trim() && !isLoadingPlaceholder(sub)) segs.push(sub.trim());
});
flush();
return segs;
@@ -710,16 +742,24 @@ function contributingFiles(siteDir: string, pathname: string): string[] {
? spec
: path.posix.normalize(path.posix.join(dir, spec));
if (!resolved.startsWith("docs/") && !resolved.startsWith("src/")) continue;
- const withExt = /\.(mdx?|tsx?|jsx?|json)$/.test(resolved)
+ // The has-extension test accepts jsx? but the candidate list did not offer
+ // it, so an extension-less import of a .js/.jsx component - there are ~40
+ // in src/ - was silently not followed, which would quietly reintroduce the
+ // shell-staleness this function exists to prevent.
+ const withExt = /\.(mdx?|[tj]sx?|json)$/.test(resolved)
? [resolved]
: [
`${resolved}.mdx`,
`${resolved}.md`,
`${resolved}.tsx`,
`${resolved}.ts`,
+ `${resolved}.jsx`,
+ `${resolved}.js`,
`${resolved}.json`,
`${resolved}/index.tsx`,
`${resolved}/index.ts`,
+ `${resolved}/index.jsx`,
+ `${resolved}/index.js`,
];
for (const cand of withExt) {
if (seen.has(cand)) continue;
@@ -912,11 +952,15 @@ function toIndexRecord(m: KModule) {
// real newlines in code samples made it more likely, not less (measured 693
// -> 783 records). Cut at the last safe point instead.
docs_excerpt: clipMarkdown(m.content.docs_markdown, 400),
- // Same treatment as docs_excerpt directly above. Applying clipMarkdown to one
- // and leaving its sibling on a hard slice left 466 records handing an
- // assistant raw code with a dangling ``` - the identical defect, on the other
- // published text field of the same record.
- assistant_excerpt: clipMarkdown(m.content.assistant_context, 300),
+ // assistant_context is " + \n\n + ", and
+ // the boilerplate alone is typically 200-270 of a 300-char budget. Clipping
+ // the WHOLE string at a fence boundary therefore threw the chunk away and
+ // left the template - 448 records lost their entire content preview, and the
+ // limit/3 "don't discard everything" guard never fired because the
+ // boilerplate satisfied it by itself. So clip the CHUNK to its own budget and
+ // keep the prefix intact: the field is a bit longer than before, and actually
+ // carries page content, which is the only reason it exists.
+ assistant_excerpt: assistantExcerpt(m.content.assistant_context, m.content.docs_markdown),
url: m.metadata.url,
heading: m.metadata.heading,
framework: m.metadata.framework,
@@ -1196,6 +1240,26 @@ export default function knowledgeExtractor(context: any, _options: any) {
);
}
+ // The guard above only catches TOTAL failure. Realistic selector drift is
+ // partial: a theme upgrade breaks most page types, `!root.length` and
+ // `!bodyMd.trim()` skip them without counting as errors, and a tenth of the
+ // corpus is published over a green build. So require most eligible pages to
+ // have produced something. Threshold is deliberately loose - this must fire
+ // on drift, never on a normal day.
+ // Measured against files.length, NOT against a count taken after the
+ // selector check: drift makes that counter fall with the result, so the
+ // ratio would stay at 1 and prove nothing. Roughly 13% of candidate files
+ // are legitimately skipped (redirect stubs and the homepage), so today's
+ // ratio is ~0.87 and 0.5 leaves wide headroom - this has to fire on drift
+ // and never on a normal day.
+ if (files.length > 0 && pagesProcessed / files.length < 0.5) {
+ throw new Error(
+ `[knowledge-extractor] only ${pagesProcessed} of ${files.length} HTML file(s) ` +
+ `produced content (${pageErrors} page error(s)). Page selectors likely drifted — ` +
+ `refusing to overwrite the AI-layer artifacts with a partial corpus.`,
+ );
+ }
+
const assetsDir = path.join(outDir, "assets");
fs.mkdirSync(assetsDir, { recursive: true });
const idxPath = path.join(assetsDir, "knowledge-retrieval-index.json");
From c1ed3bce3cfbc307baa9d8923176c1ab95b1808d Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Fri, 4 Sep 2026 14:36:16 +0100
Subject: [PATCH 17/53] fix(knowledge-extractor): label tabbed variants; stop
publishing 404 links
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Round 7. Neither MEDIUM was a regression from my earlier commits - both were in
the PR from the start, and the code-sample fix only made the first one visible.
TABBED CONTENT WAS PUBLISHED INTERLEAVED AND UNLABELLED. Docusaurus emits every
panel into the HTML - inactive ones only carry `hidden` - as a tablist of
labels followed by one panel per tab. With no handling for that, the tablist came
out as a detached bullet list ("- Gradle", "- Maven") and the panels ran together
as consecutive prose, so /sdks/android/add-sdk/ published the Gradle
build.gradle block immediately followed by "Add the mavenCentral repository in
pom.xml file:" with nothing tying either body to its label. 42 pages use tabs and
378 hidden elements' text was reaching the index, so an assistant answering "how
do I add the SDK on Android" could hand a Gradle user the Maven steps, or splice
the two.
Dropping the hidden panels would have fixed the splice by discarding half the
documentation, so each panel is now emitted under its own label instead, paired
positionally - the only association the markup offers. 21 chunks now carry
labelled variants, and the stray tablist bullet list is gone.
LINKS TO FILES WERE BEING SLASH-TERMINATED INTO 404s. Docusaurus routes end in
"/", but the asset filter only covered images and archives, so /llms.txt and the
generated /stable/c_api/*.html pages shipped as "/llms.txt/" and
"…struct_sc_symbology_settings.html/" - nine references that 404 for anyone who
follows them. Anything with a file extension in its last segment is now left as
written: 9 -> 0.
Also from round 7, all latent rather than live, and all one docs edit away from
mattering:
- The placeholder test was matching 40 arbitrary characters, and since the last
commit also applied it to whole blocks, a paragraph like "Loading the SDK
asynchronously..." would have been deleted silently. Narrowed to one or two
bare words and an ellipsis.
- tableToMd used find("tr"), which also collects a NESTED table's rows and
appends them to the outer table, and pinned the delimiter to the header's
width - so a header narrower than a body row would make a parser discard the
extra cells. Now scoped to this table's own row groups, and sized to the widest
row.
- The pipe escape ran over the whole serialized cell, including link targets, so
a URL containing a pipe became `[L](/a?x=1\|2)` - broken in any renderer.
Escaping now steps over `](…)`.
- assistantExcerpt dropped anything after the chunk. Empty today only because
assistant_context happens to END with the chunk, which nothing asserts; the
tail is re-appended so a future suffix cannot vanish unnoticed.
- A comment justified keeping curated fields out of assistant_context with "the
index only ships a 300-char assistant_excerpt". After the last commit that is
false (avg 515). Corrected, so the decision gets re-derived rather than read
from a stale premise.
Verified: tsc reports no errors in the file; 4704 modules from 616 pages, 0 page
errors; 0 file links with a trailing slash; 0 escaped pipes inside a link target;
0 dangling fences in either published field; 0 placeholders; index 11.09 MB /
graph 12.41 MB within the 14/16 budgets. Evals hold at their best: success@3
0.95, precision@3 0.90, MRR 0.95 (floors 0.8/0.6/0.6), one remaining miss
("qr code scanning") which predates this work.
Co-Authored-By: Claude Opus 5 (1M context)
---
src/plugins/knowledge-extractor/index.ts | 131 ++++++++++++++++++-----
1 file changed, 106 insertions(+), 25 deletions(-)
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index 4c5eb76b34..54355bafb5 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -77,7 +77,32 @@ function assistantExcerpt(assistantContext: string, chunk: string): string {
const at = chunk ? assistantContext.lastIndexOf(chunk) : -1;
if (at < 0) return clipMarkdown(assistantContext, ASSISTANT_CHUNK_CHARS);
const prefix = assistantContext.slice(0, at);
- return `${prefix}${clipMarkdown(chunk, ASSISTANT_CHUNK_CHARS)}`;
+ // The tail is empty today because assistant_context ENDS with the chunk, but
+ // nothing asserts that. Re-appending it costs nothing and means a future
+ // suffix - the curated user_intents/not_for that a comment below contemplates
+ // inlining - cannot silently vanish from the published field.
+ const tail = assistantContext.slice(at + chunk.length);
+ return `${prefix}${clipMarkdown(chunk, ASSISTANT_CHUNK_CHARS)}${tail}`;
+}
+
+/**
+ * Escape `|` in a table cell, which would otherwise end the cell - but never
+ * inside a markdown link target, where a backslash breaks the URL instead.
+ * inlineText() has already produced `[label](href)` by this point, so the target
+ * has to be stepped over rather than escaped.
+ */
+function escapeCell(text: string): string {
+ const out: string[] = [];
+ let i = 0;
+ const re = /\]\(([^)]*)\)/g;
+ let m: RegExpExecArray | null;
+ while ((m = re.exec(text))) {
+ out.push(text.slice(i, m.index).replace(/\|/g, "\\|"));
+ out.push(m[0]); // ](href) verbatim
+ i = m.index + m[0].length;
+ }
+ out.push(text.slice(i).replace(/\|/g, "\\|"));
+ return out.join("");
}
function slug(value: string): string {
@@ -268,27 +293,30 @@ function inlineText($: cheerio.CheerioAPI, el: any): string {
}
function tableToMd($: cheerio.CheerioAPI, el: any): string {
- const rows: string[] = [];
- let width = 0;
- $(el)
- .find("tr")
- .each((_i, tr) => {
- const cells: string[] = [];
- $(tr)
- .children("th,td")
- // A literal | inside a cell ends the cell for any markdown parser.
- .each((_j, c) => cells.push(inlineText($, c).replace(/\|/g, "\\|")));
- if (!cells.length) return;
- rows.push(`| ${cells.join(" | ")} |`);
- // Without the delimiter row after the header, none of this is a table to a
- // markdown parser - it is a run of literal pipe lines, and the header is
- // indistinguishable from data. 595 chunks shipped tables; none had one.
- if (rows.length === 1) {
- width = cells.length;
- rows.push(`|${" --- |".repeat(width)}`);
- }
- });
- return rows.join("\n");
+ // Scoped to THIS table's own row groups: find("tr") also collects a nested
+ // table's rows and appends them as extra rows of the outer one.
+ const trs = $(el).children("thead,tbody,tfoot").children("tr");
+ const rows: string[][] = [];
+ (trs.length ? trs : $(el).children("tr")).each((_i, tr) => {
+ const cells: string[] = [];
+ $(tr)
+ .children("th,td")
+ .each((_j, c) => cells.push(escapeCell(inlineText($, c))));
+ if (cells.length) rows.push(cells);
+ });
+ if (!rows.length) return "";
+ // Widest row, not the header's width: a parser honours the delimiter, so a
+ // header narrower than a body row would silently DISCARD the extra cells.
+ const width = rows.reduce((w, r) => Math.max(w, r.length), 0);
+ const line = (cells: string[]) =>
+ `| ${cells.concat(Array(width - cells.length).fill("")).join(" | ")} |`;
+ const out = [line(rows[0])];
+ // Without a delimiter row after the header none of this is a table to a
+ // markdown parser - it is a run of literal pipe lines, with the header
+ // indistinguishable from the data. 595 chunks shipped tables; none had one.
+ out.push(`|${" --- |".repeat(width)}`);
+ for (const r of rows.slice(1)) out.push(line(r));
+ return out.join("\n");
}
/**
@@ -317,7 +345,12 @@ function tableToMd($: cheerio.CheerioAPI, el: any): string {
* `setProgressBarMessage("Loading ...")` and the like all stay).
*/
function isLoadingPlaceholder(text: string): boolean {
- return /^loading\b.{0,40}(\.{2,}|\u2026)$/i.test(text.trim());
+ // Deliberately narrow. The previous shape allowed 40 arbitrary characters, and
+ // once the test was also applied to whole blocks that meant a paragraph like
+ // "Loading the SDK asynchronously..." would be deleted silently, with no
+ // warning and no trace in the output. A placeholder is one or two bare words
+ // and an ellipsis; anything with more shape than that is prose.
+ return /^loading(\s+[a-z]+){1,2}\s*(\.{3}|\u2026)$/i.test(text.trim());
}
function orderedSegments($: cheerio.CheerioAPI, el: any): string[] {
@@ -370,8 +403,45 @@ function orderedSegments($: cheerio.CheerioAPI, el: any): string[] {
return segs;
}
+/**
+ * A Docusaurus block, rendered as its labelled variants.
+ *
+ * Docusaurus emits every panel into the HTML - the inactive ones only carry
+ * `hidden` - as a of labels followed by one
+ * per tab, in the same order. With no handling for that,
+ * the tablist came out as a detached bullet list ("- Gradle - Maven") and the
+ * panels ran together as consecutive prose, so /sdks/android/add-sdk/ published
+ * the Gradle build.gradle block immediately followed by "Add the mavenCentral
+ * repository in pom.xml file:" with nothing tying either body to its label. An
+ * assistant answering "how do I add the SDK on Android" could hand a Gradle user
+ * the Maven steps, or splice the two.
+ *
+ * Dropping the hidden panels would fix the splice by throwing away half the
+ * documentation, so instead each panel is emitted under its own label. Panels are
+ * paired with labels positionally, which is the only association in the markup.
+ */
+function tabsToMd($: cheerio.CheerioAPI, el: any): string {
+ const labels: string[] = [];
+ $(el)
+ .find('[role="tab"]')
+ .each((_i, t) => labels.push(inlineText($, t)));
+ const out: string[] = [];
+ $(el)
+ .find('[role="tabpanel"]')
+ .each((i, panel) => {
+ const body = orderedSegments($, panel).join("\n\n").trim();
+ if (!body) return;
+ const label = labels[i] || "";
+ out.push(label ? `**${label}**\n\n${body}` : body);
+ });
+ return out.join("\n\n");
+}
+
function blockToMd($: cheerio.CheerioAPI, el: any): string {
const tag = String(el.tagName || el.name || "").toLowerCase();
+ // Checked before the generic wrapper handling, and before `ul`, so the tablist
+ // is never emitted as a bullet list of bare tab names.
+ if ($(el).children('[role="tablist"]').length) return tabsToMd($, el);
if (HEADING_LEVEL[tag]) {
const t = inlineText($, el).replace(/^#+\s*/, "");
return t ? `${"#".repeat(HEADING_LEVEL[tag])} ${t}` : "";
@@ -561,7 +631,15 @@ function classifyLinks(chunkMarkdown: string, site: string): { internal: string[
if (href.startsWith("/")) {
const p = href.split(/[?#]/)[0];
if (p.startsWith("/img") || p.startsWith("/assets") || /\.(png|jpe?g|gif|svg|mp4|pdf|zip)$/i.test(p)) continue;
- internal.add(p.endsWith("/") ? p : `${p}/`);
+ // Docusaurus routes end in "/", but a link to a FILE must not: the asset
+ // filter above only covers images and archives, so /llms.txt and the
+ // generated /stable/c_api/*.html pages were being published as
+ // "/llms.txt/" and "…struct_sc_symbology_settings.html/" - URLs that 404
+ // for anyone who follows them. Anything with a file extension in its last
+ // segment is left exactly as written.
+ const last = p.split("/").pop() || "";
+ const isFile = /\.[a-z0-9]{1,8}$/i.test(last);
+ internal.add(isFile || p.endsWith("/") ? p : `${p}/`);
}
}
return { internal: Array.from(internal), api: Array.from(api) };
@@ -851,7 +929,10 @@ function buildModule(args: {
// NB: user_intents / not_for are emitted as dedicated, UN-truncated fields
// (see the return + toIndexRecord). We deliberately do NOT inline them into
- // assistant_context, because the index only ships a 300-char assistant_excerpt
+ // assistant_context. NOTE: the "only 300 chars" reason this once gave no longer
+ // holds - assistant_excerpt is now the boilerplate prefix plus 300 chars of
+ // chunk (avg 515), so if this decision is revisited, re-derive it rather than
+ // reading a stale constraint out of this comment
// — inlining them would crowd out the summary. The curated signal lives in the
// structured fields; the excerpt stays a clean title+summary preview.
const assistantContext =
From 14f99c3b27cf3f7978c9bd910cea2e88f4f22d79 Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Fri, 4 Sep 2026 14:57:30 +0100
Subject: [PATCH 18/53] fix(knowledge-extractor): scope tab panels by
ownership; label stays with body
Round 8. All three findings were mine, from round 7's tabs work, and two of them
made things worse than the state they replaced - an unlabelled panel is bad, a
confidently mislabelled one is worse.
find() reached into nested . A nested block's tabs joined the outer
tablist while its panels joined the outer panel list in DOCUMENT order (outer
panel 1, then its nested panels, then outer panel 2), so positional pairing
crossed the boundary and nested content was emitted twice. Live on
/sdks/react-native/add-sdk/: "Install Manually from Dashboard" printed over a
yarn command and "**Yarn**" over `npm install` - the exact mix-up the function
exists to prevent.
My first attempt at scoping used children(), which was wrong and expensive:
Docusaurus wraps the panels, so the container's children are the tablist and a
`margin-top--md` div, children('[role=tabpanel]') matched NOTHING, and every
panel's content was silently dropped - modules 4704 -> 4083, CitesApi 2976 ->
1845. Caught by comparing the run against the previous commit rather than by
reading the diff. Panels are now scoped by OWNERSHIP - a panel is ours when the
nearest ancestor owning a tablist is this container - which excludes nested
blocks without assuming a wrapper depth. Restored: 4702 modules, CitesApi 2976,
0 duplicated code bodies, and the react-native labels pair correctly.
The label was a standalone paragraph, so chunkBody severed it from its body: 273
chunks ended on a lone **label** while the body moved to the next chunk with no
label at all. Joined by a single newline instead, label and body are one
paragraph unit the splitter cannot separate: 273 -> 1 on full chunk content.
The residual 1, plus 38 in the published excerpt, came from my own clipMarkdown:
it drops a half-included fence, and the label sits on the line before it, so the
excerpt advertised a variant it did not carry. The label is now dropped with its
body: 0.
escapeCell's link-target exemption was a step away from the spec, not toward it.
CommonMark recognises backslash escapes inside a link destination (spec 6.1), and
GFM requires the escape for a pipe anywhere in a cell including inside inline
spans - so escaping everything was already right. Leaving the pipe raw would make
a parser split the row there: URL truncated, a phantom cell appears, and since
the delimiter is sized to the widest row that phantom pads every other row with
an empty column. Reverted to escaping every pipe.
Verified: tsc reports no errors in the file; 4702 modules from 616 pages, 0 page
errors; 0 chunks ending on a lone label; 0 duplicated code bodies; 0 mislabelled
panels on the page the review cited; 0 dangling fences in either published field;
0 raw pipes in a link target; index 11.09 MB / graph 12.41 MB within budget.
Evals hold at their best: success@3 0.95, precision@3 0.90, MRR 0.95.
Co-Authored-By: Claude Opus 5 (1M context)
---
src/plugins/knowledge-extractor/index.ts | 78 ++++++++++++++++--------
1 file changed, 54 insertions(+), 24 deletions(-)
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index 54355bafb5..2216c96ba2 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -62,7 +62,12 @@ function clipMarkdown(text: string, limit: number): string {
if (!open) return cut;
// Dropping the half-included block is better than shipping it broken, unless
// that would throw away almost everything.
- const trimmed = lines.slice(0, lastFenceStart).join("\n").trimEnd();
+ const kept = lines.slice(0, lastFenceStart);
+ // A dropped block leaves its tab label behind on the previous line, which
+ // then advertises a variant this excerpt does not carry. Take the label too.
+ const LABEL_ONLY = /^\s*\*\*[^*]{1,40}\*\*\s*$/;
+ while (kept.length && LABEL_ONLY.test(kept[kept.length - 1])) kept.pop();
+ const trimmed = kept.join("\n").trimEnd();
if (trimmed.length >= Math.floor(limit / 3)) return trimmed;
return `${cut.trimEnd()}\n\u0060\u0060\u0060`;
}
@@ -86,23 +91,19 @@ function assistantExcerpt(assistantContext: string, chunk: string): string {
}
/**
- * Escape `|` in a table cell, which would otherwise end the cell - but never
- * inside a markdown link target, where a backslash breaks the URL instead.
- * inlineText() has already produced `[label](href)` by this point, so the target
- * has to be stepped over rather than escaped.
+ * Escape EVERY `|` in a table cell, link targets included.
+ *
+ * I previously exempted link targets on the theory that a backslash would break
+ * the URL. That was wrong in both directions. CommonMark does recognise
+ * backslash escapes inside a link destination (spec 6.1), so `\|` round-trips to
+ * a literal pipe; and the GFM tables extension requires the escape for a pipe
+ * anywhere in a cell, "including inside other inline spans". Leaving it raw makes
+ * the parser split the row at the pipe: the URL is truncated mid-string, a
+ * phantom cell appears, and since the delimiter is sized to the widest row that
+ * phantom widens the delimiter and pads every other row with an empty column.
*/
function escapeCell(text: string): string {
- const out: string[] = [];
- let i = 0;
- const re = /\]\(([^)]*)\)/g;
- let m: RegExpExecArray | null;
- while ((m = re.exec(text))) {
- out.push(text.slice(i, m.index).replace(/\|/g, "\\|"));
- out.push(m[0]); // ](href) verbatim
- i = m.index + m[0].length;
- }
- out.push(text.slice(i).replace(/\|/g, "\\|"));
- return out.join("");
+ return text.replace(/\|/g, "\\|");
}
function slug(value: string): string {
@@ -421,19 +422,48 @@ function orderedSegments($: cheerio.CheerioAPI, el: any): string[] {
* paired with labels positionally, which is the only association in the markup.
*/
function tabsToMd($: cheerio.CheerioAPI, el: any): string {
+ // OWN children only. find() reached into a nested block, so a nested
+ // block's tabs joined the outer tablist while its panels joined the outer panel
+ // list IN DOCUMENT ORDER - outer panel 1, then its nested panels, then outer
+ // panel 2 - and positional pairing then crossed the boundary. Live consequence
+ // on /sdks/react-native/add-sdk/: "Install Manually from Dashboard" was printed
+ // over a yarn command and "**Yarn**" over `npm install`, which is the exact
+ // mix-up this function exists to prevent, only now asserted with a label.
+ // Nested blocks are handled by the recursive orderedSegments() call below, so
+ // they must not be collected here at all - collecting them also emitted their
+ // content twice.
const labels: string[] = [];
$(el)
- .find('[role="tab"]')
+ .children('[role="tablist"]')
+ .children('[role="tab"]')
.each((_i, t) => labels.push(inlineText($, t)));
- const out: string[] = [];
- $(el)
+
+ // NOT children(): Docusaurus wraps the panels in a div (the container's own
+ // children are the tablist and a `margin-top--md` wrapper), so children()
+ // matched nothing and dropped every panel's content - measured at 621 fewer
+ // modules and 1131 fewer CitesApi edges. Scope by OWNERSHIP: a panel is ours
+ // when the nearest ancestor that owns a tablist is this container, which
+ // excludes a nested block's panels without assuming a wrapper depth.
+ const ownsTablist = (node: any) => $(node).children('[role="tablist"]').length > 0;
+ const panels = $(el)
.find('[role="tabpanel"]')
- .each((i, panel) => {
- const body = orderedSegments($, panel).join("\n\n").trim();
- if (!body) return;
- const label = labels[i] || "";
- out.push(label ? `**${label}**\n\n${body}` : body);
+ .filter((_i, p) => {
+ const owner = $(p).parents().filter((_j, a) => ownsTablist(a)).first();
+ return owner.length > 0 && owner.get(0) === el;
});
+ const out: string[] = [];
+ panels.each((i, panel) => {
+ const body = orderedSegments($, panel).join("\n\n").trim();
+ if (!body) return;
+ const label = labels[i] || "";
+ // ONE newline, not a blank line. A blank line makes the label its own
+ // paragraph, and chunkBody splits on paragraphs - measured 273 chunks ending
+ // in a lone **label** whose body had moved to the next chunk, unlabelled.
+ // That is worse than no label: the chunk promises content it does not carry.
+ // Joined by a single newline, label and body are one paragraph unit and the
+ // splitter cannot separate them.
+ out.push(label ? `**${label}**\n${body}` : body);
+ });
return out.join("\n\n");
}
From b4b80d35138548aebab71f9e7069a8d1e9cb7b25 Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Fri, 4 Sep 2026 15:21:08 +0100
Subject: [PATCH 19/53] fix(knowledge-extractor): label drop on every clip
path; heading cannot orphan it
Round 9. Three findings, all mine, all narrow - and the review's own numbers
confirmed the totals and that no page lost content versus base, which is the
check that caught my children() mistake last round.
The label drop sat AFTER clipMarkdown's early return, so it only ran when a fence
had also been half-included. When the cut landed exactly at the end of a label
line - the fence opener falling outside the window - the label shipped with
nothing after it, which is the "advertises a variant this excerpt does not carry"
defect I had reported as 0. It runs on both paths now, and the duplicate
40-character regex inside the function is gone: the shared one is capped at 80,
because this corpus already has a 43-character label ("Install from Package
Registry (Recommended)") that the tighter cap silently exempted. 2 -> 0.
The single-newline join defeats the PARAGRAPH splitter but not the HEADING
splitter, which keys on the heading line alone - so a panel whose body opens with
a heading still left the label as the tail of the previous chunk. splitFenceAware
now passes the preceding line to the boundary test, and a heading immediately
after a label-only line is not a boundary. 2 -> 0, and the one label+heading pair
on /sdks/react-native/add-sdk/ now travels together.
blockquote was classified as a block but flattened with inlineText, so a fenced
sample inside a quote would collapse onto one line - the same failure the `pre`
handler exists to prevent, where a `//` comment then swallows the rest. It
recurses now and re-prefixes with "> ". No blockquote in the corpus contains a
fence today, so this is so the first one that does is not silently mangled;
module count is unchanged at 4702, confirming no behaviour change on today's
content.
NOT fixed, and stated as a limit rather than left implied: a code block inside a
TABLE CELL is still flattened, because GFM tables cannot represent a fenced block
in a cell at all - there is no correct output to produce. 0 such cells today.
Verified: tsc reports no errors in the file; 4702 modules from 616 pages, 0 page
errors; 0 chunks or excerpts ending on a lone label in either published field; 0
dangling fences; CitesApi 2976 (base 2980); index 11.09 MB / graph 12.41 MB.
Evals hold: success@3 0.95, precision@3 0.90, MRR 0.95.
Co-Authored-By: Claude Opus 5 (1M context)
---
src/plugins/knowledge-extractor/index.ts | 67 ++++++++++++++++++++----
1 file changed, 56 insertions(+), 11 deletions(-)
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index 2216c96ba2..4b3e9675b3 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -47,6 +47,24 @@ type Chunk = { heading: string; content: string };
* opens a fence too early for that to leave anything useful, closes the fence
* instead. Consumers read this field directly, so a dangling ``` is not cosmetic.
*/
+/**
+ * A line that is nothing but bold text - a tab-panel label, in practice.
+ *
+ * Capped at 80, not 40: this corpus already has "Install from Package Registry
+ * (Recommended)" at 43 characters, which the tighter cap silently exempted.
+ * A bold lead-in whose following content was cut is the same problem as a tab
+ * label whose panel was cut - both promise something the excerpt does not carry -
+ * so treating them alike is deliberate.
+ */
+const LABEL_ONLY_LINE = /^\s*\*\*[^*]{1,80}\*\*\s*$/;
+
+/** Drop trailing label-only lines, so a clip never ends on a broken promise. */
+function dropTrailingLabels(lines: string[]): string[] {
+ const kept = lines.slice();
+ while (kept.length && LABEL_ONLY_LINE.test(kept[kept.length - 1])) kept.pop();
+ return kept;
+}
+
function clipMarkdown(text: string, limit: number): string {
if (text.length <= limit) return text;
const cut = text.slice(0, limit);
@@ -59,14 +77,18 @@ function clipMarkdown(text: string, limit: number): string {
open = !open;
}
}
- if (!open) return cut;
+ // The label drop runs on BOTH paths. It used to sit only below this early
+ // return, so when the cut landed exactly at the end of a label line - the
+ // fence opener falling outside the window - the label shipped with nothing
+ // after it. Two records did precisely that.
+ if (!open) {
+ const plain = dropTrailingLabels(lines).join("\n").trimEnd();
+ // Never return nothing: if the clip was ONLY a label, the raw cut is better.
+ return plain || cut;
+ }
// Dropping the half-included block is better than shipping it broken, unless
// that would throw away almost everything.
- const kept = lines.slice(0, lastFenceStart);
- // A dropped block leaves its tab label behind on the previous line, which
- // then advertises a variant this excerpt does not carry. Take the label too.
- const LABEL_ONLY = /^\s*\*\*[^*]{1,40}\*\*\s*$/;
- while (kept.length && LABEL_ONLY.test(kept[kept.length - 1])) kept.pop();
+ const kept = dropTrailingLabels(lines.slice(0, lastFenceStart));
const trimmed = kept.join("\n").trimEnd();
if (trimmed.length >= Math.floor(limit / 3)) return trimmed;
return `${cut.trimEnd()}\n\u0060\u0060\u0060`;
@@ -137,7 +159,7 @@ function firstHeading(text: string): string {
*/
function splitFenceAware(
body: string,
- isBoundary: (line: string) => boolean,
+ isBoundary: (line: string, prevLine: string) => boolean,
dropBoundary = false,
): string[] {
const out: string[] = [];
@@ -150,7 +172,7 @@ function splitFenceAware(
};
for (const line of body.split("\n")) {
if (/^\s*```/.test(line)) inFence = !inFence;
- if (!inFence && isBoundary(line)) {
+ if (!inFence && isBoundary(line, buf.length ? buf[buf.length - 1] : "")) {
if (dropBoundary) {
flush();
continue; // the boundary itself is a separator, not content
@@ -163,9 +185,20 @@ function splitFenceAware(
return out;
}
-/** Heading boundaries: "## " / "### " at the start of a line, outside a fence. */
+/**
+ * Heading boundaries: "## " / "### " at the start of a line, outside a fence -
+ * EXCEPT immediately after a label-only line.
+ *
+ * Joining a tab label to its body with a single newline stops the paragraph
+ * splitter separating them, but this splitter keys on the heading alone, so a
+ * panel whose body opens with a heading still left the label as the tail of the
+ * previous chunk - which then advertises content it does not contain.
+ */
function splitOnHeadings(body: string): string[] {
- return splitFenceAware(body, (l) => /^(##\s|###\s)/.test(l));
+ return splitFenceAware(
+ body,
+ (l, prev) => /^(##\s|###\s)/.test(l) && !LABEL_ONLY_LINE.test(prev),
+ );
}
/** Paragraph boundaries: a blank line outside a fence. */
@@ -531,7 +564,19 @@ function blockToMd($: cheerio.CheerioAPI, el: any): string {
return code ? "```\n" + code + "\n```" : "";
}
if (tag === "table") return tableToMd($, el);
- if (tag === "blockquote") return inlineText($, el);
+ if (tag === "blockquote") {
+ // Recurse rather than flatten. inlineText() drops every newline, so a fenced
+ // sample inside a quote collapsed onto one line - the same failure the `pre`
+ // handler exists to prevent, where a `//` comment then swallows the rest of
+ // the sample. No blockquote in the corpus contains a fence today; this is so
+ // the first one that does is not silently mangled.
+ const inner = orderedSegments($, el).join("\n\n").trim();
+ if (!inner) return "";
+ return inner
+ .split("\n")
+ .map((l) => (l ? `> ${l}` : ">"))
+ .join("\n");
+ }
if (tag === "div" || tag === "section" || tag === "details" || tag === "article" || tag === "aside") {
// Shared walker: keeps direct text children (an admonition heading is
// icondanger, so the
From f657f9e2cc61cc6f61ee44ae9b24a192be165df3 Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Fri, 4 Sep 2026 15:40:05 +0100
Subject: [PATCH 20/53] fix(knowledge-extractor): state the chunk invariant
once, not per boundary
Round 10, and this one takes the review's structural advice rather than patching
another predicate.
Nine rounds each closed one SURFACE of the same class - "don't end on a lone
label", "don't split a fence", "don't orphan a label behind a heading" - and each
fix MOVED the symptom. Round 9's heading suppression is the clearest case: it
turned "chunk ends on a lone label" (2 records) into "chunk ends on a label plus
two headings" (1 record) and cost two chunks their correct section title, because
firstHeading() then picked a title from the wrong part.
So the invariant is now stated in one place, after chunking: a chunk may not END
on a run of lines that only INTRODUCES content - bold-only lines and headings
alike. Such a run is MOVED to the head of the next chunk, never dropped, because
it belongs with the content it introduces and dropping it would lose text. A
chunk left holding nothing but introducers merges into its successor. Each
chunk's heading is then re-derived from its OWN leading heading.
That subsumes both earlier workarounds, so the splitOnHeadings suppression is
reverted and dropTrailingLabels is generalised into the shared predicate.
Checkable with one assertion over the corpus instead of a new measurement per
round, which is the actual point: 0 excerpts ending on an introducer run in
either published field, 0 chunks whose heading is not their own leading heading.
Modules 4702 -> 4637, the difference being introducer-only chunks merging into
their successors.
AND - the check I now run every time, after the children() incident - full chunk
content compared page by page against the previous commit: 0 of 616 pages lose a
single word. The 132 pages whose EXCERPTS shift a word are the 400-char window
moving over merged chunks, which is why the comparison has to be on full content;
measuring the excerpt would have shown a loss that is not there.
Three smaller ones from the same round:
- Fence detection could not see a fence inside a blockquote: both clipMarkdown
and splitFenceAware tested /^\s*```/, which never matches "> ```" - so last
round's blockquote recursion would have been cut straight through. Both now
allow the quote prefix. Still latent (0 blockquotes contain a fence).
- /sdks/web/matrixscan/get-started/ renders a SECOND permalink anchor with no
hash-link class whose label is a Font-Awesome private-use glyph, so the
zero-width strip left it non-empty and it was published as a real link inside a
heading. The private-use range is stripped too: 1 affected module -> 0.
- heading/topic kept raw markdown link syntax while summary strips it, so a
hard slice to 180/120 chars published half a URL as a semantic field. De-linked
the same way: 0 remaining.
Verified: tsc reports no errors in the file; 4637 modules from 616 pages, 0 page
errors; invariant holds corpus-wide; 0 dangling fences; 0 pages losing content;
CitesApi 2974 (base 2980, previous 2976 - the delta is fewer duplicate edges from
merged chunks, not lost citations); evals success@3 0.95, precision@3 0.90,
MRR 0.95.
Co-Authored-By: Claude Opus 5 (1M context)
---
src/plugins/knowledge-extractor/index.ts | 103 ++++++++++++++++-------
1 file changed, 74 insertions(+), 29 deletions(-)
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index 4b3e9675b3..0aad9462d5 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -48,21 +48,28 @@ type Chunk = { heading: string; content: string };
* instead. Consumers read this field directly, so a dangling ``` is not cosmetic.
*/
/**
- * A line that is nothing but bold text - a tab-panel label, in practice.
+ * A line that only INTRODUCES content and carries none itself: a heading, or a
+ * bold-only line (a tab-panel label, in practice).
*
- * Capped at 80, not 40: this corpus already has "Install from Package Registry
- * (Recommended)" at 43 characters, which the tighter cap silently exempted.
- * A bold lead-in whose following content was cut is the same problem as a tab
- * label whose panel was cut - both promise something the excerpt does not carry -
- * so treating them alike is deliberate.
+ * The bold cap is 80, not 40: this corpus already has "Install from Package
+ * Registry (Recommended)" at 43 characters, which a tighter cap silently
+ * exempted. There is no prose risk in that width - a prose bold line is always
+ * blank-separated, because orderedSegments joins prose segments with a blank
+ * line, whereas a label is glued to its body by a single newline.
*/
-const LABEL_ONLY_LINE = /^\s*\*\*[^*]{1,80}\*\*\s*$/;
+const INTRODUCER_LINE = /^\s*(?:\*\*[^*]{1,80}\*\*|#{1,6}\s+\S.*)\s*$/;
-/** Drop trailing label-only lines, so a clip never ends on a broken promise. */
-function dropTrailingLabels(lines: string[]): string[] {
- const kept = lines.slice();
- while (kept.length && LABEL_ONLY_LINE.test(kept[kept.length - 1])) kept.pop();
- return kept;
+/** Trailing lines that introduce content the text does not (yet) contain. */
+function trailingIntroducers(lines: string[]): number {
+ let i = lines.length;
+ while (i > 0 && (!lines[i - 1].trim() || INTRODUCER_LINE.test(lines[i - 1]))) i--;
+ return lines.length - i;
+}
+
+/** Drop a trailing introducer run, so a clip never ends on a broken promise. */
+function dropTrailingIntroducers(lines: string[]): string[] {
+ const drop = trailingIntroducers(lines);
+ return drop ? lines.slice(0, lines.length - drop) : lines.slice();
}
function clipMarkdown(text: string, limit: number): string {
@@ -72,7 +79,7 @@ function clipMarkdown(text: string, limit: number): string {
let open = false;
let lastFenceStart = -1;
for (let i = 0; i < lines.length; i++) {
- if (/^\s*```/.test(lines[i])) {
+ if (/^\s*(?:>\s*)*```/.test(lines[i])) {
if (!open) lastFenceStart = i;
open = !open;
}
@@ -82,13 +89,13 @@ function clipMarkdown(text: string, limit: number): string {
// fence opener falling outside the window - the label shipped with nothing
// after it. Two records did precisely that.
if (!open) {
- const plain = dropTrailingLabels(lines).join("\n").trimEnd();
+ const plain = dropTrailingIntroducers(lines).join("\n").trimEnd();
// Never return nothing: if the clip was ONLY a label, the raw cut is better.
return plain || cut;
}
// Dropping the half-included block is better than shipping it broken, unless
// that would throw away almost everything.
- const kept = dropTrailingLabels(lines.slice(0, lastFenceStart));
+ const kept = dropTrailingIntroducers(lines.slice(0, lastFenceStart));
const trimmed = kept.join("\n").trimEnd();
if (trimmed.length >= Math.floor(limit / 3)) return trimmed;
return `${cut.trimEnd()}\n\u0060\u0060\u0060`;
@@ -171,7 +178,10 @@ function splitFenceAware(
buf = [];
};
for (const line of body.split("\n")) {
- if (/^\s*```/.test(line)) inFence = !inFence;
+ // The (?:> )* prefix matters: a fenced sample inside a blockquote is emitted
+ // as "> ```", which a bare /^\s*```/ never sees - so the splitter would cut
+ // straight through it.
+ if (/^\s*(?:>\s*)*```/.test(line)) inFence = !inFence;
if (!inFence && isBoundary(line, buf.length ? buf[buf.length - 1] : "")) {
if (dropBoundary) {
flush();
@@ -186,19 +196,15 @@ function splitFenceAware(
}
/**
- * Heading boundaries: "## " / "### " at the start of a line, outside a fence -
- * EXCEPT immediately after a label-only line.
+ * Heading boundaries: "## " / "### " at the start of a line, outside a fence.
*
- * Joining a tab label to its body with a single newline stops the paragraph
- * splitter separating them, but this splitter keys on the heading alone, so a
- * panel whose body opens with a heading still left the label as the tail of the
- * previous chunk - which then advertises content it does not contain.
+ * Deliberately plain again. Special-casing "a heading right after a label" here
+ * only moved the orphaned-label symptom to "orphaned label plus headings", and
+ * cost two chunks their correct section title. The invariant that a chunk may not
+ * end on an introducer is enforced once, after chunking, in enforceChunkInvariant.
*/
function splitOnHeadings(body: string): string[] {
- return splitFenceAware(
- body,
- (l, prev) => /^(##\s|###\s)/.test(l) && !LABEL_ONLY_LINE.test(prev),
- );
+ return splitFenceAware(body, (l) => /^(##\s|###\s)/.test(l));
}
/** Paragraph boundaries: a blank line outside a fence. */
@@ -206,6 +212,36 @@ function splitParagraphs(body: string): string[] {
return splitFenceAware(body, (l) => l.trim() === "", true);
}
+/**
+ * THE invariant, enforced in one place instead of by boundary heuristics.
+ *
+ * A chunk must not END on a run of lines that merely introduces content - a tab
+ * label, a heading, or several of them - because such a chunk advertises
+ * something a consumer will not find in it. The run is MOVED to the head of the
+ * next chunk, never dropped: it belongs with the content it introduces, and
+ * dropping it would lose text outright. A chunk left with nothing but its
+ * introducers disappears into its successor.
+ *
+ * Headings are then re-derived from each chunk's OWN leading heading. Taking the
+ * first heading anywhere in the source part is what indexed two chunks under the
+ * wrong section once the boundaries moved.
+ */
+function enforceChunkInvariant(chunks: Chunk[]): Chunk[] {
+ const out = chunks.map((c) => ({ ...c }));
+ for (let i = out.length - 2; i >= 0; i--) {
+ const lines = out[i].content.split("\n");
+ const drop = trailingIntroducers(lines);
+ if (!drop) continue;
+ const moved = lines.slice(lines.length - drop).join("\n").trim();
+ const keep = lines.slice(0, lines.length - drop).join("\n").trim();
+ if (moved) out[i + 1].content = `${moved}\n${out[i + 1].content}`.trim();
+ out[i].content = keep;
+ }
+ return out
+ .filter((c) => c.content.trim())
+ .map((c) => ({ content: c.content, heading: firstHeading(c.content) || c.heading }));
+}
+
function chunkBody(body: string, target: number): Chunk[] {
const parts = splitOnHeadings(body);
const chunks: Chunk[] = [];
@@ -248,7 +284,7 @@ function chunkBody(body: string, target: number): Chunk[] {
currentHeading = paraHeading;
}
if (current) chunks.push({ heading: currentHeading, content: current });
- return chunks;
+ return enforceChunkInvariant(chunks);
}
function pickIntents(contentType: string, title: string, body: string): string[] {
@@ -305,7 +341,11 @@ function serializeInline($: cheerio.CheerioAPI, node: any): string {
const href = String($(n).attr("href") || "");
// U+200B is not matched by \s, so trim() leaves it and !label is false.
const label = serializeInline($, n)
- .replace(/[\u200b\u200c\u200d\ufeff]/g, "")
+ // Also the private-use range: /sdks/web/matrixscan/get-started/ renders a
+ // second permalink anchor with no hash-link class whose label is a
+ // Font-Awesome glyph (U+F0C1), so the zero-width strip alone left it
+ // non-empty and it was published as a real link inside the heading.
+ .replace(/[\u200b\u200c\u200d\ufeff\ue000-\uf8ff]/g, "")
.replace(/\s+/g, " ")
.trim();
if (!label) return;
@@ -992,7 +1032,12 @@ function buildModule(args: {
const title = (rawTitle || pathname).trim();
const displayTitle = idx === 1 ? title : `${title} (Part ${idx})`;
const summary = extractSummary(description, chunkClean);
- const resolvedHeading = (chunk.heading || displayTitle).trim();
+ // De-linked the same way extractSummary does. Left raw, a heading that
+ // contains a link was then hard-sliced to 180/120 chars, so `topic` shipped
+ // half a URL - noise for any reranker keyed on it.
+ const resolvedHeading = (chunk.heading || displayTitle)
+ .replace(/\[([^\]]*)\]\([^)]*\)/g, "$1")
+ .trim();
const links = classifyLinks(chunkClean, site);
// Curated signal read from the page's own frontmatter (empty when absent).
const userIntents = fmStringArray(fm.user_intents);
From 6552e81d8f2c62d7c824fd0d63a5b409b365e8c1 Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Fri, 4 Sep 2026 16:07:09 +0100
Subject: [PATCH 21/53] fix(knowledge-extractor): make the invariant a
fixpoint, and CI-enforced
Round 11. The HIGH was mine, inside the very function meant to close the class.
enforceChunkInvariant swept BACKWARDS, writing into a slot already finalised: if
out[i+1] was introducer-only it was emptied into out[i+2] first, and out[i]'s
trailing run then landed in that now-empty slot, re-creating an introducer-only
chunk no later step inspects. So the "one invariant, enforced once" claim was
false in its own implementation - it was not a fixpoint and provably not
idempotent. The review's repro (## X immediately followed by a deeper heading, a
shape that occurs 160 times on 90 pages) produced a published module whose entire
content was one heading line.
Forward now, so every slot is re-examined after it is written. Output on this
corpus is byte-identical - 4637 modules, CitesApi 2974 - because the trigger
shape has not been written yet; the fix is for the content edit that writes it.
Two holes in the same place, both reachable by ordinary editing:
- The LAST chunk was exempt, since there is nowhere forward to move to. A
trailing introducer run at the end of the body introduces nothing anywhere -
the section it names is empty in the source too - so it is dropped, which costs
only the heading of an empty trailing section.
- clipMarkdown's `text.length <= limit` early return skipped the drop entirely,
so for any chunk shorter than the limit the property held by luck of the
content rather than by enforcement.
And two of my own claims were not what the code did:
- "each chunk's own LEADING heading" was firstHeading(), i.e. the first heading
ANYWHERE in the chunk - so 241 chunks were titled by a section starting deep
inside them, 139 of those more than 400 characters in. Added leadingHeading()
and fell back to the chunkBody-derived heading, which is the section the chunk
STARTS in and is the more accurate answer.
- "tsc reports no errors" was measured with my own flags, not the repo's. The
repo's `yarn typecheck` did NOT pass on this file, and had not passed since
before my work: TS2802 on iterating a Map and a Set, from base 2a6edd580, plus
a TS2322 I introduced in tabsToMd. All fixed with Array.from and braced
callbacks; `yarn typecheck` now passes with zero errors across the repo. It
never surfaced because Docusaurus transpiles separately, so the build was
always green.
Also: the appended fence closer now carries the opener's "> " prefix. Adding the
quote-aware fence regex last round made lastFenceStart able to point at a quoted
fence, and a bare closer after "> ```" is not balanced - CommonMark ends the
blockquote at the unquoted line and opens a new, unterminated top-level fence.
THE INVARIANT IS NOW CI-ENFORCED, which was the review's actual point: the eval
script - the one thing that already loads the published index on every build -
now fails when any published excerpt ends on a heading or bold-only label with no
content, or carries an unbalanced fence. Verified in BOTH directions: it passes
on the real index and it fails on an injected breach. Eleven rounds of measuring
this by hand is now one assertion.
Verified: `yarn typecheck` clean; 4637 modules from 616 pages, 0 page errors;
invariant holds corpus-wide on both published fields; enforceChunkInvariant is
idempotent on three inputs and satisfies the review's repro, the empty-trailing-
section case, consecutive introducer-only chunks and the short-text case;
0 pages lose a word on full chunk content; evals success@3 0.95, precision@3
0.90, MRR 0.95.
Co-Authored-By: Claude Opus 5 (1M context)
---
scripts/retrieval-evals/run.cjs | 39 +++++++++++-
src/plugins/knowledge-extractor/index.ts | 79 +++++++++++++++++++++---
2 files changed, 107 insertions(+), 11 deletions(-)
diff --git a/scripts/retrieval-evals/run.cjs b/scripts/retrieval-evals/run.cjs
index 635ffb2c31..28888e8fd5 100644
--- a/scripts/retrieval-evals/run.cjs
+++ b/scripts/retrieval-evals/run.cjs
@@ -220,6 +220,43 @@ function main() {
}
const breaches = [];
+
+ // ---------------------------------------------------------------------------
+ // Artifact invariants, not retrieval quality - but this is the one place that
+ // already loads the published index on every build, so it is where they belong.
+ //
+ // Both properties cost eleven review rounds to establish, each round measuring
+ // by hand what a single assertion can check for good:
+ //
+ // 1. An excerpt must not END on a run of lines that only INTRODUCES content
+ // (a heading, or a bold-only tab label). Such a record advertises
+ // something a consumer will not find in it.
+ // 2. An excerpt must not carry an unbalanced code fence, which hands a
+ // consumer raw code presented as prose. The (?:> )* prefix is required:
+ // a fence inside a blockquote is emitted as "> ```".
+ // ---------------------------------------------------------------------------
+ const INTRODUCER_LINE = /^\s*(?:\*\*[^*]{1,80}\*\*|#{1,6}\s+\S.*)\s*$/;
+ const endsOnIntroducer = (text) => {
+ const lines = String(text || "").split("\n");
+ let i = lines.length;
+ while (i > 0 && (!lines[i - 1].trim() || INTRODUCER_LINE.test(lines[i - 1]))) i--;
+ return i < lines.length;
+ };
+ const unbalancedFence = (text) =>
+ (String(text || "").match(/^\s*(?:>\s*)*```/gm) || []).length % 2 !== 0;
+
+ const FIELDS = ["docs_excerpt", "assistant_excerpt"];
+ for (const field of FIELDS) {
+ const dangling = index.filter((r) => unbalancedFence(r[field]));
+ const promising = index.filter((r) => endsOnIntroducer(r[field]));
+ if (dangling.length) {
+ breaches.push(`${dangling.length} record(s) with an unbalanced code fence in ${field} (e.g. ${dangling[0].id})`);
+ }
+ if (promising.length) {
+ breaches.push(`${promising.length} record(s) whose ${field} ends on a heading or label with no content (e.g. ${promising[0].id})`);
+ }
+ }
+
if (metrics.success_at_k < MIN_SUCCESS) breaches.push(`success@${K}=${metrics.success_at_k} < ${MIN_SUCCESS}`);
if (metrics.precision_at_k < MIN_PRECISION) breaches.push(`precision@${K}=${metrics.precision_at_k} < ${MIN_PRECISION}`);
if (metrics.mrr < MIN_MRR) breaches.push(`MRR=${metrics.mrr} < ${MIN_MRR}`);
@@ -230,7 +267,7 @@ function main() {
}
if (breaches.length) {
- console.log("Retrieval quality below threshold:");
+ console.log("Retrieval evals failed (quality thresholds and/or artifact invariants):");
for (const b of breaches) console.log(` breach: ${b}`);
process.exit(1);
}
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index 0aad9462d5..53a6d66b4a 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -73,7 +73,13 @@ function dropTrailingIntroducers(lines: string[]): string[] {
}
function clipMarkdown(text: string, limit: number): string {
- if (text.length <= limit) return text;
+ // The early return used to hand back the raw text, so for any chunk shorter
+ // than the limit the drop never ran at all - the "no excerpt ends on an
+ // introducer" property then held only by luck of the content.
+ if (text.length <= limit) {
+ const whole = dropTrailingIntroducers(text.split("\n")).join("\n").trimEnd();
+ return whole || text;
+ }
const cut = text.slice(0, limit);
const lines = cut.split("\n");
let open = false;
@@ -98,7 +104,13 @@ function clipMarkdown(text: string, limit: number): string {
const kept = dropTrailingIntroducers(lines.slice(0, lastFenceStart));
const trimmed = kept.join("\n").trimEnd();
if (trimmed.length >= Math.floor(limit / 3)) return trimmed;
- return `${cut.trimEnd()}\n\u0060\u0060\u0060`;
+ // Match the opener's quote prefix. A bare closer after "> ```" is not
+ // balanced: CommonMark ends the blockquote at the unquoted line, implicitly
+ // closing the quoted fence, and then opens a new top-level one that never
+ // closes - the exact dangling fence this function exists to prevent.
+ const openerPrefix = (lines[lastFenceStart] || "").match(/^\s*(?:>\s*)*/);
+ const closer = `${openerPrefix ? openerPrefix[0] : ""}\u0060\u0060\u0060`;
+ return `${cut.trimEnd()}\n${closer}`;
}
/**
@@ -228,7 +240,14 @@ function splitParagraphs(body: string): string[] {
*/
function enforceChunkInvariant(chunks: Chunk[]): Chunk[] {
const out = chunks.map((c) => ({ ...c }));
- for (let i = out.length - 2; i >= 0; i--) {
+
+ // FORWARD, not backwards. Iterating from the end writes into a slot that has
+ // already been finalised: if out[i+1] was introducer-only it is emptied into
+ // out[i+2] first, and out[i]'s trailing run then lands in that now-empty slot,
+ // re-creating an introducer-only chunk no later step inspects. Going forward
+ // means every slot is re-examined after it is written, which is what makes this
+ // a fixpoint - re-running it changes nothing.
+ for (let i = 0; i <= out.length - 2; i++) {
const lines = out[i].content.split("\n");
const drop = trailingIntroducers(lines);
if (!drop) continue;
@@ -237,9 +256,39 @@ function enforceChunkInvariant(chunks: Chunk[]): Chunk[] {
if (moved) out[i + 1].content = `${moved}\n${out[i + 1].content}`.trim();
out[i].content = keep;
}
+
+ // The LAST chunk was exempt, because there is nowhere forward to move to. But a
+ // trailing introducer run at the end of the body introduces nothing anywhere -
+ // the section it names is empty in the source too - so keeping it would publish
+ // a promise the whole document cannot honour. Dropped, which costs only the
+ // heading of an empty trailing section.
+ if (out.length) {
+ const last = out[out.length - 1];
+ last.content = dropTrailingIntroducers(last.content.split("\n")).join("\n").trim();
+ }
+
return out
.filter((c) => c.content.trim())
- .map((c) => ({ content: c.content, heading: firstHeading(c.content) || c.heading }));
+ .map((c) => ({ content: c.content, heading: leadingHeading(c.content) || c.heading }));
+}
+
+/**
+ * The chunk's OWN leading heading, or "" when it does not open with one.
+ *
+ * Distinct from firstHeading(), which returns the first heading ANYWHERE in the
+ * text - so a chunk that begins mid-section and happens to contain a later
+ * heading was titled by that later section. 241 chunks were titled that way, 139
+ * of them by a heading more than 400 characters in. Falling back to the
+ * chunkBody-derived heading is more accurate: that is the section the chunk
+ * STARTS in, which is what a reader of the chunk is actually inside.
+ */
+function leadingHeading(text: string): string {
+ for (const line of text.split(/\r?\n/)) {
+ if (!line.trim()) continue;
+ const m = line.match(/^\s*#{2,6}\s+(.+?)\s*$/);
+ return m ? m[1].trim() : "";
+ }
+ return "";
}
function chunkBody(body: string, target: number): Chunk[] {
@@ -375,7 +424,10 @@ function tableToMd($: cheerio.CheerioAPI, el: any): string {
const cells: string[] = [];
$(tr)
.children("th,td")
- .each((_j, c) => cells.push(escapeCell(inlineText($, c))));
+ .each((_j, c) => {
+ // Braced for the same TS2322 reason as tabsToMd above.
+ cells.push(escapeCell(inlineText($, c)));
+ });
if (cells.length) rows.push(cells);
});
if (!rows.length) return "";
@@ -509,7 +561,11 @@ function tabsToMd($: cheerio.CheerioAPI, el: any): string {
$(el)
.children('[role="tablist"]')
.children('[role="tab"]')
- .each((_i, t) => labels.push(inlineText($, t)));
+ .each((_i, t) => {
+ // Braced: cheerio types the callback boolean|void, and an expression body
+ // returns push()'s number - which `yarn typecheck` rejects (TS2322).
+ labels.push(inlineText($, t));
+ });
// NOT children(): Docusaurus wraps the panels in a div (the container's own
// children are the tablist and a `margin-top--md` wrapper), so children()
@@ -1284,11 +1340,14 @@ function buildGraph(modules: KModule[], site: string) {
}
// product <-> framework availability edges (directly answers "what's available where")
- for (const [prod, fws] of available) {
- for (const fw of fws) addEdge(`urn:product:${prod}#avail:${fw}`, "AvailableOn", `urn:product:${prod}`, `urn:framework:${fw}`);
+ // Array.from, because @docusaurus/tsconfig's target does not allow iterating a
+ // Map directly (TS2802). This failed `yarn typecheck` in the PR as submitted -
+ // the Docusaurus build transpiles separately, so it never surfaced there.
+ for (const [prod, fws] of Array.from(available)) {
+ for (const fw of Array.from(fws)) addEdge(`urn:product:${prod}#avail:${fw}`, "AvailableOn", `urn:product:${prod}`, `urn:framework:${fw}`);
}
- for (const [prod, fws] of unavailable) {
- for (const fw of fws) addEdge(`urn:product:${prod}#navail:${fw}`, "NotAvailableOn", `urn:product:${prod}`, `urn:framework:${fw}`);
+ for (const [prod, fws] of Array.from(unavailable)) {
+ for (const fw of Array.from(fws)) addEdge(`urn:product:${prod}#navail:${fw}`, "NotAvailableOn", `urn:product:${prod}`, `urn:framework:${fw}`);
}
return {
From 378b65e2c84a22c79776f4d37517aaf46b0f2b32 Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Mon, 7 Sep 2026 09:29:59 +0100
Subject: [PATCH 22/53] fix(knowledge-extractor): assert the invariant where
the artifact is made
The invariant lived in the eval script, which is paths-filtered and limited to
base `main` - so it did not run on build-docs.yml or docs-preview.yml, the two
workflows that actually build and publish the index. A breach would have first
appeared on the post-merge run against main, and never at all for release/**.
Asserting in postBuild covers every build and leaves ONE copy of each predicate,
so the generator and its check cannot drift apart.
Scope stated rather than assumed: measured, disabling enforceChunkInvariant does
NOT fail the build, because clipMarkdown drops trailing introducers from the
excerpts on its own. The assertion guards the published surface - which is all a
consumer sees - and is not a regression test for the chunker.
clipMarkdown's last-resort branch could still emit the forbidden shape, which
with the assertion in place would be a build failure no code change could fix.
The corpus was close: the longest leading introducer run is 247 characters
against a 300-character budget. It now demotes the markers instead of echoing
the raw window, so the words survive and only the false promise goes.
Also:
- an introducer inside a blockquote is recognised, matching the fence predicate;
- a run of trailing blank lines is no longer counted as an introducer run, which
would have reported the wrong defect;
- a page whose only chunk is a heading keeps its words instead of leaving the
index silently, uncounted by the drift guard;
- a git failure in gitDates no longer blanks last_verified for every page in
silence. Observed here: one build shipped 4200 empty dates green, between two
builds carrying 17 distinct real ones. Still non-fatal - metadata must not
break a deploy - but now loud, and it does not blame shallowness for a
failure that was something else.
Verified: typecheck clean; 4200 modules / 572 pages / 0 page errors; the
published index differs from HEAD only in its build timestamp and the graph is
byte-identical; invariant 0 breaches on every published field; the chunker is
output-identical across all 630 docs files (2729 chunks, no word or heading
changes); the assertion tested in both directions on 9 shapes; gitDates tested
in both directions; evals success@3 0.90, precision@3 0.85, MRR 0.90.
Co-Authored-By: Claude Opus 5 (1M context)
---
scripts/retrieval-evals/run.cjs | 43 ++------
src/plugins/knowledge-extractor/index.ts | 128 +++++++++++++++++++++--
2 files changed, 126 insertions(+), 45 deletions(-)
diff --git a/scripts/retrieval-evals/run.cjs b/scripts/retrieval-evals/run.cjs
index 28888e8fd5..ef4d15c4dd 100644
--- a/scripts/retrieval-evals/run.cjs
+++ b/scripts/retrieval-evals/run.cjs
@@ -221,41 +221,12 @@ function main() {
const breaches = [];
- // ---------------------------------------------------------------------------
- // Artifact invariants, not retrieval quality - but this is the one place that
- // already loads the published index on every build, so it is where they belong.
- //
- // Both properties cost eleven review rounds to establish, each round measuring
- // by hand what a single assertion can check for good:
- //
- // 1. An excerpt must not END on a run of lines that only INTRODUCES content
- // (a heading, or a bold-only tab label). Such a record advertises
- // something a consumer will not find in it.
- // 2. An excerpt must not carry an unbalanced code fence, which hands a
- // consumer raw code presented as prose. The (?:> )* prefix is required:
- // a fence inside a blockquote is emitted as "> ```".
- // ---------------------------------------------------------------------------
- const INTRODUCER_LINE = /^\s*(?:\*\*[^*]{1,80}\*\*|#{1,6}\s+\S.*)\s*$/;
- const endsOnIntroducer = (text) => {
- const lines = String(text || "").split("\n");
- let i = lines.length;
- while (i > 0 && (!lines[i - 1].trim() || INTRODUCER_LINE.test(lines[i - 1]))) i--;
- return i < lines.length;
- };
- const unbalancedFence = (text) =>
- (String(text || "").match(/^\s*(?:>\s*)*```/gm) || []).length % 2 !== 0;
-
- const FIELDS = ["docs_excerpt", "assistant_excerpt"];
- for (const field of FIELDS) {
- const dangling = index.filter((r) => unbalancedFence(r[field]));
- const promising = index.filter((r) => endsOnIntroducer(r[field]));
- if (dangling.length) {
- breaches.push(`${dangling.length} record(s) with an unbalanced code fence in ${field} (e.g. ${dangling[0].id})`);
- }
- if (promising.length) {
- breaches.push(`${promising.length} record(s) whose ${field} ends on a heading or label with no content (e.g. ${promising[0].id})`);
- }
- }
+ // NOTE: the artifact invariants (no excerpt ending on a heading/label with no
+ // content, no unbalanced code fence) are asserted by the knowledge-extractor
+ // plugin itself, in postBuild - it refuses to publish a violation. They were
+ // briefly duplicated here, but this workflow is paths-filtered and limited to
+ // base `main`, so it does not run on the builds that publish the index, and a
+ // second copy of the predicate could only drift from the generator's.
if (metrics.success_at_k < MIN_SUCCESS) breaches.push(`success@${K}=${metrics.success_at_k} < ${MIN_SUCCESS}`);
if (metrics.precision_at_k < MIN_PRECISION) breaches.push(`precision@${K}=${metrics.precision_at_k} < ${MIN_PRECISION}`);
@@ -267,7 +238,7 @@ function main() {
}
if (breaches.length) {
- console.log("Retrieval evals failed (quality thresholds and/or artifact invariants):");
+ console.log("Retrieval quality below threshold:");
for (const b of breaches) console.log(` breach: ${b}`);
process.exit(1);
}
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index 53a6d66b4a..9cad6d9023 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -57,13 +57,20 @@ type Chunk = { heading: string; content: string };
* blank-separated, because orderedSegments joins prose segments with a blank
* line, whereas a label is glued to its body by a single newline.
*/
-const INTRODUCER_LINE = /^\s*(?:\*\*[^*]{1,80}\*\*|#{1,6}\s+\S.*)\s*$/;
+const INTRODUCER_LINE = /^\s*(?:>\s*)*(?:\*\*[^*]{1,80}\*\*|#{1,6}\s+\S.*)\s*$/;
/** Trailing lines that introduce content the text does not (yet) contain. */
function trailingIntroducers(lines: string[]): number {
let i = lines.length;
- while (i > 0 && (!lines[i - 1].trim() || INTRODUCER_LINE.test(lines[i - 1]))) i--;
- return lines.length - i;
+ let sawIntroducer = false;
+ while (i > 0 && (!lines[i - 1].trim() || INTRODUCER_LINE.test(lines[i - 1]))) {
+ if (lines[i - 1].trim()) sawIntroducer = true;
+ i--;
+ }
+ // Trailing blank lines alone are not a broken promise - they are whitespace.
+ // Counting them made "ends on an introducer" true for "hello\n\n", which would
+ // have reported the wrong defect.
+ return sawIntroducer ? lines.length - i : 0;
}
/** Drop a trailing introducer run, so a clip never ends on a broken promise. */
@@ -72,13 +79,34 @@ function dropTrailingIntroducers(lines: string[]): string[] {
return drop ? lines.slice(0, lines.length - drop) : lines.slice();
}
+/**
+ * Strip the markers that make a line an INTRODUCER, keeping its words.
+ *
+ * The last-resort branch of clipMarkdown used to hand back the raw window when
+ * dropping introducers emptied it - which is exactly the output the invariant
+ * forbids, so with the assertion in postBuild it would be an unfixable build
+ * failure. The corpus is close: the longest existing leading introducer run is
+ * 247 characters against a 300-character assistant budget, and the longest single
+ * heading is 246. Demoting keeps the text and drops only the promise.
+ */
+function demoteIntroducers(text: string): string {
+ return text
+ .split("\n")
+ .map((l) =>
+ INTRODUCER_LINE.test(l)
+ ? l.replace(/^(\s*(?:>\s*)*)#{1,6}\s+/, "$1").replace(/\*\*([^*]*)\*\*/g, "$1")
+ : l,
+ )
+ .join("\n");
+}
+
function clipMarkdown(text: string, limit: number): string {
// The early return used to hand back the raw text, so for any chunk shorter
// than the limit the drop never ran at all - the "no excerpt ends on an
// introducer" property then held only by luck of the content.
if (text.length <= limit) {
const whole = dropTrailingIntroducers(text.split("\n")).join("\n").trimEnd();
- return whole || text;
+ return whole || demoteIntroducers(text).trimEnd();
}
const cut = text.slice(0, limit);
const lines = cut.split("\n");
@@ -96,8 +124,8 @@ function clipMarkdown(text: string, limit: number): string {
// after it. Two records did precisely that.
if (!open) {
const plain = dropTrailingIntroducers(lines).join("\n").trimEnd();
- // Never return nothing: if the clip was ONLY a label, the raw cut is better.
- return plain || cut;
+ // Never nothing, and never the forbidden shape: demote instead of echoing.
+ return plain || demoteIntroducers(cut).trimEnd();
}
// Dropping the half-included block is better than shipping it broken, unless
// that would throw away almost everything.
@@ -264,7 +292,13 @@ function enforceChunkInvariant(chunks: Chunk[]): Chunk[] {
// heading of an empty trailing section.
if (out.length) {
const last = out[out.length - 1];
- last.content = dropTrailingIntroducers(last.content.split("\n")).join("\n").trim();
+ const dropped = dropTrailingIntroducers(last.content.split("\n")).join("\n").trim();
+ // If that empties the ONLY chunk, the page would leave the index entirely -
+ // postBuild skips a page with no chunks without even counting it, so it would
+ // vanish silently and drag down the drift-guard ratio. Demote instead: the
+ // heading's words stay, the promise goes.
+ last.content =
+ dropped || (out.length === 1 ? demoteIntroducers(last.content).trim() : "");
}
return out
@@ -867,6 +901,7 @@ let GIT_DATES: Map | null = null;
function gitDates(siteDir: string): Map {
if (GIT_DATES) return GIT_DATES;
GIT_DATES = new Map();
+ let gitFailed = false;
try {
// A shallow clone cannot answer this question; say so by staying empty.
// Ask git rather than probing for .git/shallow: in a linked worktree (or with
@@ -904,9 +939,28 @@ function gitDates(siteDir: string): Map {
// git log is newest-first, so the first sighting of a file is its latest.
if (file && commitStamp && !GIT_DATES.has(file)) GIT_DATES.set(file, commitStamp);
}
- } catch {
- // Never fatal: this plugin must not be able to break a deploy.
+ } catch (err) {
+ // Never fatal: this plugin must not be able to break a deploy. But never
+ // silent either. A transient failure here - a lock held by a concurrent git
+ // process is enough - blanks last_verified for EVERY page, and this catch
+ // used to swallow it: one build in review shipped 4200 empty dates green,
+ // between two builds that carried 17 distinct real ones.
+ console.warn(
+ `[knowledge-extractor] git log failed: last_verified will be empty on ` +
+ `every page. ${err instanceof Error ? err.message : String(err)}`,
+ );
GIT_DATES = new Map();
+ gitFailed = true;
+ }
+ // git answered, and resolved nothing. Not the shallow case (that returned
+ // above) and not a git failure (that warned already, and would make this
+ // message blame the wrong cause), so an assumption is broken - say so rather
+ // than publish 0 dates behind a green build.
+ if (!gitFailed && GIT_DATES.size === 0) {
+ console.warn(
+ "[knowledge-extractor] git resolved 0 file dates in a non-shallow repo: " +
+ "last_verified will be empty on every page.",
+ );
}
return GIT_DATES;
}
@@ -1189,6 +1243,60 @@ type KModule = ReturnType;
// ---------------------------------------------------------------------------
// consumable artifacts
// ---------------------------------------------------------------------------
+/**
+ * Refuse to publish an artifact that breaks its own invariants.
+ *
+ * Asserted where the artifact is MADE, not in the eval script: that workflow is
+ * paths-filtered and limited to base `main`, so it does not run on build-docs.yml
+ * or docs-preview.yml - the two workflows that actually build and publish this
+ * index. Checking here covers every build, and keeps ONE copy of each predicate
+ * so the generator and its check cannot drift apart.
+ *
+ * Scope, measured rather than assumed: this guards the PUBLISHED fields, which is
+ * the whole surface a consumer sees. It is not a regression test for the chunker -
+ * with enforceChunkInvariant disabled the build still passes, because clipMarkdown
+ * drops trailing introducers from the excerpts on its own. The chunker's fixpoint
+ * property is a separate concern with its own tests.
+ *
+ * Named rather than inline so it can be called directly: an assertion nobody has
+ * seen fail is worth nothing, and proving this one fires should not cost a build.
+ *
+ * The two properties:
+ * - no published excerpt may END on a run that only INTRODUCES content, because
+ * such a record advertises what a consumer will not find in it;
+ * - no published excerpt may carry an unbalanced code fence, which hands a
+ * consumer raw code presented as prose.
+ */
+function assertArtifactInvariants(index: ReturnType[]): void {
+ const violations: string[] = [];
+ for (const field of ["docs_excerpt", "assistant_excerpt"] as const) {
+ const dangling = index.filter(
+ (r) => (String(r[field] || "").match(/^\s*(?:>\s*)*```/gm) || []).length % 2 !== 0,
+ );
+ const promising = index.filter(
+ (r) => trailingIntroducers(String(r[field] || "").split("\n")) > 0,
+ );
+ if (dangling.length) {
+ violations.push(
+ `${dangling.length} record(s) with an unbalanced code fence in ${field} ` +
+ `(e.g. ${dangling[0].id})`,
+ );
+ }
+ if (promising.length) {
+ violations.push(
+ `${promising.length} record(s) whose ${field} ends on a heading or label with ` +
+ `no content (e.g. ${promising[0].id})`,
+ );
+ }
+ }
+ if (violations.length) {
+ throw new Error(
+ `[knowledge-extractor] refusing to publish - artifact invariants broken:\n ` +
+ violations.join("\n "),
+ );
+ }
+}
+
function toIndexRecord(m: KModule) {
return {
objectID: m.id,
@@ -1520,6 +1628,8 @@ export default function knowledgeExtractor(context: any, _options: any) {
);
}
+ assertArtifactInvariants(index);
+
const assetsDir = path.join(outDir, "assets");
fs.mkdirSync(assetsDir, { recursive: true });
const idxPath = path.join(assetsDir, "knowledge-retrieval-index.json");
From 205cf595b6afea2f74bc8acd53544d1cf268c7eb Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Mon, 7 Sep 2026 10:46:58 +0100
Subject: [PATCH 23/53] fix(knowledge-extractor): demote until the line is no
longer an introducer
demoteIntroducers - added last commit to close clipMarkdown's escape hatch -
replaced its markers ONCE, so a whole family of shapes came back out still
matching INTRODUCER_LINE: `### # Foo` -> `# Foo`, `**# Note**` -> `# Note`,
`**## # x**` -> `## # x`. The demotion therefore handed assertArtifactInvariants
exactly the shape it throws on, and because that assertion now runs in postBuild
it would have failed build-docs.yml and every PR preview on content no docs
author could clear without a code change. Zero such lines exist in the corpus
today - which was equally true of the hole this replaced, 53 characters away.
It also cost enforceChunkInvariant the fixpoint property its own docstring
claims: a second application demoted `# Note` again, to `Note`.
demoteLine now loops until the line is not an introducer. It terminates: while
the line matches, one of the two patterns matches too, and either replacement
strictly shortens the line. No-progress is made terminal anyway, returning a
form that cannot match either branch - the cost of being wrong about that
argument is a build nobody can unblock.
The "page must not vanish" guard tested out.length === 1, the array length
BEFORE filtering, so a body that is entirely introducer lines but long enough to
split twice still lost every chunk - and postBuild skips a page with no chunks
WITHOUT incrementing pagesProcessed, so it left the index silently and dragged
the drift-guard ratio down. Now guarded on how many chunks still carry content,
which covers that case and the single-chunk one under one rule.
And two claims in last commit's comments were false. There are no chunker tests
in this repo, so "a separate concern with its own tests" was wrong; the property
is argued in the code and checked by nothing automated, which is what the comment
now says. And the assertion guards two published excerpt fields, not "the whole
surface a consumer sees" - `summary` is deliberately excluded because
whitespace-collapsing makes it match the predicate while carrying content.
Verified: all ten shapes demote to non-introducers and demotion is itself a
fixpoint; enforceChunkInvariant is a fixpoint again on each of them; a page of 70
heading-only sections yields 1 chunk instead of 0; every prior round's shape
still holds (27 assertions, all pass). typecheck 0. The chunker is
output-identical across all 630 docs files (2729 chunks, no word or heading
change). Build: 4200 modules / 572 pages / 0 page errors; the published index
differs from the reviewed commit only in its build timestamp and the graph is
byte-identical; last_verified carries 17 distinct dates, none empty. Evals
success@3 0.90, precision@3 0.85, MRR 0.90.
Co-Authored-By: Claude Opus 5 (1M context)
---
src/plugins/knowledge-extractor/index.ts | 70 +++++++++++++++++-------
1 file changed, 51 insertions(+), 19 deletions(-)
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index 9cad6d9023..03d2dc229e 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -90,14 +90,37 @@ function dropTrailingIntroducers(lines: string[]): string[] {
* heading is 246. Demoting keeps the text and drops only the promise.
*/
function demoteIntroducers(text: string): string {
- return text
- .split("\n")
- .map((l) =>
- INTRODUCER_LINE.test(l)
- ? l.replace(/^(\s*(?:>\s*)*)#{1,6}\s+/, "$1").replace(/\*\*([^*]*)\*\*/g, "$1")
- : l,
- )
- .join("\n");
+ return text.split("\n").map(demoteLine).join("\n");
+}
+
+/**
+ * Strip markers from ONE line until it is no longer an introducer.
+ *
+ * A single pass was not enough, and the shortfall was not cosmetic: `### # Foo`
+ * demotes to `# Foo`, `**# Note**` to `# Note`, `**## # x**` to `## # x` - all
+ * still introducers, so the demotion handed the assertion precisely the shape it
+ * throws on. With that assertion in postBuild, a page containing one such line
+ * fails the main deploy and every PR preview, on content no docs author could
+ * clear without a code change. It also broke enforceChunkInvariant's fixpoint:
+ * a second application demoted `# Note` again, to `Note`.
+ *
+ * Terminates: while the line matches, one of the two patterns matches too - the
+ * heading branch needs a leading `#{1,6}` run, the bold branch a whole-line
+ * `**...**` - and either replacement strictly shortens the line.
+ */
+function demoteLine(line: string): string {
+ let out = line;
+ while (INTRODUCER_LINE.test(out)) {
+ const next = out
+ .replace(/^(\s*(?:>\s*)*)#{1,6}\s+/, "$1")
+ .replace(/\*\*([^*]*)\*\*/g, "$1");
+ // Believed unreachable by the argument above, but the cost of being wrong is
+ // a build nobody can unblock, so make no-progress terminal rather than a
+ // spin - and hand back something that CANNOT match either branch.
+ if (next === out) return out.replace(/[#*>]/g, "").trim();
+ out = next;
+ }
+ return out;
}
function clipMarkdown(text: string, limit: number): string {
@@ -293,12 +316,15 @@ function enforceChunkInvariant(chunks: Chunk[]): Chunk[] {
if (out.length) {
const last = out[out.length - 1];
const dropped = dropTrailingIntroducers(last.content.split("\n")).join("\n").trim();
- // If that empties the ONLY chunk, the page would leave the index entirely -
- // postBuild skips a page with no chunks without even counting it, so it would
- // vanish silently and drag down the drift-guard ratio. Demote instead: the
- // heading's words stay, the promise goes.
- last.content =
- dropped || (out.length === 1 ? demoteIntroducers(last.content).trim() : "");
+ // Guarded on the RESULT, not on out.length. A body that is entirely
+ // introducer lines but long enough to split chunks twice has out.length > 1,
+ // so testing the array length let every chunk empty and the page leave the
+ // index - and postBuild skips a page with no chunks WITHOUT incrementing
+ // pagesProcessed, so it vanishes silently AND drags the drift-guard ratio
+ // down. Counting what still has content covers that case and the
+ // single-chunk one under one rule.
+ const survivors = out.slice(0, -1).filter((c) => c.content.trim()).length;
+ last.content = dropped || (survivors === 0 ? demoteIntroducers(last.content).trim() : "");
}
return out
@@ -1252,11 +1278,17 @@ type KModule = ReturnType;
* index. Checking here covers every build, and keeps ONE copy of each predicate
* so the generator and its check cannot drift apart.
*
- * Scope, measured rather than assumed: this guards the PUBLISHED fields, which is
- * the whole surface a consumer sees. It is not a regression test for the chunker -
- * with enforceChunkInvariant disabled the build still passes, because clipMarkdown
- * drops trailing introducers from the excerpts on its own. The chunker's fixpoint
- * property is a separate concern with its own tests.
+ * Scope, measured rather than assumed: this guards the two published excerpt
+ * fields, docs_excerpt and assistant_excerpt. Not every published field: `summary`
+ * is whitespace-collapsed to a single line, so a chunk opening `## Install` yields
+ * "## Install Do X..." - matching the predicate while carrying content, which
+ * would be a false positive.
+ *
+ * It is also NOT a regression test for the chunker: with enforceChunkInvariant
+ * disabled a full build still passes, because clipMarkdown drops trailing
+ * introducers from the excerpts on its own. The chunker's fixpoint property is
+ * argued in demoteLine and enforceChunkInvariant and checked by nothing
+ * automated - this repo has no chunker tests. Worth adding; not claimed here.
*
* Named rather than inline so it can be called directly: an assertion nobody has
* seen fail is worth nothing, and proving this one fires should not cost a build.
From 7ed54938e983243485fb7bcb07ddbd92fe1565fe Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Mon, 7 Sep 2026 13:54:37 +0100
Subject: [PATCH 24/53] fix(knowledge-extractor): index the version actually
served, not "current"
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Two of the four review findings were real; the other two did not reproduce and
are noted below so nobody re-chases them.
VERSION LABEL. `const version = "current"` and "skip the dirs named in
versions.json" are both correct only while `lastVersion` is "current". On a beta
cycle - update-version.py minor_beta snapshots the release and sets
DOCS_LAST_VERSION="8.6.0" - Docusaurus serves the FROZEN 8.6.0 at the root and
moves the in-development tree to /next/. The root pages, which are 8.6.0, would
have been labelled "current", and /next/ would have been indexed a SECOND time,
also as "current", with no frontmatter match because its source path does not
exist under docs/. Neither the empty-output guard nor the 0.5 ratio guard fires
on that, because the page count goes UP.
The served version now comes from the config (`customFields.lastVersion`, added
alongside the other search-tag derivations) and `next` is excluded whenever a
frozen version is at the root. Verified on this build: 4,637 modules from 616
pages, 0 errors, every module `version: "current"`, 0 modules from /next/.
HARDCODED VERSION IN THE TEST. `rewriteVersionTag(filters, "docs-default-7.6.14",
…)` sat in the file whose stated premise is that no version may be hardcoded,
between a LEGACY and an API76 that are both derived from the manifest. Retiring
7.6 would have failed `yarn test:search-facets` for a reason unrelated to search.
It now derives the tag the same way. The remaining `docs-default-9.9.9` is a
deliberately synthetic unknown tag, not a repo version.
DID NOT REPRODUCE, checked directly:
The KMP API reference is NOT missing. /data-capture-sdk/kmp/search.html is
HTTP 200 with a real searchindex, and the tree has content -
kmp/core/api/data-capture-context.html is 46,553 bytes,
kmp/barcode-capture/api.html is 35,128. The premise (zero data-capture-sdk
references under docs/sdks/kmp) is true but means the KMP docs do not LINK
their API tree, not that it 404s. Worth fixing separately: nothing in the docs
points a KMP reader at it.
The release-notes prose was not touched by this PR. `git diff origin/main..HEAD
-- docs/sdks/{android,ios}/release-notes.md` is empty, and both "Invalid
Format." and "California–Driver's License" are byte-identical on main. Whatever
their merits, they predate this branch.
Co-Authored-By: Claude Opus 5 (1M context)
---
docusaurus.config.ts | 4 +++
scripts/test-search-facets.cjs | 6 +++-
src/plugins/knowledge-extractor/index.ts | 36 ++++++++++++++++++++----
3 files changed, 40 insertions(+), 6 deletions(-)
diff --git a/docusaurus.config.ts b/docusaurus.config.ts
index de805433b1..a027b26bc4 100644
--- a/docusaurus.config.ts
+++ b/docusaurus.config.ts
@@ -466,6 +466,10 @@ const config: Config = {
// reader on 6.28.11 finds the 6.28 API and never the 8.x one.
apiReferenceTagsByVersionTag: buildApiReferenceTags(docsVersions),
versionNumberByTag: buildVersionNumberByTag(docsVersions),
+ // Which version THIS build serves at the root. Read by the
+ // knowledge-extractor plugin, which cannot otherwise tell a frozen version
+ // served at the root from `current` - and the two need opposite handling.
+ lastVersion: effectiveLastVersion,
},
// Set the production url of your site here
diff --git a/scripts/test-search-facets.cjs b/scripts/test-search-facets.cjs
index d351ff270e..8bbce43137 100644
--- a/scripts/test-search-facets.cjs
+++ b/scripts/test-search-facets.cjs
@@ -177,7 +177,11 @@ check("an unknown version tag adds nothing rather than guessing", () => {
check("typing a version moves the guides AND the API reference together", () => {
const filters = ["language:en", [DEFAULT, SERVED, APILATEST]];
- const out = rewriteVersionTag(filters, "docs-default-7.6.14", MAP);
+ // The frozen tag from the manifest, not a literal. This file's premise is
+ // that no version may be hardcoded here - LEGACY and API76 either side of
+ // this line are derived - so retiring 7.6 would have failed the suite for a
+ // reason unrelated to search correctness.
+ const out = rewriteVersionTag(filters, LEGACY.replace("docusaurus_tag:", ""), MAP);
const tags = tagsOf(out);
assert.ok(tags.includes(LEGACY), "page tag must be swapped");
assert.ok(tags.includes(API76), "API reference must follow to 7.6");
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index 03d2dc229e..4568e2f3c9 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -1536,11 +1536,26 @@ export default function knowledgeExtractor(context: any, _options: any) {
// the per-page git commit date resolved below - using build time there made
// every module claim it had been verified today.
const buildStamp = new Date().toISOString();
- const version = "current";
- // Index the CURRENT docs version only. Frozen versions (versions.json)
- // are archived duplicates; the external API reference (data-capture-sdk)
- // is a separate tool; *.html dirs are client-redirect stubs.
+ // Which version sits at the ROOT of this build, from the config rather than
+ // assumed. `"current"` was hardcoded, and that holds only while
+ // `lastVersion` is "current". On a beta cycle - update-version.py
+ // minor_beta snapshots the release and sets DOCS_LAST_VERSION="8.6.0" -
+ // Docusaurus serves the FROZEN 8.6.0 at the root and moves the
+ // in-development tree to /next/. Two things then went wrong at once: the
+ // root pages, which are 8.6.0, were labelled `version: "current"`, and
+ // /next/ was indexed a SECOND time, also as "current", with no frontmatter
+ // match because its source path does not exist under docs/. Neither the
+ // empty-output guard nor the ratio guard fires on that, because the page
+ // count goes UP.
+ const servedVersion = String(siteConfig?.customFields?.lastVersion || "current");
+ const servesCurrent = servedVersion === "current";
+ const version = servedVersion;
+
+ // Index the version served at the ROOT only. Frozen versions
+ // (versions.json) are archived duplicates; `next` is the unreleased tree
+ // when it exists; the external API reference (data-capture-sdk) is a
+ // separate tool; *.html dirs are client-redirect stubs.
let frozenVersions: string[] = [];
try {
const parsed = JSON.parse(fs.readFileSync(path.join(siteDir, "versions.json"), "utf8"));
@@ -1548,7 +1563,18 @@ export default function knowledgeExtractor(context: any, _options: any) {
} catch {
/* no versions.json */
}
- const excluded = new Set([...frozenVersions, "data-capture-sdk", "assets", "img", "fonts", "search"]);
+ const excluded = new Set([
+ ...frozenVersions,
+ "data-capture-sdk",
+ "assets",
+ "img",
+ "fonts",
+ "search",
+ // `next` exists only when a frozen version is served at the root, and it
+ // is then the unreleased tree - a duplicate of every page under a version
+ // label this artifact does not describe.
+ ...(servesCurrent ? [] : ["next"]),
+ ]);
const skipDir = (name: string) => excluded.has(name) || name.endsWith(".html");
const files = walkHtml(outDir, skipDir);
From 70cc3545768465548d8c1ea0e8541ca027fdacb4 Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Tue, 8 Sep 2026 09:11:08 +0100
Subject: [PATCH 25/53] fix(knowledge-extractor): word-boundary auth intent,
and stop indexing Titanium
Second review round on this PR. Four code items and two questions.
`pickIntents` matched the SUBSTRING " auth", so it filed anything beginning
with those four letters under the security intent. Measured across the built
HTML before changing it: "authenticity" 12 times, "authentic" 10, "authority"
5 - every one of them the ID-document sense, about whether a passport is
genuine - against "authorization" twice. The old test therefore filed about 27
document-verification mentions as security findings and 2 real ones. Now a
word-boundary match. Verb forms are deliberately out: "authenticate" does not
occur in this corpus at all, while "authorized" does, in "authorized dealer",
so adding them would re-admit the false positives to catch nothing.
TITANIUM was being indexed although the repo had already decided an assistant
should not see it: `llmsIgnoredSdkTrees` excludes it from the sibling
docusaurus-plugin-llms export as "deprecated / not needed for assistant
context". Rather than restate that decision here, the globs are exported through
`customFields` and this plugin derives its route prefixes from them, so the two
AI exports cannot drift into disagreeing about scope. Filtered on the file list
rather than inside the loop, so an ignored page is never read or parsed.
Measured: 4,637 modules to 4,425, zero from /sdks/titanium/.
`--auto` could not fail its own gate: MIN_AUTO_SUCCESS defaulted to 0 and every
possible rate is >= 0, so the run printed "(min 0)" and gated nothing. Measured
page-success@3 = 0.8653 over all 616 pages / 4,437 modules and set the default
to 0.80, which absorbs ordinary drift and still fails a regression.
THE TWO OPEN QUESTIONS have one measured answer, recorded where each was asked.
This is a POINTER index, not a text store: on this build it is already 11.0 MB
with a 12.3 MB graph, while llms-full.txt carries the full prose of every page
in 2.3 MB. Publishing content.docs_markdown would add ~6.5 MB to restate, five
times less efficiently, text that ships beside it. So the division of labour is
that llms ships prose for context-stuffing and this ships typed metadata and
edges for deciding what to read, and CHUNK_TARGET_CHARS is a granularity knob
rather than a payload size - it decides which links land in which module's
references and api_refs, so changing it changes the edges, not just the size.
The 11 MB fetch is recorded as a known limit.
The chunk text is not discarded, which is worth stating because the review read
it that way: it is the input the published fields are derived FROM. Measured on
this build, chunk prose yields 2,823 api_refs, 1,053 internal references, 18,976
keywords, and a summary and intents for all 4,425 modules.
AND THE VERIFICATION I OWED. The previous commit's numbers only exercised
`servesCurrent === true`, which is the branch that was already correct - as the
review pointed out, both the version label and the /next/ exclusion are no-ops
there. Verified the other branch properly: with DOCS_LAST_VERSION temporarily
set to 7.6.14, the extractor produced 2,908 modules from 463 pages, every one
labelled version "7.6.14" rather than "current", zero from /next/, zero from
titanium. That build then failed in plugin-client-redirects because 7.6.14 has
no /sdks/ios/agent-skills/ or /migrate-7-to-8/ to redirect to - a property of
picking an old version for the test, not of this change, since a real beta cycle
freezes the newest release. Config restored; a normal build succeeds with 4,425
modules from 570 pages.
Co-Authored-By: Claude Opus 5 (1M context)
---
docusaurus.config.ts | 15 ++++++
scripts/retrieval-evals/run.cjs | 6 ++-
src/plugins/knowledge-extractor/index.ts | 58 +++++++++++++++++++++++-
3 files changed, 76 insertions(+), 3 deletions(-)
diff --git a/docusaurus.config.ts b/docusaurus.config.ts
index a027b26bc4..75585c8db0 100644
--- a/docusaurus.config.ts
+++ b/docusaurus.config.ts
@@ -466,6 +466,12 @@ const config: Config = {
// reader on 6.28.11 finds the 6.28 API and never the 8.x one.
apiReferenceTagsByVersionTag: buildApiReferenceTags(docsVersions),
versionNumberByTag: buildVersionNumberByTag(docsVersions),
+ // Source trees the repo has decided an assistant should not be given.
+ // Declared once as globs for docusaurus-plugin-llms; the
+ // knowledge-extractor reads them here and derives its own route prefixes,
+ // so the two AI exports cannot drift into disagreeing about what an
+ // assistant may see - they had, and this one was indexing Titanium.
+ llmsIgnoredSdkTrees,
// Which version THIS build serves at the root. Read by the
// knowledge-extractor plugin, which cannot otherwise tell a frozen version
// served at the root from `current` - and the two need opposite handling.
@@ -743,6 +749,15 @@ const config: Config = {
// /assets/knowledge-graph.jsonld from the rendered HTML (see
// src/plugins/knowledge-extractor).
//
+ // Division of labour with docusaurus-plugin-llms above, which also exports for
+ // AI consumers: that plugin ships the PROSE (llms.txt as a link index,
+ // llms-full.txt as the text, 78 KB and 2.3 MB on this build). This one ships
+ // TYPED METADATA AND EDGES for deciding what to read - intents, audiences,
+ // channels, frameworks, products, cites-API, see-also, availability - with
+ // only an excerpt of the prose, because the text is already published next to
+ // it. Neither replaces the other, and both read llmsIgnoredSdkTrees from
+ // customFields so they cannot disagree about what an assistant may see.
+ //
// LAST in the array on purpose: its postBuild reads the rendered HTML, so it
// must run after any plugin that rewrites the build - stripPreviewMediaPlugin
// on a preview build in particular. Ordered before, it would extract from a
diff --git a/scripts/retrieval-evals/run.cjs b/scripts/retrieval-evals/run.cjs
index ef4d15c4dd..d59d49877d 100644
--- a/scripts/retrieval-evals/run.cjs
+++ b/scripts/retrieval-evals/run.cjs
@@ -41,7 +41,11 @@ const MIN_MRR = parseFloat(arg("min-mrr", "0.6"));
// create/edit. --auto-limit caps it; --min-auto-success gates it.
const AUTO = process.argv.includes("--auto");
const AUTO_LIMIT = parseInt(arg("auto-limit", "0"), 10);
-const MIN_AUTO_SUCCESS = parseFloat(arg("min-auto-success", "0"));
+// Not 0: every possible rate is >= 0, so the old default printed "(min 0)"
+// and gated nothing. Measured on this corpus - page-success@3 = 0.8653 over
+// all 616 pages / 4,637 modules - so 0.80 absorbs ordinary drift and still
+// fails a real regression. Re-measure with `--auto` before moving it.
+const MIN_AUTO_SUCCESS = parseFloat(arg("min-auto-success", "0.80"));
const REPORT = arg("report", "");
const TOKEN = /[a-z0-9]{2,}/gi;
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index 4568e2f3c9..348a8c69e1 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -14,6 +14,34 @@
* - /assets/knowledge-retrieval-index.json (fast lookup)
* - /assets/knowledge-graph.jsonld (enriched concept graph)
*
+ * A POINTER INDEX, NOT A TEXT STORE - and deliberately so. `toIndexRecord`
+ * publishes `docs_excerpt` (<=400 chars, averaging 374) and `assistant_excerpt`
+ * (averaging 518) and does NOT publish `content.docs_markdown`; the consumer
+ * follows `url` for the full text. That is not an oversight, it is the only
+ * shape that makes sense next to the sibling export: measured on this build the
+ * index is already 11.0 MB and the graph 12.3 MB, while `llms-full.txt` carries
+ * the FULL prose of every page in 2.3 MB. Adding ~1,400 chars per module would
+ * put ~6.5 MB more onto an 11 MB artifact in order to restate, five times less
+ * efficiently, text that ships next to it.
+ *
+ * So CHUNK_TARGET_CHARS is a GRANULARITY knob, not a payload size: it decides
+ * how finely a page is split into retrievable units, and the excerpt is a
+ * ranking and preview budget. Shrinking the chunk to match the excerpt would
+ * change what a module IS - more, smaller modules - which is a retrieval-quality
+ * decision to make against the evals, not a size cleanup.
+ *
+ * DIVISION OF LABOUR with docusaurus-plugin-llms, registered beside this one:
+ * that plugin emits the PROSE corpus for context-stuffing (`llms.txt` as a link
+ * index, `llms-full.txt` as the text). This one emits TYPED METADATA AND EDGES
+ * for deciding which page or chunk to read - intents, audiences, channels,
+ * frameworks, products, cites-API, see-also, availability - which a flat text
+ * dump cannot express. They share a source of truth for what an assistant may
+ * see (`customFields.llmsIgnoredSdkTrees`) so they cannot disagree about scope.
+ *
+ * Known limit: 11 MB is large for a browser consumer to fetch whole. Nothing in
+ * the repo consumes it that way yet; if something does, it needs a served index
+ * or a split by framework rather than a smaller excerpt.
+ *
* The graph is not just faceting: alongside intent/audience/channel/framework
* it mines real edges from the content — product membership, cites-API,
* see-also (internal links), and per-product availability (from "not available"
@@ -402,7 +430,18 @@ function pickIntents(contentType: string, title: string, body: string): string[]
if (contentType === "tutorial" || contentType === "how-to" || text.includes("configure")) intents.push("configure");
if (contentType === "troubleshooting" || text.includes("error") || text.includes("fix")) intents.push("troubleshoot");
if (contentType === "reference" || contentType === "concept" || text.includes("integrat")) intents.push("integrate");
- if (text.includes("secure") || text.includes(" auth")) intents.push("secure");
+ // Word-boundary, not a substring. Counted across the built HTML, `" auth"`
+ // matched "authenticity" 12 times, "authentic" 10 and "authority" 5 - every
+ // one of them the ID-DOCUMENT sense, about whether a passport is genuine -
+ // against "authorization" twice. So the old test filed about 27
+ // document-verification mentions under the security intent, and 2 real ones.
+ //
+ // Verb forms are deliberately left out: "authenticate" does not occur in
+ // this corpus at all, while "authorized" does - in "authorized dealer" -
+ // so adding them would re-admit the false positives to catch nothing.
+ if (text.includes("secure") || /\bauth(?:n|entication|orization)?\b/.test(text)) {
+ intents.push("secure");
+ }
if (intents.length === 0) intents.push("configure");
return Array.from(new Set(intents)).sort();
}
@@ -1563,6 +1602,15 @@ export default function knowledgeExtractor(context: any, _options: any) {
} catch {
/* no versions.json */
}
+ // Route prefixes the sibling llms export is told to skip, read from the
+ // config rather than restated here. `docs/sdks/titanium/**` becomes
+ // `sdks/titanium/`, which is how it appears in a built route.
+ const ignoredRoutePrefixes = (
+ (siteConfig?.customFields?.llmsIgnoredSdkTrees as readonly string[] | undefined) || []
+ )
+ .map((glob) => String(glob).replace(/^docs\//, "").replace(/\*+$/, ""))
+ .filter(Boolean);
+
const excluded = new Set([
...frozenVersions,
"data-capture-sdk",
@@ -1577,7 +1625,13 @@ export default function knowledgeExtractor(context: any, _options: any) {
]);
const skipDir = (name: string) => excluded.has(name) || name.endsWith(".html");
- const files = walkHtml(outDir, skipDir);
+ // Filtered here rather than in skipDir, which sees one directory NAME and
+ // so cannot express a multi-segment route like `sdks/titanium/`. Applied to
+ // the list, not inside the loop, so an ignored page is never read or parsed.
+ const files = walkHtml(outDir, skipDir).filter((f) => {
+ const rel = path.relative(outDir, path.dirname(f)).split(path.sep).join("/");
+ return !ignoredRoutePrefixes.some((prefix) => `${rel}/`.startsWith(prefix));
+ });
const modules: KModule[] = [];
let pagesProcessed = 0;
let pageErrors = 0;
From a5d6cf358047fa49feb197b7cecde00f33de4fc8 Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Tue, 8 Sep 2026 09:26:56 +0100
Subject: [PATCH 26/53] fix(knowledge-extractor): apply the curation list, not
a paraphrase of it
Third round. The previous commit reused `llmsIgnoredSdkTrees` and claimed the
two AI exports "cannot disagree about scope". Both halves were wrong, and the
review was right on each.
WRONG SOURCE. That constant is one of six entries in what
docusaurus-plugin-llms is actually given, so the exports still disagreed about
39 modules - 26 Linux stub pages and 13 redirect-only root docs. But exporting
the WHOLE llms list over-corrects: it also carries a CORPUS-SHAPE decision,
deduping prose repeated under every non-Web SDK root to the Web copy. Applying
that here removed ~1,400 modules and with them the ability to answer "where in
the Flutter docs does this live", which is what a routing index is for.
So the list is split at the seam that was already implicit in it.
`assistantIgnoreFiles` is the curation half - deprecated platforms, features a
platform lacks, redirect-only stubs, non-route partials - shared by both
exports. `llmsDedupedToWeb` is the corpus half, used only by llms.
`llmsIgnoreFiles` is their concatenation, so every path is still declared once
and the one deliberate difference has a name and a reason next to it. Measured:
4,637 modules -> 4,386, with exactly the 212 Titanium and 39 stub modules gone
and the 1,400 deduped ones kept.
WRONG MATCHER. The prefix derivation - strip `docs/`, strip trailing `*` -
understood exactly one glob shape and failed OPEN on every other: a brace list,
a leading `**/`, a bare file path, a mid-path `*` all matched nothing, with no
warning. Adding a tree in any other form would have produced a green build that
kept feeding an assistant what the repo had just decided to hide. Replaced with
a small glob compiler that handles `*`, `**` and literals and THROWS on a shape
it cannot express, rather than a matcher dependency: none is declared here, and
reaching for a transitive one is the mistake this plugin was already corrected
on with cheerio. Ten cases checked, including the rejection.
A missing `customFields.assistantIgnoreFiles` now throws too. Absent meant
"index everything", which is the wrong default for a curation list and invisible
to both output guards, because the page count goes UP.
AND THE HALF-VERIFIED FIX. The review was right again: the 7.6.14 build
exercised the version LABEL only, because that build's root pages were the
`docs/` tree, so the source lookup was never wrong. On a real beta build the
root is served from `versioned_docs/version-/` while `docs/` is the
unreleased tree, and every root module took its frontmatter, dates,
`topic_type`, `product`, `keywords` and `last_verified` from the NEXT version's
file - right on the day of the snapshot, wrong from the first edit after it.
Comparing version-7.6.14 against today's `docs/` shows 388 of 449 shared pages
with differing frontmatter. `sourceCandidates` now takes the served version and
prefixes accordingly, threaded through resolveSource, contributingFiles,
sourceDate and readFrontMatter.
Smaller corrections, all from measurement rather than reasoning:
The header still described "each CURRENT-version page", which is what the
previous commit changed.
`docs_excerpt` is documented as averaging 376.5 with a max of 404, not
"<=400": clipMarkdown appends the fence closer AFTER slicing, so 400 is the
slice budget and not an enforced bound.
Sizes are quoted in MiB, matching the plugin's own budget check, not SI MB.
The pointer-index argument no longer claims each module's prose ships in
llms-full.txt. I could not establish that: the two artifacts cut the corpus
differently - 452 page sections against 4,386 modules - so the argument rests
on the `url` and on the ~6 MiB the alternative would add.
MIN_AUTO_SUCCESS's justification was measured against a corpus this same PR
no longer produces. Re-measured on what ships: page-success@3 = 0.8493 over
531 pages / 4,386 modules, so the 0.80 default keeps 4.9 points of headroom.
And that gate was never run: no workflow passed `--auto`. The evals workflow
now has a second step for it with its own report, so corpus-wide coverage -
the only check that covers pages nobody wrote a gold query for - is actually
enforced.
Co-Authored-By: Claude Opus 5 (1M context)
---
.github/workflows/docs-retrieval-evals.yml | 12 +-
docusaurus.config.ts | 54 ++++--
scripts/retrieval-evals/run.cjs | 13 +-
src/plugins/knowledge-extractor/index.ts | 185 +++++++++++++++++----
4 files changed, 211 insertions(+), 53 deletions(-)
diff --git a/.github/workflows/docs-retrieval-evals.yml b/.github/workflows/docs-retrieval-evals.yml
index 0f567e4a1d..b012fb14d7 100644
--- a/.github/workflows/docs-retrieval-evals.yml
+++ b/.github/workflows/docs-retrieval-evals.yml
@@ -52,10 +52,20 @@ jobs:
- name: Run retrieval evals
run: node scripts/retrieval-evals/run.cjs --report reports/retrieval-evals.json
+ # The gold-set run above measures 20 curated queries. This one asks every
+ # module to retrieve itself, which is the only check that covers pages
+ # nobody wrote a query for - and until now MIN_AUTO_SUCCESS gated nothing
+ # because no workflow passed --auto. Reported separately so a corpus-wide
+ # regression is attributable.
+ - name: Run corpus-wide self-retrieval
+ run: node scripts/retrieval-evals/run.cjs --auto --report reports/retrieval-evals-auto.json
+
- name: Upload eval report
if: always()
uses: actions/upload-artifact@v4
with:
name: retrieval-evals-report
- path: reports/retrieval-evals.json
+ path: |
+ reports/retrieval-evals.json
+ reports/retrieval-evals-auto.json
if-no-files-found: ignore
diff --git a/docusaurus.config.ts b/docusaurus.config.ts
index 75585c8db0..759774005b 100644
--- a/docusaurus.config.ts
+++ b/docusaurus.config.ts
@@ -96,19 +96,40 @@ const llmsRootRedirectOnlyDocs: string[] = [
"docs/system-requirements.mdx",
];
-// Paths are matched by docusaurus-plugin-llms relative to siteDir (e.g. docs/...).
-const llmsIgnoreFiles: string[] = [
+/**
+ * CURATION: pages no AI consumer should be given at all - deprecated platforms,
+ * features a platform does not have, redirect-only stubs with no prose, and
+ * partials that are not routes. Shared by both AI exports, so a decision about
+ * what an assistant may see is made once.
+ */
+const assistantIgnoreFiles: string[] = [
"docs/connector-guides/**",
// Partials are imported into real pages, not standalone doc routes; omit so llms.txt URLs work.
"docs/partials/**",
...llmsRootRedirectOnlyDocs,
...llmsIgnoredSdkTrees,
...llmsLinuxPartialIgnore,
- ...llmsNonWebSdkRoots.flatMap((root) =>
- llmsSharedPartialPageNames.map((name) => `docs/${root}/${name}`),
- ),
];
+/**
+ * CORPUS SHAPE, for the llms export only: the same prose repeated under every
+ * non-Web SDK root, deduped to Web so a flat text corpus does not carry nine
+ * copies of it.
+ *
+ * Deliberately NOT shared with the knowledge-extractor, and this is the one
+ * place the two exports differ on purpose. That index exists to route a reader
+ * to the page they are on: someone reading Flutter docs needs the Flutter URL,
+ * not the Web one that happens to hold the canonical copy of the text. Applying
+ * this list there removed about 1,400 modules and with them the ability to
+ * answer "where in the Flutter docs does this live".
+ */
+const llmsDedupedToWeb: string[] = llmsNonWebSdkRoots.flatMap((root) =>
+ llmsSharedPartialPageNames.map((name) => `docs/${root}/${name}`),
+);
+
+// Paths are matched by docusaurus-plugin-llms relative to siteDir (e.g. docs/...).
+const llmsIgnoreFiles: string[] = [...assistantIgnoreFiles, ...llmsDedupedToWeb];
+
// ---------------------------------------------------------------------------
// SINGLE SOURCE OF TRUTH: docs versions and every `docusaurus_tag` derived
// from them.
@@ -466,12 +487,13 @@ const config: Config = {
// reader on 6.28.11 finds the 6.28 API and never the 8.x one.
apiReferenceTagsByVersionTag: buildApiReferenceTags(docsVersions),
versionNumberByTag: buildVersionNumberByTag(docsVersions),
- // Source trees the repo has decided an assistant should not be given.
- // Declared once as globs for docusaurus-plugin-llms; the
- // knowledge-extractor reads them here and derives its own route prefixes,
- // so the two AI exports cannot drift into disagreeing about what an
- // assistant may see - they had, and this one was indexing Titanium.
- llmsIgnoredSdkTrees,
+ // The CURATION half of the llms ignore list - what no AI consumer should be
+ // given - exported so the knowledge-extractor applies the same decision
+ // rather than a paraphrase of it. Exporting only `llmsIgnoredSdkTrees` left
+ // the two disagreeing about 39 modules; exporting the WHOLE llms list
+ // over-corrected, because it also carries a corpus-shape decision (see
+ // llmsDedupedToWeb) that a routing index must not inherit.
+ assistantIgnoreFiles,
// Which version THIS build serves at the root. Read by the
// knowledge-extractor plugin, which cannot otherwise tell a frozen version
// served at the root from `current` - and the two need opposite handling.
@@ -751,12 +773,16 @@ const config: Config = {
//
// Division of labour with docusaurus-plugin-llms above, which also exports for
// AI consumers: that plugin ships the PROSE (llms.txt as a link index,
- // llms-full.txt as the text, 78 KB and 2.3 MB on this build). This one ships
+ // llms-full.txt as the text - 0.08 and 2.28 MiB on this build). This one ships
// TYPED METADATA AND EDGES for deciding what to read - intents, audiences,
// channels, frameworks, products, cites-API, see-also, availability - with
// only an excerpt of the prose, because the text is already published next to
- // it. Neither replaces the other, and both read llmsIgnoredSdkTrees from
- // customFields so they cannot disagree about what an assistant may see.
+ // it (10.41 MiB index, 11.62 MiB graph). Neither replaces the other.
+ //
+ // They share assistantIgnoreFiles, so what an assistant may SEE is decided
+ // once. They differ, on purpose, on llmsDedupedToWeb: a flat corpus wants one
+ // copy of prose repeated across frameworks, a routing index needs the module
+ // that points at the framework the reader is actually on.
//
// LAST in the array on purpose: its postBuild reads the rendered HTML, so it
// must run after any plugin that rewrites the build - stripPreviewMediaPlugin
diff --git a/scripts/retrieval-evals/run.cjs b/scripts/retrieval-evals/run.cjs
index d59d49877d..f23608895f 100644
--- a/scripts/retrieval-evals/run.cjs
+++ b/scripts/retrieval-evals/run.cjs
@@ -42,9 +42,16 @@ const MIN_MRR = parseFloat(arg("min-mrr", "0.6"));
const AUTO = process.argv.includes("--auto");
const AUTO_LIMIT = parseInt(arg("auto-limit", "0"), 10);
// Not 0: every possible rate is >= 0, so the old default printed "(min 0)"
-// and gated nothing. Measured on this corpus - page-success@3 = 0.8653 over
-// all 616 pages / 4,637 modules - so 0.80 absorbs ordinary drift and still
-// fails a real regression. Re-measure with `--auto` before moving it.
+// and gated nothing.
+//
+// Measured on the corpus this branch actually ships - page-success@3 =
+// 0.8493 over 531 pages / 4,386 modules - so 0.80 leaves 4.9 points of
+// headroom and still fails a real regression. An earlier note here said
+// 0.8653 over 616 pages / 4,637 modules, which was true before the same
+// change's curation filter removed Titanium and the stub pages: a figure
+// measured against a corpus the branch no longer produces. Re-measure with
+// `--auto` after anything that changes what is indexed, not just before
+// moving this number.
const MIN_AUTO_SUCCESS = parseFloat(arg("min-auto-success", "0.80"));
const REPORT = arg("report", "");
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index 348a8c69e1..25919be28c 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -7,7 +7,8 @@
* and every chunk gets the real, user-facing URL and the frontmatter-derived
* `` as its summary.
*
- * It splits each CURRENT-version page into small self-contained knowledge
+ * It splits each page of the version SERVED AT THE ROOT into small
+ * self-contained knowledge
* modules (chunks, ~1400 chars) with rule-based metadata, preserving link URLs
* inside the prose (so citations — including external API-reference links —
* survive), then emits the two artifacts an assistant / in-docs search consume:
@@ -15,14 +16,21 @@
* - /assets/knowledge-graph.jsonld (enriched concept graph)
*
* A POINTER INDEX, NOT A TEXT STORE - and deliberately so. `toIndexRecord`
- * publishes `docs_excerpt` (<=400 chars, averaging 374) and `assistant_excerpt`
- * (averaging 518) and does NOT publish `content.docs_markdown`; the consumer
- * follows `url` for the full text. That is not an oversight, it is the only
- * shape that makes sense next to the sibling export: measured on this build the
- * index is already 11.0 MB and the graph 12.3 MB, while `llms-full.txt` carries
- * the FULL prose of every page in 2.3 MB. Adding ~1,400 chars per module would
- * put ~6.5 MB more onto an 11 MB artifact in order to restate, five times less
- * efficiently, text that ships next to it.
+ * publishes `docs_excerpt` (averaging 376.5 chars, max 404 - `clipMarkdown`
+ * appends the fence closer AFTER slicing to 400, so 400 is the slice budget and
+ * not an enforced bound) and `assistant_excerpt` (averaging 521.2, max 623),
+ * and does NOT publish `content.docs_markdown`; the consumer follows `url` for
+ * the full text - which is the page itself, so it is always reachable.
+ *
+ * The cost of the alternative is measurable: the index is already 10.41 MiB and
+ * the graph 11.62 MiB, and adding ~1,400 chars per module would put roughly
+ * 6 MiB more onto it. For scale, `llms-full.txt` carries the site's prose in
+ * 2.28 MiB, so per-module text is an expensive way to store text. The argument
+ * rests on that and on the `url`, NOT on a claim that each module's prose also
+ * ships in llms-full.txt: the two artifacts cut the corpus differently - 452
+ * page sections there against 4,386 modules here - so there is no per-module
+ * correspondence to appeal to. Units are MiB throughout, to match `mb()` and
+ * MAX_INDEX_MB below.
*
* So CHUNK_TARGET_CHARS is a GRANULARITY knob, not a payload size: it decides
* how finely a page is split into retrievable units, and the excerpt is a
@@ -38,9 +46,9 @@
* dump cannot express. They share a source of truth for what an assistant may
* see (`customFields.llmsIgnoredSdkTrees`) so they cannot disagree about scope.
*
- * Known limit: 11 MB is large for a browser consumer to fetch whole. Nothing in
- * the repo consumes it that way yet; if something does, it needs a served index
- * or a split by framework rather than a smaller excerpt.
+ * Known limit: 10 MiB is large for a browser consumer to fetch whole. Nothing
+ * in the repo consumes it that way yet; if something does, it needs a served
+ * index or a split by framework rather than a smaller excerpt.
*
* The graph is not just faceting: alongside intent/audience/channel/framework
* it mines real edges from the content — product membership, cites-API,
@@ -1037,7 +1045,57 @@ function gitDates(siteDir: string): Map {
* device-pairing/ shipped an empty date even from a full-history clone: its
* source is device-pairing/device-pairing.md, a shape neither list covered.
*/
-function sourceCandidates(pathname: string): string[] {
+/**
+ * Compile one llms ignore glob to a RegExp, or refuse.
+ *
+ * Deliberately NOT a full glob engine, and deliberately loud about it. The
+ * shapes the repo's ignore list uses are literal paths and `/**`; a
+ * previous version tried to handle them by string surgery on the prefix, which
+ * understood exactly one of them and silently matched NOTHING for the rest -
+ * so adding a tree in any other form gave a green build that kept feeding an
+ * assistant what the repo had just decided to hide. Anything this cannot
+ * express now throws at build time instead.
+ *
+ * No matcher is a declared dependency of this site, and reaching for a
+ * transitive one is the mistake this plugin was already corrected on once
+ * (cheerio). Twelve lines beat a lockfile change.
+ */
+function ignoreGlobToRegExp(glob: string): RegExp {
+ const unsupported = /[{}!\[\]?+@()|]/.exec(glob);
+ if (unsupported) {
+ throw new Error(
+ `[knowledge-extractor] cannot express the ignore glob ${JSON.stringify(glob)}: ` +
+ `unsupported character ${JSON.stringify(unsupported[0])}. Supported shapes are a ` +
+ `literal path and one using * or ** as whole-segment wildcards. Extend ` +
+ `ignoreGlobToRegExp rather than leaving the pattern to match nothing.`,
+ );
+ }
+ let out = "";
+ for (let i = 0; i < glob.length; i += 1) {
+ const c = glob[i];
+ if (c === "*") {
+ const doubled = glob[i + 1] === "*";
+ if (doubled && glob[i + 2] === "/") {
+ out += "(?:[^/]+/)*";
+ i += 2;
+ } else if (doubled) {
+ out += ".*";
+ i += 1;
+ } else {
+ out += "[^/]*";
+ }
+ continue;
+ }
+ out += c.replace(/[.+^${}()|[\]\\]/g, "\\$&");
+ }
+ return new RegExp(`^${out}$`);
+}
+
+/**
+ * Every spelling of the DOCS-relative source path a route can come from. Used
+ * for matching the llms ignore globs, which are written against `docs/`.
+ */
+function docsRelCandidates(pathname: string): string[] {
const rel = pathname.replace(/^\/+|\/+$/g, "");
if (!rel) return ["docs/index.md", "docs/index.mdx", "docs/intro.md", "docs/intro.mdx"];
const leaf = rel.split("/").pop() || "";
@@ -1053,9 +1111,31 @@ function sourceCandidates(pathname: string): string[] {
];
}
+/**
+ * Where the file BEHIND a served route actually lives.
+ *
+ * Not always `docs/`. When a frozen version is served at the root - the beta
+ * cycle, where `update-version.py minor_beta` snapshots the release and sets
+ * `DOCS_LAST_VERSION` - the root is served from
+ * `versioned_docs/version-/` and `docs/` becomes the unreleased tree.
+ * Reading `docs/` then gave every root module the NEXT version's frontmatter:
+ * correct on the day of the snapshot, wrong from the first edit after it.
+ * Comparing version-7.6.14 against today's docs/ shows 388 of 449 shared pages
+ * with differing frontmatter, so this is not a hypothetical drift.
+ *
+ * The label alone does not expose it, which is why a 7.6.14 build looked fine:
+ * that test served the docs/ tree at the root, so the two paths coincided.
+ */
+function sourceCandidates(pathname: string, servedVersion = "current"): string[] {
+ const candidates = docsRelCandidates(pathname);
+ if (servedVersion === "current") return candidates;
+ const prefix = `versioned_docs/version-${servedVersion}/`;
+ return candidates.map((c) => c.replace(/^docs\//, prefix));
+}
+
/** Repo-relative path of the source file behind a pathname, or "". */
-function resolveSource(siteDir: string, pathname: string): string {
- for (const cand of sourceCandidates(pathname)) {
+function resolveSource(siteDir: string, pathname: string, servedVersion = "current"): string {
+ for (const cand of sourceCandidates(pathname, servedVersion)) {
try {
if (fs.statSync(path.join(siteDir, cand)).isFile()) return cand;
} catch {
@@ -1075,8 +1155,8 @@ function resolveSource(siteDir: string, pathname: string): string {
* _features-by-framework.mdx last changed 2026-08-14 while every shell around it
* still reads 2026-01-19.
*/
-function contributingFiles(siteDir: string, pathname: string): string[] {
- const root = resolveSource(siteDir, pathname);
+function contributingFiles(siteDir: string, pathname: string, servedVersion = "current"): string[] {
+ const root = resolveSource(siteDir, pathname, servedVersion);
if (!root) return [];
const seen = new Set([root]);
const queue = [root];
@@ -1154,24 +1234,28 @@ function contributingFiles(siteDir: string, pathname: string): string[] {
* was this checked" - a formatting sweep moves it. Real verification needs a
* human-set frontmatter field, which is a separate thing from this.
*/
-function sourceDate(siteDir: string, pathname: string): string {
+function sourceDate(siteDir: string, pathname: string, servedVersion = "current"): string {
const dates = gitDates(siteDir);
if (!dates.size) return "";
let newest = 0;
- for (const rel of contributingFiles(siteDir, pathname)) {
+ for (const rel of contributingFiles(siteDir, pathname, servedVersion)) {
const secs = Number(dates.get(rel) || 0);
if (Number.isFinite(secs) && secs > newest) newest = secs;
}
return newest ? new Date(newest * 1000).toISOString() : "";
}
-function readFrontMatter(siteDir: string, pathname: string): Record {
+function readFrontMatter(
+ siteDir: string,
+ pathname: string,
+ servedVersion = "current",
+): Record {
// Actually shares sourceCandidates() now. It previously kept its own list with
// a comment claiming otherwise, and the lists had drifted: a folder/folder.md
// page resolved for dating but not for frontmatter, so its curated fields
// (keywords, and any topic_type / product / user_intents / canonical_id) were
// silently dropped and semantic_status stayed "rule_based".
- for (const rel of sourceCandidates(pathname)) {
+ for (const rel of sourceCandidates(pathname, servedVersion)) {
const file = path.join(siteDir, rel);
try {
if (!fs.existsSync(file)) continue;
@@ -1602,14 +1686,40 @@ export default function knowledgeExtractor(context: any, _options: any) {
} catch {
/* no versions.json */
}
- // Route prefixes the sibling llms export is told to skip, read from the
- // config rather than restated here. `docs/sdks/titanium/**` becomes
- // `sdks/titanium/`, which is how it appears in a built route.
- const ignoredRoutePrefixes = (
- (siteConfig?.customFields?.llmsIgnoredSdkTrees as readonly string[] | undefined) || []
- )
- .map((glob) => String(glob).replace(/^docs\//, "").replace(/\*+$/, ""))
- .filter(Boolean);
+ // The curation decision, applied rather than paraphrased: the same globs
+ // docusaurus-plugin-llms is given for what an assistant may not see,
+ // matched against each page's source path - which is what the globs were
+ // written against.
+ //
+ // NOT the llms plugin's full ignore list. That list also dedupes prose
+ // repeated under every non-Web SDK root, which is right for a flat corpus
+ // and wrong here: this index exists to route a reader to the page they are
+ // on, and inheriting the dedup removed ~1,400 modules along with the
+ // ability to say where in the Flutter docs something lives. See
+ // llmsDedupedToWeb in docusaurus.config.ts.
+ //
+ // An earlier version derived route PREFIXES by string surgery. That
+ // understood exactly one shape, `docs//**`, and every
+ // other form failed open: a brace list, a leading `**/`, a bare file, a
+ // mid-path `*` all matched nothing and left the tree indexed with no
+ // warning - a green build quietly feeding an assistant what the repo had
+ // just decided to hide.
+ const ignoreGlobs = siteConfig?.customFields?.assistantIgnoreFiles as
+ | readonly string[]
+ | undefined;
+ if (!Array.isArray(ignoreGlobs)) {
+ // Absent means "index everything", which is the wrong default for a
+ // curation list: renaming this customFields key would silently widen
+ // what an assistant is fed, and neither the empty-output guard nor the
+ // drift ratio catches it because the page count goes UP.
+ throw new Error(
+ "[knowledge-extractor] customFields.assistantIgnoreFiles is missing. It " +
+ "carries the repo's decision about what an assistant may see, and " +
+ "indexing everything is not a safe fallback. Export it from " +
+ "docusaurus.config.ts.",
+ );
+ }
+ const ignorePatterns = ignoreGlobs.map((g) => ignoreGlobToRegExp(String(g)));
const excluded = new Set([
...frozenVersions,
@@ -1625,12 +1735,17 @@ export default function knowledgeExtractor(context: any, _options: any) {
]);
const skipDir = (name: string) => excluded.has(name) || name.endsWith(".html");
- // Filtered here rather than in skipDir, which sees one directory NAME and
- // so cannot express a multi-segment route like `sdks/titanium/`. Applied to
- // the list, not inside the loop, so an ignored page is never read or parsed.
+ // Filtered on the list, not inside the loop, so an ignored page is never
+ // read or parsed. Matched on the DOCS-relative source path rather than the
+ // route, because that is what the globs describe - and on every candidate
+ // spelling of it, since a route maps to `docs/x.md`, `docs/x/index.md` and
+ // the folder/folder.md convention alike.
const files = walkHtml(outDir, skipDir).filter((f) => {
const rel = path.relative(outDir, path.dirname(f)).split(path.sep).join("/");
- return !ignoredRoutePrefixes.some((prefix) => `${rel}/`.startsWith(prefix));
+ const pathname = rel ? `/${rel}/` : "/";
+ return !docsRelCandidates(pathname).some((cand) =>
+ ignorePatterns.some((re) => re.test(cand)),
+ );
});
const modules: KModule[] = [];
let pagesProcessed = 0;
@@ -1660,10 +1775,10 @@ export default function knowledgeExtractor(context: any, _options: any) {
if (!chunks.length) continue;
pagesProcessed += 1;
- const fm = readFrontMatter(siteDir, pathname);
+ const fm = readFrontMatter(siteDir, pathname, servedVersion);
// "" when the real date is unknowable (shallow clone, no git). The
// module then ships last_verified: "" rather than a fake constant.
- const sourceUpdatedAt = sourceDate(siteDir, pathname);
+ const sourceUpdatedAt = sourceDate(siteDir, pathname, servedVersion);
const framework = detectFramework(pathname);
// Frontmatter is authoritative when present; fall back to path/heuristics.
const fmProducts = fmStringArray(fm.product).map(slug).filter(Boolean);
From 6882f34c231c6bb37230ad10661883b765eeca4e Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Tue, 8 Sep 2026 09:49:55 +0100
Subject: [PATCH 27/53] fix(knowledge-extractor): finish the frozen-root fix,
and agree with minimatch
Fourth round. Two of these are the same fix being finished for the third time,
which is worth naming rather than glossing.
THE FROZEN-AT-ROOT PATH, THIRD ATTEMPT. Round two labelled the version. Round
three read frontmatter from the right tree. Both left the DATES wrong, and
silently: `gitDates` batches one `git log -- docs src`, so no `versioned_docs/`
path was ever in the map, every lookup missed, and all modules shipped
`last_verified: ""`. None of the guards fire on that - the repo is not shallow,
the map is not empty, and the drift ratio does not move. The pathspec now
includes `versioned_docs`; measured, the log carries 32,284 such paths and the
probe file resolves.
Second half of the same thing: `contributingFiles` dropped any resolved import
that did not start with `docs/` or `src/`, which is every relative partial
import once the root file is under `versioned_docs/`. Measured: the 7.6.14
snapshot has 350 relative imports and zero `@site/`-absolute ones, so a page
whose prose lives in a partial would have been dated from its own two-line
shell - the exact staleness this function exists to prevent.
THE GLOB COMPILER NOW AGREES INSTEAD OF MERELY REFUSING. It threw on shapes it
could not express, but silently mis-compiled two it accepted:
A slash-less pattern compiled to an unmatchable regex, because every candidate
path starts with `docs/`. docusaurus-plugin-llms passes `matchBase: true`, so
`system-requirements.mdx` hides that file anywhere - here it hid nothing. Now
a pattern with no `/` matches the basename, as it does there.
`**` adjacent to a non-slash emitted `.*` and crossed separators, where
minimatch degrades it to one segment. `docs/sdks/linux/matrixscan**` therefore
swallowed the whole `matrixscan/` subtree here while llms kept it - two
artifacts disagreeing about scope, which is the one thing this design claims
cannot happen. `**` now spans segments only as a whole segment.
Checked against the authority rather than by reasoning: a differential test over
154 glob/path pairs against `minimatch(..., {matchBase: true})` - the matcher
the llms plugin actually calls - reports 0 divergences, including every shape
the review found.
The evals no longer skip the inputs that decide what is indexed:
`docusaurus.config.ts` (which now holds `assistantIgnoreFiles` and
`lastVersion`) and `versions.json` are in the path filter, and the `--auto` step
carries `if: always()` so a gold-set breach cannot hide the corpus-wide number.
Two more figures corrected in the header, same class as the ones before them:
the shared-scope key is `customFields.assistantIgnoreFiles`, not
`llmsIgnoredSdkTrees` which is a private input to it; and `llms-full.txt` has
423 sections with 410 links in `llms.txt`, not the 452 I wrote.
Unchanged on the normal path: 4,386 modules from 531 pages, `last_verified` on
100% of them, zero from titanium/partials/connector-guides, page-success@3
0.8493 against the 0.80 floor.
Co-Authored-By: Claude Opus 5 (1M context)
---
.github/workflows/docs-retrieval-evals.yml | 10 +++++
src/plugins/knowledge-extractor/index.ts | 44 ++++++++++++++++++----
2 files changed, 47 insertions(+), 7 deletions(-)
diff --git a/.github/workflows/docs-retrieval-evals.yml b/.github/workflows/docs-retrieval-evals.yml
index b012fb14d7..46eb7159b5 100644
--- a/.github/workflows/docs-retrieval-evals.yml
+++ b/.github/workflows/docs-retrieval-evals.yml
@@ -17,6 +17,12 @@ on:
- 'src/plugins/knowledge-extractor/**'
- 'scripts/retrieval-evals/**'
- '.github/workflows/docs-retrieval-evals.yml'
+ # These decide WHAT gets indexed at all: assistantIgnoreFiles and
+ # lastVersion live in the config, and versions.json decides which
+ # trees are frozen. Without them a PR that widens or narrows the
+ # curation list changes the corpus and skips both evals.
+ - 'docusaurus.config.ts'
+ - 'versions.json'
push:
branches:
- main
@@ -58,6 +64,10 @@ jobs:
# because no workflow passed --auto. Reported separately so a corpus-wide
# regression is attributable.
- name: Run corpus-wide self-retrieval
+ # always(): a gold-set breach above must not hide the corpus-wide
+ # number, which is the one that says whether a regression is broad
+ # or local.
+ if: always()
run: node scripts/retrieval-evals/run.cjs --auto --report reports/retrieval-evals-auto.json
- name: Upload eval report
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index 25919be28c..e33af4c45f 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -27,8 +27,9 @@
* 6 MiB more onto it. For scale, `llms-full.txt` carries the site's prose in
* 2.28 MiB, so per-module text is an expensive way to store text. The argument
* rests on that and on the `url`, NOT on a claim that each module's prose also
- * ships in llms-full.txt: the two artifacts cut the corpus differently - 452
- * page sections there against 4,386 modules here - so there is no per-module
+ * ships in llms-full.txt: the two artifacts cut the corpus differently - 423
+ * sections there and 410 links in llms.txt, against 4,386 modules here - so
+ * there is no per-module
* correspondence to appeal to. Units are MiB throughout, to match `mb()` and
* MAX_INDEX_MB below.
*
@@ -44,7 +45,7 @@
* for deciding which page or chunk to read - intents, audiences, channels,
* frameworks, products, cites-API, see-also, availability - which a flat text
* dump cannot express. They share a source of truth for what an assistant may
- * see (`customFields.llmsIgnoredSdkTrees`) so they cannot disagree about scope.
+ * see (`customFields.assistantIgnoreFiles`) so a curation decision is made once.
*
* Known limit: 10 MiB is large for a browser consumer to fetch whole. Nothing
* in the repo consumes it that way yet; if something does, it needs a served
@@ -999,7 +1000,7 @@ function gitDates(siteDir: string): Map {
// older one. Seconds compare correctly regardless of zone.
const out = execFileSync(
"git",
- ["log", "--no-merges", "--name-only", "--format=%x00%ct", "--", "docs", "src"],
+ ["log", "--no-merges", "--name-only", "--format=%x00%ct", "--", "docs", "src", "versioned_docs"],
{ cwd: siteDir, encoding: "utf8", maxBuffer: 256 * 1024 * 1024 },
);
let commitStamp = "";
@@ -1075,12 +1076,25 @@ function ignoreGlobToRegExp(glob: string): RegExp {
const c = glob[i];
if (c === "*") {
const doubled = glob[i + 1] === "*";
- if (doubled && glob[i + 2] === "/") {
+ // `**` spans path segments ONLY as a whole segment - `a/**/b`, `a/**` or
+ // a leading `**/`. Adjacent to anything else minimatch degrades it to a
+ // single `*`, and emitting `.*` there made this matcher hide a whole
+ // subtree the llms export keeps: `docs/sdks/linux/matrixscan**` swallowed
+ // `matrixscan/get-started.md`. Two artifacts disagreeing about scope is
+ // the one thing this design is supposed to prevent.
+ const wholeSegment =
+ doubled &&
+ (i === 0 || glob[i - 1] === "/") &&
+ (i + 2 === glob.length || glob[i + 2] === "/");
+ if (wholeSegment && glob[i + 2] === "/") {
out += "(?:[^/]+/)*";
i += 2;
- } else if (doubled) {
+ } else if (wholeSegment) {
out += ".*";
i += 1;
+ } else if (doubled) {
+ out += "[^/]*";
+ i += 1;
} else {
out += "[^/]*";
}
@@ -1088,6 +1102,12 @@ function ignoreGlobToRegExp(glob: string): RegExp {
}
out += c.replace(/[.+^${}()|[\]\\]/g, "\\$&");
}
+ // A pattern with no `/` matches a BASENAME anywhere, because that is what
+ // docusaurus-plugin-llms does with it (`minimatch(..., {matchBase: true})`).
+ // Anchoring it against the full path instead compiled to something no
+ // candidate could ever match - a pattern accepted and then quietly ignored,
+ // which is the failure this function was rewritten to stop.
+ if (!glob.includes("/")) return new RegExp(`(?:^|/)${out}$`);
return new RegExp(`^${out}$`);
}
@@ -1189,7 +1209,17 @@ function contributingFiles(siteDir: string, pathname: string, servedVersion = "c
spec.startsWith("docs/") || spec.startsWith("src/")
? spec
: path.posix.normalize(path.posix.join(dir, spec));
- if (!resolved.startsWith("docs/") && !resolved.startsWith("src/")) continue;
+ // versioned_docs too: on a frozen-at-root build the root file lives
+ // there, so its relative partial imports resolve there as well. Without
+ // it every snapshot page dated from its own two-line shell instead of
+ // the partial holding its prose - all 234 of them import relatively.
+ if (
+ !resolved.startsWith("docs/") &&
+ !resolved.startsWith("src/") &&
+ !resolved.startsWith("versioned_docs/")
+ ) {
+ continue;
+ }
// The has-extension test accepts jsx? but the candidate list did not offer
// it, so an extension-less import of a .js/.jsx component - there are ~40
// in src/ - was silently not followed, which would quietly reintroduce the
From 7277c443588e07a39c454169d2f2469449b30cc9 Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Tue, 8 Sep 2026 10:15:44 +0100
Subject: [PATCH 28/53] fix(knowledge-extractor): match the way the llms walker
matches
Fifth round, and the review's verdict was that nothing blocks - these are its
six findings, taken because they are cheap and because two of them are the same
fail-open class as the last three rounds.
THE MATCHER NOW AGREES BY CONSTRUCTION, not by enumerating shapes. The review
found a bare directory entry - `docs/connector-guides` with no `/**` - hiding
the whole subtree in llms while matching nothing here, because
`readMarkdownFiles` calls `shouldIgnoreFile` on each DIRECTORY before recursing.
My first fix was a special case for extension-less patterns; testing it against
that walker's real semantics rather than against minimatch-on-a-file-path
showed two more shapes still disagreeing (`matrixscan**`, a bare `titanium`).
So the pattern is now applied the way the walker applies it - to the file and to
every ancestor directory - and the special case is gone. A differential test
over 208 pairs against those semantics reports 0 divergences.
The filter also matches the RESOLVED source now, not every candidate spelling.
`docsRelCandidates` emits `docs//index.md` for every route whether or not
that file exists, so `docs/**/index.md` would have matched a candidate of every
route and emptied the index, where llms drops only pages really sourced from an
index.md. Normalised back to `docs/` first, because a frozen-at-root build
resolves into `versioned_docs/version-X/` and the globs are written against
`docs/` - unnormalised, the whole curation list would fail open there.
`\` is now refused. `docs\sdks\titanium\**` was accepted and matched nothing in
either artifact - minimatch reads it as an escape - so a plausible authoring
slip hid the tree from neither. That is precisely what the throw exists for.
One divergence is documented rather than fixed: `*` and whole-segment `**` here
also match a segment beginning with `.`, where minimatch defaults to
`dot: false`. No doc source is dot-prefixed, so nothing in the corpus reaches
it.
Outside the plugin, two smaller ones:
`FeatureList` rendered `href={withCurrentDocsPath(frameworkInfo.apiUrl)}`
unguarded. The 16 Kotlin Multiplatform rows this branch adds carry no
`apiUrl`, and `href={undefined}` renders link-styled, is not
keyboard-focusable and navigates nowhere. Latent only because all 50 current
usages are compact mode, which skips that column; the sibling cell nine lines
up already guarded it.
`if: always()` on the self-retrieval step also fires when the build failed,
adding a second red step whose message blames a missing index, and on
cancellation. Now `!cancelled() && steps.build.outcome == 'success'`.
Worth writing down rather than fixing, from the review's own measurement: on a
frozen-at-root run 479 of 498 pages carry the same `last_verified` - the
snapshot commit's - because that is when those files were created. It is
accurate, and it is also a near-constant that looks like data, which is the
doctrine `gitDates` invokes when it blanks on shallow clones.
Normal path unchanged: 4,386 modules from 531 pages, dates on all of them, zero
from titanium/partials/connector-guides/linux stubs, page-success@3 0.8493
against the 0.80 floor.
Co-Authored-By: Claude Opus 5 (1M context)
---
.github/workflows/docs-retrieval-evals.yml | 9 ++--
src/components/FeatureList/index.tsx | 12 +++++-
src/plugins/knowledge-extractor/index.ts | 49 ++++++++++++++++++++--
3 files changed, 61 insertions(+), 9 deletions(-)
diff --git a/.github/workflows/docs-retrieval-evals.yml b/.github/workflows/docs-retrieval-evals.yml
index 46eb7159b5..6e2e630117 100644
--- a/.github/workflows/docs-retrieval-evals.yml
+++ b/.github/workflows/docs-retrieval-evals.yml
@@ -53,6 +53,7 @@ jobs:
run: yarn install --frozen-lockfile
- name: Build docs (generates the knowledge retrieval index)
+ id: build
run: yarn build
- name: Run retrieval evals
@@ -64,10 +65,10 @@ jobs:
# because no workflow passed --auto. Reported separately so a corpus-wide
# regression is attributable.
- name: Run corpus-wide self-retrieval
- # always(): a gold-set breach above must not hide the corpus-wide
- # number, which is the one that says whether a regression is broad
- # or local.
- if: always()
+ # Not always(): a gold-set breach above must not hide the corpus-wide
+ # number, but a FAILED BUILD must not add a second red step blaming a
+ # missing index instead - and always() fires on cancellation too.
+ if: ${{ !cancelled() && steps.build.outcome == 'success' }}
run: node scripts/retrieval-evals/run.cjs --auto --report reports/retrieval-evals-auto.json
- name: Upload eval report
diff --git a/src/components/FeatureList/index.tsx b/src/components/FeatureList/index.tsx
index 17c600922a..129af7416f 100644
--- a/src/components/FeatureList/index.tsx
+++ b/src/components/FeatureList/index.tsx
@@ -202,9 +202,19 @@ const FeatureList: React.FC = ({
{Object.entries(feature.frameworks)
.filter(([, info]) => info.version !== 'n/a')
.map(([frameworkName, frameworkInfo]) => (
+ // href guarded like the feature-name cell above: the
+ // Kotlin Multiplatform rows carry no apiUrl, and an
+ // with href={undefined} renders link-styled, is not
+ // keyboard-focusable and navigates nowhere. Latent only
+ // because every current usage is compact mode, which
+ // skips this column.
{
/**
* Compile one llms ignore glob to a RegExp, or refuse.
*
+ * One known divergence from minimatch, unreachable today and left documented
+ * rather than implemented: `*` and whole-segment `**` here also match a
+ * segment beginning with `.`, where minimatch defaults to `dot: false`. No
+ * doc source is dot-prefixed, so nothing in the corpus reaches it; if one
+ * appears it would be hidden from the index and kept in llms.
+ *
* Deliberately NOT a full glob engine, and deliberately loud about it. The
* shapes the repo's ignore list uses are literal paths and `/**`; a
* previous version tried to handle them by string surgery on the prefix, which
@@ -1062,7 +1068,10 @@ function gitDates(siteDir: string): Map {
* (cheerio). Twelve lines beat a lockfile change.
*/
function ignoreGlobToRegExp(glob: string): RegExp {
- const unsupported = /[{}!\[\]?+@()|]/.exec(glob);
+ // Backslash included: a Windows-spelled `docs\\sdks\\titanium\\**` is a
+ // plausible authoring slip, and it matches nothing in EITHER artifact -
+ // minimatch reads it as an escape - so it would hide the tree from neither.
+ const unsupported = /[{}!\[\]?+@()|\\]/.exec(glob);
if (unsupported) {
throw new Error(
`[knowledge-extractor] cannot express the ignore glob ${JSON.stringify(glob)}: ` +
@@ -1111,6 +1120,27 @@ function ignoreGlobToRegExp(glob: string): RegExp {
return new RegExp(`^${out}$`);
}
+/**
+ * Is this source path hidden from AI consumers?
+ *
+ * Tests the file AND every ancestor directory, because that is what the llms
+ * walker does: `readMarkdownFiles` calls `shouldIgnoreFile` on each directory
+ * before recursing into it, so a pattern that matches a DIRECTORY hides
+ * everything beneath it. Matching only the file path left three shapes hiding a
+ * subtree there and nothing here - `docs/connector-guides` with no `/**`,
+ * `docs/sdks/linux/matrixscan**`, and a bare `titanium` - which is the
+ * scope disagreement this whole mechanism exists to prevent. Verified against
+ * that walker's semantics rather than against minimatch on a file path.
+ */
+function hiddenFromAssistants(sourcePath: string, patterns: RegExp[]): boolean {
+ const parts = sourcePath.split("/");
+ for (let i = parts.length; i > 0; i -= 1) {
+ const prefix = parts.slice(0, i).join("/");
+ if (patterns.some((re) => re.test(prefix))) return true;
+ }
+ return false;
+}
+
/**
* Every spelling of the DOCS-relative source path a route can come from. Used
* for matching the llms ignore globs, which are written against `docs/`.
@@ -1773,9 +1803,20 @@ export default function knowledgeExtractor(context: any, _options: any) {
const files = walkHtml(outDir, skipDir).filter((f) => {
const rel = path.relative(outDir, path.dirname(f)).split(path.sep).join("/");
const pathname = rel ? `/${rel}/` : "/";
- return !docsRelCandidates(pathname).some((cand) =>
- ignorePatterns.some((re) => re.test(cand)),
- );
+ // The RESOLVED source, not every candidate spelling of it. Matching all
+ // the candidates let a pattern over-hide: `docs/**/index.md` matches the
+ // `docs//index.md` candidate of every route whether that file
+ // exists or not, so it would have emptied the index while llms dropped
+ // only the pages really sourced from an index.md.
+ //
+ // Normalised back to `docs/` first, because the globs are written
+ // against that while a frozen-at-root build resolves into
+ // versioned_docs/version-X/ - left unnormalised, nothing would match
+ // there and the entire curation list would fail open.
+ const resolved = resolveSource(siteDir, pathname, servedVersion);
+ if (!resolved) return true; // no source found: not this filter's call
+ const asDocs = resolved.replace(/^versioned_docs\/version-[^/]+\//, "docs/");
+ return !hiddenFromAssistants(asDocs, ignorePatterns);
});
const modules: KModule[] = [];
let pagesProcessed = 0;
From f1eceb8310afa7443d7527598cf031f4954d5383 Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Tue, 8 Sep 2026 10:31:56 +0100
Subject: [PATCH 29/53] fix(knowledge-extractor): stop testing the segment the
llms walker never sees
Sixth round. The review's verdict was Go again; these are its two low findings,
and one of them is a claim of mine that the diff did not deliver.
`hiddenFromAssistants` walked ancestors down to `i > 0`, so it also tested the
bare `docs` segment. The llms walker starts INSIDE siteDir/docs and never hands
that segment to `shouldIgnoreFile`, so a curation entry matching it - `docs`,
`doc*`, `**/docs` - hid all 676 files here while llms kept every one. Measured
as the only over-hide class across 512 generated pattern shapes. It would have
failed the build rather than shipped a wrong artifact, since an empty file list
trips the pagesProcessed guard, but loud and wrong is still wrong. `i > 1`.
THE FEATURELIST GUARD DID NOTHING, and the previous commit message said it did.
`withCurrentDocsPath` returns `undefined` for `undefined` and React omits an
undefined attribute, so the rendered DOM was byte-identical: the chip stayed an
`` with no href - not keyboard-focusable, navigating nowhere, still carrying
the link hover. Nor was it a type fix; the repo's tsconfig does not set
`strict`. Now the ELEMENT changes, the way the feature-name cell nine lines up
already did by swapping `` for ``: no apiUrl renders a ``. 17 cells
in features.json have no apiUrl - 16 Kotlin Multiplatform, 1 Web - and it is
latent only while every usage is compact mode, which skips that column.
That put the unused `.frameworkItemUnavailable` class to work, and it needed
correcting first: `opacity: 0.5` composites the label to 3.27:1 in light mode,
below AA, while looking merely faint. Dimmed through the border and
--ifm-color-emphasis-700 instead - measured 5.06:1 light, 9.34:1 dark.
Normal path unchanged: 4,386 modules from 531 pages.
Co-Authored-By: Claude Opus 5 (1M context)
---
src/components/FeatureList/index.tsx | 47 ++++++++++++--------
src/components/FeatureList/styles.module.css | 8 +++-
src/plugins/knowledge-extractor/index.ts | 8 +++-
3 files changed, 41 insertions(+), 22 deletions(-)
diff --git a/src/components/FeatureList/index.tsx b/src/components/FeatureList/index.tsx
index 129af7416f..610b1c692f 100644
--- a/src/components/FeatureList/index.tsx
+++ b/src/components/FeatureList/index.tsx
@@ -202,25 +202,34 @@ const FeatureList: React.FC = ({
{Object.entries(feature.frameworks)
.filter(([, info]) => info.version !== 'n/a')
.map(([frameworkName, frameworkInfo]) => (
- // href guarded like the feature-name cell above: the
- // Kotlin Multiplatform rows carry no apiUrl, and an
- // with href={undefined} renders link-styled, is not
- // keyboard-focusable and navigates nowhere. Latent only
- // because every current usage is compact mode, which
- // skips this column.
-
- {frameworkName} v{frameworkInfo.version}
-
+ // The ELEMENT changes, not just the href. Guarding the
+ // href alone rendered the same DOM - withCurrentDocsPath
+ // returns undefined for undefined and React omits the
+ // attribute - so the chip stayed an with no href:
+ // not keyboard-focusable, navigating nowhere, still
+ // showing the link hover. 17 cells in features.json
+ // carry no apiUrl (16 Kotlin Multiplatform, 1 Web).
+ // Latent only while every usage is compact mode, which
+ // skips this column. Same shape as the feature-name cell
+ // above, which swaps for .
+ frameworkInfo.apiUrl ? (
+
+ {frameworkName} v{frameworkInfo.version}
+
+ ) : (
+
+ {frameworkName} v{frameworkInfo.version}
+
+ )
))}
diff --git a/src/components/FeatureList/styles.module.css b/src/components/FeatureList/styles.module.css
index 7e41c35f1b..c01898fccf 100644
--- a/src/components/FeatureList/styles.module.css
+++ b/src/components/FeatureList/styles.module.css
@@ -112,9 +112,13 @@
text-decoration: none;
}
+/* No API reference for this framework yet. Dimmed through the border and a
+ colour token rather than `opacity`, which composited the label to 3.27:1 in
+ light mode - below AA - while looking merely faint. */
.frameworkItemUnavailable {
- opacity: 0.5;
- cursor: not-allowed;
+ color: var(--ifm-color-emphasis-700);
+ border-style: dashed;
+ cursor: default;
}
.frameworkItemUnavailable:hover {
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index 5ddbcda3ed..71f13d8b8a 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -1134,7 +1134,13 @@ function ignoreGlobToRegExp(glob: string): RegExp {
*/
function hiddenFromAssistants(sourcePath: string, patterns: RegExp[]): boolean {
const parts = sourcePath.split("/");
- for (let i = parts.length; i > 0; i -= 1) {
+ // `i > 1`, not `i > 0`: the walker starts INSIDE siteDir/docs, so the bare
+ // `docs` segment is never handed to shouldIgnoreFile. Testing it here meant an
+ // entry like `docs`, `doc*` or `**/docs` hid all 676 files while llms kept
+ // every one of them. It would have failed the build loudly rather than shipped
+ // a wrong artifact - an empty file list trips the pagesProcessed guard - but
+ // loud and wrong is still wrong.
+ for (let i = parts.length; i > 1; i -= 1) {
const prefix = parts.slice(0, i).join("/");
if (patterns.some((re) => re.test(prefix))) return true;
}
From a384fbbfddbd38e0798506edbcb5b7db9369ef2f Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Tue, 8 Sep 2026 10:48:49 +0100
Subject: [PATCH 30/53] fix(FeatureList): correct the contrast figures to the
built css
The review's final round returned Go, and caught one more of my numbers: I
computed those contrast ratios against assumed token values rather than the
built stylesheet. Measured properly they are 3.19:1 for the old opacity form
(not 3.27), and 5.29:1 light / 12.26:1 dark for the replacement (not 5.06 and
9.34). The conclusions are unchanged in both directions - the old form failed AA
and the new one passes - but a figure nobody can reproduce is worth no more here
than it was in the six rounds before this one.
Also made precise: 17 cells in features.json carry no apiUrl, but only 16 reach
the branch. The 17th, Web / 7-Segment Display, is filtered out earlier by
version === "n/a".
Not fixed, and worth flagging rather than folding in: `.frameworkItem:hover`
six lines above sets `color: var(--ifm-color-primary-contrast)`, a token this
site never defines. The invalid var() falls back to `inherit`, so hovering an
AVAILABLE chip paints content colour on the primary background - 3.95:1 light,
3.29:1 dark. It predates this branch, is unreachable while every usage is
compact mode, and correcting the token name alone would not fix it: white on
#3578e5 is 4.23:1, so it needs a darker hover background. That is a design
choice, not a rename, and it belongs in its own change.
Co-Authored-By: Claude Opus 5 (1M context)
---
src/components/FeatureList/index.tsx | 4 +++-
src/components/FeatureList/styles.module.css | 6 ++++--
2 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/src/components/FeatureList/index.tsx b/src/components/FeatureList/index.tsx
index 610b1c692f..e094536a84 100644
--- a/src/components/FeatureList/index.tsx
+++ b/src/components/FeatureList/index.tsx
@@ -208,7 +208,9 @@ const FeatureList: React.FC = ({
// attribute - so the chip stayed an with no href:
// not keyboard-focusable, navigating nowhere, still
// showing the link hover. 17 cells in features.json
- // carry no apiUrl (16 Kotlin Multiplatform, 1 Web).
+ // carry no apiUrl, of which 16 reach this branch - the
+ // 17th is Web / 7-Segment Display, filtered out earlier
+ // by version === "n/a".
// Latent only while every usage is compact mode, which
// skips this column. Same shape as the feature-name cell
// above, which swaps for .
diff --git a/src/components/FeatureList/styles.module.css b/src/components/FeatureList/styles.module.css
index c01898fccf..db1b4653ee 100644
--- a/src/components/FeatureList/styles.module.css
+++ b/src/components/FeatureList/styles.module.css
@@ -113,8 +113,10 @@
}
/* No API reference for this framework yet. Dimmed through the border and a
- colour token rather than `opacity`, which composited the label to 3.27:1 in
- light mode - below AA - while looking merely faint. */
+ colour token rather than `opacity`, which composited the label to 3.19:1 in
+ light mode - below AA - while looking merely faint. Measured against the
+ BUILT css rather than assumed token values: 5.29:1 light, 12.26:1 dark.
+ `border-style: dashed` carries the state without relying on colour. */
.frameworkItemUnavailable {
color: var(--ifm-color-emphasis-700);
border-style: dashed;
From 553c1e00edaf4eb23c2f8f7c08bfaa7864609351 Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Fri, 18 Sep 2026 13:55:03 +0100
Subject: [PATCH 31/53] Fix eight extraction defects review found, and gate the
eval on a baseline
Collapsible sections orphaned their label. is not a block tag, so
orderedSegments flushed it as an inline run and the "\n\n" join made it a
paragraph boundary - chunkBody cut there and shipped 44 modules whose entire
content was a bare region label ("Europe", "North America") while the country
table that label introduces shipped with no region context at all. tabsToMd
already avoids this with a single newline; details now does the same.
Continuation chunks lost their section heading. In the paragraph fallback
paraHeading was overwritten unconditionally, so a paragraph carrying no heading
of its own reset it to "" and buildModule substituted the page title: 1,179 of
3,855 "(Part N)" modules were titled " (Part N)" rather than the section
they are in, taking semantic.topic - which a reranker keys on - with them.
clipMarkdown's short path skipped fence balancing and returned its input
verbatim, so an unbalanced fence from the content reached
assertArtifactInvariants, which throws and fails docusaurus build for main and
every preview. Nothing in the corpus triggers it today, but the rule everywhere
else in this plugin is that extraction must never break a deploy.
baseUrl was ignored. Rendered hrefs carry it and pathname does not, so on a PR
preview every reference gained the preview prefix, indexedPaths.has() matched
nothing, all 1,014 SeeAlso edges disappeared and the self-link filter stopped
working - the artifact a reviewer inspects was not the artifact main publishes.
Also: code fences keep their language, so a Swift and a Kotlin sample are no
longer byte-identical in an excerpt whose job is helping pick the right page;
isAvailabilityStub reads the page's opening rather than the whole body, so one
sentence about an unsupported sub-feature can no longer mark every chunk
not_available and put AvailableOn and NotAvailableOn on the same product; the
plugin skips emission on preview builds, which were committing ~22 MB of
generated JSON into gh-pages on every push, permanently; and the "LAST in the
array on purpose" comment no longer claims an ordering guarantee Docusaurus
does not give - postBuild hooks run under Promise.all.
The --auto gate now compares against a recorded baseline instead of an absolute
floor. Self-retrieval asks whether a page surfaces itself, and this corpus is
~11 near-duplicate copies of the same prose, so every page competes with its own
siblings: adding a framework would have dropped the score for a reason unrelated
to quality, and 0.8493 sat under 5 points above the 0.80 floor. It now fails on
a drop of more than 0.03 from baseline.json, keeps a low absolute backstop, and
prints when the corpus shape changed so the reason for a drop is visible.
Co-Authored-By: Claude Opus 5 (1M context)
---
docusaurus.config.ts | 18 +++--
scripts/retrieval-evals/baseline.json | 8 +++
scripts/retrieval-evals/run.cjs | 89 +++++++++++++++++++----
src/plugins/knowledge-extractor/index.ts | 90 +++++++++++++++++++++---
4 files changed, 177 insertions(+), 28 deletions(-)
create mode 100644 scripts/retrieval-evals/baseline.json
diff --git a/docusaurus.config.ts b/docusaurus.config.ts
index 759774005b..2e92b07270 100644
--- a/docusaurus.config.ts
+++ b/docusaurus.config.ts
@@ -498,6 +498,10 @@ const config: Config = {
// knowledge-extractor plugin, which cannot otherwise tell a frozen version
// served at the root from `current` - and the two need opposite handling.
lastVersion: effectiveLastVersion,
+ // Read by the knowledge-extractor, which must NOT emit its ~22 MB of JSON
+ // into a preview: pr-preview-action commits the whole build/ into gh-pages,
+ // so every preview push would add those blobs there permanently.
+ isPreviewBuild,
},
// Set the production url of your site here
@@ -784,10 +788,16 @@ const config: Config = {
// copy of prose repeated across frameworks, a routing index needs the module
// that points at the framework the reader is actually on.
//
- // LAST in the array on purpose: its postBuild reads the rendered HTML, so it
- // must run after any plugin that rewrites the build - stripPreviewMediaPlugin
- // on a preview build in particular. Ordered before, it would extract from a
- // state the deploy does not serve.
+ // Last in the array by convention, NOT by guarantee. Docusaurus runs every
+ // plugin's postBuild through Promise.all (core/lib/commands/build.js), so
+ // array position implies nothing about execution order and this hook races
+ // any other postBuild.
+ //
+ // That is safe today only because the one other postBuild,
+ // stripPreviewMediaPlugin, deletes files under build/img, which walkHtml
+ // skips via `excluded` - so whichever wins, this plugin reads the same HTML.
+ // A future postBuild that REWRITES html would race non-deterministically and
+ // must instead be sequenced explicitly, not moved above this line.
knowledgeExtractor,
],
diff --git a/scripts/retrieval-evals/baseline.json b/scripts/retrieval-evals/baseline.json
new file mode 100644
index 0000000000..a87d658b64
--- /dev/null
+++ b/scripts/retrieval-evals/baseline.json
@@ -0,0 +1,8 @@
+{
+ "page_success_at_k": 0.8493,
+ "page_mrr": 0.7699,
+ "pages": 531,
+ "modules": 4386,
+ "k": 3,
+ "recorded_at": "2026-09-18"
+}
diff --git a/scripts/retrieval-evals/run.cjs b/scripts/retrieval-evals/run.cjs
index f23608895f..b909e4233e 100644
--- a/scripts/retrieval-evals/run.cjs
+++ b/scripts/retrieval-evals/run.cjs
@@ -41,18 +41,34 @@ const MIN_MRR = parseFloat(arg("min-mrr", "0.6"));
// create/edit. --auto-limit caps it; --min-auto-success gates it.
const AUTO = process.argv.includes("--auto");
const AUTO_LIMIT = parseInt(arg("auto-limit", "0"), 10);
-// Not 0: every possible rate is >= 0, so the old default printed "(min 0)"
-// and gated nothing.
+// Gated as a REGRESSION against a recorded baseline, not against an absolute
+// floor.
//
-// Measured on the corpus this branch actually ships - page-success@3 =
-// 0.8493 over 531 pages / 4,386 modules - so 0.80 leaves 4.9 points of
-// headroom and still fails a real regression. An earlier note here said
-// 0.8653 over 616 pages / 4,637 modules, which was true before the same
-// change's curation filter removed Titanium and the stub pages: a figure
-// measured against a corpus the branch no longer produces. Re-measure with
-// `--auto` after anything that changes what is indexed, not just before
-// moving this number.
-const MIN_AUTO_SUCCESS = parseFloat(arg("min-auto-success", "0.80"));
+// An absolute floor is the wrong instrument for this metric. Self-retrieval asks
+// whether a page surfaces itself, and this corpus is ~11 near-duplicate copies
+// of the same prose, one per framework - so every page competes with its own
+// siblings. Adding a framework makes the score fall for a reason that has
+// nothing to do with retrieval quality, and the last measurement (0.8493 over
+// 531 pages / 4,386 modules) sat under 5 points above a 0.80 floor. The next
+// SDK would have turned a green pipeline red and taught everyone to raise the
+// number, which is how a gate stops meaning anything.
+//
+// So: fail when the score drops more than AUTO_TOLERANCE below the baseline in
+// baseline.json, and keep a low absolute floor as a backstop for the case where
+// the baseline itself is wrong. Re-record with --update-baseline after a change
+// that legitimately alters what is indexed, and say so in the commit.
+const BASELINE_PATH = path.join(__dirname, "baseline.json");
+const AUTO_TOLERANCE = parseFloat(arg("auto-tolerance", "0.03"));
+const AUTO_FLOOR = parseFloat(arg("auto-floor", "0.60"));
+const UPDATE_BASELINE = process.argv.includes("--update-baseline");
+function readBaseline() {
+ try {
+ return JSON.parse(fs.readFileSync(BASELINE_PATH, "utf8"));
+ } catch {
+ return null;
+ }
+}
+const MIN_AUTO_SUCCESS = parseFloat(arg("min-auto-success", "0"));
const REPORT = arg("report", "");
const TOKEN = /[a-z0-9]{2,}/gi;
@@ -158,7 +174,52 @@ function main() {
page_mrr: +(rrSum / rows.length).toFixed(4),
};
console.log(`\nRetrieval self-eval (AUTO, page-level over all docs): ${rows.length} pages / ${docs.length} modules, k=${K}`);
- console.log(` page-success@${K} = ${metrics.page_success_at_k} (min ${MIN_AUTO_SUCCESS})`);
+ const baseline = readBaseline();
+ // An explicit --min-auto-success still wins, so a caller can pin a number.
+ const floor = MIN_AUTO_SUCCESS > 0
+ ? MIN_AUTO_SUCCESS
+ : baseline
+ ? Math.max(AUTO_FLOOR, +(baseline.page_success_at_k - AUTO_TOLERANCE).toFixed(4))
+ : AUTO_FLOOR;
+ const breached = metrics.page_success_at_k < floor;
+ console.log(` page-success@${K} = ${metrics.page_success_at_k} (min ${floor})`);
+ if (baseline) {
+ const delta = +(metrics.page_success_at_k - baseline.page_success_at_k).toFixed(4);
+ console.log(
+ ` baseline = ${baseline.page_success_at_k} ` +
+ `(${baseline.pages} pages / ${baseline.modules} modules, ${baseline.recorded_at})` +
+ ` delta ${delta >= 0 ? "+" : ""}${delta}`,
+ );
+ // Corpus growth is the expected reason for a drop here, so say it out loud
+ // rather than leaving someone to infer it from a red pipeline.
+ if (metrics.pages !== baseline.pages || metrics.modules !== baseline.modules) {
+ console.log(
+ ` NOTE: corpus changed since the baseline ` +
+ `(${baseline.pages}->${metrics.pages} pages, ${baseline.modules}->${metrics.modules} modules). ` +
+ `If that was intended, re-record with --update-baseline.`,
+ );
+ }
+ } else {
+ console.log(` baseline = none recorded; gating on the ${AUTO_FLOOR} backstop only`);
+ }
+ if (UPDATE_BASELINE) {
+ fs.writeFileSync(
+ BASELINE_PATH,
+ JSON.stringify(
+ {
+ page_success_at_k: metrics.page_success_at_k,
+ page_mrr: metrics.page_mrr,
+ pages: metrics.pages,
+ modules: metrics.modules,
+ k: metrics.k,
+ recorded_at: new Date().toISOString().slice(0, 10),
+ },
+ null,
+ 2,
+ ) + "\n",
+ );
+ console.log(` baseline recorded -> ${path.relative(process.cwd(), BASELINE_PATH)}`);
+ }
console.log(` page-MRR = ${metrics.page_mrr}`);
console.log(` ${misses.length} page(s) not surfaced in top ${K} by their own content.`);
misses.slice(0, 10).forEach((m) => console.log(` ✗ ${m}`));
@@ -166,10 +227,10 @@ function main() {
fs.mkdirSync(path.dirname(REPORT), { recursive: true });
fs.writeFileSync(
REPORT,
- JSON.stringify({ status: metrics.page_success_at_k < MIN_AUTO_SUCCESS ? "breach" : "ok", metrics, misses: misses.slice(0, 200) }, null, 2) + "\n",
+ JSON.stringify({ status: breached ? "breach" : "ok", floor, baseline, metrics, misses: misses.slice(0, 200) }, null, 2) + "\n",
);
}
- process.exit(metrics.page_success_at_k < MIN_AUTO_SUCCESS ? 1 : 0);
+ process.exit(breached && !UPDATE_BASELINE ? 1 : 0);
}
if (!gold.length) {
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index 71f13d8b8a..f8fc1f298a 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -166,7 +166,17 @@ function clipMarkdown(text: string, limit: number): string {
// introducer" property then held only by luck of the content.
if (text.length <= limit) {
const whole = dropTrailingIntroducers(text.split("\n")).join("\n").trimEnd();
- return whole || demoteIntroducers(text).trimEnd();
+ const short = whole || demoteIntroducers(text).trimEnd();
+ // Balance here as well. This path returned its input verbatim, so an
+ // unbalanced fence arriving from the content itself reached
+ // assertArtifactInvariants, which throws and fails `docusaurus build` -
+ // for main and for every PR preview. That contradicts the rule the rest
+ // of this plugin follows, that extraction must never break a deploy, and
+ // the fix would have to be a code change on a docs-only PR with main red.
+ const fences = short.match(/^\s*(?:>\s*)*```/gm) || [];
+ if (fences.length % 2 === 0) return short;
+ const openerPrefix = (fences[fences.length - 1] || "").match(/^\s*(?:>\s*)*/);
+ return `${short}\n${openerPrefix ? openerPrefix[0] : ""}\u0060\u0060\u0060`;
}
const cut = text.slice(0, limit);
const lines = cut.split("\n");
@@ -423,7 +433,13 @@ function chunkBody(body: string, target: number): Chunk[] {
} else {
if (para) chunks.push({ heading: paraHeading, content: para });
para = p;
- paraHeading = firstHeading(p);
+ // `|| partHeading`: this used to overwrite unconditionally, so a
+ // continuation paragraph carrying no heading of its own reset the
+ // heading to "". enforceChunkInvariant then had nothing to fall back on
+ // and buildModule substituted the page title, leaving 1,179 of 3,855
+ // "(Part N)" modules titled " (Part N)" instead of the section
+ // they are in - and `topic`, which a reranker keys on, with them.
+ paraHeading = firstHeading(p) || partHeading;
}
}
current = para;
@@ -765,7 +781,14 @@ function blockToMd($: cheerio.CheerioAPI, el: any): string {
.join("\n")
: $(el).text()
).replace(/\s+$/g, "");
- return code ? "```\n" + code + "\n```" : "";
+ // Carry Prism's language through. Without it a Swift and a Kotlin sample
+ // are byte-identical in an excerpt whose stated job is helping an
+ // assistant pick the right page, and framework routing is this
+ // artifact's headline feature.
+ const langAttr = `${$(el).attr("class") || ""} ${$(el).find("code").first().attr("class") || ""}`;
+ const langMatch = langAttr.match(/language-([A-Za-z0-9+#-]+)/);
+ const lang = langMatch ? langMatch[1] : "";
+ return code ? "```" + lang + "\n" + code + "\n```" : "";
}
if (tag === "table") return tableToMd($, el);
if (tag === "blockquote") {
@@ -781,7 +804,24 @@ function blockToMd($: cheerio.CheerioAPI, el: any): string {
.map((l) => (l ? `> ${l}` : ">"))
.join("\n");
}
- if (tag === "div" || tag === "section" || tag === "details" || tag === "article" || tag === "aside") {
+ if (tag === "details") {
+ // is the LABEL for the block it introduces, and it is not a block
+ // tag - so orderedSegments flushed it as its own inline run and the "\n\n"
+ // join below turned it into a paragraph boundary. chunkBody then cut there
+ // and shipped 44 modules whose entire content was a bare region label
+ // ("Europe", "North America"), while the country table that label
+ // introduces shipped with no region context at all. tabsToMd avoids exactly
+ // this with a single newline; a collapsible section needs the same.
+ const summaryEl = $(el).children("summary").first();
+ const label = summaryEl.length ? inlineText($, summaryEl[0]) : "";
+ const rest = $(el).clone();
+ rest.children("summary").remove();
+ const inner = orderedSegments($, rest[0]).join("\n\n").trim();
+ if (!label) return inner;
+ if (!inner) return label;
+ return `${label}\n${inner}`;
+ }
+ if (tag === "div" || tag === "section" || tag === "article" || tag === "aside") {
// Shared walker: keeps direct text children (an admonition heading is
// icondanger, so the
// severity word used to vanish) AND keeps link URLs, which a per-child walk
@@ -889,11 +929,19 @@ function detectContentType(pathname: string, title: string): string {
}
function isAvailabilityStub(title: string, body: string): boolean {
- return /\bnot available\b/i.test(title) || /is not available (on|for) the/i.test(body);
+ if (/\bnot available\b/i.test(title)) return true;
+ // Anchor to the page's OWN opening, not the whole body. Scanning everything
+ // meant a normal product page that notes one unsupported sub-feature marked
+ // EVERY chunk not_available, so the page contributed NotAvailableOn while
+ // its siblings contributed AvailableOn - the self-contradiction
+ // SYNTHETIC_PRODUCTS was introduced to prevent, this time on real products.
+ // A genuine stub says so in its first paragraph.
+ const opening = body.trim().split(/\n\s*\n/)[0] || "";
+ return /is not available (on|for) the/i.test(opening);
}
/** Classify links found in chunk prose into internal doc paths and API-ref URLs. */
-function classifyLinks(chunkMarkdown: string, site: string): { internal: string[]; api: string[] } {
+function classifyLinks(chunkMarkdown: string, site: string, baseUrl: string): { internal: string[]; api: string[] } {
const internal = new Set();
const api = new Set();
const re = /\[[^\]]*\]\(([^)]+)\)/g;
@@ -908,7 +956,17 @@ function classifyLinks(chunkMarkdown: string, site: string): { internal: string[
// normalize same-host absolute URLs to a site path
if (site && href.startsWith(site)) href = href.slice(site.length) || "/";
if (href.startsWith("/")) {
- const p = href.split(/[?#]/)[0];
+ let p = href.split(/[?#]/)[0];
+ // Rendered hrefs carry baseUrl; `pathname` is derived from the outDir
+ // and does not. On a PR preview baseUrl is
+ // /data-capture-documentation/pr-preview/pr-N/, so every reference
+ // gained that prefix, indexedPaths.has(ref) matched nothing, all 1,014
+ // SeeAlso edges vanished, and the r !== pathname self-link filter
+ // stopped working - the artifact a reviewer inspects on a preview was
+ // not the artifact main publishes.
+ if (baseUrl && baseUrl !== "/" && p.startsWith(baseUrl)) {
+ p = "/" + p.slice(baseUrl.length).replace(/^\/+/, "");
+ }
if (p.startsWith("/img") || p.startsWith("/assets") || /\.(png|jpe?g|gif|svg|mp4|pdf|zip)$/i.test(p)) continue;
// Docusaurus routes end in "/", but a link to a FILE must not: the asset
// filter above only covers images and archives, so /llms.txt and the
@@ -1338,6 +1396,7 @@ function buildModule(args: {
url: string;
sourceSite: string;
site: string;
+ baseUrl: string;
title: string;
description: string;
chunk: Chunk;
@@ -1352,7 +1411,7 @@ function buildModule(args: {
notAvailable: boolean;
fm: Record;
}) {
- const { pathname, url, sourceSite, site, title: rawTitle, description, chunk, idx, framework, product, products, contentType, version, updatedAt, sourceUpdatedAt, notAvailable, fm } = args;
+ const { pathname, url, sourceSite, site, baseUrl, title: rawTitle, description, chunk, idx, framework, product, products, contentType, version, updatedAt, sourceUpdatedAt, notAvailable, fm } = args;
const chunkClean = chunk.content.trim();
const title = (rawTitle || pathname).trim();
const displayTitle = idx === 1 ? title : `${title} (Part ${idx})`;
@@ -1363,7 +1422,7 @@ function buildModule(args: {
const resolvedHeading = (chunk.heading || displayTitle)
.replace(/\[([^\]]*)\]\([^)]*\)/g, "$1")
.trim();
- const links = classifyLinks(chunkClean, site);
+ const links = classifyLinks(chunkClean, site, baseUrl);
// Curated signal read from the page's own frontmatter (empty when absent).
const userIntents = fmStringArray(fm.user_intents);
const notFor = fmStringArray(fm.not_for);
@@ -1719,6 +1778,17 @@ export default function knowledgeExtractor(context: any, _options: any) {
name: "knowledge-extractor",
async postBuild({ siteConfig, outDir }: { siteConfig: any; outDir: string }) {
const site = String(siteConfig?.url || "").replace(/\/+$/, "");
+ // Rendered hrefs are baseUrl-prefixed; pathname is not. classifyLinks
+ // strips it so the two can be compared (see F2 note there).
+ const baseUrl = String(siteConfig?.baseUrl || "/");
+ // A preview build must not emit these. pr-preview-action commits the whole
+ // build/ into the gh-pages branch, so every push added ~22 MB of generated
+ // JSON (10.4 index + 11.6 graph) permanently - closing the PR deletes the
+ // files but not the blobs. Nothing on a preview consumes them either.
+ if (siteConfig?.customFields?.isPreviewBuild) {
+ console.log("[knowledge-extractor] preview build - skipping artifact emission");
+ return;
+ }
const sourceSite = site ? new URL(site).hostname.toLowerCase() : "";
// When the artifact was produced. Honest and unconditional: it populates
// `updated_at`. It is deliberately NOT used for `last_verified`, which is
@@ -1886,7 +1956,7 @@ export default function knowledgeExtractor(context: any, _options: any) {
const contentType = TOPIC_TYPE_TO_CONTENT[fmTopic] || detectContentType(pathname, title);
chunks.forEach((chunk, i) => {
modules.push(
- buildModule({ pathname, url, sourceSite, site, title, description, chunk, idx: i + 1, framework, product, products, contentType, version, updatedAt: buildStamp, sourceUpdatedAt, notAvailable, fm }),
+ buildModule({ pathname, url, sourceSite, site, baseUrl, title, description, chunk, idx: i + 1, framework, product, products, contentType, version, updatedAt: buildStamp, sourceUpdatedAt, notAvailable, fm }),
);
});
} catch (err) {
From 0e09b703b7301fe400a5eecc627904ba5587b860 Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Fri, 18 Sep 2026 13:59:02 +0100
Subject: [PATCH 32/53] Re-record the retrieval baseline against the fixed
artifact
The extraction fixes change what is indexed, so the figures recorded from the
previous build no longer describe it: keeping the summary label with the table
it introduces and letting continuation chunks keep their section heading moved
the corpus from 531 pages / 4,386 modules to 533 / 4,365.
page-success@3 goes 0.8493 -> 0.8462, a drop of 0.0031 against a 0.03
tolerance, so the gate passed on the old baseline and printed the corpus change
as the reason rather than failing. Gold-set evals stay well above their floors
(success@3 0.9, precision@3 0.85, MRR 0.9).
Co-Authored-By: Claude Opus 5 (1M context)
---
scripts/retrieval-evals/baseline.json | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/scripts/retrieval-evals/baseline.json b/scripts/retrieval-evals/baseline.json
index a87d658b64..9d8029dd08 100644
--- a/scripts/retrieval-evals/baseline.json
+++ b/scripts/retrieval-evals/baseline.json
@@ -1,8 +1,8 @@
{
- "page_success_at_k": 0.8493,
- "page_mrr": 0.7699,
- "pages": 531,
- "modules": 4386,
+ "page_success_at_k": 0.8462,
+ "page_mrr": 0.7674,
+ "pages": 533,
+ "modules": 4365,
"k": 3,
"recorded_at": "2026-09-18"
}
From eb0e6bb46ee22d0694b5bbf69c744ba62db0b882 Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Fri, 18 Sep 2026 14:14:14 +0100
Subject: [PATCH 33/53] Test the prose, not the heading, and stop the gate
failing open
The availability check read the first block of the body as "the opening
paragraph", but extractMarkdownish emits the page header as its own block, so
every body starts "# " and the prose test never ran at all. Every page
currently flagged matches through the title branch instead - a page headed
plainly "ID Capture" whose first sentence is "ID Capture is not available for
the Linux SDK." went undetected and emitted AvailableOn for a platform it
explicitly rules out. Take the first block that is not a heading.
A body that reduces to the page title alone is not a page either.
/hosted/id-bolt/session/ renders outside article .markdown, so the element
holds only and it shipped one module whose entire content was
"ID Bolt session" - the best token match for that query, returning nothing to
read. The test is against the title, not against heading syntax: is
not a block tag, so that h1 arrives as a plain string with no "#" on it, and a
first attempt at this guard that looked for one let the page straight through.
The baseline gate failed open two ways. An unreadable baseline.json was
swallowed and the floor silently dropped to the backstop, so a 24-point
regression would have gone green; and a file that parsed without
page_success_at_k made the floor NaN, which every comparison is false against -
the gate passed unconditionally and still wrote "status": "ok". Both now exit 1
and say which file to fix. Absent is still a legitimate state: the first run
records it.
MRR is recorded in the baseline, so gate it too. Success@3 alone cannot see a
change that keeps every page inside the top 3 while pushing it from rank 1 to
rank 3 - the corpus looks unchanged while ranking quality, the thing a
retrieval consumer actually feels, halves.
Preview builds drop to a shallow clone. last_verified was the only thing that
needed full history and the extractor now returns before any git call on a
preview, so the full clone was buying a freshness signal nobody computes.
Co-Authored-By: Claude Opus 5 (1M context)
---
.github/workflows/docs-preview.yml | 13 ++++-----
scripts/retrieval-evals/run.cjs | 37 +++++++++++++++++++++---
src/plugins/knowledge-extractor/index.ts | 26 +++++++++++++++--
3 files changed, 63 insertions(+), 13 deletions(-)
diff --git a/.github/workflows/docs-preview.yml b/.github/workflows/docs-preview.yml
index e7d756ab1c..c030abc307 100644
--- a/.github/workflows/docs-preview.yml
+++ b/.github/workflows/docs-preview.yml
@@ -25,13 +25,12 @@ jobs:
# Full history, because the knowledge-extractor sets each page's
# `last_verified` from that file's last commit date. A depth-1 clone
# makes every file resolve to the same single commit, and the plugin
- # then emits "" rather than a constant that looks like data - so a
- # preview would carry no freshness signal at all.
- #
- # Only this job needs it: `deploy` below just downloads the artifact.
- # Cheap here - 796 commits, and the `git log` over docs/ measures at
- # ~0.13s.
- fetch-depth: 0
+ # A shallow clone is enough HERE. last_verified is the only thing that
+ # needed full history, and the knowledge-extractor now returns before
+ # any git call on a preview build (it must not emit its ~22 MB of JSON
+ # into gh-pages), so a full clone would buy a freshness signal nobody
+ # computes. The build job on main still fetches full history.
+ fetch-depth: 1
- name: Setup Node.js
uses: actions/setup-node@v4
diff --git a/scripts/retrieval-evals/run.cjs b/scripts/retrieval-evals/run.cjs
index b909e4233e..4bd42ff858 100644
--- a/scripts/retrieval-evals/run.cjs
+++ b/scripts/retrieval-evals/run.cjs
@@ -62,11 +62,31 @@ const AUTO_TOLERANCE = parseFloat(arg("auto-tolerance", "0.03"));
const AUTO_FLOOR = parseFloat(arg("auto-floor", "0.60"));
const UPDATE_BASELINE = process.argv.includes("--update-baseline");
function readBaseline() {
+ let raw;
try {
- return JSON.parse(fs.readFileSync(BASELINE_PATH, "utf8"));
+ raw = fs.readFileSync(BASELINE_PATH, "utf8");
} catch {
+ // Genuinely absent is a legitimate state - the first run records it.
return null;
}
+ // Present but unusable is NOT. Swallowing it dropped the gate to the bare
+ // backstop, so a 24-point regression would have gone green; and a parsed
+ // object missing the key made the floor NaN, which every comparison is false
+ // against - the gate then passed unconditionally and still reported "ok".
+ let parsed;
+ try {
+ parsed = JSON.parse(raw);
+ } catch (err) {
+ console.error(`retrieval-evals: ${BASELINE_PATH} is not valid JSON (${err.message}).`);
+ console.error("Fix it or delete it - refusing to run an ungated check.");
+ process.exit(1);
+ }
+ if (!parsed || !Number.isFinite(parsed.page_success_at_k)) {
+ console.error(`retrieval-evals: ${BASELINE_PATH} has no finite page_success_at_k.`);
+ console.error("Re-record it with --update-baseline - refusing to run an ungated check.");
+ process.exit(1);
+ }
+ return parsed;
}
const MIN_AUTO_SUCCESS = parseFloat(arg("min-auto-success", "0"));
const REPORT = arg("report", "");
@@ -181,7 +201,16 @@ function main() {
: baseline
? Math.max(AUTO_FLOOR, +(baseline.page_success_at_k - AUTO_TOLERANCE).toFixed(4))
: AUTO_FLOOR;
- const breached = metrics.page_success_at_k < floor;
+ // MRR is recorded, so gate it. Success@k alone cannot see a change that
+ // keeps every page inside the top 3 while pushing it from rank 1 to rank 3 -
+ // the corpus looks unchanged and ranking quality, which is what a retrieval
+ // consumer feels, has halved.
+ const mrrFloor =
+ baseline && Number.isFinite(baseline.page_mrr)
+ ? +(baseline.page_mrr - AUTO_TOLERANCE).toFixed(4)
+ : 0;
+ const breached =
+ metrics.page_success_at_k < floor || metrics.page_mrr < mrrFloor;
console.log(` page-success@${K} = ${metrics.page_success_at_k} (min ${floor})`);
if (baseline) {
const delta = +(metrics.page_success_at_k - baseline.page_success_at_k).toFixed(4);
@@ -220,14 +249,14 @@ function main() {
);
console.log(` baseline recorded -> ${path.relative(process.cwd(), BASELINE_PATH)}`);
}
- console.log(` page-MRR = ${metrics.page_mrr}`);
+ console.log(` page-MRR = ${metrics.page_mrr} (min ${mrrFloor})`);
console.log(` ${misses.length} page(s) not surfaced in top ${K} by their own content.`);
misses.slice(0, 10).forEach((m) => console.log(` ✗ ${m}`));
if (REPORT) {
fs.mkdirSync(path.dirname(REPORT), { recursive: true });
fs.writeFileSync(
REPORT,
- JSON.stringify({ status: breached ? "breach" : "ok", floor, baseline, metrics, misses: misses.slice(0, 200) }, null, 2) + "\n",
+ JSON.stringify({ status: breached ? "breach" : "ok", floor, mrrFloor, baseline, metrics, misses: misses.slice(0, 200) }, null, 2) + "\n",
);
}
process.exit(breached && !UPDATE_BASELINE ? 1 : 0);
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index f8fc1f298a..e3efe138ac 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -936,7 +936,18 @@ function isAvailabilityStub(title: string, body: string): boolean {
// its siblings contributed AvailableOn - the self-contradiction
// SYNTHETIC_PRODUCTS was introduced to prevent, this time on real products.
// A genuine stub says so in its first paragraph.
- const opening = body.trim().split(/\n\s*\n/)[0] || "";
+ // The first BLOCK is the page heading - extractMarkdownish emits the
+ // header as its own block, so every body starts "# \n\n...". Taking
+ // block 0 therefore tested the title line twice and never reached the
+ // prose, which is where a stub actually says it: a page headed plainly
+ // "ID Capture" whose opening sentence is "ID Capture is not available for
+ // the Linux SDK." went undetected and emitted AvailableOn for a platform
+ // it explicitly rules out. Take the first block that is not a heading.
+ const opening =
+ body
+ .trim()
+ .split(/\n\s*\n/)
+ .find((block) => block.trim() && !/^\s*#/.test(block)) || "";
return /is not available (on|for) the/i.test(opening);
}
@@ -1916,7 +1927,18 @@ export default function knowledgeExtractor(context: any, _options: any) {
const title = ($("h1").first().text() || $("title").text() || "").replace(//g, "").trim();
const description = ($('meta[name="description"]').attr("content") || "").trim();
const bodyMd = extractMarkdownish($, root);
- if (!bodyMd.trim()) continue;
+ // Not just empty: a body that reduces to the page heading alone is not
+ // a page either. /hosted/id-bolt/session/ renders its content outside
+ // article .markdown, so the element holds only , and it
+ // shipped one module whose entire content was "ID Bolt session" - the
+ // single best token match for that query, returning nothing to read.
+ // Compare against the TITLE, not against heading syntax. is
+ // not a block tag, so this page's h1 arrives as the plain string
+ // "ID Bolt session" with no "#" for a heading filter to catch - the
+ // first version of this guard looked for one and let the page through.
+ const bodyText = bodyMd.replace(/^#+\s*/gm, "").replace(/\s+/g, " ").trim();
+ const titleText = title.replace(/\s+/g, " ").trim();
+ if (!bodyText || bodyText.toLowerCase() === titleText.toLowerCase()) continue;
const chunks = chunkBody(bodyMd, CHUNK_TARGET_CHARS);
if (!chunks.length) continue;
From 7015c4942f71e471ec60bcb64dee138d1ce15d0c Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Fri, 18 Sep 2026 14:19:34 +0100
Subject: [PATCH 34/53] Re-record the baseline after the title-only page is
skipped
One module fewer (4,365 -> 4,364): /hosted/id-bolt/session/ shipped a module
whose entire content was its own title.
Co-Authored-By: Claude Opus 5 (1M context)
---
scripts/retrieval-evals/baseline.json | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/scripts/retrieval-evals/baseline.json b/scripts/retrieval-evals/baseline.json
index 9d8029dd08..fa14dd0701 100644
--- a/scripts/retrieval-evals/baseline.json
+++ b/scripts/retrieval-evals/baseline.json
@@ -1,8 +1,8 @@
{
- "page_success_at_k": 0.8462,
- "page_mrr": 0.7674,
- "pages": 533,
- "modules": 4365,
+ "page_success_at_k": 0.8459,
+ "page_mrr": 0.7669,
+ "pages": 532,
+ "modules": 4364,
"k": 3,
"recorded_at": "2026-09-18"
}
From 6d008d6be1597217a087ea6b9dea395b7c442d60 Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Fri, 18 Sep 2026 14:33:03 +0100
Subject: [PATCH 35/53] Apply the header-rendered-title lesson to the other
guard, and close two gates
isAvailabilityStub still skipped blocks beginning with "#". That was already
proved wrong once, in the page loop, and for the same reason: is not a
block tag, so on the 147 indexed pages that render their h1 inside one - every
*/intro/, core-concepts, symbology-properties, system-requirements, migrate-* -
the title arrives as a plain block carrying no "#" and was selected as "the
opening". The check then read the title instead of the prose and could never
match, so a stub authored with a frontmatter title and no "# " line, whose first
sentence says it is not available on a platform, still emitted AvailableOn for
that platform. It now skips the block that equals the title, whatever syntax it
arrived in.
The baseline validated page_success_at_k and not page_mrr, so a baseline that
lost the key - a hand edit, or one written by a pre-MRR version of the script -
set mrrFloor to 0, and nothing is below 0: the MRR gate disabled itself while
the report still said "ok". Both keys are validated now, and the floor has an
absolute backstop the way page-success already did.
The retrieval evals did not run when a component changed. The extractor reads
RENDERED html, so a component decides what the indexed text is - it already
carries a special case for FeatureList's "Loading features..." placeholder, and
productKeys() reads src/data. This PR's own FeatureList change would not have
triggered them; the first signal would have been the push-to-main run, after
merge.
Also: the preview checkout comment was two spliced versions arguing for
fetch-depth 0 above a fetch-depth of 1, which is a plausible route back to
committing 22 MB into gh-pages on every preview push; and
.frameworkItemUnavailable:hover restored --ifm-color-content, so hovering an
unavailable chip showed it at full contrast with only the dashed border left to
carry the state.
Co-Authored-By: Claude Opus 5 (1M context)
---
.github/workflows/docs-preview.yml | 17 +++++++-------
.github/workflows/docs-retrieval-evals.yml | 8 +++++++
scripts/retrieval-evals/run.cjs | 24 +++++++++++++-------
src/components/FeatureList/styles.module.css | 8 ++++++-
src/plugins/knowledge-extractor/index.ts | 16 +++++++++++--
5 files changed, 54 insertions(+), 19 deletions(-)
diff --git a/.github/workflows/docs-preview.yml b/.github/workflows/docs-preview.yml
index c030abc307..bc884ffdf1 100644
--- a/.github/workflows/docs-preview.yml
+++ b/.github/workflows/docs-preview.yml
@@ -22,14 +22,15 @@ jobs:
- name: Checkout code
uses: actions/checkout@v4
with:
- # Full history, because the knowledge-extractor sets each page's
- # `last_verified` from that file's last commit date. A depth-1 clone
- # makes every file resolve to the same single commit, and the plugin
- # A shallow clone is enough HERE. last_verified is the only thing that
- # needed full history, and the knowledge-extractor now returns before
- # any git call on a preview build (it must not emit its ~22 MB of JSON
- # into gh-pages), so a full clone would buy a freshness signal nobody
- # computes. The build job on main still fetches full history.
+ # Shallow is enough HERE, and only here. last_verified is the one
+ # thing that needs full history - the extractor reads each file's last
+ # commit date, and under a depth-1 clone every file resolves to the
+ # same commit - but the extractor now returns before any git call on a
+ # preview build, because it must not emit its ~22 MB of JSON into the
+ # gh-pages branch that pr-preview-action commits. A full clone would
+ # buy a freshness signal nobody computes. build-docs.yml, which does
+ # publish the artifact, still fetches full history - do not copy this
+ # value there.
fetch-depth: 1
- name: Setup Node.js
diff --git a/.github/workflows/docs-retrieval-evals.yml b/.github/workflows/docs-retrieval-evals.yml
index 6e2e630117..126545154b 100644
--- a/.github/workflows/docs-retrieval-evals.yml
+++ b/.github/workflows/docs-retrieval-evals.yml
@@ -17,6 +17,14 @@ on:
- 'src/plugins/knowledge-extractor/**'
- 'scripts/retrieval-evals/**'
- '.github/workflows/docs-retrieval-evals.yml'
+ # The extractor reads RENDERED html, so a component decides what the
+ # indexed text IS - it already carries a special case for FeatureList's
+ # "Loading features..." SSR placeholder, and productKeys() reads
+ # src/data. Without these, a PR that changes what a component renders
+ # (this one changes FeatureList) never runs the evals, and the first
+ # signal is the push-to-main trigger after it has merged.
+ - 'src/components/**'
+ - 'src/data/**'
# These decide WHAT gets indexed at all: assistantIgnoreFiles and
# lastVersion live in the config, and versions.json decides which
# trees are frozen. Without them a PR that widens or narrows the
diff --git a/scripts/retrieval-evals/run.cjs b/scripts/retrieval-evals/run.cjs
index 4bd42ff858..70997e0d3e 100644
--- a/scripts/retrieval-evals/run.cjs
+++ b/scripts/retrieval-evals/run.cjs
@@ -60,6 +60,7 @@ const AUTO_LIMIT = parseInt(arg("auto-limit", "0"), 10);
const BASELINE_PATH = path.join(__dirname, "baseline.json");
const AUTO_TOLERANCE = parseFloat(arg("auto-tolerance", "0.03"));
const AUTO_FLOOR = parseFloat(arg("auto-floor", "0.60"));
+const AUTO_MRR_FLOOR = parseFloat(arg("auto-mrr-floor", "0.40"));
const UPDATE_BASELINE = process.argv.includes("--update-baseline");
function readBaseline() {
let raw;
@@ -81,10 +82,16 @@ function readBaseline() {
console.error("Fix it or delete it - refusing to run an ungated check.");
process.exit(1);
}
- if (!parsed || !Number.isFinite(parsed.page_success_at_k)) {
- console.error(`retrieval-evals: ${BASELINE_PATH} has no finite page_success_at_k.`);
- console.error("Re-record it with --update-baseline - refusing to run an ungated check.");
- process.exit(1);
+ for (const key of ["page_success_at_k", "page_mrr"]) {
+ // Both, not just the first. page_mrr went unchecked, so a baseline that
+ // dropped the key - a hand edit, or one written by a pre-MRR version of
+ // this script - set mrrFloor to 0, and nothing is ever below 0: the MRR
+ // gate disabled itself while the report still said "ok".
+ if (!parsed || !Number.isFinite(parsed[key])) {
+ console.error(`retrieval-evals: ${BASELINE_PATH} has no finite ${key}.`);
+ console.error("Re-record it with --update-baseline - refusing to run an ungated check.");
+ process.exit(1);
+ }
}
return parsed;
}
@@ -205,10 +212,11 @@ function main() {
// keeps every page inside the top 3 while pushing it from rank 1 to rank 3 -
// the corpus looks unchanged and ranking quality, which is what a retrieval
// consumer feels, has halved.
- const mrrFloor =
- baseline && Number.isFinite(baseline.page_mrr)
- ? +(baseline.page_mrr - AUTO_TOLERANCE).toFixed(4)
- : 0;
+ // readBaseline guarantees a finite page_mrr when a baseline exists, so the
+ // only way here without one is having no baseline at all - the first run.
+ const mrrFloor = baseline
+ ? Math.max(AUTO_MRR_FLOOR, +(baseline.page_mrr - AUTO_TOLERANCE).toFixed(4))
+ : AUTO_MRR_FLOOR;
const breached =
metrics.page_success_at_k < floor || metrics.page_mrr < mrrFloor;
console.log(` page-success@${K} = ${metrics.page_success_at_k} (min ${floor})`);
diff --git a/src/components/FeatureList/styles.module.css b/src/components/FeatureList/styles.module.css
index db1b4653ee..624b7cfb37 100644
--- a/src/components/FeatureList/styles.module.css
+++ b/src/components/FeatureList/styles.module.css
@@ -123,9 +123,15 @@
cursor: default;
}
+/* Hold the dimmed colour on hover. This rule exists to cancel
+ .frameworkItem:hover, but it was left over from the opacity version and
+ restored --ifm-color-content - the full-contrast colour - so hovering an
+ unavailable chip made it look available, with only the dashed border
+ still carrying the state. The span is not interactive; cursor: default
+ already says so. */
.frameworkItemUnavailable:hover {
background: var(--ifm-color-emphasis-100);
- color: var(--ifm-color-content);
+ color: var(--ifm-color-emphasis-700);
border-color: var(--ifm-color-emphasis-200);
}
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index e3efe138ac..cf58315a09 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -942,12 +942,24 @@ function isAvailabilityStub(title: string, body: string): boolean {
// prose, which is where a stub actually says it: a page headed plainly
// "ID Capture" whose opening sentence is "ID Capture is not available for
// the Linux SDK." went undetected and emitted AvailableOn for a platform
- // it explicitly rules out. Take the first block that is not a heading.
+ // it explicitly rules out.
+ //
+ // Skip the TITLE block, not blocks that start with "#". A `#` filter was
+ // the first attempt and it is wrong for the same reason it was wrong in the
+ // page loop: is not a block tag, so on the 147 pages that render
+ // their h1 inside one - every */intro/, core-concepts, symbology-properties,
+ // system-requirements, migrate-* - the title arrives as a plain block with
+ // no "#" on it and gets selected as the opening. The check then reads the
+ // title instead of the prose and can never match.
+ const titleText = title.replace(/\s+/g, " ").trim().toLowerCase();
const opening =
body
.trim()
.split(/\n\s*\n/)
- .find((block) => block.trim() && !/^\s*#/.test(block)) || "";
+ .find((block) => {
+ const text = block.replace(/^#+\s*/, "").replace(/\s+/g, " ").trim();
+ return text && text.toLowerCase() !== titleText;
+ }) || "";
return /is not available (on|for) the/i.test(opening);
}
From be5c0a042e2f52e3042a528018001007433460f7 Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Fri, 18 Sep 2026 15:11:37 +0100
Subject: [PATCH 36/53] Count ties against the page, and reach the prose past a
sub-heading
The AUTO rank counted only strictly-better competitors, so every other-page
chunk tying the page's own best score was treated as ranking below it. This
corpus is ~11 near-duplicate copies of the same prose, so exact ties are the
common case and the metric was the optimistic rank - while the gold-set path in
the same file already broke ties deterministically, so the two halves disagreed
about what rank means. Ties are now resolved by id in both, and the baseline is
re-recorded against the honest number: page-success@3 0.8459 -> 0.7876,
page-MRR 0.7669 -> 0.6895. Nothing about retrieval changed; the measurement
stopped flattering it. A baseline resting on tie-resolution for a tenth of the
corpus moves further than the tolerance whenever an edit perturbs tokenisation
enough to flip a batch of ties - red with no regression behind it - and hides a
real regression that merely converts strictly-better competitors into ties.
The availability check swapped one blind spot for another. Skipping blocks that
start with "#" missed the 147 pages rendering their h1 inside , where
the title carries no "#"; skipping the title block instead then broke
"# ID Capture / ## Requirements / ID Capture is not available on the Linux SDK."
- the first non-title block is the sub-heading, so the stub sentence was never
reached and that page went back to emitting AvailableOn for a platform it rules
out. It now skips heading blocks AND the title block, and all six shapes are
covered by a check in the commit that follows.
--min-auto-mrr joins --min-auto-success, so the documented "a caller can pin a
number" can actually relax the AUTO gate; with only the success override, MRR
kept failing it.
The evals paths filter gains src/theme/**, which decides the MARKUP the
extractor parses: MDXComponents.js maps Tabs/TabItem and every custom component
rendered inside article .markdown - tabsToMd is built entirely around that
markup - and DocItem is swizzled.
Co-Authored-By: Claude Opus 5 (1M context)
---
.github/workflows/docs-retrieval-evals.yml | 6 ++++
scripts/retrieval-evals/baseline.json | 4 +--
scripts/retrieval-evals/run.cjs | 41 ++++++++++++++++++----
src/plugins/knowledge-extractor/index.ts | 13 +++++--
4 files changed, 53 insertions(+), 11 deletions(-)
diff --git a/.github/workflows/docs-retrieval-evals.yml b/.github/workflows/docs-retrieval-evals.yml
index 126545154b..739cd08d9e 100644
--- a/.github/workflows/docs-retrieval-evals.yml
+++ b/.github/workflows/docs-retrieval-evals.yml
@@ -25,6 +25,12 @@ on:
# signal is the push-to-main trigger after it has merged.
- 'src/components/**'
- 'src/data/**'
+ # And src/theme, which decides the MARKUP: MDXComponents.js maps Tabs /
+ # TabItem and every custom component rendered inside article .markdown -
+ # tabsToMd is built entirely around that markup - and DocItem is swizzled.
+ # Swapping the Tabs implementation, or wrapping a component in one more
+ # element, changes the indexed text on hundreds of pages.
+ - 'src/theme/**'
# These decide WHAT gets indexed at all: assistantIgnoreFiles and
# lastVersion live in the config, and versions.json decides which
# trees are frozen. Without them a PR that widens or narrows the
diff --git a/scripts/retrieval-evals/baseline.json b/scripts/retrieval-evals/baseline.json
index fa14dd0701..44836d35c1 100644
--- a/scripts/retrieval-evals/baseline.json
+++ b/scripts/retrieval-evals/baseline.json
@@ -1,6 +1,6 @@
{
- "page_success_at_k": 0.8459,
- "page_mrr": 0.7669,
+ "page_success_at_k": 0.7876,
+ "page_mrr": 0.6895,
"pages": 532,
"modules": 4364,
"k": 3,
diff --git a/scripts/retrieval-evals/run.cjs b/scripts/retrieval-evals/run.cjs
index 70997e0d3e..56ba97d5ef 100644
--- a/scripts/retrieval-evals/run.cjs
+++ b/scripts/retrieval-evals/run.cjs
@@ -61,6 +61,7 @@ const BASELINE_PATH = path.join(__dirname, "baseline.json");
const AUTO_TOLERANCE = parseFloat(arg("auto-tolerance", "0.03"));
const AUTO_FLOOR = parseFloat(arg("auto-floor", "0.60"));
const AUTO_MRR_FLOOR = parseFloat(arg("auto-mrr-floor", "0.40"));
+const MIN_AUTO_MRR = parseFloat(arg("min-auto-mrr", "0"));
const UPDATE_BASELINE = process.argv.includes("--update-baseline");
function readBaseline() {
let raw;
@@ -173,14 +174,35 @@ function main() {
const misses = [];
for (const r of rows) {
const qt = tokenize(r.query);
- // best score among chunks of the SAME page
+ // Best-ranking chunk of the SAME page. Ties are broken by id, exactly as
+ // the gold-set path sorts (b.s - a.s || a.id.localeCompare(b.id)): the two
+ // halves of this script have to agree about what rank means.
let bestSame = 0;
- for (const d of docs) if (d.url === r.url) bestSame = Math.max(bestSame, fastScore(qt, d.tokens));
- // rank of that best same-page chunk = # of OTHER-page chunks scoring higher
+ let bestSameId = "";
+ for (const d of docs) {
+ if (d.url !== r.url) continue;
+ const s = fastScore(qt, d.tokens);
+ if (s > bestSame || (s === bestSame && (!bestSameId || d.id.localeCompare(bestSameId) < 0))) {
+ bestSame = s;
+ bestSameId = d.id;
+ }
+ }
+ // Rank of that chunk = how many OTHER-page chunks outrank it.
+ //
+ // A tie counts against it when the competitor's id sorts first. The
+ // comparison used to be a bare `>`, which handed the page every tie - and
+ // this corpus is ~11 near-duplicate copies of the same prose, so ties are
+ // the common case, not the edge case. Measured on the same artifact:
+ // page-success@3 0.8459 optimistic vs 0.7350 with ties counted, page-MRR
+ // 0.7669 vs 0.6526. A baseline resting on that difference moves further
+ // than the tolerance whenever an edit perturbs tokenisation enough to flip
+ // a batch of ties - a red gate with no regression behind it - and hides a
+ // real regression that only converts strictly-better competitors into ties.
let better = 0;
for (const d of docs) {
if (d.url === r.url) continue;
- if (fastScore(qt, d.tokens) > bestSame) {
+ const s = fastScore(qt, d.tokens);
+ if (s > bestSame || (s === bestSame && d.id.localeCompare(bestSameId) < 0)) {
better++;
if (better >= K) break;
}
@@ -203,6 +225,9 @@ function main() {
console.log(`\nRetrieval self-eval (AUTO, page-level over all docs): ${rows.length} pages / ${docs.length} modules, k=${K}`);
const baseline = readBaseline();
// An explicit --min-auto-success still wins, so a caller can pin a number.
+ // --min-auto-mrr does the same for MRR: with only the success override the
+ // documented "a caller can pin a number" could not actually relax the AUTO
+ // gate, because MRR kept failing it.
const floor = MIN_AUTO_SUCCESS > 0
? MIN_AUTO_SUCCESS
: baseline
@@ -214,9 +239,11 @@ function main() {
// consumer feels, has halved.
// readBaseline guarantees a finite page_mrr when a baseline exists, so the
// only way here without one is having no baseline at all - the first run.
- const mrrFloor = baseline
- ? Math.max(AUTO_MRR_FLOOR, +(baseline.page_mrr - AUTO_TOLERANCE).toFixed(4))
- : AUTO_MRR_FLOOR;
+ const mrrFloor = MIN_AUTO_MRR > 0
+ ? MIN_AUTO_MRR
+ : baseline
+ ? Math.max(AUTO_MRR_FLOOR, +(baseline.page_mrr - AUTO_TOLERANCE).toFixed(4))
+ : AUTO_MRR_FLOOR;
const breached =
metrics.page_success_at_k < floor || metrics.page_mrr < mrrFloor;
console.log(` page-success@${K} = ${metrics.page_success_at_k} (min ${floor})`);
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index cf58315a09..f96768a179 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -951,14 +951,23 @@ function isAvailabilityStub(title: string, body: string): boolean {
// system-requirements, migrate-* - the title arrives as a plain block with
// no "#" on it and gets selected as the opening. The check then reads the
// title instead of the prose and can never match.
+ // BOTH, not either. Filtering on "#" alone missed the 147 pages that render
+ // their h1 inside , where the title arrives with no "#" on it.
+ // Filtering on the title alone then broke a different shape: for
+ // "# ID Capture / ## Requirements / ID Capture is not available on the Linux
+ // SDK." the first non-title block is the SUB-heading, so the stub sentence was
+ // never reached and the page went back to emitting AvailableOn for a platform
+ // it rules out. Skip heading blocks AND the title block; take the first block
+ // of actual prose.
const titleText = title.replace(/\s+/g, " ").trim().toLowerCase();
const opening =
body
.trim()
.split(/\n\s*\n/)
.find((block) => {
- const text = block.replace(/^#+\s*/, "").replace(/\s+/g, " ").trim();
- return text && text.toLowerCase() !== titleText;
+ if (/^\s*#/.test(block)) return false;
+ const text = block.replace(/\s+/g, " ").trim();
+ return Boolean(text) && text.toLowerCase() !== titleText;
}) || "";
return /is not available (on|for) the/i.test(opening);
}
From 4a4a63bf53a67f0ed0fe7bc29aaae71475ee0d75 Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Fri, 18 Sep 2026 15:38:54 +0100
Subject: [PATCH 37/53] Give the gold-set search one slot per page, not per
chunk
search() sliced raw modules, so a single page could occupy every top-k slot -
"id capture supported documents" returned three chunks of /id-documents/ as its
entire top 3, and 9 of the 20 gold queries repeated a URL.
This does not move the gate, which is the argument for it rather than against.
success@3 and MRR are 0.9 either way and precision@3 FALLS, 0.85 -> 0.8167,
because duplicate chunks of a relevant page each counted as relevant: precision
was partly measuring how finely a page happened to be chunked rather than how
often the right page was found, while a consumer with three slots to spend got
one page.
The --auto half already ranks by "how many OTHER-page chunks outrank it", so it
never spends a slot on a sibling. Both halves now agree about what a rank means,
which is the same argument the tie-break change made for the sort order.
Reported by @moritzhartmeier in review of #418.
Co-Authored-By: Claude Opus 5 (1M context)
---
scripts/retrieval-evals/run.cjs | 30 +++++++++++++++++++++++++++---
1 file changed, 27 insertions(+), 3 deletions(-)
diff --git a/scripts/retrieval-evals/run.cjs b/scripts/retrieval-evals/run.cjs
index 56ba97d5ef..e3ea35d13a 100644
--- a/scripts/retrieval-evals/run.cjs
+++ b/scripts/retrieval-evals/run.cjs
@@ -123,10 +123,34 @@ function score(queryTokens, doc) {
function search(index, query, k) {
const qt = tokenize(query);
- return index
+ const ranked = index
.map((d) => ({ id: d.id, url: String(d.url || d.source_site || ""), s: score(qt, d) }))
- .sort((a, b) => b.s - a.s || a.id.localeCompare(b.id))
- .slice(0, k);
+ .sort((a, b) => b.s - a.s || a.id.localeCompare(b.id));
+ // One slot per PAGE, not per chunk. The index holds many chunks per page
+ // (4,364 modules over 532 pages) and this used to slice raw modules, so a
+ // single page could take every slot: "id capture supported documents" returned
+ // three chunks of /id-documents/ as its entire top 3.
+ //
+ // It does not move the gate - success@3 and MRR are the same either way, and
+ // precision@3 actually falls, because duplicate chunks of a relevant page each
+ // counted as relevant. That is the point. Un-deduped, precision@3 partly
+ // measured how finely a page happened to be chunked rather than how often the
+ // right page was found, and a consumer with three slots to spend got one page.
+ //
+ // The --auto half already ranks by "how many OTHER-page chunks outrank it", so
+ // it never spends a slot on a sibling. Deduping here makes both halves of this
+ // script agree about what a rank means - the same argument as the tie-break
+ // note above.
+ const seen = new Set();
+ const out = [];
+ for (const hit of ranked) {
+ const page = hit.url.split("#")[0];
+ if (seen.has(page)) continue;
+ seen.add(page);
+ out.push(hit);
+ if (out.length >= k) break;
+ }
+ return out;
}
function relevant(hit, expect) {
From c8308df82af58c44ad99a026aee65501803c81fe Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Fri, 18 Sep 2026 15:46:54 +0100
Subject: [PATCH 38/53] Announce the unavailable chip as unavailable
The contrast work changed what the chip looks like and not what it announces.
An unavailable chip was still just its text - "iOS v1.2.3", identical to an
available one - so a screen-reader user got no signal that this one is different
and does not link anywhere. The dashed border and the dimmed token only carry
the state visually.
aria-disabled, a title, and a visually-hidden "(not available)" suffix. The
suffix is clipped rather than display:none, which would take it out of the
accessibility tree too and defeat the point.
Every current call site uses displayMode="compact", which does not render this
column, so this is not visible anywhere yet - worth having in place before the
table view ships.
Reported by @raffaelefarinaro in review of #418.
Co-Authored-By: Claude Opus 5 (1M context)
---
src/components/FeatureList/index.tsx | 8 ++++++++
src/components/FeatureList/styles.module.css | 15 +++++++++++++++
2 files changed, 23 insertions(+)
diff --git a/src/components/FeatureList/index.tsx b/src/components/FeatureList/index.tsx
index e094536a84..f7c558df9a 100644
--- a/src/components/FeatureList/index.tsx
+++ b/src/components/FeatureList/index.tsx
@@ -228,8 +228,16 @@ const FeatureList: React.FC = ({
{frameworkName} v{frameworkInfo.version}
+ {/* The dashed border and the dimmed token say "unavailable"
+ to someone who can see them. Without this the chip
+ announces exactly what an available one announces -
+ "iOS v1.2.3" - so a screen-reader user gets no signal
+ that this one is different and does not link anywhere. */}
+ (not available)
)
))}
diff --git a/src/components/FeatureList/styles.module.css b/src/components/FeatureList/styles.module.css
index 624b7cfb37..7505c59438 100644
--- a/src/components/FeatureList/styles.module.css
+++ b/src/components/FeatureList/styles.module.css
@@ -117,6 +117,21 @@
light mode - below AA - while looking merely faint. Measured against the
BUILT css rather than assumed token values: 5.29:1 light, 12.26:1 dark.
`border-style: dashed` carries the state without relying on colour. */
+/* Reachable by a screen reader, absent from the visual layout. Not
+ `display: none` or `visibility: hidden`, which remove it from the
+ accessibility tree as well and would defeat the point. */
+.visuallyHidden {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ margin: -1px;
+ padding: 0;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ white-space: nowrap;
+ border: 0;
+}
+
.frameworkItemUnavailable {
color: var(--ifm-color-emphasis-700);
border-style: dashed;
From 7cc8bbc0586eb18ba2d44f9f6484b56ae5404ae5 Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Fri, 18 Sep 2026 15:53:25 +0100
Subject: [PATCH 39/53] Keep the feature-availability matrix out of the
knowledge index
The matrix ships as ten near-identical copies, one per SDK. They are 120 modules
over 10 URLs at 23-33 distinct tokens against an index median of 50, and they
name every product - so under score()'s sqrt(|q| * |d|) normalisation they score
well on ANY single-product query while answering none of them. The whole top ten
for "sparkscan" was the ten copies of this page, with every SparkScan page below
all of them; they also took ranks 4-5 on "qr code scanning".
Excluded through a new knowledgeIndexIgnoreFiles rather than by adding to
assistantIgnoreFiles. That list is the CURATION decision - what an assistant may
see - and is deliberately shared by both exports; putting the matrix there would
also strip the one copy the llms export keeps, where a flat text corpus can
carry a table perfectly well. The new list is the index's counterpart to
llmsDedupedToWeb: shared curation, per-export corpus shape, which is the
distinction the config already draws.
Nothing is lost. What the table says - which product exists on which framework -
is what the graph's AvailableOn / NotAvailableOn edges already carry, in a form
a consumer can query rather than one it has to parse.
Measured: 4,364 -> 4,244 modules, 0 matrix modules left, llms.txt keeps its one
copy. "sparkscan" now returns five SparkScan pages. Gold set improves on every
metric - success@3 0.9 -> 0.95, precision@3 0.8167 -> 0.8667, MRR 0.9 -> 0.95 -
and the auto half rises to 0.7969 / 0.6992, re-recorded here.
Reported by @moritzhartmeier in review of #418.
Co-Authored-By: Claude Opus 5 (1M context)
---
docusaurus.config.ts | 31 ++++++++++++++++++++++++
scripts/retrieval-evals/baseline.json | 8 +++---
src/plugins/knowledge-extractor/index.ts | 5 +++-
3 files changed, 39 insertions(+), 5 deletions(-)
diff --git a/docusaurus.config.ts b/docusaurus.config.ts
index 2e92b07270..1b954acc54 100644
--- a/docusaurus.config.ts
+++ b/docusaurus.config.ts
@@ -127,8 +127,35 @@ const llmsDedupedToWeb: string[] = llmsNonWebSdkRoots.flatMap((root) =>
llmsSharedPartialPageNames.map((name) => `docs/${root}/${name}`),
);
+/**
+ * CORPUS SHAPE, for the knowledge index only: the feature-availability matrix,
+ * every copy of it.
+ *
+ * The counterpart of llmsDedupedToWeb - each export states its own corpus shape
+ * while both share the curation decision in assistantIgnoreFiles. The llms
+ * export keeps ONE copy of this page, because a flat text corpus can carry a
+ * table; the index keeps none.
+ *
+ * A token-overlap consumer cannot use it and is actively harmed by it. The
+ * matrices are 120 modules over 10 URLs at 23-33 distinct tokens against an
+ * index median of 50, and they name every product - so they score well on ANY
+ * single-product query while answering none of them. Measured: the whole top 10
+ * for the query "sparkscan" was the ten framework copies of this page, with the
+ * SparkScan pages below all of them.
+ *
+ * Nothing is lost. What the table says - which product exists on which
+ * framework - is exactly what the graph's AvailableOn / NotAvailableOn edges
+ * carry, in a form a consumer can query rather than one it has to parse.
+ */
+const knowledgeIndexDeduped: string[] = [
+ "docs/features-by-framework.mdx",
+ ...llmsNonWebSdkRoots.map((root) => `docs/${root}/features-by-framework.mdx`),
+ "docs/sdks/web/features-by-framework.mdx",
+];
+
// Paths are matched by docusaurus-plugin-llms relative to siteDir (e.g. docs/...).
const llmsIgnoreFiles: string[] = [...assistantIgnoreFiles, ...llmsDedupedToWeb];
+const knowledgeIndexIgnoreFiles: string[] = [...assistantIgnoreFiles, ...knowledgeIndexDeduped];
// ---------------------------------------------------------------------------
// SINGLE SOURCE OF TRUTH: docs versions and every `docusaurus_tag` derived
@@ -494,6 +521,10 @@ const config: Config = {
// over-corrected, because it also carries a corpus-shape decision (see
// llmsDedupedToWeb) that a routing index must not inherit.
assistantIgnoreFiles,
+ // The same curation list plus the index's own corpus-shape exclusions; see
+ // knowledgeIndexDeduped. Read by the knowledge-extractor in place of
+ // assistantIgnoreFiles, exactly as the llms plugin reads llmsIgnoreFiles.
+ knowledgeIndexIgnoreFiles,
// Which version THIS build serves at the root. Read by the
// knowledge-extractor plugin, which cannot otherwise tell a frozen version
// served at the root from `current` - and the two need opposite handling.
diff --git a/scripts/retrieval-evals/baseline.json b/scripts/retrieval-evals/baseline.json
index 44836d35c1..280fdbb40c 100644
--- a/scripts/retrieval-evals/baseline.json
+++ b/scripts/retrieval-evals/baseline.json
@@ -1,8 +1,8 @@
{
- "page_success_at_k": 0.7876,
- "page_mrr": 0.6895,
- "pages": 532,
- "modules": 4364,
+ "page_success_at_k": 0.7969,
+ "page_mrr": 0.6992,
+ "pages": 522,
+ "modules": 4244,
"k": 3,
"recorded_at": "2026-09-18"
}
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index f96768a179..efc9f37975 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -1872,7 +1872,10 @@ export default function knowledgeExtractor(context: any, _options: any) {
// mid-path `*` all matched nothing and left the tree indexed with no
// warning - a green build quietly feeding an assistant what the repo had
// just decided to hide.
- const ignoreGlobs = siteConfig?.customFields?.assistantIgnoreFiles as
+ // knowledgeIndexIgnoreFiles, not assistantIgnoreFiles: the shared curation
+ // list PLUS this export's own corpus-shape exclusions, the same way the
+ // llms plugin reads llmsIgnoreFiles rather than the bare curation list.
+ const ignoreGlobs = siteConfig?.customFields?.knowledgeIndexIgnoreFiles as
| readonly string[]
| undefined;
if (!Array.isArray(ignoreGlobs)) {
From 6076605e4cb691033bf96aae0cf9558e9fc6d098 Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Mon, 21 Sep 2026 10:50:28 +0100
Subject: [PATCH 40/53] Rank the evals with BM25, and stop full-cloning on pull
requests
The proxy retriever scored overlap / sqrt(|q| * |d|). |q| is constant
across the documents of one query, so that ranked on overlap / sqrt(|d|),
which pays a document for being SHORT: a 10-token stub matching one query
term scored 0.316 against 0.200 for a 100-token page matching two. The gate
reads its numbers from this retriever, so its precision looked stronger
than it was.
Replaced with BM25 over the existing binary term representation. IDF weighs
a rare term above a common one, and the length term normalises against the
corpus average with b=0.75 rather than sqrt(|d|). Term frequency stays
binary because docText() is read as a Set - deliberately, since the fields
it concatenates already repeat the title and slug, so a raw count would
measure field layout rather than aboutness.
The --auto half carried its own copy of the formula in fastScore, and that
is the half the baseline and the gate are computed from - so fixing only
score() would have changed nothing that is measured, and left the two
halves disagreeing about what a rank means. Both now call one makeScorer.
Measured on one index, changing only the scorer, so the corpus cannot
explain the difference:
old new
page-success@3 0.7962 0.8423 +0.0461
page-MRR 0.6981 0.7696 +0.0715
pages missed 106 82 -24
Baseline re-recorded against the new scorer. The 20-query gold set is
unchanged at success@3 0.95 / precision@3 0.8667 / MRR 0.95, with the same
single miss - it is too small to register the difference, which is itself
worth knowing about what that set can and cannot detect.
Separately: build-docs.yml took fetch-depth: 0 on every trigger. That job
builds and verifies but never publishes - no deploy step, and no workflow
in the repo publishes the index - and a shallow clone cannot fail it,
because the extractor warns and emits "" and nothing asserts on
last_verified. So on pull_request the freshness signal was computed, paid
for and discarded, on a job with no path filter, which is every PR to the
repo. Now shallow on pull_request and full elsewhere.
docs-preview.yml justified its own depth by saying build-docs.yml "does
publish the artifact". It does not, and that comment was steering future
readers away from this exact change. Corrected.
Co-Authored-By: Claude Opus 5 (1M context)
---
.github/workflows/build-docs.yml | 27 ++++++---
.github/workflows/docs-preview.yml | 6 +-
scripts/retrieval-evals/baseline.json | 10 ++--
scripts/retrieval-evals/run.cjs | 79 ++++++++++++++++++++++-----
4 files changed, 92 insertions(+), 30 deletions(-)
diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml
index 051a1e8c3d..ab3d5b0de1 100644
--- a/.github/workflows/build-docs.yml
+++ b/.github/workflows/build-docs.yml
@@ -36,16 +36,25 @@ jobs:
- name: Checkout code
uses: actions/checkout@v4
with:
- # Full history, because the knowledge-extractor sets each page's
- # `last_verified` from that file's last commit date. The default
- # shallow clone (depth 1) makes every file resolve to the same single
- # commit, and the plugin then deliberately emits "" rather than a
- # constant that looks like data - which would leave the published
- # retrieval index with no freshness signal at all.
+ # Shallow on pull_request, full history on every other trigger.
#
- # Cheap here: 796 commits, and the `git log` over docs/ measures at
- # ~0.13s. Revisit only if the history grows by orders of magnitude.
- fetch-depth: 0
+ # The knowledge-extractor sets each page's `last_verified` from that
+ # file's last commit date. Under a depth-1 clone every file resolves
+ # to the same single commit, so the plugin deliberately emits ""
+ # rather than a constant that looks like data. It warns and carries
+ # on - nothing in this job asserts on last_verified, so a shallow
+ # clone cannot turn it red, it only drops the freshness signal.
+ #
+ # Which is the point: this job does not PUBLISH the index. It builds
+ # and verifies, and has no deploy step. On a pull_request the signal
+ # is computed, paid for and discarded - and this job carries no path
+ # filter, so that is every PR to the repo. docs-preview.yml stays
+ # shallow on the same reasoning.
+ #
+ # Full history is kept on push, schedule and workflow_dispatch, where
+ # the built artifact is what a deploy or a hand-run inspection reads,
+ # and where the cost is paid once rather than per PR.
+ fetch-depth: ${{ github.event_name == 'pull_request' && 1 || 0 }}
- name: Setup Node.js
uses: actions/setup-node@v4
diff --git a/.github/workflows/docs-preview.yml b/.github/workflows/docs-preview.yml
index bc884ffdf1..d56635c8aa 100644
--- a/.github/workflows/docs-preview.yml
+++ b/.github/workflows/docs-preview.yml
@@ -28,9 +28,9 @@ jobs:
# same commit - but the extractor now returns before any git call on a
# preview build, because it must not emit its ~22 MB of JSON into the
# gh-pages branch that pr-preview-action commits. A full clone would
- # buy a freshness signal nobody computes. build-docs.yml, which does
- # publish the artifact, still fetches full history - do not copy this
- # value there.
+ # buy a freshness signal nobody computes. build-docs.yml makes the
+ # same call for the same reason and is also shallow on pull_request;
+ # it takes full history only on push, schedule and workflow_dispatch.
fetch-depth: 1
- name: Setup Node.js
diff --git a/scripts/retrieval-evals/baseline.json b/scripts/retrieval-evals/baseline.json
index 280fdbb40c..da6695a654 100644
--- a/scripts/retrieval-evals/baseline.json
+++ b/scripts/retrieval-evals/baseline.json
@@ -1,8 +1,8 @@
{
- "page_success_at_k": 0.7969,
- "page_mrr": 0.6992,
- "pages": 522,
- "modules": 4244,
+ "page_success_at_k": 0.8423,
+ "page_mrr": 0.7696,
+ "pages": 520,
+ "modules": 4228,
"k": 3,
- "recorded_at": "2026-09-18"
+ "recorded_at": "2026-09-21"
}
diff --git a/scripts/retrieval-evals/run.cjs b/scripts/retrieval-evals/run.cjs
index e3ea35d13a..33cf0bc23e 100644
--- a/scripts/retrieval-evals/run.cjs
+++ b/scripts/retrieval-evals/run.cjs
@@ -113,18 +113,72 @@ function docText(d) {
].join(" ");
}
-function score(queryTokens, doc) {
- const dt = tokenize(docText(doc));
- if (!queryTokens.size || !dt.size) return 0;
- let overlap = 0;
- for (const t of queryTokens) if (dt.has(t)) overlap++;
- return overlap / Math.sqrt(queryTokens.size * dt.size);
+// BM25 over a binary term representation, replacing `overlap / sqrt(|q|*|d|)`.
+//
+// |q| is constant across the documents of one query, so that formula ranked on
+// overlap / sqrt(|d|) - which rewards a document for being SHORT. A 10-token
+// stub matching one query term scored 1/sqrt(10) = 0.316, beating a 100-token
+// page matching two at 2/sqrt(100) = 0.200. The proxy retriever this gate reads
+// its numbers from was therefore measuring page brevity as much as relevance,
+// and precision looked stronger than it was.
+//
+// Two changes fix that. IDF weights a rare term above a common one, so matching
+// "sparkscan" is no longer worth the same as matching "the". And the length term
+// normalises against the corpus AVERAGE with the standard b=0.75, which damps
+// long documents without handing short ones the ranking.
+//
+// Term frequency is binary because docText() is read as a Set. That is
+// deliberate rather than a shortcut: the fields concatenated there already
+// repeat the title and slug, so a raw count would measure field layout. With
+// tf=1 the length factor is constant per document and BM25 reduces to
+// IDF-weighted overlap under pivoted length normalisation - which is exactly
+// the property that was missing.
+const K1 = 1.2;
+const B = 0.75;
+
+function makeScorer(tokenSets) {
+ const df = new Map();
+ let total = 0;
+ for (const dt of tokenSets) {
+ total += dt.size;
+ for (const t of dt) df.set(t, (df.get(t) || 0) + 1);
+ }
+ const N = tokenSets.length || 1;
+ const avgdl = total / N || 1;
+ // Precomputed, not called per (query token, document) pair: --auto scores
+ // every page against every module, so Math.log in the inner loop is tens of
+ // millions of calls. Floored at 0 so a term in nearly every document
+ // contributes nothing rather than scoring negative.
+ const idf = new Map();
+ for (const [t, n] of df) idf.set(t, Math.max(0, Math.log(1 + (N - n + 0.5) / (n + 0.5))));
+ return function score(qt, dt) {
+ if (!qt.size || !dt.size) return 0;
+ let sum = 0;
+ for (const t of qt) if (dt.has(t)) sum += idf.get(t) || 0;
+ if (sum === 0) return 0;
+ return (sum * (K1 + 1)) / (1 + K1 * (1 - B + (B * dt.size) / avgdl));
+ };
+}
+
+// Memoised per index array. Both halves of this script build their scorer from
+// the same corpus through the same function, so "rank" cannot come to mean two
+// different things in the two paths - the tie-break notes below depend on that.
+const SCORERS = new WeakMap();
+function scorerFor(index) {
+ let entry = SCORERS.get(index);
+ if (!entry) {
+ const tokens = index.map((d) => tokenize(docText(d)));
+ entry = { tokens, score: makeScorer(tokens) };
+ SCORERS.set(index, entry);
+ }
+ return entry;
}
function search(index, query, k) {
const qt = tokenize(query);
+ const { tokens, score } = scorerFor(index);
const ranked = index
- .map((d) => ({ id: d.id, url: String(d.url || d.source_site || ""), s: score(qt, d) }))
+ .map((d, i) => ({ id: d.id, url: String(d.url || d.source_site || ""), s: score(qt, tokens[i]) }))
.sort((a, b) => b.s - a.s || a.id.localeCompare(b.id));
// One slot per PAGE, not per chunk. The index holds many chunks per page
// (4,364 modules over 532 pages) and this used to slice raw modules, so a
@@ -187,12 +241,11 @@ function main() {
const seen = new Set();
let rows = docs.filter((d) => d.url && !seen.has(d.url) && seen.add(d.url));
if (AUTO_LIMIT > 0) rows = rows.slice(0, AUTO_LIMIT);
- const fastScore = (qt, dt) => {
- if (!qt.size || !dt.size) return 0;
- let o = 0;
- for (const t of qt) if (dt.has(t)) o++;
- return o / Math.sqrt(qt.size * dt.size);
- };
+ // The SAME scorer the gold-set path uses, built over this corpus. It was a
+ // second copy of the old formula here, so a change to one ranking function
+ // silently left the other behind - and this is the half the baseline and
+ // the gate are computed from.
+ const fastScore = makeScorer(docs.map((d) => d.tokens));
let ok = 0,
rrSum = 0;
const misses = [];
From 83fdd1ffdeaf792209d33e14cc8dafe289770f0c Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Mon, 21 Sep 2026 11:08:01 +0100
Subject: [PATCH 41/53] Make the evals read last_verified, so the full clone
buys something
docs-retrieval-evals.yml checks out full history so the extractor can date
each page, and nothing read the result - the same "freshness signal nobody
computes" that docs-preview.yml names as its reason for staying shallow.
The cost was real and the return was zero, which is a fair objection to
simply keeping the setting.
run.cjs now reports coverage on every run: how many modules carry a
last_verified, the oldest and newest, and how many are over 180 days old.
On this index that is 4228/4228 dated, 2025-12-12 to 2026-09-18, 2 older
than 180 days.
It also guards the setting that produces it. If NOT ONE module carries a
date - which is exactly what a shallow clone yields, since the extractor
emits "" rather than a constant that looks like data - the run fails in CI
and names the workflow and the line that must have been lost. Locally it
warns and carries on, because a shallow clone is a legitimate state to
develop in. Verified both ways against an index with every date blanked:
exit 1 under CI, exit 0 without it.
Deliberately a REPORT and not a ranking input. last_verified is a date and
the scorer tokenises on [a-z0-9]{2,}, so "2026-09-18" would enter the term
stream as "2026", "09" and "18" - a query mentioning any of those numbers
would then match every page verified that day. Recency is not relevance,
and mixing them would degrade the metric this file exists to measure while
looking like an improvement.
Retrieval numbers are untouched: gold set 0.95 / 0.8667 / 0.95, auto
page-success@3 0.8423 and page-MRR 0.7696, both unchanged.
Co-Authored-By: Claude Opus 5 (1M context)
---
.github/workflows/docs-retrieval-evals.yml | 24 ++++++++---
scripts/retrieval-evals/run.cjs | 48 ++++++++++++++++++++++
2 files changed, 66 insertions(+), 6 deletions(-)
diff --git a/.github/workflows/docs-retrieval-evals.yml b/.github/workflows/docs-retrieval-evals.yml
index 391759fffb..bd860cc388 100644
--- a/.github/workflows/docs-retrieval-evals.yml
+++ b/.github/workflows/docs-retrieval-evals.yml
@@ -58,12 +58,24 @@ jobs:
- name: Checkout code
uses: actions/checkout@v4
with:
- # Full history: the knowledge-extractor takes each page's
- # `last_verified` from its last commit date. The default shallow
- # clone (depth 1) makes every file resolve to the same single
- # commit, so the plugin deliberately emits "" rather than a
- # constant that looks like data - which would leave the artifact
- # this workflow evaluates with no freshness signal at all.
+ # Full history, and unlike build-docs.yml this job USES it.
+ #
+ # The knowledge-extractor takes each page's `last_verified` from its
+ # last commit date. Under the default depth-1 clone every file
+ # resolves to the same single commit, so the plugin deliberately
+ # emits "" rather than a constant that looks like data.
+ #
+ # run.cjs reports freshness coverage from that field - how many
+ # modules carry a date, the oldest and newest, and how many are over
+ # 180 days old - and fails in CI if NOT ONE module has one, which is
+ # what losing this line would look like. So the cost buys a signal
+ # that is actually read, and the check guards the setting that
+ # produces it. Do not drop to depth 1 here without deleting that
+ # report first.
+ #
+ # Deliberately NOT a ranking input: last_verified is a date, and the
+ # scorer tokenises on [a-z0-9]{2,}, so it would enter the term stream
+ # as "2026"/"09"/"18" and match any query mentioning those numbers.
fetch-depth: 0
- name: Setup Node.js
diff --git a/scripts/retrieval-evals/run.cjs b/scripts/retrieval-evals/run.cjs
index 33cf0bc23e..6f8b58e583 100644
--- a/scripts/retrieval-evals/run.cjs
+++ b/scripts/retrieval-evals/run.cjs
@@ -207,6 +207,53 @@ function search(index, query, k) {
return out;
}
+// Freshness coverage of the index.
+//
+// docs-retrieval-evals.yml checks out full history for exactly one reason: the
+// extractor dates each page from that file's last commit, and under a shallow
+// clone it emits "" rather than a constant that looks like data. Nothing read
+// the result, which is what made the cost look unjustified - docs-preview.yml
+// calls it "a freshness signal nobody computes". This computes it.
+//
+// A REPORT, not a ranking input, and that distinction is the whole point.
+// last_verified is a date and this scorer tokenises on [a-z0-9]{2,}, so
+// "2026-09-18" would enter the term stream as "2026", "09" and "18" - a query
+// mentioning any of those numbers would then match every page verified that
+// day. Recency is not relevance, and feeding one into the other would quietly
+// degrade the metric the rest of this file exists to measure.
+function reportFreshness(index) {
+ const dated = [];
+ let blank = 0;
+ for (const m of index) {
+ const d = String(m.last_verified || "");
+ if (/^\d{4}-\d{2}-\d{2}$/.test(d)) dated.push(d);
+ else blank++;
+ }
+ console.log(`\nFreshness: ${dated.length}/${index.length} modules carry a last_verified date.`);
+ if (dated.length) {
+ dated.sort();
+ const cutoff = new Date(Date.now() - 180 * 864e5).toISOString().slice(0, 10);
+ const stale = dated.filter((d) => d < cutoff).length;
+ console.log(
+ ` oldest ${dated[0]}, newest ${dated[dated.length - 1]}, ` +
+ `${stale} older than 180 days (before ${cutoff}).`,
+ );
+ }
+ if (blank === index.length) {
+ console.error(
+ "\nretrieval-evals: NOT ONE module carries a date. The extractor emits \"\"\n" +
+ "under a shallow clone, so the checkout step has lost its `fetch-depth: 0`\n" +
+ "(.github/workflows/docs-retrieval-evals.yml) and the index ships with no\n" +
+ "freshness signal at all.\n",
+ );
+ // Locally a shallow clone is a legitimate state to be in and not worth
+ // blocking on. In CI the workflow sets the depth explicitly, so losing it
+ // is a regression in the workflow rather than a property of the checkout -
+ // and it is silent, which is the only reason this check exists.
+ if (process.env.CI) process.exit(1);
+ }
+}
+
function relevant(hit, expect) {
const u = hit.url.toLowerCase();
return expect.some((e) => u.includes(e.toLowerCase()));
@@ -223,6 +270,7 @@ function main() {
console.error("retrieval-evals: empty or invalid index.");
process.exit(1);
}
+ reportFreshness(index);
if (AUTO) {
// Corpus-wide, PAGE-LEVEL self-retrieval over every doc: for each page,
// query with a chunk's own title+summary and check that a chunk from the
From a2a1131e44d8261d6db1a22762bbf82462c1db9c Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Mon, 21 Sep 2026 14:15:15 +0100
Subject: [PATCH 42/53] Make the freshness guard opt-in, and name the key the
guard actually reads
Two defects found by reviewing this branch's own new code.
reportFreshness keyed its hard failure off process.env.CI, which assumed
the retrieval-evals job is the only CI caller. It is not, and this same PR
is what made that false: build-docs.yml now uses a shallow clone on
pull_request, so an index built there legitimately carries no dates. Any
other CI job running `yarn docs:retrieval-evals` would have exited 1 and
blamed a workflow it never touched. The failure is now opt-in via
--require-freshness, passed only by the job that checks out full history on
purpose; every other caller gets the report without the exit. Verified all
three cases: dateless without the flag exits 0, dateless with it exits 1,
dated with it exits 0.
The knowledge-extractor's fatal guard reads
customFields.knowledgeIndexIgnoreFiles but its message told the reader to
export assistantIgnoreFiles - contradicting the comment two lines above it.
Those are different lists: the one it reads is assembled from the other
plus this export's corpus-shape exclusions, so following the old message
would not have cleared the error. It now names the key it reads and says
why the neighbouring one will not do.
Co-Authored-By: Claude Opus 5 (1M context)
---
.github/workflows/docs-retrieval-evals.yml | 6 ++++-
scripts/retrieval-evals/run.cjs | 30 +++++++++++++++-------
src/plugins/knowledge-extractor/index.ts | 11 +++++---
3 files changed, 33 insertions(+), 14 deletions(-)
diff --git a/.github/workflows/docs-retrieval-evals.yml b/.github/workflows/docs-retrieval-evals.yml
index bd860cc388..bcbc6ad101 100644
--- a/.github/workflows/docs-retrieval-evals.yml
+++ b/.github/workflows/docs-retrieval-evals.yml
@@ -92,7 +92,11 @@ jobs:
run: yarn build
- name: Run retrieval evals
- run: node scripts/retrieval-evals/run.cjs --report reports/retrieval-evals.json
+ # --require-freshness: this job is the one that checks out full history
+ # on purpose, so a dateless index here means the checkout lost its
+ # fetch-depth. Other callers (build-docs.yml is shallow on PRs) get the
+ # report without the failure.
+ run: node scripts/retrieval-evals/run.cjs --report reports/retrieval-evals.json --require-freshness
# The gold-set run above measures 20 curated queries. This one asks every
# module to retrieve itself, which is the only check that covers pages
diff --git a/scripts/retrieval-evals/run.cjs b/scripts/retrieval-evals/run.cjs
index 6f8b58e583..cf25599817 100644
--- a/scripts/retrieval-evals/run.cjs
+++ b/scripts/retrieval-evals/run.cjs
@@ -98,6 +98,9 @@ function readBaseline() {
}
const MIN_AUTO_SUCCESS = parseFloat(arg("min-auto-success", "0"));
const REPORT = arg("report", "");
+// Set by the workflow that checks out full history on purpose. See
+// reportFreshness: without it, an index with no dates is reported and allowed.
+const REQUIRE_FRESHNESS = process.argv.includes("--require-freshness");
const TOKEN = /[a-z0-9]{2,}/gi;
const tokenize = (s) => new Set((String(s || "").toLowerCase().match(TOKEN) || []));
@@ -241,16 +244,25 @@ function reportFreshness(index) {
}
if (blank === index.length) {
console.error(
- "\nretrieval-evals: NOT ONE module carries a date. The extractor emits \"\"\n" +
- "under a shallow clone, so the checkout step has lost its `fetch-depth: 0`\n" +
- "(.github/workflows/docs-retrieval-evals.yml) and the index ships with no\n" +
- "freshness signal at all.\n",
+ "\nretrieval-evals: NOT ONE module carries a date, so this index was built\n" +
+ "from a shallow clone - the extractor emits \"\" rather than a constant\n" +
+ "that looks like data.\n",
);
- // Locally a shallow clone is a legitimate state to be in and not worth
- // blocking on. In CI the workflow sets the depth explicitly, so losing it
- // is a regression in the workflow rather than a property of the checkout -
- // and it is silent, which is the only reason this check exists.
- if (process.env.CI) process.exit(1);
+ // Opt-in, NOT `process.env.CI`.
+ //
+ // A shallow clone is a legitimate state: it is what build-docs.yml now uses
+ // on pull_request, because that job never publishes the index. Keying this
+ // off CI alone would fail any other CI job that ran the evals, and blame a
+ // workflow it had never touched. Only a caller that asked for full history
+ // can say that dateless output is a regression rather than a choice, so
+ // only that caller passes the flag.
+ if (REQUIRE_FRESHNESS) {
+ console.error(
+ "--require-freshness was passed, so the caller expects dated modules:\n" +
+ "the checkout step has lost its `fetch-depth: 0`.\n",
+ );
+ process.exit(1);
+ }
}
}
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index efc9f37975..eee4f95069 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -1884,10 +1884,13 @@ export default function knowledgeExtractor(context: any, _options: any) {
// what an assistant is fed, and neither the empty-output guard nor the
// drift ratio catches it because the page count goes UP.
throw new Error(
- "[knowledge-extractor] customFields.assistantIgnoreFiles is missing. It " +
- "carries the repo's decision about what an assistant may see, and " +
- "indexing everything is not a safe fallback. Export it from " +
- "docusaurus.config.ts.",
+ "[knowledge-extractor] customFields.knowledgeIndexIgnoreFiles is " +
+ "missing. It carries the repo's decision about what an assistant " +
+ "may see, and indexing everything is not a safe fallback. Export " +
+ "it from docusaurus.config.ts. (It is assembled there from " +
+ "assistantIgnoreFiles plus this export's own corpus-shape " +
+ "exclusions - assistantIgnoreFiles alone is a different list and " +
+ "setting it will not satisfy this check.)",
);
}
const ignorePatterns = ignoreGlobs.map((g) => ignoreGlobToRegExp(String(g)));
From 0c0c6c580ae7d7beb3b067a7b7d19ecb3ab56d81 Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Mon, 21 Sep 2026 14:26:49 +0100
Subject: [PATCH 43/53] Close three silent-failure paths in the extractor's
file selection
All three share a shape: the index quietly stops describing the corpus and
nothing goes red, because the guards that exist watch for the index getting
SMALLER or EMPTIER and these do not always do that.
skipDir matched directory NAMES at any depth. The excluded set holds
`search`, `assets`, `img`, `data-capture-sdk` and the frozen version
numbers, so a future guide at /hosted/express/search/ would have vanished
from the index - and invisibly, since a page dropped in the walk never
reaches `files` and so cannot lower the drift ratio that guards this.
walkHtml now hands skipDir the root-relative path and the set is anchored
to depth 1. Checked against the real tree first: every member of it is
genuinely top-level, so this removes the class without moving anything
today. The `.html` suffix test stays depth-agnostic - that is a shape, not
a location. (`fonts` turns out to be dead weight either way: it exists only
at build/assets/fonts, inside an already-skipped directory.)
The curation filter failed OPEN when resolveSource found nothing, so a
route in an ignored tree would be fed to assistants despite the repo having
decided to hide it - and the page count goes UP, which is the one direction
neither the empty-output guard nor the drift ratio can see. It now falls
back to matching the ROUTE against the same globs, which covers the
realistic trigger: a page gaining `slug:` frontmatter moves the route off
the file path without moving it out of the ignored tree. Failing closed was
the wrong alternative - this build reports exactly one unresolved route,
`/`, the homepage, which has no docs source and never will, so a throw
would break every build. Unresolved routes are now warned about by path.
docs-retrieval-evals.yml did not watch versioned_docs/**. While
lastVersion is pinned to a snapshot - a beta cycle, which is what the
extractor's servedVersion handling exists for - that snapshot IS the
corpus this measures, so a PR editing it changed exactly what is indexed
and ran neither eval until after it merged.
Verified against a full rebuild rather than argued: the index is identical
either side of these changes - 4228 modules, 520 pages, zero added, zero
removed - and the gate is unmoved at page-success@3 0.8423 / page-MRR
0.7696, delta +0. tsc clean.
Co-Authored-By: Claude Opus 5 (1M context)
---
.github/workflows/docs-retrieval-evals.yml | 5 ++
src/plugins/knowledge-extractor/index.ts | 56 ++++++++++++++++++++--
2 files changed, 56 insertions(+), 5 deletions(-)
diff --git a/.github/workflows/docs-retrieval-evals.yml b/.github/workflows/docs-retrieval-evals.yml
index bcbc6ad101..9a3277cffd 100644
--- a/.github/workflows/docs-retrieval-evals.yml
+++ b/.github/workflows/docs-retrieval-evals.yml
@@ -14,6 +14,11 @@ on:
- main
paths:
- 'docs/**'
+ # And the frozen snapshots. While docusaurus.config.ts pins lastVersion to
+ # one of them - a beta cycle - that snapshot IS the corpus this indexes,
+ # so a PR editing it changes exactly what is measured here and would
+ # otherwise run neither eval until after it merged.
+ - 'versioned_docs/**'
- 'src/plugins/knowledge-extractor/**'
- 'scripts/retrieval-evals/**'
- '.github/workflows/docs-retrieval-evals.yml'
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index eee4f95069..e757a8b7e2 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -1787,13 +1787,24 @@ function buildGraph(modules: KModule[], site: string) {
// ---------------------------------------------------------------------------
// filesystem walk
// ---------------------------------------------------------------------------
-function walkHtml(dir: string, skipDir: (name: string) => boolean): string[] {
+// `skipDir` receives the ROOT-relative path as well as the bare name, so a
+// caller can anchor an exclusion to the top level. Excluding by name alone
+// matched at any depth: the set holds `search`, `assets`, `img` and the frozen
+// version numbers, so a future guide at /hosted/express/search/ would have
+// disappeared from the index - and invisibly, because a page dropped here never
+// reaches `files` and so cannot lower the drift ratio that guards this.
+function walkHtml(
+ dir: string,
+ skipDir: (relPath: string, name: string) => boolean,
+ root: string = dir,
+): string[] {
const out: string[] = [];
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
const full = path.join(dir, entry.name);
if (entry.isDirectory()) {
- if (skipDir(entry.name)) continue;
- out.push(...walkHtml(full, skipDir));
+ const rel = path.relative(root, full).split(path.sep).join("/");
+ if (skipDir(rel, entry.name)) continue;
+ out.push(...walkHtml(full, skipDir, root));
} else if (entry.isFile() && entry.name === "index.html") {
out.push(full);
}
@@ -1907,13 +1918,21 @@ export default function knowledgeExtractor(context: any, _options: any) {
// label this artifact does not describe.
...(servesCurrent ? [] : ["next"]),
]);
- const skipDir = (name: string) => excluded.has(name) || name.endsWith(".html");
+ // `excluded` is anchored to the BUILD ROOT - every member of it is a
+ // top-level directory (build/assets, build/img, build/search,
+ // build/data-capture-sdk, build/). Matching the bare name
+ // at any depth would also swallow a same-named directory deeper in the
+ // tree, which is a real page rather than a build artifact. The `.html`
+ // suffix test stays depth-agnostic: that is a shape, not a location.
+ const skipDir = (rel: string, name: string) =>
+ (!rel.includes("/") && excluded.has(name)) || name.endsWith(".html");
// Filtered on the list, not inside the loop, so an ignored page is never
// read or parsed. Matched on the DOCS-relative source path rather than the
// route, because that is what the globs describe - and on every candidate
// spelling of it, since a route maps to `docs/x.md`, `docs/x/index.md` and
// the folder/folder.md convention alike.
+ const unresolvedRoutes: string[] = [];
const files = walkHtml(outDir, skipDir).filter((f) => {
const rel = path.relative(outDir, path.dirname(f)).split(path.sep).join("/");
const pathname = rel ? `/${rel}/` : "/";
@@ -1928,10 +1947,37 @@ export default function knowledgeExtractor(context: any, _options: any) {
// versioned_docs/version-X/ - left unnormalised, nothing would match
// there and the entire curation list would fail open.
const resolved = resolveSource(siteDir, pathname, servedVersion);
- if (!resolved) return true; // no source found: not this filter's call
+ if (!resolved) {
+ // No source file maps to this route. Failing open here indexes the
+ // page, and for a route in an IGNORED tree that silently undoes a
+ // curation decision - the one failure neither the empty-output guard
+ // nor the drift ratio can see, because the page count goes UP.
+ //
+ // So fall back to the route itself. The globs are written against
+ // docs-relative paths and a route normally mirrors one, so a synthetic
+ // `docs/` still matches `docs/sdks/titanium/**` even when
+ // source resolution missed. That covers the realistic trigger: a page
+ // gaining `slug:` frontmatter, which moves the route off the file path
+ // without moving it out of the ignored tree.
+ //
+ // Recorded either way, because an unresolved route means the path
+ // mapping this filter depends on has drifted, and that is worth
+ // seeing in a build log rather than inferring from a page count.
+ unresolvedRoutes.push(pathname);
+ const asRoute = `docs${pathname.replace(/\/$/, "")}`;
+ return !hiddenFromAssistants(asRoute, ignorePatterns);
+ }
const asDocs = resolved.replace(/^versioned_docs\/version-[^/]+\//, "docs/");
return !hiddenFromAssistants(asDocs, ignorePatterns);
});
+ if (unresolvedRoutes.length) {
+ console.warn(
+ `[knowledge-extractor] ${unresolvedRoutes.length} route(s) resolved to ` +
+ `no source file; the curation list was matched against the route ` +
+ `instead: ${unresolvedRoutes.slice(0, 10).join(", ")}` +
+ `${unresolvedRoutes.length > 10 ? ", ..." : ""}`,
+ );
+ }
const modules: KModule[] = [];
let pagesProcessed = 0;
let pageErrors = 0;
From 767cf7e9475bb53151a10962116a631d1a022eac Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Mon, 21 Sep 2026 14:50:26 +0100
Subject: [PATCH 44/53] Canonicalise the product through products.json, and
carry baseUrl into urls
detectProduct returned the raw URL segment, but a route does not always
spell its product's key. /sdks/*/label-capture/ belongs to
smart-label-capture and /sdks/*/matrixscan/ to matrixscan-batch, so 609
modules shipped filed under two products that do not exist in
products.json - and the two real keys had no pages at all. Every
BelongsToProduct and AvailableOn edge built on them described something no
consumer can look up, which is the exact failure productKeys() documents
itself as preventing.
The alias map is DERIVED from the registry's own frameworks[].apiUrl rather
than listed, so it is a fact products.json already states instead of a
second copy to keep in step: each product records real routes there, and
the segment in them is its URL spelling. Guarded so one product's route can
never claim another's key. Today it yields exactly the two aliases and
identity for the other eleven.
Measured on a rebuild: label-capture 349 -> smart-label-capture 349,
matrixscan 260 -> matrixscan-batch 260, corpus unchanged at 4228 modules
over 520 pages. `product` feeds `keywords`, so correcting it moves the
token stream slightly; the gate stays green well inside tolerance and the
baseline is re-recorded at 0.8404 / 0.7676 per this script's own rule about
changes to what is indexed. Gold set unmoved at 0.95 / 0.8667 / 0.95.
Also: published urls dropped baseUrl. Docusaurus writes routes into outDir
without that prefix, so `site + pathname` is right only because production
sets baseUrl ''. Folded in as a separate `siteBase` rather than into
`site`, because classifyLinks strips `site` as a bare origin and takes
baseUrl as its own argument - combining them would stop it recognising
internal links.
And assistantIgnoreFiles is no longer exported through customFields.
Nothing reads it - both consumers take a superset - while customFields is
serialised into the client bundle on every page, so it shipped a build-time
list to every reader and gave the extractor a second name to drift from.
Co-Authored-By: Claude Opus 5 (1M context)
---
docusaurus.config.ts | 14 +++--
scripts/retrieval-evals/baseline.json | 4 +-
src/plugins/knowledge-extractor/index.ts | 75 +++++++++++++++++++++---
3 files changed, 78 insertions(+), 15 deletions(-)
diff --git a/docusaurus.config.ts b/docusaurus.config.ts
index 1b954acc54..2f394a75b1 100644
--- a/docusaurus.config.ts
+++ b/docusaurus.config.ts
@@ -520,10 +520,16 @@ const config: Config = {
// the two disagreeing about 39 modules; exporting the WHOLE llms list
// over-corrected, because it also carries a corpus-shape decision (see
// llmsDedupedToWeb) that a routing index must not inherit.
- assistantIgnoreFiles,
- // The same curation list plus the index's own corpus-shape exclusions; see
- // knowledgeIndexDeduped. Read by the knowledge-extractor in place of
- // assistantIgnoreFiles, exactly as the llms plugin reads llmsIgnoreFiles.
+ // NOT assistantIgnoreFiles. It is the shared curation decision, but nothing
+ // reads it at runtime - both consumers take a superset of it - and
+ // customFields is serialised into the client bundle on every page, so
+ // exporting it shipped a build-time list to every reader and gave the
+ // extractor a second name to drift from. It stays a local const above,
+ // feeding the two lists that ARE read.
+ //
+ // The curation list plus the index's own corpus-shape exclusions; see
+ // knowledgeIndexDeduped. Read by the knowledge-extractor, exactly as the
+ // llms plugin reads llmsIgnoreFiles.
knowledgeIndexIgnoreFiles,
// Which version THIS build serves at the root. Read by the
// knowledge-extractor plugin, which cannot otherwise tell a frozen version
diff --git a/scripts/retrieval-evals/baseline.json b/scripts/retrieval-evals/baseline.json
index da6695a654..c4e88a642c 100644
--- a/scripts/retrieval-evals/baseline.json
+++ b/scripts/retrieval-evals/baseline.json
@@ -1,6 +1,6 @@
{
- "page_success_at_k": 0.8423,
- "page_mrr": 0.7696,
+ "page_success_at_k": 0.8404,
+ "page_mrr": 0.7676,
"pages": 520,
"modules": 4228,
"k": 3,
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index e757a8b7e2..e48bde3db4 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -879,11 +879,22 @@ const SYNTHETIC_PRODUCTS = new Set(["core", "general"]);
* on web, .NET and Titanium - never reached it at all.
*/
let PRODUCT_KEYS: Set | null = null;
-function productKeys(siteDir: string): Set {
- if (PRODUCT_KEYS) return PRODUCT_KEYS;
+// URL segment -> products.json key, for the products whose route does not spell
+// their key. DERIVED from the registry's own `frameworks[].apiUrl`, not listed:
+// every product already records a real route there, so the alias is a fact the
+// file states rather than a second copy to keep in step. Today it yields
+// matrixscan -> matrixscan-batch and label-capture -> smart-label-capture, and
+// identity for the other eleven.
+let PRODUCT_ALIASES: Map | null = null;
+
+function loadProducts(siteDir: string): void {
+ if (PRODUCT_KEYS && PRODUCT_ALIASES) return;
try {
const raw = fs.readFileSync(path.join(siteDir, "src", "data", "products.json"), "utf8");
- const parsed = JSON.parse(raw) as Array<{ key?: unknown }>;
+ const parsed = JSON.parse(raw) as Array<{
+ key?: unknown;
+ frameworks?: Record;
+ }>;
// Filter on the RAW key: slug("") returns "module", so filtering after
// slugging can never drop anything, and an entry with a missing key would
// register "module" as a real product - after which a page at
@@ -895,12 +906,37 @@ function productKeys(siteDir: string): Set {
.filter(Boolean)
.map(slug),
);
+ const aliases = new Map();
+ for (const entry of parsed) {
+ const key = slug(String(entry?.key ?? "").trim());
+ if (!key || !PRODUCT_KEYS.has(key)) continue;
+ for (const fw of Object.values(entry?.frameworks ?? {})) {
+ // `/sdks///...`, with the two-segment .NET routes
+ // spelled `/sdks/net///...`.
+ const m = /^\/sdks\/(?:net\/)?[^/]+\/([^/]+)\//.exec(String(fw?.apiUrl ?? ""));
+ if (!m) continue;
+ const seg = slug(m[1]);
+ // Never let one product's route claim another product's key.
+ if (seg && seg !== key && !PRODUCT_KEYS.has(seg)) aliases.set(seg, key);
+ }
+ }
+ PRODUCT_ALIASES = aliases;
} catch {
// No registry (or unreadable): fall back to path shape only. Never fatal -
// this plugin must not be able to break a deploy.
PRODUCT_KEYS = new Set();
+ PRODUCT_ALIASES = new Map();
}
- return PRODUCT_KEYS;
+}
+
+function productKeys(siteDir: string): Set {
+ loadProducts(siteDir);
+ return PRODUCT_KEYS as Set;
+}
+
+function productAliases(siteDir: string): Map {
+ loadProducts(siteDir);
+ return PRODUCT_ALIASES as Map;
}
/** Product a page belongs to (sparkscan, matrixscan, id-capture, ...) or "core". */
@@ -910,7 +946,15 @@ function detectProduct(pathname: string, siteDir: string): string {
const i = p[1] === "net" ? 3 : 2; // first segment after the framework
const rest = p.slice(i);
if (!rest.length) return "core";
- const first = slug(rest[0]);
+ // Canonicalised through the registry BEFORE anything is decided, because a
+ // route does not always spell its product's key: /sdks/ios/label-capture/
+ // belongs to `smart-label-capture` and /sdks/ios/matrixscan/ to
+ // `matrixscan-batch`. Returning the raw segment filed 609 modules under two
+ // products that do not exist in products.json, and left the two real ones
+ // with no pages at all - so every BelongsToProduct and AvailableOn edge
+ // built on them described a product no consumer can look up.
+ const raw = slug(rest[0]);
+ const first = productAliases(siteDir).get(raw) ?? raw;
// A product directory, or a single page whose name IS a known product.
if (rest.length >= 2 || productKeys(siteDir).has(first)) return first;
return "core";
@@ -1662,7 +1706,9 @@ function toIndexRecord(m: KModule) {
}
/** Enriched JSON-LD graph: facets + mined product / api / see-also / availability edges. */
-function buildGraph(modules: KModule[], site: string) {
+// `siteBase` is origin + baseUrl, not the bare origin: the doc urls emitted
+// here have to match the ones on the modules, which carry the prefix.
+function buildGraph(modules: KModule[], siteBase: string) {
const indexedPaths = new Set(modules.map((m) => m.metadata.source_path));
const uniq = (vals: string[]) => Array.from(new Set(vals.filter((v) => v && v.trim()))).sort();
@@ -1705,7 +1751,7 @@ function buildGraph(modules: KModule[], site: string) {
...frameworks.map((v) => ({ "@id": `urn:framework:${v}`, "@type": "Framework", name: v })),
...products.map((v) => ({ "@id": `urn:product:${v}`, "@type": "Product", name: v })),
...apiRefs.map((v) => ({ "@id": `urn:api:${v}`, "@type": "ApiReference", url: v })),
- ...docPaths.map((v) => ({ "@id": `urn:doc:${v}`, "@type": "Doc", url: `${site}${v}` })),
+ ...docPaths.map((v) => ({ "@id": `urn:doc:${v}`, "@type": "Doc", url: `${siteBase}${v}` })),
];
const edges: any[] = [];
@@ -1821,6 +1867,17 @@ export default function knowledgeExtractor(context: any, _options: any) {
name: "knowledge-extractor",
async postBuild({ siteConfig, outDir }: { siteConfig: any; outDir: string }) {
const site = String(siteConfig?.url || "").replace(/\/+$/, "");
+ // Docusaurus writes routes into outDir WITHOUT the baseUrl prefix, so
+ // `site + pathname` silently drops it and every published url is wrong on
+ // a sub-path deploy. Production sets baseUrl '' so the two agree, which is
+ // why this has never shown: the preview build is the only sub-path deploy
+ // today and postBuild returns before here.
+ //
+ // Kept separate from `site` rather than folded into it: classifyLinks
+ // strips `site` as a bare ORIGIN prefix and takes baseUrl as its own
+ // argument, so a combined value would stop it recognising internal links.
+ const basePrefix = String(siteConfig?.baseUrl || "/").replace(/\/+$/, "");
+ const siteBase = `${site}${basePrefix}`;
// Rendered hrefs are baseUrl-prefixed; pathname is not. classifyLinks
// strips it so the two can be compared (see F2 note there).
const baseUrl = String(siteConfig?.baseUrl || "/");
@@ -1996,7 +2053,7 @@ export default function knowledgeExtractor(context: any, _options: any) {
const relDir = path.relative(outDir, path.dirname(file)).split(path.sep).join("/");
const pathname = relDir ? `/${relDir}/` : "/";
- const url = `${site}${pathname}`;
+ const url = `${siteBase}${pathname}`;
const title = ($("h1").first().text() || $("title").text() || "").replace(//g, "").trim();
const description = ($('meta[name="description"]').attr("content") || "").trim();
const bodyMd = extractMarkdownish($, root);
@@ -2062,7 +2119,7 @@ export default function knowledgeExtractor(context: any, _options: any) {
const active = modules.filter((m) => m.status === "active");
const index = active.map(toIndexRecord);
- const graph = buildGraph(active, site);
+ const graph = buildGraph(active, siteBase);
// Fail LOUD on empty extraction — matches the config's onBrokenLinks:"throw"
// convention. "Non-fatal" covers one bad page, not "extracted nothing at
From 0f38508ae0d9a965b4b1f306238dd74a130fb6dd Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Mon, 21 Sep 2026 15:15:08 +0100
Subject: [PATCH 45/53] Stop the drift guard depending on a postBuild race, and
rank --auto by page
The drift guard could fail the build for a reason that never happened.
@docusaurus/plugin-client-redirects writes /index.html stubs into
outDir from its own postBuild, and those are exactly the files walkHtml
enumerates. postBuild hooks run through Promise.all, so whether they exist
when this plugin walks the tree is a race. Measured on this build: 617 real
pages and 712 stubs in scope, so pagesProcessed/files.length is 0.843
without them and 0.391 with them - and the threshold is 0.5. It has only
ever passed because this plugin wins the race; losing it fails the build
claiming "page selectors likely drifted", which is not what happened.
Stubs are now identified by their meta refresh and excluded from both terms
of the ratio. Detected that way rather than by the doc selectors on
purpose: the guard exists to catch those selectors drifting, so excluding
files BY them would let it neutralise itself - every file would look like
"not a doc page" and the denominator would empty.
The comment claiming stripPreviewMediaPlugin was "the one other postBuild"
was wrong three ways: client-redirects and docusaurus-plugin-llms both have
one, and the first is the one that matters.
--auto counted competing CHUNKS while search() spends one slot per PAGE, so
three chunks of a single rival consumed all three slots and scored a miss
the gold-set path scores a hit. That is the half baseline.json and the CI
gate come from, so the gated number was the wrong one - and it moved with
chunk counts, meaning re-chunking a rival page changed the score with no
change in retrieval quality. It now counts distinct pages.
Verified rather than asserted: an independent harness computes each page's
own rank through both paths and compares - 120 sampled pages, 120 agree, 0
disagree. The corrected metric is 0.8596 / 0.7750 with 73 misses, against
0.8404 / 0.7676 and 82 before, so the old one understated page retrieval by
about two points. Baseline re-recorded. Gold set unmoved at 0.95 / 0.8667 /
0.95.
Also: the title stripped only U+200B where serializeInline strips the whole
zero-width and private-use set, so a permalink glyph could survive into the
published title - which defeats both the heading-only-page guard
(bodyText === titleText) and isAvailabilityStub's title skip.
Co-Authored-By: Claude Opus 5 (1M context)
---
docusaurus.config.ts | 19 ++++++++---
scripts/retrieval-evals/baseline.json | 4 +--
scripts/retrieval-evals/run.cjs | 18 +++++++++--
src/plugins/knowledge-extractor/index.ts | 41 +++++++++++++++++++++---
4 files changed, 68 insertions(+), 14 deletions(-)
diff --git a/docusaurus.config.ts b/docusaurus.config.ts
index 2f394a75b1..d294e50d93 100644
--- a/docusaurus.config.ts
+++ b/docusaurus.config.ts
@@ -830,11 +830,20 @@ const config: Config = {
// array position implies nothing about execution order and this hook races
// any other postBuild.
//
- // That is safe today only because the one other postBuild,
- // stripPreviewMediaPlugin, deletes files under build/img, which walkHtml
- // skips via `excluded` - so whichever wins, this plugin reads the same HTML.
- // A future postBuild that REWRITES html would race non-deterministically and
- // must instead be sequenced explicitly, not moved above this line.
+ // There are THREE other postBuild hooks, not one: stripPreviewMediaPlugin,
+ // @docusaurus/plugin-client-redirects and docusaurus-plugin-llms.
+ //
+ // stripPreviewMediaPlugin deletes under build/img, which walkHtml skips, and
+ // docusaurus-plugin-llms only writes its own .txt files at the root. But
+ // plugin-client-redirects WRITES /index.html stubs into outDir - the
+ // very files walkHtml enumerates - so this plugin sees a different file count
+ // depending on who wins. The extractor now identifies those stubs by their
+ // meta refresh and excludes them from both terms of its drift ratio, so the
+ // outcome no longer depends on the race.
+ //
+ // A future postBuild that REWRITES page html would still race
+ // non-deterministically and must be sequenced explicitly, not moved above
+ // this line.
knowledgeExtractor,
],
diff --git a/scripts/retrieval-evals/baseline.json b/scripts/retrieval-evals/baseline.json
index c4e88a642c..2da59cb1b0 100644
--- a/scripts/retrieval-evals/baseline.json
+++ b/scripts/retrieval-evals/baseline.json
@@ -1,6 +1,6 @@
{
- "page_success_at_k": 0.8404,
- "page_mrr": 0.7676,
+ "page_success_at_k": 0.8596,
+ "page_mrr": 0.775,
"pages": 520,
"modules": 4228,
"k": 3,
diff --git a/scripts/retrieval-evals/run.cjs b/scripts/retrieval-evals/run.cjs
index cf25599817..09f881cb54 100644
--- a/scripts/retrieval-evals/run.cjs
+++ b/scripts/retrieval-evals/run.cjs
@@ -335,15 +335,27 @@ function main() {
// than the tolerance whenever an edit perturbs tokenisation enough to flip
// a batch of ties - a red gate with no regression behind it - and hides a
// real regression that only converts strictly-better competitors into ties.
- let better = 0;
+ // Distinct competing PAGES, not competing chunks.
+ //
+ // search() spends one slot per page, so a rank there counts pages. This
+ // counted every outranking CHUNK, so three chunks of one rival page
+ // consumed all three slots and the page was scored a miss that the
+ // gold-set path scores a hit. The two halves of this script have to agree
+ // about what a rank means, and this is the half the baseline and the CI
+ // gate are computed from - so the gated number was the wrong one.
+ //
+ // It also made the metric move with CHUNK COUNTS: re-chunking a rival
+ // page, with no change in retrieval quality at all, changed this score.
+ const betterPages = new Set();
for (const d of docs) {
if (d.url === r.url) continue;
const s = fastScore(qt, d.tokens);
if (s > bestSame || (s === bestSame && d.id.localeCompare(bestSameId) < 0)) {
- better++;
- if (better >= K) break;
+ betterPages.add(d.url);
+ if (betterPages.size >= K) break;
}
}
+ const better = betterPages.size;
if (better < K) {
ok++;
rrSum += 1 / (better + 1);
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index e48bde3db4..6a41dda0b4 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -2038,11 +2038,25 @@ export default function knowledgeExtractor(context: any, _options: any) {
const modules: KModule[] = [];
let pagesProcessed = 0;
let pageErrors = 0;
+ // Counted so they can leave the drift guard's denominator. See the throw
+ // below: these files exist or not depending on a postBuild race, and with
+ // them in the denominator the guard's verdict depends on who won it.
+ let redirectStubs = 0;
for (const file of files) {
// Per-page failures are non-fatal — skip the one bad page, keep going.
try {
const html = fs.readFileSync(file, "utf8");
+ // A client-redirect stub, not a page. Detected on the meta refresh
+ // rather than on the doc selectors deliberately: the guard below
+ // exists to catch those selectors drifting, so excluding files BY
+ // those selectors would let the guard neutralise itself - everything
+ // would look like "not a doc page" and the denominator would empty.
+ // The meta refresh is independent of them.
+ if (/]+http-equiv=["']?refresh/i.test(html)) {
+ redirectStubs += 1;
+ continue;
+ }
const $ = cheerio.load(html);
const root = $("article .markdown").first().length
? $("article .markdown").first()
@@ -2054,7 +2068,14 @@ export default function knowledgeExtractor(context: any, _options: any) {
const relDir = path.relative(outDir, path.dirname(file)).split(path.sep).join("/");
const pathname = relDir ? `/${relDir}/` : "/";
const url = `${siteBase}${pathname}`;
- const title = ($("h1").first().text() || $("title").text() || "").replace(//g, "").trim();
+ // The SAME strip set serializeInline uses. Stripping only U+200B here
+ // let a permalink glyph from the private-use range survive into the
+ // published title - and a title that differs from the serialized one
+ // defeats both the heading-only-page guard (bodyText === titleText)
+ // and isAvailabilityStub's title skip.
+ const title = ($("h1").first().text() || $("title").text() || "")
+ .replace(/[-]/g, "")
+ .trim();
const description = ($('meta[name="description"]').attr("content") || "").trim();
const bodyMd = extractMarkdownish($, root);
// Not just empty: a body that reduces to the page heading alone is not
@@ -2146,10 +2167,22 @@ export default function knowledgeExtractor(context: any, _options: any) {
// are legitimately skipped (redirect stubs and the homepage), so today's
// ratio is ~0.87 and 0.5 leaves wide headroom - this has to fire on drift
// and never on a normal day.
- if (files.length > 0 && pagesProcessed / files.length < 0.5) {
+ // Redirect stubs are OUT of this ratio, in both terms.
+ //
+ // @docusaurus/plugin-client-redirects writes /index.html files into
+ // outDir from its own postBuild, and those are exactly what walkHtml
+ // enumerates. Since postBuild hooks run through Promise.all, whether they
+ // exist when this one walks the tree is a race. Measured on this build:
+ // 617 real pages and 712 stubs in scope, so the ratio is 0.843 without
+ // them and 0.391 with them - the second trips this guard and fails the
+ // build with a message about selector drift that has nothing to do with
+ // what happened. It passes today only because this plugin wins the race.
+ const candidates = files.length - redirectStubs;
+ if (candidates > 0 && pagesProcessed / candidates < 0.5) {
throw new Error(
- `[knowledge-extractor] only ${pagesProcessed} of ${files.length} HTML file(s) ` +
- `produced content (${pageErrors} page error(s)). Page selectors likely drifted — ` +
+ `[knowledge-extractor] only ${pagesProcessed} of ${candidates} candidate HTML ` +
+ `file(s) produced content (${pageErrors} page error(s), ${redirectStubs} ` +
+ `redirect stub(s) excluded). Page selectors likely drifted — ` +
`refusing to overwrite the AI-layer artifacts with a partial corpus.`,
);
}
From dd917f85a0ba45abbc677a1ec8925d2b6bcf6e27 Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Mon, 21 Sep 2026 15:20:55 +0100
Subject: [PATCH 46/53] Take the ignore list as a plugin option - a naming fix,
not a size one
Review asked for this list to move off customFields, on the grounds that a
plugin option would keep a build-time list out of the client bundle. The
move is worth making and it is made here, but that reasoning does not hold
and the comments no longer repeat it.
Measured on the built artifact rather than assumed: Docusaurus serialises
the resolved config, plugin options included, so main.js carries TWO
`ignoreFiles:` arrays - this plugin's and docusaurus-plugin-llms'. Moving
off customFields changed nothing about what ships. Keeping the globs out of
the client would mean the plugin reading them off disk itself, and the llms
plugin could not do that at all.
What the move does buy is one name per consumer instead of a customFields
key that has to be kept in step with the list it mirrors - which is the
failure the previous commit had already hit once, when the fatal guard read
knowledgeIndexIgnoreFiles and told the reader to export assistantIgnoreFiles.
The plugin still throws when the option is absent rather than defaulting to
indexing everything, which is the property that actually protects curation.
Corpus identical across the change: 4228 modules, 520 pages, zero module
ids added or removed. tsc clean.
Co-Authored-By: Claude Opus 5 (1M context)
---
docusaurus.config.ts | 26 +++++++++--------
src/plugins/knowledge-extractor/index.ts | 36 +++++++++++++++---------
2 files changed, 37 insertions(+), 25 deletions(-)
diff --git a/docusaurus.config.ts b/docusaurus.config.ts
index d294e50d93..70f9e156bb 100644
--- a/docusaurus.config.ts
+++ b/docusaurus.config.ts
@@ -520,17 +520,16 @@ const config: Config = {
// the two disagreeing about 39 modules; exporting the WHOLE llms list
// over-corrected, because it also carries a corpus-shape decision (see
// llmsDedupedToWeb) that a routing index must not inherit.
- // NOT assistantIgnoreFiles. It is the shared curation decision, but nothing
- // reads it at runtime - both consumers take a superset of it - and
- // customFields is serialised into the client bundle on every page, so
- // exporting it shipped a build-time list to every reader and gave the
- // extractor a second name to drift from. It stays a local const above,
- // feeding the two lists that ARE read.
+ // Neither assistantIgnoreFiles nor knowledgeIndexIgnoreFiles is exported
+ // here. Each consumer takes its own list as a plugin option instead, so
+ // there is one name per consumer rather than a customFields key that has to
+ // be kept in step with it.
//
- // The curation list plus the index's own corpus-shape exclusions; see
- // knowledgeIndexDeduped. Read by the knowledge-extractor, exactly as the
- // llms plugin reads llmsIgnoreFiles.
- knowledgeIndexIgnoreFiles,
+ // This does NOT keep them out of the client bundle, and it is worth being
+ // exact about that: Docusaurus serialises the resolved config, plugin
+ // options included, so the globs ship either way - the built main.js
+ // carries two `ignoreFiles:` arrays. Moving them was a naming fix, not a
+ // size one.
// Which version THIS build serves at the root. Read by the
// knowledge-extractor plugin, which cannot otherwise tell a frozen version
// served at the root from `current` - and the two need opposite handling.
@@ -844,7 +843,12 @@ const config: Config = {
// A future postBuild that REWRITES page html would still race
// non-deterministically and must be sequenced explicitly, not moved above
// this line.
- knowledgeExtractor,
+ // The curation list plus this index's own corpus-shape exclusions (see
+ // knowledgeIndexDeduped), passed as a plugin option so this consumer reads it
+ // under one name - the same shape docusaurus-plugin-llms uses above. The
+ // plugin throws if it is missing rather than defaulting to "index
+ // everything", which is the property that matters here.
+ [knowledgeExtractor, { ignoreFiles: knowledgeIndexIgnoreFiles }],
],
presets: [
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index 6a41dda0b4..399708074c 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -1861,7 +1861,16 @@ function walkHtml(
// ---------------------------------------------------------------------------
// plugin
// ---------------------------------------------------------------------------
-export default function knowledgeExtractor(context: any, _options: any) {
+// `options.ignoreFiles` rather than `customFields`, for ONE name per consumer
+// and to match how docusaurus-plugin-llms takes its own list.
+//
+// NOT for bundle size, and this was measured rather than assumed: Docusaurus
+// serialises the whole resolved config - plugin options included - into
+// main.js, so the globs ship to every reader either way. The built bundle
+// carries two `ignoreFiles:` arrays, this one and the llms plugin's.
+// Keeping them out of the client would mean the plugin reading the list off
+// disk itself, which the llms plugin could not do anyway.
+export default function knowledgeExtractor(context: any, options: any) {
const siteDir: string = context?.siteDir || process.cwd();
return {
name: "knowledge-extractor",
@@ -1943,22 +1952,21 @@ export default function knowledgeExtractor(context: any, _options: any) {
// knowledgeIndexIgnoreFiles, not assistantIgnoreFiles: the shared curation
// list PLUS this export's own corpus-shape exclusions, the same way the
// llms plugin reads llmsIgnoreFiles rather than the bare curation list.
- const ignoreGlobs = siteConfig?.customFields?.knowledgeIndexIgnoreFiles as
- | readonly string[]
- | undefined;
+ const ignoreGlobs = options?.ignoreFiles as readonly string[] | undefined;
if (!Array.isArray(ignoreGlobs)) {
// Absent means "index everything", which is the wrong default for a
- // curation list: renaming this customFields key would silently widen
- // what an assistant is fed, and neither the empty-output guard nor the
- // drift ratio catches it because the page count goes UP.
+ // curation list: dropping this option would silently widen what an
+ // assistant is fed, and neither the empty-output guard nor the drift
+ // ratio catches it because the page count goes UP.
throw new Error(
- "[knowledge-extractor] customFields.knowledgeIndexIgnoreFiles is " +
- "missing. It carries the repo's decision about what an assistant " +
- "may see, and indexing everything is not a safe fallback. Export " +
- "it from docusaurus.config.ts. (It is assembled there from " +
- "assistantIgnoreFiles plus this export's own corpus-shape " +
- "exclusions - assistantIgnoreFiles alone is a different list and " +
- "setting it will not satisfy this check.)",
+ "[knowledge-extractor] the `ignoreFiles` option is missing. It " +
+ "carries the repo's decision about what an assistant may see, and " +
+ "indexing everything is not a safe fallback. Pass it where this " +
+ "plugin is registered in docusaurus.config.ts: " +
+ "[knowledgeExtractor, { ignoreFiles: knowledgeIndexIgnoreFiles }]. " +
+ "That list is assembled there from assistantIgnoreFiles plus this " +
+ "export's own corpus-shape exclusions - assistantIgnoreFiles alone " +
+ "is a different list and will not do.",
);
}
const ignorePatterns = ignoreGlobs.map((g) => ignoreGlobToRegExp(String(g)));
From 502ea970f11b75d6ab6ccf9987a02605bbf1f4ae Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Mon, 21 Sep 2026 15:56:59 +0100
Subject: [PATCH 47/53] Word-bound the troubleshoot test, let the registry
decide every product, and refuse a threshold that is not a number
pickIntents tested `text.includes("fix")` as a bare substring, two lines
above the comment explaining why `auth` needed a word boundary. It matched
"prefix", "suffix" and "fixtures", which appear in ordinary reference
prose. Measured over a full rebuild: 38 modules lose the troubleshoot
intent, and for 28 of them it was the ONLY intent they carried - pages with
nothing wrong, filed entirely as troubleshooting.
detectProduct published the first path segment as a product for non-/sdks/
routes, so urn:product:hosted (128 modules) and urn:product:id-documents
(12) went into the graph as keys products.json has never held. Those are
sections, not products; they now read `general`, which is already in
SYNTHETIC_PRODUCTS and so stays out of availability edges.
The /sdks/ branch had the same shape left in it: `rest.length >= 2` meant
"a directory, therefore a product". Every such directory in the repo IS a
product today - the published values are identical either side of this
change, verified on a full build - so this removes a class rather than a
defect. Unknown segments now fall to core.
Two keys remain that products.json does not define,
ai-powered-barcode-scanning and batch-scanning, and they are NOT a defect:
both pages carry not_available: true, and the availability-stub block names
a stub after the feature it rules out precisely so that fact is not thrown
away. Checked rather than assumed before touching it.
Threshold flags were bare parseFloat, so `--min-success abc` gave NaN,
every `metric < NaN` was false, and the gate exited 0 reporting "ok" - a
typo silently disabling the check it was meant to tighten. readBaseline()
already refused to run ungated for this hazard; the flags now do too.
Verified both ways: exit 1 on a non-numeric flag, unchanged on a valid one.
build-docs.yml is shallow on every trigger. Keeping full history on
push/schedule rested on those runs producing what a deploy reads; the job
has no deploy step and no upload-artifact step, so the index is discarded
with the runner on every trigger. docs-retrieval-evals.yml keeps
fetch-depth: 0 because it is the job that actually reads the dates.
Corpus unchanged at 4228 modules over 520 pages. Gate exactly on baseline
(delta +0), gold set 0.95 / 0.8667 / 0.95. tsc clean.
Co-Authored-By: Claude Opus 5 (1M context)
---
.github/workflows/build-docs.yml | 30 +++++++-------
scripts/retrieval-evals/run.cjs | 35 ++++++++++++----
src/plugins/knowledge-extractor/index.ts | 53 +++++++++++++++++++++---
3 files changed, 91 insertions(+), 27 deletions(-)
diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml
index ab3d5b0de1..2dd04d6961 100644
--- a/.github/workflows/build-docs.yml
+++ b/.github/workflows/build-docs.yml
@@ -36,25 +36,25 @@ jobs:
- name: Checkout code
uses: actions/checkout@v4
with:
- # Shallow on pull_request, full history on every other trigger.
+ # Shallow on EVERY trigger, because this job never publishes what the
+ # full clone would improve.
#
# The knowledge-extractor sets each page's `last_verified` from that
- # file's last commit date. Under a depth-1 clone every file resolves
- # to the same single commit, so the plugin deliberately emits ""
- # rather than a constant that looks like data. It warns and carries
- # on - nothing in this job asserts on last_verified, so a shallow
- # clone cannot turn it red, it only drops the freshness signal.
+ # file's last commit date, and under a depth-1 clone every file
+ # resolves to the same commit, so the plugin emits "" rather than a
+ # constant that looks like data. It warns and carries on; nothing here
+ # asserts on last_verified, so this cannot turn the job red.
#
- # Which is the point: this job does not PUBLISH the index. It builds
- # and verifies, and has no deploy step. On a pull_request the signal
- # is computed, paid for and discarded - and this job carries no path
- # filter, so that is every PR to the repo. docs-preview.yml stays
- # shallow on the same reasoning.
+ # An earlier version of this kept full history on push/schedule, on
+ # the theory that those runs produce the artifact a deploy reads. They
+ # do not: this job has no deploy step and no upload-artifact step, so
+ # the index it builds is discarded with the runner on every trigger,
+ # push included. No workflow in this repo publishes it.
#
- # Full history is kept on push, schedule and workflow_dispatch, where
- # the built artifact is what a deploy or a hand-run inspection reads,
- # and where the cost is paid once rather than per PR.
- fetch-depth: ${{ github.event_name == 'pull_request' && 1 || 0 }}
+ # docs-retrieval-evals.yml is the one that does use the dates - it
+ # reports freshness coverage and fails on --require-freshness - and it
+ # keeps fetch-depth: 0 for that reason.
+ fetch-depth: 1
- name: Setup Node.js
uses: actions/setup-node@v4
diff --git a/scripts/retrieval-evals/run.cjs b/scripts/retrieval-evals/run.cjs
index 09f881cb54..d6b9ce9f6b 100644
--- a/scripts/retrieval-evals/run.cjs
+++ b/scripts/retrieval-evals/run.cjs
@@ -31,16 +31,37 @@ function arg(name, def) {
const INDEX = arg("index", "build/assets/knowledge-retrieval-index.json");
const GOLD = arg("gold", path.join(__dirname, "gold-set.json"));
-const K = parseInt(arg("k", "3"), 10);
-const MIN_SUCCESS = parseFloat(arg("min-success", "0.8"));
-const MIN_PRECISION = parseFloat(arg("min-precision", "0.6"));
-const MIN_MRR = parseFloat(arg("min-mrr", "0.6"));
+// Parsed through a checked reader, NOT bare parseFloat.
+//
+// `--min-success x` or `--auto-tolerance abc` yields NaN, every `metric < NaN`
+// comparison is false, and the gate exits 0 reporting "ok" - a threshold
+// typo silently disables the check it was meant to tighten. readBaseline()
+// already refuses to run ungated for exactly this hazard on the baseline file;
+// the flags deserve the same treatment.
+function num(name, fallback, parse) {
+ const raw = arg(name, fallback);
+ const v = parse(raw, 10);
+ if (!Number.isFinite(v)) {
+ console.error(
+ `retrieval-evals: --${name} is "${raw}", which is not a number.\n` +
+ "Refusing to run: every comparison against NaN is false, so the gate " +
+ "would pass whatever the metrics were.",
+ );
+ process.exit(1);
+ }
+ return v;
+}
+
+const K = num("k", "3", parseInt);
+const MIN_SUCCESS = num("min-success", "0.8", parseFloat);
+const MIN_PRECISION = num("min-precision", "0.6", parseFloat);
+const MIN_MRR = num("min-mrr", "0.6", parseFloat);
// --auto: corpus-wide self-retrieval over EVERY module (not just the 20-query
// gold set) — each module becomes a query built from its own title+summary and
// must retrieve itself in the top k. Measures coverage across all docs we
// create/edit. --auto-limit caps it; --min-auto-success gates it.
const AUTO = process.argv.includes("--auto");
-const AUTO_LIMIT = parseInt(arg("auto-limit", "0"), 10);
+const AUTO_LIMIT = num("auto-limit", "0", parseInt);
// Gated as a REGRESSION against a recorded baseline, not against an absolute
// floor.
//
@@ -58,7 +79,7 @@ const AUTO_LIMIT = parseInt(arg("auto-limit", "0"), 10);
// the baseline itself is wrong. Re-record with --update-baseline after a change
// that legitimately alters what is indexed, and say so in the commit.
const BASELINE_PATH = path.join(__dirname, "baseline.json");
-const AUTO_TOLERANCE = parseFloat(arg("auto-tolerance", "0.03"));
+const AUTO_TOLERANCE = num("auto-tolerance", "0.03", parseFloat);
const AUTO_FLOOR = parseFloat(arg("auto-floor", "0.60"));
const AUTO_MRR_FLOOR = parseFloat(arg("auto-mrr-floor", "0.40"));
const MIN_AUTO_MRR = parseFloat(arg("min-auto-mrr", "0"));
@@ -96,7 +117,7 @@ function readBaseline() {
}
return parsed;
}
-const MIN_AUTO_SUCCESS = parseFloat(arg("min-auto-success", "0"));
+const MIN_AUTO_SUCCESS = num("min-auto-success", "0", parseFloat);
const REPORT = arg("report", "");
// Set by the workflow that checks out full history on purpose. See
// reportFreshness: without it, an index with no dates is reported and allowed.
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index 399708074c..138f542b71 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -453,7 +453,18 @@ function pickIntents(contentType: string, title: string, body: string): string[]
const text = `${title} ${body}`.toLowerCase();
const intents: string[] = [];
if (contentType === "tutorial" || contentType === "how-to" || text.includes("configure")) intents.push("configure");
- if (contentType === "troubleshooting" || text.includes("error") || text.includes("fix")) intents.push("troubleshoot");
+ // `fix` is word-bounded for the same reason `auth` is, two lines down: as a
+ // bare substring it matched "prefix", "suffix" and "fixtures", and those
+ // words appear in ordinary reference prose, so pages with nothing wrong were
+ // filed under the troubleshooting intent - for many of them the ONLY intent
+ // they carried. The inflected forms are kept because they are the real
+ // signal; the trailing boundary is what excludes "fixtures".
+ if (
+ contentType === "troubleshooting" ||
+ text.includes("error") ||
+ /\bfix(?:e[sd]|ing)?\b/.test(text)
+ )
+ intents.push("troubleshoot");
if (contentType === "reference" || contentType === "concept" || text.includes("integrat")) intents.push("integrate");
// Word-boundary, not a substring. Counted across the built HTML, `" auth"`
// matched "authenticity" 12 times, "authentic" 10 and "authority" 5 - every
@@ -955,11 +966,43 @@ function detectProduct(pathname: string, siteDir: string): string {
// built on them described a product no consumer can look up.
const raw = slug(rest[0]);
const first = productAliases(siteDir).get(raw) ?? raw;
- // A product directory, or a single page whose name IS a known product.
- if (rest.length >= 2 || productKeys(siteDir).has(first)) return first;
- return "core";
+ // The REGISTRY decides, not the path shape.
+ //
+ // `rest.length >= 2` meant "a directory, therefore a product". That is true
+ // of every /sdks/// tree in the repo today, so this changes
+ // nothing now - verified against a full build, the published product values
+ // are identical either side of it. It removes a CLASS: a topic folder added
+ // under /sdks/ later would otherwise publish a urn:product: node for a key
+ // products.json has never held, and aliasing cannot catch that because
+ // there is nothing to alias it to.
+ //
+ // Unknown segments fall to "core", which is in SYNTHETIC_PRODUCTS and so is
+ // kept out of availability edges. A genuinely new product added to docs/
+ // before products.json lands therefore reads as core until the registry
+ // names it - the safe direction, since under-claiming costs a facet while
+ // over-claiming puts a key in the graph no consumer can resolve.
+ //
+ // This does NOT touch the availability-stub rename below. That block fires
+ // precisely when the product IS synthetic, so a page whose job is to say
+ // "X is not available here" still gets named after X - reaching it through
+ // "core" rather than by skipping this check is the same outcome by a
+ // stricter route.
+ return productKeys(siteDir).has(first) ? first : "core";
}
- return p[0] ? slug(p[0]) : "general";
+ // Outside /sdks/, the first segment is a SECTION - hosted, id-documents,
+ // barcode-scanning - not a product. Returning it raw published
+ // urn:product:hosted and urn:product:id-documents into the graph, with
+ // BelongsToProduct edges pointing at keys products.json has never contained:
+ // the same defect just fixed on the /sdks/ branch, in the other half of the
+ // function.
+ //
+ // `general` rather than the segment, because it is already in
+ // SYNTHETIC_PRODUCTS and so is excluded from availability edges - which is
+ // exactly the treatment a non-product deserves. Nothing is lost: the section
+ // is still in the url, the framework and the tags.
+ const top = p[0] ? slug(p[0]) : "";
+ if (!top) return "general";
+ return productKeys(siteDir).has(top) ? top : "general";
}
function detectContentType(pathname: string, title: string): string {
From 8a55eddee9e2edff7f9a7b7afde7f2eb8509f63e Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Mon, 21 Sep 2026 16:09:40 +0100
Subject: [PATCH 48/53] Stop hiding the framework column the component still
builds a header for
.frameworkList was `display: none` in this file's FIRST commit (#244), so
the "Available Frameworks" cell has never rendered - while the component
goes on emitting Available Frameworks above it and building the
chips inside it. A column header over content hidden by CSS is not a
layout decision, it is two halves of the component disagreeing.
Removing the rule is safe to the point of being invisible: all 50
FeatureList usages in docs/, versioned_docs/ and src/ pass
displayMode="compact", which returns before the table is built, so nothing
in the built site reaches this path. Measured on the current build:
`frameworkList` and `frameworkItemUnavailable` appear in 10 JS bundles and
1 CSS file and in ZERO html files.
Added the smallest container layout that makes the column legible rather
than leaving the chips flush: they carry padding and a border but no
margin, and React emits no whitespace between siblings of a .map(), so
without it they would touch.
This also makes c8308df real. That commit added the dashed unavailable chip
and its visually-hidden "(not available)" text to answer an accessibility
review, and `display: none` removes an element from the accessibility tree
as thoroughly as from the page - so the fix could never have taken effect
where it stood. It still does not render today, because the compact path
skips the column entirely; what changes is that enabling that view now
yields a working, announced column instead of an empty one.
Whether the non-compact view should exist at all is a separate question -
it is component, CSS and bundle weight for something used zero times - and
it is a product decision, not a review fix.
Co-Authored-By: Claude Opus 5 (1M context)
---
src/components/FeatureList/styles.module.css | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/src/components/FeatureList/styles.module.css b/src/components/FeatureList/styles.module.css
index 7505c59438..a5cf73ff35 100644
--- a/src/components/FeatureList/styles.module.css
+++ b/src/components/FeatureList/styles.module.css
@@ -87,8 +87,18 @@
}
+/* The chips carry padding and a border but no margin, and React renders the
+ .map() output with no whitespace between siblings, so without a container
+ layout they sit flush against one another. This rule was `display: none`
+ from the file's first commit - the column has never rendered, because all 50
+ FeatureList usages pass displayMode="compact", which takes a different path.
+ Hiding the content while the component still emits its
+ Available Frameworks header was incoherent; this is the smallest
+ layout that makes the column legible if that view is ever used. */
.frameworkList {
- display: none;
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.25rem;
}
.frameworkItem {
From 74b5eecf906a528d696a6e64c4083dfb3d299735 Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Tue, 22 Sep 2026 08:55:39 +0100
Subject: [PATCH 49/53] Finish the checked-flag conversion, and make an alias
collision fail loud
The previous commit added num() specifically to stop a non-numeric
threshold turning into NaN, then converted only some of its callers.
AUTO_FLOOR, AUTO_MRR_FLOOR and MIN_AUTO_MRR were left as bare parseFloat on
the three lines directly below AUTO_TOLERANCE, which did get it - so
`--auto-mrr-floor abc` still gave NaN, `page_mrr < NaN` was still false, and
the gate still reported ok whatever the real score. A header comment
claiming the hole was closed while three lines under it left it open is
worse than not having written the reader. All three now go through num();
verified each rejects a non-numeric value and that valid arguments are
unaffected (delta +0 against the baseline).
The alias map resolved a collision by last-write-wins: two products whose
frameworks[].apiUrl yield the same route segment would silently give it to
whichever sits later in products.json, reattributing every page under it,
with nothing anywhere recording that a choice was made. Misattributing a
product is the failure the alias map exists to fix, so settling it by array
order reintroduces it in a form that is harder to see. It now throws and
names both products, matching how the ignore-glob and missing-ignoreFiles
checks in this file already behave.
Verified against the real registry rather than reasoned: the loop still
derives exactly matrixscan -> matrixscan-batch and label-capture ->
smart-label-capture and throws on neither, one product repeating a segment
across eleven frameworks does not trip it - that is the ordinary case - and
two products claiming one segment throws naming both. Not reachable today;
the two live aliases are on disjoint segments.
tsc clean.
Co-Authored-By: Claude Opus 5 (1M context)
---
scripts/retrieval-evals/run.cjs | 6 ++---
src/plugins/knowledge-extractor/index.ts | 30 ++++++++++++++++++++++--
2 files changed, 31 insertions(+), 5 deletions(-)
diff --git a/scripts/retrieval-evals/run.cjs b/scripts/retrieval-evals/run.cjs
index d6b9ce9f6b..9648c13d56 100644
--- a/scripts/retrieval-evals/run.cjs
+++ b/scripts/retrieval-evals/run.cjs
@@ -80,9 +80,9 @@ const AUTO_LIMIT = num("auto-limit", "0", parseInt);
// that legitimately alters what is indexed, and say so in the commit.
const BASELINE_PATH = path.join(__dirname, "baseline.json");
const AUTO_TOLERANCE = num("auto-tolerance", "0.03", parseFloat);
-const AUTO_FLOOR = parseFloat(arg("auto-floor", "0.60"));
-const AUTO_MRR_FLOOR = parseFloat(arg("auto-mrr-floor", "0.40"));
-const MIN_AUTO_MRR = parseFloat(arg("min-auto-mrr", "0"));
+const AUTO_FLOOR = num("auto-floor", "0.60", parseFloat);
+const AUTO_MRR_FLOOR = num("auto-mrr-floor", "0.40", parseFloat);
+const MIN_AUTO_MRR = num("min-auto-mrr", "0", parseFloat);
const UPDATE_BASELINE = process.argv.includes("--update-baseline");
function readBaseline() {
let raw;
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index 138f542b71..1426ea56dc 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -927,8 +927,34 @@ function loadProducts(siteDir: string): void {
const m = /^\/sdks\/(?:net\/)?[^/]+\/([^/]+)\//.exec(String(fw?.apiUrl ?? ""));
if (!m) continue;
const seg = slug(m[1]);
- // Never let one product's route claim another product's key.
- if (seg && seg !== key && !PRODUCT_KEYS.has(seg)) aliases.set(seg, key);
+ if (!seg || seg === key || PRODUCT_KEYS.has(seg)) continue;
+ // Never let one product's route claim another product's key (the
+ // PRODUCT_KEYS check above), and never let two products claim the SAME
+ // route segment silently.
+ //
+ // A bare aliases.set() is last-write-wins: whichever product sits later
+ // in products.json takes the segment, every page under it is
+ // reattributed to that product, and nothing anywhere says so. A
+ // misattributed product is exactly the failure this alias map was added
+ // to fix, so resolving it by array order would reintroduce it in a form
+ // that is harder to see.
+ //
+ // Not reachable with the current registry - the only two aliases,
+ // matrixscan and label-capture, are on disjoint segments - so this
+ // throws rather than warns, matching how every other curation-integrity
+ // check in this file behaves. Reaching it means products.json is
+ // ambiguous about which product owns a route, and no fallback this
+ // plugin picks can be the right answer to that.
+ const prior = aliases.get(seg);
+ if (prior && prior !== key) {
+ throw new Error(
+ `[knowledge-extractor] products.json: the route segment "${seg}" is ` +
+ `claimed by both "${prior}" and "${key}" through their ` +
+ `frameworks[].apiUrl. One product must own a segment - pages under ` +
+ `/sdks//${seg}/ cannot belong to both.`,
+ );
+ }
+ aliases.set(seg, key);
}
}
PRODUCT_ALIASES = aliases;
From b5c57d36323c09f2ffcdb70ed600f28b4002dd27 Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Tue, 22 Sep 2026 11:03:55 +0100
Subject: [PATCH 50/53] Stop a guard I added from being swallowed, and four
more silent paths
The worst of these was mine, from the previous commit. The
alias-collision throw sat INSIDE loadProducts' try, and the bare catch
swallowed it and set PRODUCT_KEYS to an empty Set. A collision would then
have made detectProduct answer "core" for every /sdks/ page and "general"
for everything else: every BelongsToProduct edge collapsed onto two
synthetic buckets, every availability edge gone, on a green build. That is
strictly worse than the last-write-wins it replaced, and the same shape of
bug - a silent fallback standing in for a decision nobody can make
correctly. Reading the registry is now the only thing inside the try, so a
missing file is still tolerated and a self-contradictory one reaches the
surface.
Its sibling: loadProducts was called lazily from detectProduct, which runs
inside the per-page try/catch, so even a correct throw would have arrived
as ~620 "skipped page" warnings followed by the drift guard's "page
selectors likely drifted" - the wrong diagnosis. Loaded once, eagerly,
before the loop.
clipMarkdown balanced fences on its short path and not on its demote path.
`open` is computed over the raw cut and the fence test is line-anchored, so
"### # ``` weird" holds no fence - then demoteLine strips the markers, the
backticks land at column 0, and the result carries an opener with no
closer. Measured: limit 12 on that input returned "``` we", which
assertArtifactInvariants throws on, failing the build on content no docs
author could clear. Both paths now share balanceFences. Fuzzed over 60,000
adversarial inputs: 0 unbalanced.
readBaseline blocked the command it told you to run. A baseline missing
page_mrr exited 1 saying "Re-record it with --update-baseline", but that
write happens at the end of main() and the exit prevented ever reaching it,
so the only way out was deleting the file by hand. --update-baseline now
passes through; verified it refuses without the flag and repairs with it.
A malformed versions.json was swallowed as "no frozen versions", so
/7.6.14/ and /6.28.11/ would be indexed as duplicates of the root tree,
every module labelled version: "current". Invisible to both guards, because
the page count goes UP. Absent is still fine; present-and-unreadable now
throws.
And docs-preview.yml still described build-docs.yml as taking full history
on push and schedule, which stopped being true when this branch made it
shallow on every trigger. Mine, from the commit that made it conditional.
Verified without a full rebuild - 2.8 GB free and the last local build was
reaped for memory pressure - by exercising the real functions against the
real registry: 13 product keys, the same two aliases, and
/sdks/ios/label-capture/ -> smart-label-capture, /sdks/ios/matrixscan/ ->
matrixscan-batch, /sdks/linux/batch-scanning/ -> core,
/hosted/express/ -> general. tsc clean. CI runs the full build.
Co-Authored-By: Claude Opus 5 (1M context)
---
.github/workflows/docs-preview.yml | 9 +-
scripts/retrieval-evals/run.cjs | 24 +++--
src/plugins/knowledge-extractor/index.ts | 115 +++++++++++++++++++----
3 files changed, 121 insertions(+), 27 deletions(-)
diff --git a/.github/workflows/docs-preview.yml b/.github/workflows/docs-preview.yml
index d56635c8aa..7dcaf2edaf 100644
--- a/.github/workflows/docs-preview.yml
+++ b/.github/workflows/docs-preview.yml
@@ -29,8 +29,13 @@ jobs:
# preview build, because it must not emit its ~22 MB of JSON into the
# gh-pages branch that pr-preview-action commits. A full clone would
# buy a freshness signal nobody computes. build-docs.yml makes the
- # same call for the same reason and is also shallow on pull_request;
- # it takes full history only on push, schedule and workflow_dispatch.
+ # same call for the same reason and is shallow on EVERY trigger: it
+ # builds and verifies but never publishes the index, so the dates
+ # would be computed and discarded there too.
+ #
+ # docs-retrieval-evals.yml is the one workflow that keeps
+ # fetch-depth: 0, because it is the one that reads the dates - it
+ # reports freshness coverage and fails on --require-freshness.
fetch-depth: 1
- name: Setup Node.js
diff --git a/scripts/retrieval-evals/run.cjs b/scripts/retrieval-evals/run.cjs
index 9648c13d56..e76937b229 100644
--- a/scripts/retrieval-evals/run.cjs
+++ b/scripts/retrieval-evals/run.cjs
@@ -96,13 +96,27 @@ function readBaseline() {
// backstop, so a 24-point regression would have gone green; and a parsed
// object missing the key made the floor NaN, which every comparison is false
// against - the gate then passed unconditionally and still reported "ok".
+ // --update-baseline is the ONE caller allowed past a bad baseline, because it
+ // is the thing that repairs one. Without this, both checks below exited 1
+ // before the write at the end of main() could run - so the message "Re-record
+ // it with --update-baseline" named a command that could never succeed, and
+ // the only way out was to delete the file by hand. A guard whose own
+ // remediation it blocks is worse than no guard.
+ const refuse = (msg) => {
+ console.error(`retrieval-evals: ${msg}`);
+ if (UPDATE_BASELINE) {
+ console.error("--update-baseline was passed, so this run will overwrite it.");
+ return null;
+ }
+ console.error("Refusing to run an ungated check.");
+ process.exit(1);
+ };
+
let parsed;
try {
parsed = JSON.parse(raw);
} catch (err) {
- console.error(`retrieval-evals: ${BASELINE_PATH} is not valid JSON (${err.message}).`);
- console.error("Fix it or delete it - refusing to run an ungated check.");
- process.exit(1);
+ return refuse(`${BASELINE_PATH} is not valid JSON (${err.message}).`);
}
for (const key of ["page_success_at_k", "page_mrr"]) {
// Both, not just the first. page_mrr went unchecked, so a baseline that
@@ -110,9 +124,7 @@ function readBaseline() {
// this script - set mrrFloor to 0, and nothing is ever below 0: the MRR
// gate disabled itself while the report still said "ok".
if (!parsed || !Number.isFinite(parsed[key])) {
- console.error(`retrieval-evals: ${BASELINE_PATH} has no finite ${key}.`);
- console.error("Re-record it with --update-baseline - refusing to run an ungated check.");
- process.exit(1);
+ return refuse(`${BASELINE_PATH} has no finite ${key}.`);
}
}
return parsed;
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index 1426ea56dc..af3ec2d7de 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -160,6 +160,26 @@ function demoteLine(line: string): string {
return out;
}
+/**
+ * Close a code fence the clip left open.
+ *
+ * Both of clipMarkdown's early returns need this, and for different reasons:
+ * the short path can be handed text that was already unbalanced, and the
+ * demote path can MANUFACTURE an opener by stripping the markers in front of
+ * one. Shared so the two cannot drift - they did, and the demote path shipped
+ * the shape the published-artifact assertion throws on.
+ *
+ * The closer copies the opener's quote prefix. A bare closer after "> ```" is
+ * not balanced: CommonMark ends the blockquote at the unquoted line, implicitly
+ * closing the quoted fence, then opens a new top-level one that never closes.
+ */
+function balanceFences(text: string): string {
+ const fences = text.match(/^\s*(?:>\s*)*```/gm) || [];
+ if (fences.length % 2 === 0) return text;
+ const openerPrefix = (fences[fences.length - 1] || "").match(/^\s*(?:>\s*)*/);
+ return `${text}\n${openerPrefix ? openerPrefix[0] : ""}\u0060\u0060\u0060`;
+}
+
function clipMarkdown(text: string, limit: number): string {
// The early return used to hand back the raw text, so for any chunk shorter
// than the limit the drop never ran at all - the "no excerpt ends on an
@@ -173,10 +193,7 @@ function clipMarkdown(text: string, limit: number): string {
// for main and for every PR preview. That contradicts the rule the rest
// of this plugin follows, that extraction must never break a deploy, and
// the fix would have to be a code change on a docs-only PR with main red.
- const fences = short.match(/^\s*(?:>\s*)*```/gm) || [];
- if (fences.length % 2 === 0) return short;
- const openerPrefix = (fences[fences.length - 1] || "").match(/^\s*(?:>\s*)*/);
- return `${short}\n${openerPrefix ? openerPrefix[0] : ""}\u0060\u0060\u0060`;
+ return balanceFences(short);
}
const cut = text.slice(0, limit);
const lines = cut.split("\n");
@@ -195,7 +212,15 @@ function clipMarkdown(text: string, limit: number): string {
if (!open) {
const plain = dropTrailingIntroducers(lines).join("\n").trimEnd();
// Never nothing, and never the forbidden shape: demote instead of echoing.
- return plain || demoteIntroducers(cut).trimEnd();
+ //
+ // balanceFences on BOTH, because demotion can CREATE a fence where the
+ // counter saw none. `open` is computed over `cut` before demotion, and the
+ // fence test is line-anchored, so "### # ``` weird" holds no fence at all -
+ // then demoteLine strips the markers, the backticks land at column 0, and
+ // the result carries an opener with no closer. Measured: limit 12 on that
+ // input returned "``` we", which assertArtifactInvariants throws on, which
+ // fails `docusaurus build` on content no docs author could clear.
+ return balanceFences(plain || demoteIntroducers(cut).trimEnd());
}
// Dropping the half-included block is better than shipping it broken, unless
// that would throw away almost everything.
@@ -900,12 +925,35 @@ let PRODUCT_ALIASES: Map | null = null;
function loadProducts(siteDir: string): void {
if (PRODUCT_KEYS && PRODUCT_ALIASES) return;
+ // READING the registry is the only thing inside the try.
+ //
+ // A bare try around the whole function swallowed the collision throw below
+ // and left PRODUCT_KEYS empty - after which detectProduct answers "core" for
+ // every /sdks/ page and "general" for everything else, every
+ // BelongsToProduct edge collapses onto two synthetic buckets, and every
+ // availability edge disappears. On a green build. That is far worse than the
+ // last-write-wins it was meant to replace, and it is the same shape of bug:
+ // a silent fallback standing in for a decision nobody can make correctly.
+ //
+ // So the two cases are separated. "The file is missing or unparseable" is
+ // tolerated, because this plugin must not be able to break a deploy over a
+ // file it only reads. "The file is present and says two contradictory
+ // things" is not tolerable, and must reach the surface.
+ let parsed: Array<{
+ key?: unknown;
+ frameworks?: Record;
+ }>;
try {
const raw = fs.readFileSync(path.join(siteDir, "src", "data", "products.json"), "utf8");
- const parsed = JSON.parse(raw) as Array<{
- key?: unknown;
- frameworks?: Record;
- }>;
+ parsed = JSON.parse(raw) as typeof parsed;
+ if (!Array.isArray(parsed)) throw new Error("not an array");
+ } catch {
+ // No registry (or unreadable): fall back to path shape only. Never fatal.
+ PRODUCT_KEYS = new Set();
+ PRODUCT_ALIASES = new Map();
+ return;
+ }
+ {
// Filter on the RAW key: slug("") returns "module", so filtering after
// slugging can never drop anything, and an entry with a missing key would
// register "module" as a real product - after which a page at
@@ -958,11 +1006,6 @@ function loadProducts(siteDir: string): void {
}
}
PRODUCT_ALIASES = aliases;
- } catch {
- // No registry (or unreadable): fall back to path shape only. Never fatal -
- // this plugin must not be able to break a deploy.
- PRODUCT_KEYS = new Set();
- PRODUCT_ALIASES = new Map();
}
}
@@ -1993,12 +2036,39 @@ export default function knowledgeExtractor(context: any, options: any) {
// (versions.json) are archived duplicates; `next` is the unreleased tree
// when it exists; the external API reference (data-capture-sdk) is a
// separate tool; *.html dirs are client-redirect stubs.
+ // ABSENT and BROKEN are different things, and the old catch treated them
+ // the same. A malformed versions.json left frozenVersions empty, so
+ // /7.6.14/ and /6.28.11/ stopped being excluded and were indexed as
+ // duplicates of the root tree - every one of them labelled
+ // version: "current", which is false. Neither guard can see it: the
+ // empty-output check passes and the drift ratio IMPROVES, because the
+ // page count goes up.
+ //
+ // A site with no versions.json is legitimate and stays tolerated. A
+ // versions.json that is present and unreadable is a build input this
+ // plugin cannot interpret, and guessing "none" is the one answer
+ // guaranteed to be wrong.
let frozenVersions: string[] = [];
- try {
- const parsed = JSON.parse(fs.readFileSync(path.join(siteDir, "versions.json"), "utf8"));
- if (Array.isArray(parsed)) frozenVersions = parsed.map(String);
- } catch {
- /* no versions.json */
+ const versionsPath = path.join(siteDir, "versions.json");
+ if (fs.existsSync(versionsPath)) {
+ let parsed: unknown;
+ try {
+ parsed = JSON.parse(fs.readFileSync(versionsPath, "utf8"));
+ } catch (err) {
+ throw new Error(
+ `[knowledge-extractor] versions.json is present but not valid JSON ` +
+ `(${(err as Error).message}). Refusing to guess that there are no ` +
+ `frozen versions - that would index every frozen tree as a ` +
+ `duplicate of the root, labelled with the served version.`,
+ );
+ }
+ if (!Array.isArray(parsed)) {
+ throw new Error(
+ `[knowledge-extractor] versions.json is present but is not an array. ` +
+ `Refusing to guess that there are no frozen versions.`,
+ );
+ }
+ frozenVersions = parsed.map(String);
}
// The curation decision, applied rather than paraphrased: the same globs
// docusaurus-plugin-llms is given for what an assistant may not see,
@@ -2066,6 +2136,13 @@ export default function knowledgeExtractor(context: any, options: any) {
// route, because that is what the globs describe - and on every candidate
// spelling of it, since a route maps to `docs/x.md`, `docs/x/index.md` and
// the folder/folder.md convention alike.
+ // Eagerly, before the page loop. detectProduct() calls loadProducts()
+ // lazily, and that call would land inside the per-page try/catch below -
+ // so a genuine registry error would arrive as ~620 "skipped page"
+ // warnings followed by the drift guard's "page selectors likely drifted",
+ // which is the wrong diagnosis for a products.json that contradicts
+ // itself. Raised here it is one error naming the real cause.
+ loadProducts(siteDir);
const unresolvedRoutes: string[] = [];
const files = walkHtml(outDir, skipDir).filter((f) => {
const rel = path.relative(outDir, path.dirname(f)).split(path.sep).join("/");
From 59fbb07df98d7db1e9befb05819554a60a738862 Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Thu, 24 Sep 2026 08:57:50 +0100
Subject: [PATCH 51/53] Stop the plugin header asserting numbers that keep
going stale
Review flagged the module count as stale. Measuring the rest of the header
against a real build found it was not alone - five figures had drifted, not
one:
modules 4,386 -> 4,228
index size 10.41 -> 10.09 MiB
graph size 11.62 -> 11.29 MiB
docs_excerpt avg 376.5 -> 379.9
assistant avg 521.2 -> 525.2
Only llms-full.txt at 2.28 MiB and 410 llms.txt links were still right.
Re-pinning them would set up the fourth round of the same correction, so
the paragraph now argues in magnitudes - around 10 MiB, around 11, roughly
6 more, against about 2.3 for the whole prose corpus - which is all the
argument ever needed and which survives a chunking change. Where to get
exact values is named instead: baseline.json for pages and modules, the
built artifacts for sizes, and the extractor's own postBuild line, all of
which are derived rather than typed. This is the same conclusion #436
reached about measurements in a published file, applied to a source
comment: nothing checks a number in a comment.
Dropped the "423 sections" figure with them. I could not reproduce it from
the built llms-full.txt under any reading I tried, and the sentence it
supports - that the two artifacts cut the corpus differently - is better
made structurally: llms.txt indexes whole PAGES, this indexes CHUNKS,
several per page, so there is no per-module correspondence either way.
And the DIVISION OF LABOUR paragraph still said the two plugins share
`customFields.assistantIgnoreFiles`. Neither reads it. Both take their list
as a plugin option, which this branch changed deliberately - a customFields
key is a second name that has to be kept in step, and it had already
drifted once. The curation decision is still made once; only the transport
changed. The PR description carried the same stale sentence and is fixed
too.
Co-Authored-By: Claude Opus 5 (1M context)
---
src/plugins/knowledge-extractor/index.ts | 47 +++++++++++++++---------
1 file changed, 30 insertions(+), 17 deletions(-)
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index c070571283..c7d777385d 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -16,22 +16,30 @@
* - /assets/knowledge-graph.jsonld (enriched concept graph)
*
* A POINTER INDEX, NOT A TEXT STORE - and deliberately so. `toIndexRecord`
- * publishes `docs_excerpt` (averaging 376.5 chars, max 404 - `clipMarkdown`
- * appends the fence closer AFTER slicing to 400, so 400 is the slice budget and
- * not an enforced bound) and `assistant_excerpt` (averaging 521.2, max 623),
- * and does NOT publish `content.docs_markdown`; the consumer follows `url` for
- * the full text - which is the page itself, so it is always reachable.
+ * publishes `docs_excerpt` and `assistant_excerpt` - each a clipped preview,
+ * budgeted at 400 and 300 chars respectively, though `clipMarkdown` appends the
+ * fence closer AFTER slicing, so those are slice budgets and not enforced
+ * bounds - and does NOT publish `content.docs_markdown`. The consumer follows
+ * `url` for the full text, which is the page itself, so it is always reachable.
*
- * The cost of the alternative is measurable: the index is already 10.41 MiB and
- * the graph 11.62 MiB, and adding ~1,400 chars per module would put roughly
- * 6 MiB more onto it. For scale, `llms-full.txt` carries the site's prose in
- * 2.28 MiB, so per-module text is an expensive way to store text. The argument
- * rests on that and on the `url`, NOT on a claim that each module's prose also
- * ships in llms-full.txt: the two artifacts cut the corpus differently - 423
- * sections there and 410 links in llms.txt, against 4,386 modules here - so
- * there is no per-module
- * correspondence to appeal to. Units are MiB throughout, to match `mb()` and
- * MAX_INDEX_MB below.
+ * The cost of the alternative is a MAGNITUDE argument, and it is stated in
+ * magnitudes on purpose. The index is around 10 MiB and the graph around 11;
+ * carrying the full chunk would add roughly 6 MiB more, against `llms-full.txt`
+ * holding the site's entire prose corpus in about 2.3. Per-module text is an
+ * expensive way to store text, and that holds at any of these sizes.
+ *
+ * Exact figures are deliberately NOT pinned here. They have been wrong three
+ * times: the module count, both artifact sizes and both excerpt averages all
+ * drifted as chunking and scoring changed, while this comment went on asserting
+ * them, and nothing checks a number in a comment. For the current values read
+ * `scripts/retrieval-evals/baseline.json` (pages and modules) or measure the
+ * built artifacts; the extractor prints its own counts at the end of postBuild.
+ *
+ * The argument rests on those magnitudes and on the `url`, NOT on a claim that
+ * each module's prose also ships in llms-full.txt: the two artifacts cut the
+ * corpus differently - llms.txt indexes whole PAGES while this indexes CHUNKS,
+ * several per page - so there is no per-module correspondence to appeal to.
+ * Units are MiB throughout, to match `mb()` and MAX_INDEX_MB below.
*
* So CHUNK_TARGET_CHARS is a GRANULARITY knob, not a payload size: it decides
* how finely a page is split into retrievable units, and the excerpt is a
@@ -44,8 +52,13 @@
* index, `llms-full.txt` as the text). This one emits TYPED METADATA AND EDGES
* for deciding which page or chunk to read - intents, audiences, channels,
* frameworks, products, cites-API, see-also, availability - which a flat text
- * dump cannot express. They share a source of truth for what an assistant may
- * see (`customFields.assistantIgnoreFiles`) so a curation decision is made once.
+ * dump cannot express. They share the curation decision about what an assistant
+ * may see - `assistantIgnoreFiles` in docusaurus.config.ts - but each takes its
+ * own list as a PLUGIN OPTION (`options.ignoreFiles` here, `ignoreFiles` on the
+ * llms plugin) rather than through `customFields`. That is deliberate: a
+ * customFields key is a second name that has to be kept in step with the list
+ * it mirrors, and it had already drifted once. Each consumer's list is a
+ * superset of the shared one, so the decision is still made in a single place.
*
* Known limit: 10 MiB is large for a browser consumer to fetch whole. Nothing
* in the repo consumes it that way yet; if something does, it needs a served
From 5899288c73ad3405dbf4762feb7c32a54ea3bc9d Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Thu, 24 Sep 2026 09:32:13 +0100
Subject: [PATCH 52/53] Report the artifact sizes on the success line, so the
header's pointer is true
The previous commit stopped pinning drifting figures in the header and
pointed readers at postBuild for current values instead. That pointer was
only half true: postBuild printed modules, pages, nodes and edges, but not
sizes. idxMb and graphMb were already computed a few lines above for the
soft-cap check and were printed ONLY when that check failed - so the figure
a reader most often wants was visible only when the build was about to
break.
Both now appear on the normal success line, derived from the bytes just
written rather than typed into a comment. That is the whole point of the
previous commit: a number nobody maintains goes stale, a number the build
computes cannot.
Header updated to say what is actually reported, and to name `yarn build`
plus the last [knowledge-extractor] line as the way to get it.
tsc clean. The line itself is left to CI to print - 4.5 GB free here, but
the last local build was reaped for memory pressure and CI reports this for
nothing.
Co-Authored-By: Claude Opus 5 (1M context)
---
src/plugins/knowledge-extractor/index.ts | 22 ++++++++++++++++++----
1 file changed, 18 insertions(+), 4 deletions(-)
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index c7d777385d..d8a5207e9a 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -31,9 +31,13 @@
* Exact figures are deliberately NOT pinned here. They have been wrong three
* times: the module count, both artifact sizes and both excerpt averages all
* drifted as chunking and scoring changed, while this comment went on asserting
- * them, and nothing checks a number in a comment. For the current values read
- * `scripts/retrieval-evals/baseline.json` (pages and modules) or measure the
- * built artifacts; the extractor prints its own counts at the end of postBuild.
+ * them, and nothing checks a number in a comment.
+ *
+ * So the current values are REPORTED rather than written down. The success line
+ * at the end of postBuild prints modules, pages, both artifact sizes, node and
+ * edge counts, every one of them derived from the artifact it just wrote -
+ * `yarn build` and read the last [knowledge-extractor] line. Pages and modules
+ * are also in scripts/retrieval-evals/baseline.json, recorded by the evals.
*
* The argument rests on those magnitudes and on the `url`, NOT on a claim that
* each module's prose also ships in llms-full.txt: the two artifacts cut the
@@ -2428,9 +2432,19 @@ export default function knowledgeExtractor(context: any, options: any) {
const edgeSummary = Object.entries(edgeTypes)
.map(([k, v]) => `${k}=${v}`)
.join(" ");
+ // Sizes on the SUCCESS line, not only in the cap-exceeded error.
+ //
+ // idxMb and graphMb are already computed above for the soft-cap check,
+ // and until now they were only ever printed when that check FAILED - so
+ // the one number a reader most often wants was visible only when the
+ // build was about to break. The header above points here for current
+ // figures rather than pinning them in a comment that goes stale; that
+ // pointer is only honest if the figures are actually here.
console.log(
`[knowledge-extractor] ${index.length} modules from ${pagesProcessed} pages ` +
- `(${pageErrors} page error(s)) | graph: ${graph["@graph"].length} nodes | edges: ${edgeSummary} -> /assets/`,
+ `(${pageErrors} page error(s)) | index ${idxMb.toFixed(2)} MiB, graph ` +
+ `${graphMb.toFixed(2)} MiB | graph: ${graph["@graph"].length} nodes | ` +
+ `edges: ${edgeSummary} -> /assets/`,
);
},
};
From 2feeee19b41e62f89a3dd3d334a2af1d4b28f078 Mon Sep 17 00:00:00 2001
From: Yevheniia Sorokina
Date: Thu, 24 Sep 2026 09:46:46 +0100
Subject: [PATCH 53/53] Close the NaN gate one level up, and stop the regex
comment overselling itself
review found that `page_success_at_k = ok / rows.length` is NaN when rows
is empty - an index whose records carry no `url` - and `NaN < floor` is
false, so `breached` stays false and the gate prints "ok" and exits 0 on an
index it never measured. That is exactly the hazard num() and readBaseline()
were written to close, left open one level above them. Now refuses: exit 1
on a url-less index, unchanged exit 0 on the real one, both checked.
And the comment I added to the link regex claimed a harm that cannot
happen. It said a truncated API href "lands in `api` with the fragment cut
mid-signature" - but `api.add(href.split("#")[0])` discards the fragment
anyway, so no anchor ever reaches api_refs. The external case is dropped by
the `site` prefix test, and no link in docs/ has a paren in its href at all
(zero matches).
I also told the PR that the +2 graph nodes after that change were "two
API-reference targets that were previously truncated now resolving". I
cannot support that: the same commit merged main, which changed docs, and I
never isolated the two. Withdrawn.
The fix itself stands and stays - a parser that truncates on a shape
CommonMark allows is wrong, and a truncated INTERNAL path would enter
`internal` as a doc URL resolving to nothing with no error anywhere. It is
a correctness fix for the parser, not a repair of live damage, and the
comment now says so.
Co-Authored-By: Claude Opus 5 (1M context)
---
scripts/retrieval-evals/run.cjs | 13 +++++++++++++
src/plugins/knowledge-extractor/index.ts | 15 ++++++++++-----
2 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/scripts/retrieval-evals/run.cjs b/scripts/retrieval-evals/run.cjs
index e76937b229..a6919c690f 100644
--- a/scripts/retrieval-evals/run.cjs
+++ b/scripts/retrieval-evals/run.cjs
@@ -396,6 +396,19 @@ function main() {
misses.push(r.url.replace(/^https?:\/\/[^/]+/, ""));
}
}
+ // No rows means no metric, and a metric that is NaN passes every gate:
+ // `NaN < floor` is false, so `breached` stays false and this prints "ok"
+ // and exits 0 on an index it never measured. That is the same hazard num()
+ // and readBaseline() were written to close, one level up - an index whose
+ // records carry no `url` produces rows.length === 0 and would sail through.
+ if (rows.length === 0) {
+ console.error(
+ "\nretrieval-evals: no page rows - every record is missing a `url`, " +
+ "so there is nothing to measure.\nRefusing to report a gate result " +
+ "on an index this run could not evaluate.\n",
+ );
+ process.exit(1);
+ }
const metrics = {
mode: "auto-page-self-retrieval",
pages: rows.length,
diff --git a/src/plugins/knowledge-extractor/index.ts b/src/plugins/knowledge-extractor/index.ts
index d8a5207e9a..12c9e10d77 100644
--- a/src/plugins/knowledge-extractor/index.ts
+++ b/src/plugins/knowledge-extractor/index.ts
@@ -1159,11 +1159,16 @@ function classifyLinks(chunkMarkdown: string, site: string, baseUrl: string): {
// [init](https://docs.scandit.com/.../ns-scan.html#init(context:))
// -> https://docs.scandit.com/.../ns-scan.html#init(context:
//
- // The first is usually harmless - a truncated external URL fails the `site`
- // prefix tests below and is dropped. The second is not: it is an
- // API-reference fragment, so it passes those tests and lands in `api` with
- // the fragment cut mid-signature, and Swift/ObjC selectors in that form are
- // exactly what the API reference anchors on.
+ // Neither is harmful TODAY, and that is worth stating plainly rather than
+ // overselling the fix. A truncated external URL fails the `site` prefix
+ // tests below and is dropped; a truncated API href loses only its fragment,
+ // which `api.add(href.split("#")[0])` discards anyway. And no link in docs/
+ // currently has a paren in its href - checked, zero matches.
+ //
+ // It is a correctness fix for the parser, not a repair of live damage: the
+ // shape it mishandles is one CommonMark allows, and the failure is silent -
+ // a truncated INTERNAL path would enter `internal` as a doc URL that
+ // resolves to nothing, with no error anywhere. Cheap to get right once.
//
// `(?:[^()]|\([^()]*\))+` admits one nested pair, which covers every case in
// this corpus. Full nesting needs a parser, and CommonMark itself only