diff --git a/.claude/rules/docs-authoring.md b/.claude/rules/docs-authoring.md index bb2a8e5..7ac286c 100644 --- a/.claude/rules/docs-authoring.md +++ b/.claude/rules/docs-authoring.md @@ -14,7 +14,7 @@ When creating or editing any markdown file, follow the discipline below. These a - **Prove it.** Before writing any technical claim, know the exact file (and ideally lines) that prove it. If you can't, don't write it. Silence beats speculation: no "appears to", "should", "will", or planned/intended behaviour. - Fix existing statements that contradict the code. - **Cut a comment by whole sentences, above the public floor.** Never delete or cut below one sentence the documentation comment on a public or exported symbol, a public structure member, or a package or module. Keep the sentence saying what it does, even where it restates the name, code, or syntax; where unclear, keep the first sentence. Correct a wrong or absent-content claim from the body. If the body was not read, keep the comment and report it. Cut other sentences that restate code, re-describe documented members, or narrate alternatives or reasoning where the code needs only the conclusion, keeping every other sentence word for word. A package or file comment says what the unit is for and never tours its members. -- **Current state only.** Describe the code as it is now, in prose and in comments alike. Never narrate the past ("replaces", "used to", "formerly", "for the first time", "unlike the old") and never name a file, flag, or tool that no longer exists. Future intent lives in a `TODO` in the code, never in the documentation. **Name the line a comment describes.** Where no line corresponds, correct a public or exported symbol's comment from its body; delete an internal comment on that ground. A note about a deliberate omission the code depends on and a file header pass this test. Rationale worth keeping goes in a decision record of its own under [`docs/`](../../docs/index.md). +- **Current state only.** Describe the code as it is now, in prose and in comments alike. Never narrate the past ("replaces", "used to", "formerly", "for the first time", "unlike the old") and never name a file, flag, or tool that no longer exists. Future intent lives in a `TODO` in the code, never in the documentation. Name the code a comment describes (a line, a block, the function, or the file); a comment giving the reason the code is written as it is passes. Where no code corresponds, correct the comment to the current fact it carries, and delete it only when none remains. An existing comment, public or private, is kept unless it is commented-out code, every sentence restates the code beneath it, or it narrates a change stating no current fact; a verbose one is tightened by whole sentences, keeping its summary and every reason, constraint, or warning, and trimming happens only inside the requested scope. A note about a deliberate omission the code depends on and a file header pass this test. An architectural or cross-cutting decision goes in a decision record of its own under [`docs/`](../../docs/index.md). The reason a particular piece of code is written as it is stays in a comment beside that code. ## Style diff --git a/.claude/skills/audit-docs/SKILL.md b/.claude/skills/audit-docs/SKILL.md index cb2e714..f885288 100644 --- a/.claude/skills/audit-docs/SKILL.md +++ b/.claude/skills/audit-docs/SKILL.md @@ -13,7 +13,7 @@ These hold however this skill was invoked. The sections below carry the detail, - **Files keep their path and name.** Rename, move, split, merge, or delete a file, or create a directory, only when the request asks for it or the user approves it when asked. Where one looks necessary, ask the user and wait; where you cannot ask, propose it in your output instead. - **Documentation only.** Never change executable code or behaviour unless the request explicitly asks for it. - **No claim without proof.** Every sentence rests on a string copied from code opened this run. What you cannot prove goes in your output, not in the file. -- **Public documentation comments have a floor.** Never delete or cut below one sentence the comment on a public or exported symbol, a public structure member, or a package or module. Keep the sentence saying what it does, as written, even when it restates the name, code, or syntax; where unclear, keep the first sentence. Correct a wrong or absent-content claim from the body. If the body was not read, keep the comment and report it. Other comments you write on a public symbol are at most two sentences from its body: what it does, and a second only for an error, constraint, or caller obligation the code proves. An accurate existing comment gains no sentence except a fold or a deprecation's replacement (Phase 3). Cut other whole sentences that restate code, re-describe members, or narrate alternatives or reasoning where the code needs only the conclusion. A package or file comment says what the unit is for, plus entry points only in a large package, and never tours its members. +- **Comments are corrected, not deleted.** Every existing comment, public or private, documentation or inline, stays unless Phase 3's closed delete list names it: a drifted one is corrected, a verbose one is tightened in place, and one you are unsure about stays and is reported. The rules for writing a new comment never justify removing an existing one. ## Role & Purpose @@ -69,7 +69,7 @@ Every statement must be grounded in code you have **opened and read in full duri ### Rule 4: Current state only -Documentation and comments describe the code as it is now. Never narrate a change, a fix, or a prior state ("now uses", "previously", "no longer", "restored", "replaces", "used to", "formerly", "for the first time", "unlike the old"), never argue that the code is correct or safe, and never name a file, flag, symbol, or tool that no longer exists: version control already carries that history. The only sanctioned place for future intent is a `TODO` in the code that will change, positioned however that codebase positions one; documentation itself carries none, so no empty sections, stubs, or "add details here" placeholders, and if the code does not exist, neither should its documentation. Rationale worth keeping goes in its own decision record, not scattered through the files it explains. +Documentation and comments describe the code as it is now. Never narrate a change, a fix, or a prior state ("now uses", "previously", "no longer", "restored", "replaces", "used to", "formerly", "for the first time", "unlike the old"), never argue that the code is correct or safe, and never name a file, flag, symbol, or tool that no longer exists: version control already carries that history. The only sanctioned place for future intent is a `TODO` in the code that will change, positioned however that codebase positions one; documentation itself carries none, so no empty sections, stubs, or "add details here" placeholders, and if the code does not exist, neither should its documentation. Only architectural or cross-cutting decisions get decision records; why a piece of code is written as it is stays in a comment beside it. ### Rule 5: Mermaid diagram and image accessibility (zero tolerance) @@ -117,16 +117,27 @@ Judge each document you edit in full as a whole, not only paragraph by paragraph ### Phase 3: in-code documentation audit -Phase 3 runs on every audit, whatever Phases 1 and 2 found, over the code files in scope; where there are none, say so. A floor holds over every cutting and deletion rule below: the comment on a public or exported symbol, a public structure member, or a package or module is never deleted or cut below its sentence saying what it does, even where that sentence restates the name, code, or syntax. Correct a wrong or absent-content claim from the body; when the body was not read, keep the comment and report it. Phase 3 corrects what is wrong, documents what is absent in scope, and cuts what a comment does not need; every sentence it keeps stays as written. +Phase 3 runs on every audit, whatever Phases 1 and 2 found, over the code files in scope; where there are none, say so. It corrects what is wrong, documents what is absent in scope, and tightens what is padded. **Its default on an existing comment is to keep it, its next is to correct it, and deletion is limited to the closed list below.** A floor holds over every rule here: the comment on a public or exported symbol, a public structure member, or a package or module never drops below its sentence saying what it does, even where that sentence restates the name. When the body was not read, keep the comment and report it. + +**Existing comments, public and private alike, are judged in this order; the first test that applies decides.** Before-and-after pairs are in [`existing-comments.md`](references/existing-comments.md). + +1. **Drifted:** it states something the code no longer does. Correct it from the body, keeping wording that is still true. +2. **Wholly redundant:** every sentence restates the name and signature or the line beneath it, such as `// Increment counter`, with no reason, constraint, edge case, or warning. Delete it unless the floor holds it. This is one delete-list ground; the scope rule below applies. +3. **Verbose:** a fact worth keeping sits inside padding (restated parameters, a tour of the body, filler, hedging). Cut the padding sentences; the summary and every reason, constraint, edge case, or warning stay. This never removes a whole comment. +4. Otherwise it stays as written. + +**The closed delete list.** Beyond test 2, delete only commented-out code, a comment about code that no longer exists with nothing to correct it towards, change narration ("now uses", "previously") stating no current fact, and, under the guard below, a use-site copy of what the declaration's comment says; narration that does state one is rewritten to it. A TODO stays unless its work is visibly done. Removing a comment because it is private, the function is short, or you would not have written it is a defect. **When unsure, keep it and report it.** + +**Trim only inside the requested scope.** Tests 2 and 3 apply only to what the request resolved to: on a pull request, the files and code the diff touched; on a directory or component, everything in it; on a function, only that function. Elsewhere only test 1 applies. - **Scope:** the code the scope rule above resolved to, covering its documentation comments, inline comments, and file-level headers, plus every `.md` file inside that scope which sits outside `docs/`. A file the rule did not resolve to stays out whatever it contains, so this phase is never a repository-wide sweep for markdown, for undocumented symbols, or for a comment pattern. On a pull request or working changes, write a missing comment only for a symbol the diff added or changed, and list the other undocumented symbols in those files in your output. -- **Actions:** scan for documentation and comments; read the current implementation of each documented element; verify it against actual code behaviour; correct inaccurate or outdated comments, and remove inaccurate internal comments or orphaned TODOs; cut bloat above the public floor; document each public symbol in scope that lacks a comment. **Cutting works by whole sentences.** In any comment in scope, including documentation, file, and package comments, cut sentences that restate the declaration or code beneath it, re-describe members with their own comments, or narrate alternatives or reasoning where the code needs only the conclusion. Keep every other sentence word for word; where a kept sentence leans on a cut one ("also", "these"), keep both or cut both. A comment made of nothing else goes entirely unless the floor holds it. A public summary sentence and a sentence explaining non-obvious internal logic always stay. A reworded or merged sentence is a new claim needing its own proof (Rule 2). Correct a comment that is both wrong and long before cutting it. -- **Document the public surface in scope, from the body.** Every public or exported symbol in scope carries a documentation comment, as do the members of a public structure: fields, properties, keys, enum values. Open the body and write the comment from it, in the form the language's convention sets (a Go comment opens with the symbol's name, a Python docstring with a one-line summary): one sentence saying what the symbol does, written even where the name makes that obvious, since being obvious is not a defect on a public surface and being absent is. A second sentence is allowed only for an error, a constraint, or a caller obligation that a line of the body, a test assertion, a configuration value, or a decision record opened this run proves, and a comment you write stops there; an accurate existing comment gains no sentence except a fold or a deprecation's replacement (below). Write no reason or invariant you cannot quote. A member's comment states what the code in scope that sets or reads it shows. **Rule 2 still governs, and it comes first.** Not having got to the body is no reason to skip the symbol, and being unable to reach it is no reason to guess. Where you have not read the body, leave the symbol as it is and name it in your output: undocumented and reported is a compliant result, where a comment written from the symbol's name is the defect this rule exists to prevent. -- **Do not restate what the language's own syntax declares**, such as a type, a visibility modifier, or an override marker. This governs what you write; in an existing comment, a sentence doing so is cut only above the public floor, while a tag is governed by the next bullet. -- **Correct an existing documentation tag; do not strip or delete it.** A parameter, return, throws, or example entry was written deliberately. Read enough surrounding code to judge it, then fix what is factually wrong and leave what is right, including parts a convention would omit in new code. Removing a tag, or a piece of one, because it looks redundant is restyling someone else's work, not auditing it. Delete a whole tag only when it is wrong and uncorrectable, such as one documenting a parameter the signature no longer has. Phase 2's "default to correcting, not deleting" governs in-code documentation too. -- **Internal elements** are documented only where the logic is complex or carries a gotcha or edge case, and a comment inside a function body is written only for non-obvious business logic, a workaround, or a complex transformation. Delete an internal comment only when it restates the line beneath it, such as `// Increment counter` above a counter increment (delete the comment, keep the code). +- **Actions:** scan for documentation and comments; read the current implementation of each documented element; verify it against actual code behaviour; apply the order above; document each public symbol in scope that lacks a comment. **Tightening works by whole sentences.** Under test 3, cut sentences restating the signature, re-describing members with their own comments, or touring the body. Keep every other sentence word for word; where a kept sentence leans on a cut one ("also", "these"), keep both or cut both. A summary sentence, and a sentence giving a reason, a constraint, an edge case, or a warning, always stay, so a why-comment is never cut for being reasoning. A reworded or merged sentence is a new claim needing its own proof (Rule 2). Correct a comment that is both wrong and long before tightening it. +- **Document the public surface in scope, from the body.** Every public or exported symbol in scope carries a documentation comment, as do the members of a public structure: fields, properties, keys, enum values. Open the body and write the comment from it, in the form the language's convention sets (a Go comment opens with the symbol's name, a Python docstring with a one-line summary): one sentence saying what the symbol does, written even where the name makes that obvious, since being obvious is not a defect on a public surface and being absent is. A second sentence is allowed only for an error, a constraint, or a caller obligation that a line of the body, a test assertion, a configuration value, or a decision record opened this run proves, and a comment you write stops there; an accurate existing comment gains no sentence except a fold or a deprecation's replacement (below). Write no reason or invariant you cannot quote. A member's comment states what the code in scope that sets or reads it shows. **Rule 2 still governs, and it comes first.** Not having got to the body is no reason to skip the symbol, and being unable to reach it is no reason to guess: leave it as it is and name it in your output. Undocumented and reported is compliant; a comment written from the symbol's name is the defect. +- **Do not restate what the language's own syntax declares**, such as a type, a visibility modifier, or an override marker. This governs what you write; an existing comment is judged by the order above, and a tag by the next bullet. +- **Correct an existing documentation tag; do not strip or delete it.** A parameter, return, throws, or example entry was written deliberately. Fix what is factually wrong and leave what is right, including parts a convention would omit in new code. Delete a whole tag only when it is wrong and uncorrectable, such as one documenting a parameter the signature no longer has. +- **New comments on private and internal code** are written only where the logic is complex or carries a gotcha, an edge case, a workaround, or a reason the code cannot show, and then as briefly as the fact allows: no comment restating a helper's name or signature, no parameter list repeating the signature, no tour of the body. This rule governs only what you write. It is never a reason to remove an existing comment, which the order above decides. - **A fact is documented once, at its declaration.** A declaration, including an export or re-export statement, is not a use. A statement about a symbol belongs on its declaration, never above a line that reads, calls, or branches on it. Remove a copy above a use only when both sites are in scope, the declaration's body was read, and the copy says no more than the declaration's comment; fold any additional constraint into the declaration first. Otherwise leave both and report the copy. -- **Comments describe the code as it stands (Rule 4), and the test is to name the line.** Delete commented-out code. Point at the code beneath each comment; where no line corresponds, the comment describes a decision, not this code. Correct a public or exported symbol's comment from its body rather than deleting it; delete other comments on that ground. A note about a deliberate omission the code depends on and a file-level header also pass this test. +- **Comments describe the code as it stands (Rule 4), and the test is to name the code.** Point at what each comment describes: a line, a block, the function or declaration it sits on, or the file. A comment explaining why the code beneath it is written the way it is describes that code and passes. A comment naming removed code is corrected towards its replacement, or deleted under the closed list. A note about a deliberate omission the code depends on and a file-level header also pass. - **Form:** a documentation comment is a complete sentence, capitalized and punctuated; a short trailing comment may be a fragment. Wrap long comment lines to the width the file already uses, letting an unbreakable URL exceed it. Use the documentation format's own list syntax for enumerations. Never box a comment in asterisks or other decorative characters. Documentation precedes an annotation or decorator and never sits between it and the declaration. - **Contracts worth stating, where the body shows them:** any cleanup the caller owns (a handle to close, a listener to remove, a subscription to cancel), the error values or exception types a caller can branch on, and a deprecation marker naming its replacement. Name an error or a duty only where the body or a callee you opened returns, raises, or requires it, and call a list of them complete only when every path through the body was read. A deprecation without migration directions is incomplete; add one only where it is provable under Rule 2. - **File and package comments:** where the language has one, it says in one sentence what the file or package is for, in the language's conventional form (a Go package comment opens `Package auth`), and in a large package it may add a second naming the few entry points a caller starts from. It never lists or re-describes members that carry their own comments, which the language's generated reference already lists. A package comment summarizes every file it spans, so write one only once each of those files was read this run. Notes aimed at maintainers rather than consumers go with the implementation instead. @@ -152,6 +163,7 @@ Open one of these when the run needs its detail. Nothing here is loaded until yo - [`writing-for-both-readers.md`](references/writing-for-both-readers.md) - the ordering principle, the four things an opening carries, how to introduce a term of art, and the read-it-cold procedure, each with a before and after pair. Read before writing or revising the opening of a Markdown page. - [`writing-guidelines.md`](references/writing-guidelines.md) - the prose rules for documents: voice, brevity, language, configuration references, citations, snippets, and formatting. Read before writing or changing a sentence in a Markdown page. - [`voice-and-ai-tells.md`](references/voice-and-ai-tells.md) - the tell catalogue with a corrected rewrite for each. Read while writing or revising prose. +- [`existing-comments.md`](references/existing-comments.md) - before-and-after pairs for correcting, tightening, keeping, and deleting an existing code comment. Read before Phase 3 changes a comment. - [`diagram-and-image-accessibility.md`](references/diagram-and-image-accessibility.md) - worked `accTitle` and `accDescr` examples, and how to choose a diagram type. Read before adding or editing a diagram. - [`audit-report.template.md`](assets/audit-report.template.md) - the report shape for the end of the run. @@ -220,8 +232,8 @@ Then confirm: - Every public symbol you touched carries a documentation comment written from its implementation, not from its name, any comment you wrote is at most two sentences, no accurate existing comment gained a sentence except a fold or a deprecation's replacement, and no comment narrates a change, names something that no longer exists, argues the code is safe, or sits commented out. No comment you added sits above a usage site rather than a declaration, and every comment you removed as a repetition either said no more than the declaration's or had what it added folded into the declaration first. - Rendered output was checked, not only the source: diagrams parse, nested lists render, and documentation comments display the intended text. Every table you touched was re-read whole, with each row's cell count matching its header and no cell broken across lines. - Every document you created sits in an existing home or in a directory whose existing documents are the same Diátaxis type, and your output names what decided it. -- No comment you wrote or kept describes something the file does not contain, and every comment you deleted on that ground was one you could not attach to a line. -- No comment in scope, documentation comments and file or package comments included, restates its declaration above the public floor, re-describes members carrying their own comments, or narrates alternatives or reasoning where the code needs only the conclusion, and every cut removed whole sentences and left the rest word for word (Phase 3). +- Every comment you deleted is on Phase 3's closed delete list, none was removed for being private, internal, inside a body, or reasoning, and every drifted comment was corrected rather than removed. +- Every tightened comment lost whole padding sentences only, kept its summary and every reason, constraint, edge case, and warning, and sits inside the requested scope (Phase 3). - No documentation comment on a public or exported symbol, public structure member, package, or module was deleted or cut below one sentence; wrong or absent-content claims were corrected from the body, and comments whose bodies were not read were kept and reported. - Every document you edited in full, judged as a whole rather than paragraph by paragraph, is no longer than a careful human would have written for the same brief (Rule 6), and any split or move you judged necessary was asked about or proposed rather than made. - A passage you wrote that stayed long after Rule 6's trim was weighed for a complementary diagram, table, code/config snippet, or image (Rule 6), and one was added where it fit the content. diff --git a/.claude/skills/audit-docs/agents/surface-auditor.md b/.claude/skills/audit-docs/agents/surface-auditor.md index c236dc0..c360d29 100644 --- a/.claude/skills/audit-docs/agents/surface-auditor.md +++ b/.claude/skills/audit-docs/agents/surface-auditor.md @@ -67,7 +67,7 @@ A comment describing something the file does not contain, which the phrase list Response response = client.send(request); ``` -COMMENT: `Removed the manual retry loop here because the client already retries with backoff.` CODE: `Response response = client.send(request);`. **The test is to name the line the comment describes**, and here no line does: there is no retry loop in the file, so the sentence is about a decision rather than about this code. Run this test on every comment, since the sub-class above it catches only the comments that announce themselves with a banned phrase, and record the entry under `CONTRADICTED` with the absent thing named in the `BEHAVIOUR` line. Two comments pass the test and are never entries: a note about a deliberate omission the code depends on, such as why a field stays out of a payload, describes a constraint on the line beneath it; and a file-level header describes the file rather than any one line. +COMMENT: `Removed the manual retry loop here because the client already retries with backoff.` CODE: `Response response = client.send(request);`. **The test is to name the code the comment describes**: a line, a block, the function or declaration it sits on, or the file. Here the subject is a retry loop the file does not contain, so the sentence is about a decision rather than about this code. Where a current fact remains, the caller keeps it by rewriting the comment: report it under `CONTRADICTED` with the absent thing named in the `BEHAVIOUR` line. Where no current fact remains, the closed delete list permits deletion. Run this test on every comment, since the sub-class above it catches only the comments that announce themselves with a banned phrase. These pass the test and are never entries: a comment explaining why the code beneath it is written the way it is, which describes that code; a note about a deliberate omission the code depends on, such as why a field stays out of a payload; and a file-level header, which describes the file. ## List three: comments repeated above a usage site @@ -94,9 +94,9 @@ A comment can be true, non-repeated, and still carry sentences its reader does n - a sentence restating the declaration or the code beneath it, such as a signature retold in prose or a straightforward conditional, loop, or assignment walked through step by step, except for the public floor sentence, which is always kept even where it restates the name, code, or syntax; - a sentence listing or re-describing members that carry their own comments, which is how a package or type comment turns into a tour of the interface: each member's own comment, and the reference the language generates from them, already carry it; -- a sentence narrating alternatives considered or reasoning walked through, where the code needs only the conclusion. +- a sentence that only narrates alternatives or steps already captured by a later sentence, without stating a reason, constraint, edge case, or warning. -Report the comment's own sentences in two verbatim sets: `KEEP`, the sentences carrying something the code does not show, and `CUT`, each sentence of the three kinds above beside the code string or member comment it restates. For a public or exported symbol, public structure member, or package or module, `KEEP` is never empty: keep its summary sentence, or the first sentence if unclear. A wrong comment in this group is corrected from the body, never deleted; an unread body means keep and report it. A sentence explaining non-obvious internal logic is also always `KEEP`. Never write replacement text: the caller writes any new wording from code it opens itself. A wrong comment also goes under `CONTRADICTED`, and the caller corrects it before cutting. +Report the comment's own sentences in two verbatim sets: `KEEP`, the sentences carrying something the code does not show, and `CUT`, each sentence of the three kinds above beside the code string or member comment it restates. **`KEEP` is never empty for any comment reported here, public or private, documentation or inline**: keep its summary sentence, or the first sentence if unclear. This list tightens a comment and never removes one; a comment whose every sentence restates the line beneath it, with nothing kept, is outside this list and the caller judges it. A sentence giving a reason, a constraint, an edge case, a warning, or an explanation of non-obvious logic is always `KEEP`, since that is the conclusion the code cannot show. A wrong comment is corrected from the body, never deleted; an unread body means keep and report it. Never write replacement text: the caller writes any new wording from code it opens itself. A wrong comment also goes under `CONTRADICTED`, and the caller corrects it before cutting. ```python # We need to check if the user is eligible for the discount. @@ -142,7 +142,7 @@ What remains is the package comment the language convention asks for: one senten Each of these produces noise rather than a finding, so leave each one out of the list named beside it, and only that list: - a comment that is merely terse, or plain, or worded differently from how a convention would word it: every list; -- an internal helper whose name and signature already carry what it does: `UNDOCUMENTED`; +- an internal helper whose name and signature already carry what it does: `UNDOCUMENTED`, since a missing private comment is not a defect. An existing comment on such a helper is still read for `CONTRADICTED` and `VERBOSE`, and its being private is never itself an entry; - a missing comment on a binding inside a function body: `UNDOCUMENTED`; - a comment sitting on a declaration: `REPEATED`, since a declaration, including an export or re-export statement, is not a use. A member's comment and a file-level header are still read for `CONTRADICTED` and `VERBOSE`; - a type annotation restated in prose: `CONTRADICTED`, since it is a style question and not a contradiction, though under `VERBOSE` it is a restating sentence; @@ -189,8 +189,8 @@ BLOCKED BY: VERBOSE :: -KEEP: -CUT: :: +KEEP: +CUT: :: COUNTS Files in scope: diff --git a/.claude/skills/audit-docs/assets/audit-report.template.md b/.claude/skills/audit-docs/assets/audit-report.template.md index 4587724..0d723bd 100644 --- a/.claude/skills/audit-docs/assets/audit-report.template.md +++ b/.claude/skills/audit-docs/assets/audit-report.template.md @@ -85,7 +85,7 @@ Undocumented public symbols outside the change, listed rather than documented: [ | `[path]` | [documented [count] previously undocumented public symbols] | | `[path]` | [created, [tutorial / how-to guide / reference / explanation]] | -Kinds to choose from: made the change the request asked for, corrected a factual statement, documented a public symbol, retained a public documentation comment at its one-sentence floor, corrected an existing documentation tag, removed an outdated or restating internal comment, removed a comment repeated above a usage site, cut sentences from a comment, removed a duplicated section, introduced a term on first use, added orientation for a first-time reader, created, and, only where the request asked or the user approved it, renamed, moved, split, merged, or deleted. +Kinds to choose from: made the change the request asked for, corrected a factual statement, documented a public symbol, retained a public documentation comment at its one-sentence floor, corrected an existing documentation tag, corrected a drifted comment, removed a comment on the closed delete list (commented-out code, restating its code with nothing more, about code that no longer exists, change narration with no current fact, or a use-site comment that says no more than the declaration's comment, removed only when both sites were in scope, the declaration body was read, and any additional constraint was folded into the declaration), cut sentences from a comment, removed a duplicated section, introduced a term on first use, added orientation for a first-time reader, created, and, only where the request asked or the user approved it, renamed, moved, split, merged, or deleted. (One row per file, not one per edit. If no file changed, replace the table with "No files changed.") @@ -123,6 +123,7 @@ This run edits documentation, so a code defect is reported here and left alone. - Every phase carries a status line, including a phase whose answer is that the documentation was already accurate. - Every symbol reported in Phase 3 as left as it stands because its implementation was not read also appears under Unverified. - No documentation comment on a public or exported symbol, public structure member, package, or module was deleted or cut below one sentence. +- Every comment removed, public or private, documentation or inline, is on the closed delete list; every other comment was kept, corrected, or tightened by whole sentences inside the requested scope. - Every file changed is inside the scope, and none was renamed, moved, split, or deleted unless the request asked for it or the user approved it. - Every file named in a phase result appears in the files changed table, and every row of that table is a file that was edited. - The file count in the summary matches the number of rows in the table. diff --git a/.claude/skills/audit-docs/references/existing-comments.md b/.claude/skills/audit-docs/references/existing-comments.md new file mode 100644 index 0000000..1726cd0 --- /dev/null +++ b/.claude/skills/audit-docs/references/existing-comments.md @@ -0,0 +1,121 @@ +# Existing comments: correct, tighten, keep, or delete + +An existing comment was written by someone who knew something about the code. The audit's job is to keep that knowledge accurate, not to restyle it. Each pair below shows one outcome of the ordered tests in Phase 3: the first test that applies decides, and deletion is the narrowest outcome. + +- [Existing comments: correct, tighten, keep, or delete](#existing-comments-correct-tighten-keep-or-delete) + - [Drifted private comment: correct it](#drifted-private-comment-correct-it) + - [Verbose private documentation comment: tighten it](#verbose-private-documentation-comment-tighten-it) + - [In-body comment explaining why: keep it](#in-body-comment-explaining-why-keep-it) + - [Comment restating the line beneath it: delete it](#comment-restating-the-line-beneath-it-delete-it) + - [Change narration carrying a current fact: rewrite it](#change-narration-carrying-a-current-fact-rewrite-it) + - [Outcomes that are defects](#outcomes-that-are-defects) + +## Drifted private comment: correct it + +The helper is private, which is no reason to remove its comment. The comment is wrong, so it is corrected from the body, keeping the wording that is still true. + +Before (TypeScript): + +```ts +/** Retries the request up to three times before giving up. */ +function withRetry(request: () => Promise): Promise { + return retry(request, { attempts: MAX_ATTEMPTS, backoffMs: 250 }); +} +``` + +After, where `MAX_ATTEMPTS` is `5`: + +```ts +/** Retries the request up to `MAX_ATTEMPTS` times, 250 ms apart, before giving up. */ +``` + +## Verbose private documentation comment: tighten it + +The summary and the constraint stay; the sentences restating the parameters and touring the body go, by whole sentences. + +Before (Python): + +```python +def _normalize(path: str) -> str: + """Normalizes a path. + + This helper function takes a path string as its parameter and returns + the normalized path string. It first strips whitespace, then lowercases + the value, then removes any trailing slash. + + Windows drive letters are lowercased too, so callers must not compare + the result against a raw drive path. + """ +``` + +After: + +```python +def _normalize(path: str) -> str: + """Normalizes a path. + + Windows drive letters are lowercased too, so callers must not compare + the result against a raw drive path. + """ +``` + +## In-body comment explaining why: keep it + +The comment names the code beneath it and says why it is written this way, which the code cannot show. It passes the name-the-code test and states a reason, so it stays as written, however short the function. + +```go +func (c *Cache) Get(key string) (Item, bool) { + // Read under the write lock: Get also refreshes the entry's expiry. + c.mu.Lock() + defer c.mu.Unlock() + return c.touch(key) +} +``` + +## Comment restating the line beneath it: delete it + +Every word restates the next line and adds no reason, constraint, edge case, or warning. This is the redundant-comment ground for deletion; the other closed-list grounds also apply, subject to scope. + +Before (Java): + +```java +// Increment counter +counter++; +``` + +After: + +```java +counter++; +``` + +## Change narration carrying a current fact: rewrite it + +The narration goes; the fact it carries stays, stated in the present. + +Before (TypeScript): + +```ts +// Now uses the session token instead of the API key, which was removed. +const headers = { Authorization: `Bearer ${session.token}` }; +``` + +After: + +```ts +// Authenticates with the session token; this endpoint rejects API keys. +const headers = { Authorization: `Bearer ${session.token}` }; +``` + +The rewrite keeps the claim about API keys only where the endpoint's documentation or code was opened this run. Where it was not, the comment becomes `// Authenticates with the session token.` + +## Outcomes that are defects + +Each of these removes knowledge the code does not carry, and none is on the closed delete list: + +- Deleting a private helper's documentation comment because the helper is private or internal. +- Deleting every inline comment in a function because the function is short. +- Deleting a comment explaining why because it is reasoning rather than description. +- Replacing a verbose comment with nothing instead of cutting its padding sentences. +- Deleting a comment you are unsure about instead of keeping it and reporting it. +- Trimming a redundant or verbose comment outside the requested scope, where only a drifted comment is corrected. diff --git a/.claude/skills/audit-pr/references/review-categories.md b/.claude/skills/audit-pr/references/review-categories.md index e6c953c..76994f7 100644 --- a/.claude/skills/audit-pr/references/review-categories.md +++ b/.claude/skills/audit-pr/references/review-categories.md @@ -57,7 +57,7 @@ The manifest and lockfile pair for each ecosystem, how to read an installed pack **Test logic that reached production code:** a test-environment branch, an export that exists only so a test can reach it, a mock or sample value on a production path, a flag that disables behaviour under test. -**Tells of generated code**, which are review targets rather than accusations: an abstraction with one caller, a generic parameter with one instantiation, a helper duplicating one already in the repository under a different name, an API call that is plausible but absent from the library's surface, error handling that catches and logs without changing the outcome, and a comment that narrates the change ("now uses X", "updated to handle Y") or explains an absence ("removed X because", "we no longer need Y") instead of describing the code. The test that catches the second without a phrase list: point at the line the comment describes. A comment you cannot attach to a line beneath it is about a decision rather than about this code, and the reader who wants that decision is looking at the pull request. +**Tells of generated code**, which are review targets rather than accusations: an abstraction with one caller, a generic parameter with one instantiation, a helper duplicating one already in the repository under a different name, an API call that is plausible but absent from the library's surface, error handling that catches and logs without changing the outcome, and a comment that narrates the change ("now uses X", "updated to handle Y") or explains an absence ("removed X because", "we no longer need Y") instead of describing the code. The test that catches the second without a phrase list: name the code the comment describes, whether a line, a block, a function, or the file. A comment giving the reason the code is written as it is passes, since the reason belongs to that code; one that names no code at all is about a decision, and the reader who wants that decision is looking at the pull request. ## 6. Architecture and design @@ -100,7 +100,7 @@ Algorithmic complexity, N+1 queries, missing caching, oversized payloads, synchr ## 9. Documentation and comments -Public surfaces documented, existing comments still accurate after the change, why-comments for non-obvious logic, the pull request description updated, and external documentation still accurate. Flag specific drift as a finding. Correcting the documentation itself is separate work and is not part of this review. A deprecation names its replacement. A tunable value is documented by the name a consumer changes it by. +Public surfaces documented, existing comments still accurate after the change, why-comments for non-obvious logic, the pull request description updated, and external documentation still accurate. Flag specific drift as a finding, and recommend correcting a drifted comment towards the code rather than deleting it. Correcting the documentation itself is separate work and is not part of this review. A deprecation names its replacement. A tunable value is documented by the name a consumer changes it by. ## 10. Standards and style diff --git a/.claude/skills/typescript-code-and-test-standards/SKILL.md b/.claude/skills/typescript-code-and-test-standards/SKILL.md index 154466c..c86245a 100644 --- a/.claude/skills/typescript-code-and-test-standards/SKILL.md +++ b/.claude/skills/typescript-code-and-test-standards/SKILL.md @@ -113,12 +113,12 @@ Writing new code, reviewing a diff, and fixing a failing test are different jobs ## Comments - **Comments describe the code as it stands.** Never narrate a change, a fix, or a prior state ("now uses", "changed to", "previously", "no longer", "restored"). Version control carries that, and the comment outlives the change that prompted it. -- **Name the line the comment describes.** Point at the code beneath it; where no line corresponds, the comment describes a decision, not this code. _Bad:_ `// Removed the retry wrapper here since the SDK retries internally.` For an internal comment, remove it; on an exported symbol, correct the block from its body instead. +- **Name the code the comment describes**: a line, a block, the function it sits on, or the file. A comment giving the reason the code is written as it is describes that code and passes. _Bad:_ `// Removed the retry wrapper here since the SDK retries internally.` names a wrapper that is not there. Correct it to the current fact it carries, `// The SDK retries internally, so this call is not wrapped.`, and delete it only when no current fact remains. - **Never argue that the code is correct or safe.** A note defending a decision documents the edit rather than the code. Say what something does or why it exists; do not justify that it works. - A comment that contradicts the code is **corrected, not deleted**. When the two disagree, the code is the truth. -- Delete commented-out code rather than leaving it in place. -- Inside a function body, a comment restating the line beneath it is noise. Delete those, and keep anything carrying a constraint, hazard, or non-obvious behaviour. On a public surface, one sentence saying what a symbol does is not a defect even where its name says so too; a block restating the signature at length is (see **Documentation blocks**). -- **A fact about a symbol is documented once, on its declaration.** An export or re-export statement is a declaration, not a use. Never repeat the fact above a line that reads, calls, or branches on the symbol: `// isBetaEnabled mirrors the beta-features flag` belongs on its declaration, not above each `if (isBetaEnabled)`. Each member of an exported structure is its own declaration and keeps its own block. Fold a constraint from a use-site copy into the declaration. +- **An existing comment is kept by default, public and private alike.** Delete only commented-out code, a comment whose every sentence restates the name, signature, or line beneath it, a comment about code that no longer exists with no current fact to correct it towards, change narration stating no current fact, and a copy above a use of what the declaration's comment already says, removed only under the guard in the next rule. Being private, short, or not a comment you would have written is never a reason. A verbose comment is tightened by whole sentences, keeping its summary and every reason, constraint, edge case, or warning, and is never removed whole. Trim only inside the code you were asked to work on; elsewhere, only correct drift. +- Inside a function body, a comment restating the line beneath it is noise. Delete those, and keep anything carrying a reason, constraint, hazard, or non-obvious behaviour. On a public surface, one sentence saying what a symbol does is not a defect even where its name says so too; a block restating the signature at length is (see **Documentation blocks**). +- **A fact about a symbol is documented once, on its declaration.** An export or re-export statement is a declaration, not a use. Never repeat the fact above a line that reads, calls, or branches on the symbol: `// isBetaEnabled mirrors the beta-features flag` belongs on its declaration, not above each `if (isBetaEnabled)`. Each member of an exported structure is its own declaration and keeps its own block. Remove a use-site copy only where both sites are in scope, the declaration's body was read, and the copy says no more than the declaration's comment; fold any additional constraint into the declaration first, and otherwise leave both and say so. - **Never delete a tooling directive.** `//@ts-check`, `/// `, `// @ts-expect-error`, `eslint-disable`, `biome-ignore`, `istanbul ignore`, and `prettier-ignore` are instructions to a tool, not commentary. **Moving one is not deleting it.** Where the same directive repeats across files and the tool reads that same setting from its own configuration, setting the key once and removing the copies relocates the instruction rather than discarding it, and the number of copies removed goes in the change. What this rule forbids is stripping a directive during work that had no reason to touch it. - Use `//` for implementation notes, and consecutive `//` lines for a multi-line note. No `/* */` block inside a function body, with one exception: naming an argument at a call site, `someFunction(/* shouldRender= */ true)`. @@ -126,8 +126,8 @@ Writing new code, reviewing a diff, and fixing a failing test are different jobs - **Every exported symbol carries a documentation block**, as do members of an exported structure: interface properties, object keys, and enum values. Never delete or cut below one sentence a block on an exported symbol, an exported structure member, or a package or module. Keep the sentence saying what it does, even where it restates the name, code, or syntax; where unclear, keep the first sentence. Correct a wrong or absent-content claim from the body. If the body was not read, keep the comment and report it. Write new blocks from the body, never the name: one sentence saying what the symbol does, and a second only for an error, input constraint, or caller obligation the body or a test proves. Write no reason or invariant you cannot point to in the code. - **A file-level block** (`@file`, `@fileoverview`, `@packageDocumentation`) **is one sentence saying what the module is for.** It never lists or re-describes exports that carry their own blocks. -- **Cut a verbose block by whole sentences, above the public floor.** Keep every other sentence word for word, and keep or cut together sentences that depend on one another. A reworded or merged sentence is a new claim that needs the body behind it. Tags follow the rule on existing tags below. -- A private helper gets a block when its behaviour is not evident from its name and signature. A binding declared inside a function body does not. +- **Cut a verbose block by whole sentences, above the public floor.** A summary sentence and every sentence giving a reason, constraint, edge case, or warning stay. Keep every other sentence word for word, and keep or cut together sentences that depend on one another. A reworded or merged sentence is a new claim that needs the body behind it. Tags follow the rule on existing tags below. +- A private helper gets a **new** block only when its behaviour is not evident from its name and signature: non-obvious logic, a reason, or a constraint. An existing block on one is kept under the rules in **Comments**. A binding declared inside a function body gets no new block. - **Types in a documentation block depend on whether the file is type-checked.** In a file TypeScript checks, omit `@param {string}`, `@returns {number}`, `@type`, and `@typedef`: the compiler already carries the type, so the annotation becomes prose that drifts from the signature. **In a plain JavaScript file where the documentation block is the type system**, those annotations are load-bearing and stay. Check `tsconfig.json`, `jsconfig.json`, and any `//@ts-check` directive before removing one. - **Leave existing tags alone unless they are wrong.** A tag already in the tree was added deliberately, annotation and all. Read the surrounding code, correct what is factually wrong, and change nothing else: do not strip a `{type}` annotation, reword accurate prose, or delete a tag for looking redundant. Delete one only when it is wrong and uncorrectable, such as documenting a parameter the signature no longer has. - `@throws`, `@example`, `@deprecated`, and `@see` are encouraged: none are expressible in the type system. `@deprecated` names its replacement. diff --git a/.claude/skills/typescript-code-and-test-standards/agents/comment-and-jsdoc-auditor.md b/.claude/skills/typescript-code-and-test-standards/agents/comment-and-jsdoc-auditor.md index 4f09462..fbf1411 100644 --- a/.claude/skills/typescript-code-and-test-standards/agents/comment-and-jsdoc-auditor.md +++ b/.claude/skills/typescript-code-and-test-standards/agents/comment-and-jsdoc-auditor.md @@ -43,7 +43,7 @@ Every exported symbol carries a documentation block, and so does every member of - Where you have read the implementation body and it is undocumented, report it as missing and say in one clause what the body does, so the caller can write the block. That block is one sentence, and two only where the body proves an error, a constraint on the input, or an obligation on the caller. - **Where you could not read the body**, report it under `UNVERIFIED` and say why. Do not describe what you think it does. A symbol reported as unverified is a correct outcome; a plausible description invented from its name is not. -A private helper needs a block only when its behaviour is not evident from its name and signature. A binding inside a function body does not. +A private helper needs a new block only when its behaviour is not evident from its name and signature. A binding inside a function body does not. These criteria decide what is missing, never what is removable: an existing block on a private helper is checked by the comment rules below like any other, and being private is never itself a finding. ## Types in a documentation block @@ -70,11 +70,11 @@ Report a tag only when it is **factually wrong**: it describes a parameter the s ## Comment rules to check - **Narrates a change.** Any comment about a change, a fix, or a prior state: "now uses", "changed to", "updated to", "previously", "no longer", "restored", "switched from", or any paraphrase. Finding. -- **Describes something the file does not contain.** Name the line beneath the comment; where no line corresponds, it describes a decision, not this code. Quote it and name what it says is absent. For an internal comment, the fix is deletion; on a public or exported symbol, public structure member, package, or module, correct it from its body instead. Two comments that pass this test are a note about a deliberate omission the code depends on and a file-level header. +- **Describes something the file does not contain.** Name the code the comment describes: a line, a block, the function it sits on, or the file. Where none corresponds, it describes a decision, not this code. Quote it and name what it says is absent. The fix is to correct it to the current fact it carries, such as `The SDK retries with backoff, so this call is not wrapped.`; deletion is the fix only when no current fact remains. Three comments pass this test: one giving the reason the code beneath it is written as it is, a note about a deliberate omission the code depends on, and a file-level header. - **Argues the code is correct or safe.** A comment defending a decision or asserting that something works documents the edit rather than the code. Finding. - **Contradicts the code.** Finding, and the fix is to **correct the comment, not delete it**. The code is the truth; the mismatch is often the most interesting thing in the file. -- **Restates the line beneath it**, inside a function body. Finding, and the fix is deletion. On a public surface, one sentence saying what the symbol does is not a finding even where its name says so too. -- **A documentation block carrying sentences its reader does not need.** A sentence restating the signature or code beneath it, other than the public floor sentence, a sentence re-describing documented members, or a sentence narrating alternatives where the code needs only the conclusion. Finding. Quote the sentences to cut and keep. A public or exported symbol, public structure member, package, or module always has a non-empty `KEEP`: the sentence saying what it does, or the first sentence when unclear. Correct a wrong comment from the body, never delete it; if the body was not read, keep and report it. Cut whole sentences and reword none. Tags are not part of this finding. +- **Restates the line beneath it**, inside a function body, in every sentence. Finding, and the fix is deletion. A comment with any sentence giving a reason, constraint, edge case, or warning is not this finding; where padding surrounds such a sentence, it is the verbose finding below. On a public surface, one sentence saying what the symbol does is not a finding even where its name says so too. +- **A documentation block carrying sentences its reader does not need.** A sentence restating the signature or code beneath it, other than the public floor sentence, a sentence re-describing documented members, or a sentence narrating alternatives where the code needs only the conclusion. Finding. Quote the sentences to cut and keep. A summary sentence and every reason, constraint, edge case, or warning are always `KEEP`, so `KEEP` is never empty on any comment. A public or exported symbol, public structure member, package, or module always has a non-empty `KEEP`: the sentence saying what it does, or the first sentence when unclear. Correct a wrong comment from the body, never delete it; if the body was not read, keep and report it. Cut whole sentences and reword none. Tags are not part of this finding. - **Commented-out code.** Finding, and the fix is deletion. - **Markdown link syntax inside a documentation block.** `[text](url)`, and worse `[name](#anchor)`, which renders as dead text in a hover tooltip. Finding. The fix is `{@link SymbolName}`, `@see https://example.com`, or `{@link https://example.com Display text}`. - **A block comment inside a function body.** Finding, with one exception: naming an argument at a call site, `someFunction(/* shouldRender= */ true)`. diff --git a/.claude/skills/typescript-code-and-test-standards/assets/copilot-instructions.template.md b/.claude/skills/typescript-code-and-test-standards/assets/copilot-instructions.template.md index 7c5ddb4..c85ccc6 100644 --- a/.claude/skills/typescript-code-and-test-standards/assets/copilot-instructions.template.md +++ b/.claude/skills/typescript-code-and-test-standards/assets/copilot-instructions.template.md @@ -17,8 +17,9 @@ Everything below is what those tools cannot check. ## Comments - **Comments describe the code as it stands.** Never narrate a change, a fix, or a prior state ("now uses", "changed to", "previously", "no longer", "restored"). Version control carries that, and the comment outlives the change that prompted it. -- **Name the line a comment describes.** Where no line corresponds, correct a public or exported symbol's comment from its body; delete an internal comment on that ground. Never delete or cut below one sentence the comment on a public or exported symbol, a public structure member, or a package or module. Keep the sentence saying what it does, even where it restates the name, code, or syntax; where unclear, keep the first sentence. If the body was not read, keep the comment and report it. -- **Never argue that the code is correct or safe.** A note defending a decision documents the edit rather than the code. +- **Name the code a comment describes**: a line, a block, the function, or the file. A comment giving the reason the code is written as it is passes. Where no code corresponds, correct the comment to the current fact it carries, and delete it only when none remains. +- **An existing comment is kept by default, public and private alike.** Delete only commented-out code, a comment whose every sentence restates the code beneath it, change narration stating no current fact, and a use-site copy of what the declaration's comment already says, where both sites are in scope, the declaration's body was read, and the copy adds nothing. A verbose comment is tightened by whole sentences, keeping its summary and every reason, constraint, or warning. Trim only inside the code you were asked to work on. Never delete or cut below one sentence the comment on a public or exported symbol, a public structure member, or a package or module. Keep the sentence saying what it does, even where it restates the name, code, or syntax; where unclear, keep the first sentence. If the body was not read, keep the comment and report it. +- **Never argue that the code is correct or safe.** A note defending a decision documents the edit rather than the code; a sentence giving the reason the code is written as it is stays. - A comment that contradicts the code is **corrected, not deleted**. The code is the truth. - Delete commented-out code. - Inside a function body, a comment restating the line beneath it is noise. On a public surface, one sentence saying what a symbol does is not a defect even where its name says so too. diff --git a/.claude/skills/typescript-code-and-test-standards/references/comments-and-jsdoc.md b/.claude/skills/typescript-code-and-test-standards/references/comments-and-jsdoc.md index c11c1a7..5171dc7 100644 --- a/.claude/skills/typescript-code-and-test-standards/references/comments-and-jsdoc.md +++ b/.claude/skills/typescript-code-and-test-standards/references/comments-and-jsdoc.md @@ -46,18 +46,19 @@ The bad version becomes a lie the first time someone adds a second cache, and it The banned openers catch a comment that announces it is about a change. They miss the more common one, which reads as ordinary rationale and is really a note about something that is not there. -The test is mechanical: **name the line the comment describes.** Point at the code beneath it that the comment is about. Where no line corresponds, the comment is about a decision rather than about this code, and a decision belongs in the commit message, where the diff that proves it lives. +The test is mechanical: **name the code the comment describes**, whether a line, a block, the function it sits on, or the file. A comment giving the reason the code beneath it is written as it is names that code and passes. Where no code corresponds, the comment is about a decision rather than about this code. Correct it to the current fact it carries; a sentence about the decision itself belongs in the commit message, where the diff that proves it lives. ```ts // Bad: explains something the file does not contain // Removed the manual retry loop here because the SDK already retries with backoff. const response = await client.send(request); -// Good: nothing here, and that sentence in the commit message +// Good: the current fact the comment was carrying +// The SDK retries with backoff, so this call is not wrapped. const response = await client.send(request); ``` -A reader of the bad version cannot check it. There is no retry loop to compare against, no way to tell whether the claim about the SDK is still true, and nothing to do with the information. Six months on, the comment survives a change to the SDK that the sentence no longer describes. +A reader of the bad version cannot check it: there is no retry loop to compare against. The good version keeps the fact the bad one carried, that the SDK retries, as a constraint on the line beneath it, which a reader can check against the SDK. Delete such a comment only when no current fact remains in it. Two comments pass this test and are not findings. A note about a deliberate omission the code depends on, such as why a field must stay out of a payload, describes a real constraint on the line beneath it. A file-level header describes the file rather than any single line. @@ -84,7 +85,7 @@ Say what something does, or why it exists. Do not justify that it works. **When a comment contradicts the code, the code is the truth and the comment is corrected.** Deleting it loses whatever the comment was reaching for, and the mismatch is often the most interesting thing in the file: it usually means either the comment described an intent the code abandoned, or the code drifted from a constraint that still holds. -Delete an internal comment only when it restates the line beneath it or is commented-out code. Never delete or cut below one sentence a public or exported symbol's comment, a public structure member's comment, or a package or module comment. Keep the sentence saying what it does, even if it restates the name, code, or syntax; where unclear, keep the first sentence. Correct a wrong or absent-content claim from the body. If the body was not read, keep the comment and report it. +**An existing comment is kept by default, public and private alike.** Delete one only when it is commented-out code, every sentence restates the name, signature, or line beneath it, it describes code that no longer exists with no current fact to correct it towards, it narrates a change stating no current fact, or it copies above a use what the declaration's comment already says, where both sites are in scope, the declaration's body was read, and the copy adds nothing. Being private, short, or not a comment you would have written is never a reason. A verbose comment is tightened by whole sentences, keeping its summary and every reason, constraint, edge case, or warning; it is never removed whole. Trim only inside the code you were asked to work on; elsewhere, only correct drift. Never delete or cut below one sentence a public or exported symbol's comment, a public structure member's comment, or a package or module comment. Keep the sentence saying what it does, even if it restates the name, code, or syntax; where unclear, keep the first sentence. Correct a wrong or absent-content claim from the body. If the body was not read, keep the comment and report it. ## Comments that restate the line beneath them @@ -115,7 +116,7 @@ A bundler magic comment in particular looks like commentary and is load-bearing. **Every exported symbol**, and every member of an exported structure: interface properties, object keys, enum values, and class members that are part of the public surface. -A private helper carries one when its behaviour is not evident from its name and signature. A binding declared inside a function body does not: the name and type already carry it. +A private helper gets a new one only when its behaviour is not evident from its name and signature: non-obvious logic, a reason, or a constraint. A binding declared inside a function body gets no new one: the name and type already carry it. These criteria govern writing a block; an existing block on a private helper is kept, corrected, or tightened under the rules above, never removed for being private. Write the block from the body, never from the name. It is one sentence saying what the symbol does, and a second only for something the signature cannot express that the body or a test proves: diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index aedd063..4f65cbb 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -28,7 +28,7 @@ npm run build # Production build **Never make the repository depend on AI agent files.** If `.claude/`, `.claude-plugin/`, and `.github/prompts/` were deleted, everything must still build, test, and lint. `.claude-plugin/` holds only the plugin marketplace, which sits there because VS Code looks for a marketplace only at the repository root. No `package.json` script, config, workflow, or page under `docs/` may reference or invoke anything in them. The dependency runs one way: agent tooling may name a project command, never the reverse. The only exception is an ignore or exclude glob, which is inert when the path is absent. Agent tooling that needs running gets a target in `.claude/Makefile`, which is deleted along with the tooling it drives. -**Documentation and comments describe the current state, in every file type.** A comment, document, or config header states what the code does now. Never narrate the past ("replaces", "used to", "formerly", "for the first time", "unlike the old") and never name a file, flag, or tool that no longer exists: git carries that history, and a reader cannot check a claim against something that is gone. The future belongs nowhere but a `TODO`. Rationale worth keeping goes in a decision record of its own under `docs/`, created when the first one is needed, rather than scattered through the files it explains. +**Documentation and comments describe the current state, in every file type.** A comment, document, or config header states what the code does now. Never narrate the past ("replaces", "used to", "formerly", "for the first time", "unlike the old") and never name a file, flag, or tool that no longer exists: git carries that history, and a reader cannot check a claim against something that is gone. The future belongs nowhere but a `TODO`. An architectural or cross-cutting decision goes in a decision record of its own under `docs/`, created when the first one is needed, rather than scattered through the files it touches. The reason a particular piece of code is written as it is stays in a comment beside that code. ### Testing Requirements @@ -163,9 +163,9 @@ Not adopted: the ban on default exports (this repository uses them for the modul ### Comments & JSDoc -- **Comments describe the code as it stands.** Never narrate a change, fix, or prior state ("now uses", "previously", "no longer", "restored", "replaces", "used to", "formerly", "for the first time"), and never name a file, flag, or tool that no longer exists. Never argue that the code is correct or safe. **Name the line each comment describes.** Where no line corresponds, correct a public or exported symbol's comment from its body; delete an internal comment on that ground. Delete commented-out code. A comment contradicting the code is corrected, not deleted. A note about a deliberate omission the code depends on, and a file header, pass this test. +- **Comments describe the code as it stands.** Never narrate a change, fix, or prior state ("now uses", "previously", "no longer", "restored", "replaces", "used to", "formerly", "for the first time"), and never name a file, flag, or tool that no longer exists. Never argue that the code is correct or safe; a sentence giving the reason the code is written as it is is not an argument and stays. **Name the code each comment describes** (a line, a block, the function, or the file). Where no code corresponds, correct the comment to the current fact it carries, and delete it only when none remains. **An existing comment, public or private, is kept by default**: delete it only when it is commented-out code, every sentence restates the code beneath it, it narrates a change stating no current fact, or it copies above a use what the declaration's comment already says (under the guard below). Being private or short is never a reason. A verbose comment is tightened by whole sentences, keeping its summary and every reason, constraint, or warning, and only inside the requested scope. Delete commented-out code. A comment contradicting the code is corrected, not deleted. A note about a deliberate omission the code depends on, and a file header, pass this test. - **Every exported symbol carries a `/** */` block**, as do members of an exported structure (interface properties, object keys, enum values). Never delete the block or cut it below one sentence. Keep the sentence saying what the symbol does, even where it restates the name, code, or syntax; where unclear, keep the first sentence. Correct a wrong or absent-content claim from the body. If the body was not read, keep the block and report it. Write new blocks from the body: one sentence saying what the symbol does, and a second only for an error, constraint, or caller obligation the body or a test proves. A file-level block says what the module is for and never tours its exports. Cut other sentences by whole sentences; tags follow the rule on existing tags below. -- A private helper gets a block when its name and signature do not carry it; a binding inside a function body does not, and a comment there that restates the next line is noise. **A fact about a symbol is stated once, on its declaration.** An export or re-export statement is a declaration, not a use. Never repeat a fact above a line that reads, calls, or branches on the symbol. A member of an exported structure is its own declaration. Remove a copy above a use only where both sites are in scope, the declaration's body was read, and the copy says no more than the declaration's comment; fold any additional constraint into the declaration first. Otherwise leave both and say so. +- A private helper gets a **new** block only when its name and signature do not carry it (non-obvious logic, a reason, or a constraint); an existing one is kept under the rule above. A binding inside a function body gets no new block, and a comment there whose every sentence restates the next line is noise. **A fact about a symbol is stated once, on its declaration.** An export or re-export statement is a declaration, not a use. Never repeat a fact above a line that reads, calls, or branches on the symbol. A member of an exported structure is its own declaration. Remove a copy above a use only where both sites are in scope, the declaration's body was read, and the copy says no more than the declaration's comment; fold any additional constraint into the declaration first. Otherwise leave both and say so. - **In a block you write, do not put types in JSDoc.** TypeScript ignores `@param {string}`, `@returns {number}`, `@type`, and `@typedef` in `.ts`/`.tsx`, so they drift from the signature. Skip `@implements`, `@enum`, `@private`, and `@override` beside the keyword, and add `@param`/`@returns` where they say more than the name and type do - **Leave existing tags alone unless wrong.** A `@param`/`@returns` already in the tree was added deliberately, annotation and all. Read the surrounding code, fix what is factually wrong, change nothing else: do not strip a `{type}`, reword accurate prose, or delete a tag for looking redundant. Delete only when wrong and uncorrectable, such as documenting a parameter the signature no longer has - `@throws`, `@example`, `@deprecated` (naming its replacement), and `@see` are encouraged: none are expressible in the type system. Open a block with a third-person verb phrase; one tag per line; bodies are Markdown diff --git a/.github/prompts/audit-docs.prompt.md b/.github/prompts/audit-docs.prompt.md index a6d6c2a..e2cf4ca 100644 --- a/.github/prompts/audit-docs.prompt.md +++ b/.github/prompts/audit-docs.prompt.md @@ -46,16 +46,16 @@ Act as a **Strictly Factual Technical Writer and Auditor**. Make the project's d ### Phase 3: in-code documentation audit -Phase 3 runs on every audit, whatever Phases 1 and 2 found, over the code files in scope; where there are none, say so. A floor holds over every cutting and deletion rule below: the comment on a public or exported symbol, a public structure member, or a package or module is never deleted or cut below its sentence saying what it does, even where that sentence restates the name, code, or syntax. Correct a wrong or absent-content claim from the body; when the body was not read, keep the comment and report it. Phase 3 corrects what is wrong, documents what is absent in scope, and cuts what a comment does not need. +Phase 3 runs on every audit, whatever Phases 1 and 2 found, over the code files in scope; where there are none, say so. **Comments are corrected, not deleted.** Every existing comment, public or private, documentation or inline, stays unless the closed delete list below names it. Judge each by the first test that applies: **drifted** (it contradicts the code): correct it from the body; **wholly redundant** (every sentence restates the code beneath it, as `// Increment counter` does): delete it only in scope and unless the public floor holds; **verbose**: cut padding sentences, keeping the summary and every reason, constraint, edge case, or warning, so it never goes whole; otherwise it stays as written. The closed delete list is that redundant comment, commented-out code, a comment about code that no longer exists with nothing current to correct it towards, change narration stating no current fact, a TODO whose work is visibly done, and a copy of a fact above a use of a symbol whose declaration's comment already says it, under the guard in the once-at-its-declaration rule. Deleting a comment for being private, internal, short, or one you would not have written is a defect; when unsure, keep it and report it. Redundancy and verbosity are judged only inside the requested scope (the files and code a pull request touched, a named directory, a named function); elsewhere, only correct drift. A floor also holds: the comment on a public or exported symbol, a public structure member, or a package or module is never deleted or cut below its sentence saying what it does, even where it restates the name. When the body was not read, keep the comment and report it. - **Scope:** the code the scope rule above resolved to, covering its documentation comments, inline comments, and file-level headers, plus every `.md` file inside that scope which sits outside `docs/`. A file the rule did not resolve to stays out whatever it contains, so this phase is never a repository-wide sweep for markdown, for undocumented symbols, or for a comment pattern. On a pull request or working changes, write a missing comment only for a symbol the diff added or changed, and list the other undocumented symbols in those files in your output. -- **Actions:** scan comments, read the implementation, and correct inaccuracies; remove inaccurate internal comments and orphaned TODOs. Cut bloat above the public floor, then document each public symbol in scope that lacks a comment. **Cutting works by whole sentences.** Cut sentences that restate code, re-describe documented members, or narrate alternatives or reasoning where the code needs only the conclusion. Keep other sentences word for word; keep or cut together sentences that depend on one another. A comment made of nothing else goes entirely unless the floor holds it. A public summary and a sentence explaining non-obvious internal logic always stay. Reworded or merged sentences are new claims needing proof (Rule 2). Correct a wrong, long comment before cutting it. +- **Actions:** scan comments, read the implementation, and correct inaccuracies. Tighten verbose comments within scope, then document each public symbol in scope that lacks a comment. **Cutting works by whole sentences.** Cut sentences that restate code, re-describe documented members, or narrate rejected alternatives only when they state no reason, constraint, edge case, or warning. Keep other sentences word for word; keep or cut together sentences that depend on one another. A summary sentence and any sentence giving a reason, constraint, edge case, warning, or non-obvious logic always stay: a why-comment is never cut for being reasoning. Reworded or merged sentences are new claims needing proof (Rule 2). Correct a wrong, long comment before cutting it. - **Document the public surface in scope, from the body.** Every public or exported symbol in scope carries a documentation comment, as do the members of a public structure: fields, properties, keys, enum values. Open the body and write the comment from it, in the language's conventional form (a Go comment opens with the symbol's name, a Python docstring with a one-line summary): one sentence saying what the symbol does, even where the name makes that obvious, since being obvious is not a defect on a public surface and being absent is. A second sentence is allowed only for an error, constraint, or caller obligation that a body line, test assertion, configuration value, or decision record opened this run proves, and a comment you write stops there; an accurate existing comment gains no sentence except a fold or a deprecation's replacement (below). Write no reason or invariant you cannot quote. A member's comment states what code in scope that sets or reads it shows. **Rule 2 still governs, and it comes first.** Not having got to the body is no reason to skip the symbol, and being unable to reach it is no reason to guess. Where you have not read the body, leave the symbol and name it in your output: undocumented and reported is compliant, and a comment written from the name is the defect. - **Do not restate what the language's own syntax declares.** This governs what you write; in an existing comment, cut such a sentence only above the public floor. A tag follows the next bullet. - **Correct an existing documentation tag; do not strip or delete it.** A parameter, return, throws, or example entry was written deliberately. Read enough surrounding code to judge it, then fix what is factually wrong and leave what is right, including parts a convention would omit in new code. Removing a tag, or a piece of one, because it looks redundant is restyling someone else's work, not auditing it. Delete a whole tag only when it is wrong and uncorrectable, such as one documenting a parameter the signature no longer has. Phase 2's "default to correcting, not deleting" governs in-code documentation too. -- **Internal elements** are documented only where the logic is complex or carries a gotcha or edge case, and a comment inside a function body is written only for non-obvious business logic, a workaround, or a complex transformation. Delete an internal comment only when it restates the line beneath it, such as `// Increment counter` above a counter increment (delete the comment, keep the code). +- **New comments on internal code:** write one on a private element or inside a function body only for complex logic, a gotcha, an edge case, a workaround, or a rationale the code cannot show, never one restating the obvious. This governs what you write and is never a reason to remove an existing comment. - **A fact is documented once, at its declaration.** An export or re-export statement is a declaration, not a use. Remove a copy above a use only when the declaration and use are in scope, the declaration's body was read, and the copy says no more than its comment; fold any additional constraint into the declaration first. Otherwise leave both and report the copy. -- **Comments describe the code as it stands (Rule 4); name the line.** Delete commented-out code. Where no line corresponds, correct a public or exported symbol's comment from its body; delete other comments on that ground. A note about a deliberate omission the code depends on and a file-level header also stay. +- **Comments describe the code as it stands (Rule 4); name the code** each describes: a line, a block, the function or declaration it sits on, or the file. A comment explaining why the code beneath it is written that way passes, as do a note about a deliberate omission and a file-level header. A comment about code that no longer exists is corrected towards the current code, or deleted under the closed list only when nothing current remains to state. - **Form:** a documentation comment is a complete sentence, capitalized and punctuated; a short trailing comment may be a fragment. Wrap long comment lines to the width the file already uses, letting an unbreakable URL exceed it. Use the documentation format's own list syntax for enumerations. Never box a comment in asterisks or other decorative characters. Documentation precedes an annotation or decorator and never sits between it and the declaration. - **Contracts worth stating, where the body shows them:** any cleanup the caller owns (a handle to close, a listener to remove, a subscription to cancel), the error values or exception types a caller can branch on, and a deprecation marker naming its replacement. Name an error or duty only where the body or a callee you opened returns, raises, or requires it, and call a list complete only when every path was read. A deprecation without migration directions is incomplete; add one only where it is provable under Rule 2. - **File and package comments:** where the language has one, it says in one sentence what the file or package is for, in its conventional form (a Go package comment opens `Package auth`); a large package may add one naming the few entry points a caller starts from. It never lists or re-describes members carrying their own comments, which generated reference already lists, and is written only once every file it spans was read. Maintainer notes go with the implementation. @@ -97,7 +97,7 @@ Every statement must be grounded in code you have **opened and read in full duri ### Rule 4: Current state only -Documentation and comments describe the code as it is now. Never narrate a change, a fix, or a prior state ("now uses", "previously", "no longer", "restored", "replaces", "used to", "formerly", "for the first time", "unlike the old"), never argue that the code is correct or safe, and never name a file, flag, symbol, or tool that no longer exists: version control already carries that history. The only sanctioned place for future intent is a `TODO` in the code that will change, in that codebase's form; documentation itself carries none, so no empty sections, stubs, or "add details here" placeholders, and if the code does not exist, neither should its documentation. Rationale worth keeping goes in its own decision record, not scattered through the files it explains. +Documentation and comments describe the code as it is now. Never narrate a change, a fix, or a prior state ("now uses", "previously", "no longer", "restored", "replaces", "used to", "formerly", "for the first time", "unlike the old"), never argue that the code is correct or safe, and never name a file, flag, symbol, or tool that no longer exists: version control already carries that history. The only sanctioned place for future intent is a `TODO` in the code that will change, in that codebase's form; documentation itself carries none, so no empty sections, stubs, or "add details here" placeholders, and if the code does not exist, neither should its documentation. An architectural or cross-cutting decision goes in its own decision record, not scattered through the files it touches; the reason a particular piece of code is written as it is stays in a comment beside that code. ### Rule 5: Mermaid diagram and image accessibility (zero tolerance) @@ -210,8 +210,8 @@ Then confirm: - Every public symbol you touched carries a documentation comment written from its implementation, not its name, any comment you wrote is at most two sentences, no accurate existing comment gained a sentence except a fold or a deprecation's replacement, and none narrates a change, names something gone, argues the code is safe, or sits commented out. No comment you added sits above a usage site rather than a declaration, and every one you removed as a repetition either said no more than the declaration's or had its addition folded in first. - Rendered output was checked, not only the source: diagrams parse, nested lists render, and documentation comments display the intended text. Every table you touched was re-read whole, with each row's cell count matching its header and no cell broken across lines. - Every document you created sits in an existing home or a directory whose documents are the same Diátaxis type, and your output names what decided it. -- No comment you wrote or kept describes something the file does not contain, and every comment you deleted on that ground was one you could not attach to a line. -- No comment in scope, documentation and file or package comments included, restates its declaration above the public floor, re-describes members carrying their own comments, or narrates alternatives or reasoning where the code needs only the conclusion, and every cut removed whole sentences and left the rest word for word. +- Every comment deleted, public or private, is on the closed delete list; every other existing comment was kept, corrected, or tightened, and no comment was removed for being private or internal. +- No comment you wrote or kept describes something the file does not contain, and every cut removed whole sentences inside the requested scope, kept each summary, reason, constraint, edge case, and warning, and left the rest word for word. - No documentation comment on a public or exported symbol, public structure member, package, or module was deleted or cut below one sentence; wrong or absent-content claims were corrected from the body, and comments whose bodies were not read were kept and reported. - Every document you edited in full is no longer, as a whole, than a careful human would have written (Rule 6), and any split or move you judged necessary was asked about or proposed, not made. - A passage you wrote that stayed long after Rule 6 was weighed for a complementary diagram, table, snippet, or image, and one was added where it fit. diff --git a/.github/prompts/audit-pr.prompt.md b/.github/prompts/audit-pr.prompt.md index c52cb86..6513480 100644 --- a/.github/prompts/audit-pr.prompt.md +++ b/.github/prompts/audit-pr.prompt.md @@ -174,7 +174,7 @@ Dead code, naming clarity, function complexity, magic numbers, and formatting co **Test logic that reached production code:** a test-environment branch, an export that exists only so a test can reach it, a mock or sample value on a production path, a flag that disables behaviour under test. -**Tells of generated code**, which are review targets rather than accusations: an abstraction with one caller, a generic parameter with one instantiation, a helper duplicating one already in the repository under a different name, an API call that is plausible but absent from the library's surface, error handling that catches and logs without changing the outcome, and a comment that narrates the change ("now uses X", "updated to handle Y") or explains an absence ("removed X because", "we no longer need Y") instead of describing the code. The test that catches the second without a phrase list: point at the line the comment describes. A comment you cannot attach to a line beneath it is about a decision rather than about this code, and the reader who wants that decision is looking at the pull request. +**Tells of generated code**, which are review targets rather than accusations: an abstraction with one caller, a generic parameter with one instantiation, a helper duplicating one already in the repository under a different name, an API call that is plausible but absent from the library's surface, error handling that catches and logs without changing the outcome, and a comment that narrates the change ("now uses X", "updated to handle Y") or explains an absence ("removed X because", "we no longer need Y") instead of describing the code. The test that catches the second without a phrase list: name the code the comment describes, whether a line, a block, a function, or the file. A comment giving the reason the code is written as it is passes, since the reason belongs to that code; one that names no code at all is about a decision, and the reader who wants that decision is looking at the pull request. ### 6. Architecture and design @@ -217,7 +217,7 @@ Algorithmic complexity, N+1 queries, missing caching, oversized payloads, synchr ### 9. Documentation and comments -Public surfaces documented, existing comments still accurate after the change, why-comments for non-obvious logic, the pull request description updated, and external documentation still accurate. Flag specific drift as a finding. Correcting the documentation itself is separate work and is not part of this review. A deprecation names its replacement. A tunable value is documented by the name a consumer changes it by. +Public surfaces documented, existing comments still accurate after the change, why-comments for non-obvious logic, the pull request description updated, and external documentation still accurate. Flag specific drift as a finding, and recommend correcting a drifted comment towards the code rather than deleting it. Correcting the documentation itself is separate work and is not part of this review. A deprecation names its replacement. A tunable value is documented by the name a consumer changes it by. ### 10. Standards and style diff --git a/CLAUDE.md b/CLAUDE.md index eee4dbd..6edb9b5 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -17,7 +17,7 @@ This repo is worked on by **both** GitHub Copilot and Claude Code. Keep these au ### Documentation and comments describe the current state -**This applies to every file type, not only markdown**, because a path-scoped rule can only cover the extensions someone thought to list. A comment, document, or config header states what the code does now. Never narrate the past ("replaces", "used to", "formerly", "for the first time", "unlike the old") and never name a file, flag, or tool that no longer exists. The future belongs nowhere but a `TODO`. Name the line a comment describes; where no line corresponds, correct a public or exported symbol's comment from its body and delete an internal comment. Never delete or cut below one sentence a public or exported symbol's comment, a public structure member's comment, or a package or module comment. Keep the sentence saying what it does, even where it restates the name, code, or syntax; where unclear, keep the first sentence. If the body was not read, keep the comment and report it. A note about a deliberate omission the code depends on and a file-level header pass this test. Rationale worth keeping goes in a decision record of its own under [`docs/`](docs/index.md). +**This applies to every file type, not only markdown**, because a path-scoped rule can only cover the extensions someone thought to list. A comment, document, or config header states what the code does now. Never narrate the past ("replaces", "used to", "formerly", "for the first time", "unlike the old") and never name a file, flag, or tool that no longer exists. The future belongs nowhere but a `TODO`. Name the code a comment describes (a line, a block, the function, or the file); a comment giving the reason the code is written as it is passes. Where no code corresponds, correct the comment to the current fact it carries, and delete it only when none remains. An existing comment, public or private, is kept unless it is commented-out code, every sentence restates the code beneath it, or it narrates a change stating no current fact; a verbose one is tightened by whole sentences, keeping its summary and every reason, constraint, or warning, and trimming happens only inside the requested scope. Never delete or cut below one sentence a public or exported symbol's comment, a public structure member's comment, or a package or module comment. Keep the sentence saying what it does, even where it restates the name, code, or syntax; where unclear, keep the first sentence. If the body was not read, keep the comment and report it. A note about a deliberate omission the code depends on and a file-level header pass this test. An architectural or cross-cutting decision goes in a decision record of its own under [`docs/`](docs/index.md). The reason a particular piece of code is written as it is stays in a comment beside that code. ## Commands diff --git a/package-lock.json b/package-lock.json index c46770d..f8e10e3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,18 +29,18 @@ "@trivago/prettier-plugin-sort-imports": "^6.0.2", "@types/jest": "^30.0.0", "@types/lodash": "^4.17.25", - "@types/node": "^26.6.1", + "@types/node": "^26.6.2", "@types/react": "^19.3.0", "@types/react-dom": "^19.3.0", "@typescript-eslint/parser": "^8.70.0", "concurrently": "^10.0.5", "cypress": "^15.21.0", "cypress-axe": "^1.7.0", - "eslint": "^10.10.0", - "jest": "^30.5.1", - "jest-environment-jsdom": "^30.5.1", - "markdownlint-cli2": "^0.23.2", - "prettier": "^3.9.7", + "eslint": "^10.11.0", + "jest": "^30.5.2", + "jest-environment-jsdom": "^30.5.2", + "markdownlint-cli2": "^0.23.3", + "prettier": "^3.9.8", "sass": "^1.104.1", "start-server-and-test": "^3.0.12", "typescript": "^6.0.3" @@ -417,9 +417,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", - "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "version": "7.29.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.9.tgz", + "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==", "license": "MIT", "dependencies": { "@babel/types": "^7.29.8" @@ -1692,9 +1692,9 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", - "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==", + "version": "7.29.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.9.tgz", + "integrity": "sha512-FFwIwzU+7SCOuxxV4YtJql6T9981ZVTm+FHO5GhVsRqCTdy0WwrEZh3l42ARpXruJUDGOptdduHW6Zr7pNPLNg==", "dev": true, "license": "MIT", "dependencies": { @@ -4115,9 +4115,9 @@ } }, "node_modules/@jest/console": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.5.1.tgz", - "integrity": "sha512-u5Ncuc+gXVUwjNMFQOnphHo2Qx2DxyC8Dvpmf4HCx4y0kvSkRRNiQYRixrvOP4V7y52JcSuNxqochCt0PpdHVg==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.5.2.tgz", + "integrity": "sha512-e8sQC4pCMHPBrPX7Hk8TJr+DM5dkUnImSTNag8SEWFAFAF6xIz4AJvCKapnrdHnZxep4bxw4PhG+ZbimYBMyKw==", "dev": true, "license": "MIT", "dependencies": { @@ -4179,17 +4179,17 @@ } }, "node_modules/@jest/core": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.5.1.tgz", - "integrity": "sha512-BL9g6CJUUhIbdoAflz/Va658erSSXUIvU8XUYiWNTbZljJjZ5yaC9EJ9/dQ19rpbYV3ZOK4sBACqhPaTyhoUIA==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.5.2.tgz", + "integrity": "sha512-/jqvFWoJF7LV1a6AUpYMbMm+2yIYsHJfR474H0SCzr9k8tnO/jl9wRg6zSG6lxgf6EozNlCG4amFzWsbZSvvZA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.5.1", + "@jest/console": "30.5.2", "@jest/pattern": "30.5.0", - "@jest/reporters": "30.5.1", - "@jest/test-result": "30.5.1", - "@jest/transform": "30.5.1", + "@jest/reporters": "30.5.2", + "@jest/test-result": "30.5.2", + "@jest/transform": "30.5.2", "@jest/types": "30.5.1", "@types/node": "*", "ansi-escapes": "^4.3.2", @@ -4199,18 +4199,18 @@ "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.11", "jest-changed-files": "30.5.1", - "jest-config": "30.5.1", + "jest-config": "30.5.2", "jest-haste-map": "30.5.1", "jest-message-util": "30.5.1", "jest-regex-util": "30.5.0", "jest-resolve": "30.5.1", - "jest-resolve-dependencies": "30.5.1", - "jest-runner": "30.5.1", - "jest-runtime": "30.5.1", - "jest-snapshot": "30.5.1", + "jest-resolve-dependencies": "30.5.2", + "jest-runner": "30.5.2", + "jest-runtime": "30.5.2", + "jest-snapshot": "30.5.2", "jest-util": "30.5.1", "jest-validate": "30.5.1", - "jest-watcher": "30.5.1", + "jest-watcher": "30.5.2", "pretty-format": "30.5.1", "slash": "^3.0.0" }, @@ -4299,33 +4299,33 @@ } }, "node_modules/@jest/environment": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.5.1.tgz", - "integrity": "sha512-eYJAkOsrpwDXPcoLNEG6lN9Zo3Cy35pxnVQD74vyIfsi/Q8wB/lZFsEjU4wrecOgT4ZviQDZaX/cFIJyMdMxTw==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.5.2.tgz", + "integrity": "sha512-nwFPOUMbmsjNNRCpnJpB9HbSZu4C07wDDds++5j+j1MezzPLxMPDdbdUVjr2o4RULDOValnDd70taPFI1EtxAg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/fake-timers": "30.5.1", + "@jest/fake-timers": "30.5.2", "@jest/types": "30.5.1", "@types/node": "*", - "jest-mock": "30.5.1" + "jest-mock": "30.5.2" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/environment-jsdom-abstract": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment-jsdom-abstract/-/environment-jsdom-abstract-30.5.1.tgz", - "integrity": "sha512-J395vmP3Fb2Te0JmF7pe4si4jpfbXef1YsY4UpHYL6OOxS2molu9Dsie1VmIiUalXdtmz1P5QRgc+5hBD+ssBg==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/@jest/environment-jsdom-abstract/-/environment-jsdom-abstract-30.5.2.tgz", + "integrity": "sha512-8/P+8hKv7L4mhFoB6gpYLj/fuzXk8PWrde7TDHh8tJz5pE1ktlMbg0y6hDY/V8MfAnispFlPl/vPifowLy3JGQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.5.1", - "@jest/fake-timers": "30.5.1", + "@jest/environment": "30.5.2", + "@jest/fake-timers": "30.5.2", "@jest/types": "30.5.1", "@types/node": "*", - "jest-mock": "30.5.1", + "jest-mock": "30.5.2", "jest-util": "30.5.1" }, "engines": { @@ -4343,23 +4343,23 @@ } }, "node_modules/@jest/expect": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.5.1.tgz", - "integrity": "sha512-uOGd40P/COyUp9xHf5jeGiGJC2/ANg+2+Tk9/xN5/LxmlY/r/gxsPrx3DTEtaRZsLAX4wgNSLEDELZ5bmVs2bA==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.5.2.tgz", + "integrity": "sha512-2E+1Pg6jJxbRjLNLpciC71iri/3qsKJL222/aXJEFwC0VdUSvfS+JZQQLEVjUYYc8t8pQu2MGE3cF2+bNTYRsg==", "dev": true, "license": "MIT", "dependencies": { - "expect": "30.5.1", - "jest-snapshot": "30.5.1" + "expect": "30.5.2", + "jest-snapshot": "30.5.2" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.5.1.tgz", - "integrity": "sha512-WcRWhHQdTMRDpyWKZ/6MINBmovI7zeD+bL8wFjCncRV3NQOwKy1X45IfyblfHR4k/XciIlNEdFL9QjFO+HNKOg==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.5.2.tgz", + "integrity": "sha512-d/HOLSrJUlBIl6n3LzOa7cjW3xdePm5H5gQw2lixZ/0h157l9sw3mLblzFqnPcTbhDzhRQdBOX3A3KcG73nm5Q==", "dev": true, "license": "MIT", "dependencies": { @@ -4370,9 +4370,9 @@ } }, "node_modules/@jest/fake-timers": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.5.1.tgz", - "integrity": "sha512-rEkV6YzpBXo/L9cnj2ibyuYZuyGiNWaPUsyCu3HYJbqCV4jnEiKmf7hId20z8eKjZ0JQ9jtIYKxRSmYB/OYSsA==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.5.2.tgz", + "integrity": "sha512-GKk0h0tKT5SpDPxDhPg3r9mm5s8/YCBzVNMOGdRiQXwUiMsjU10mVPlMaQstH6/cu50vOb8N9oQUMETHuwwxKw==", "dev": true, "license": "MIT", "dependencies": { @@ -4380,7 +4380,7 @@ "@sinonjs/fake-timers": "^15.4.0", "@types/node": "*", "jest-message-util": "30.5.1", - "jest-mock": "30.5.1", + "jest-mock": "30.5.2", "jest-util": "30.5.1" }, "engines": { @@ -4398,16 +4398,16 @@ } }, "node_modules/@jest/globals": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.5.1.tgz", - "integrity": "sha512-VhqvQ251XIC7pk46YymI3HCeBLOdvriDw9zibekodAHEwoVvbVVgpU5H13GvmyOAzxtZCfsm1uvzqkaqJf2I+g==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.5.2.tgz", + "integrity": "sha512-62zfS+dL+M5aTNHXCNLyqD+j4oqxTIzDYrZbpqMP8Yn+gvlAGyzC6BSPNb1ZmFOakV1RtFYX/O3FCQXSWmQdgg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.5.1", - "@jest/expect": "30.5.1", + "@jest/environment": "30.5.2", + "@jest/expect": "30.5.2", "@jest/types": "30.5.1", - "jest-mock": "30.5.1" + "jest-mock": "30.5.2" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -4444,16 +4444,16 @@ "license": "MIT" }, "node_modules/@jest/reporters": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.5.1.tgz", - "integrity": "sha512-RbUXIfv85KxitJn4l3MpAoMilkvXe2QCO5lXxHWftywo/VdZ5vkEoHRDgphcxP6qmoIkUaN8/UZj6NhdkIFdJg==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.5.2.tgz", + "integrity": "sha512-ev6E9iG73twQcfAfoTnviuYkr3yOrYbzAtMFCimv2fxHXPIp9PBt2u1wNMt0aYWgl8FPwIcS8oqRJg6alnht4Q==", "dev": true, "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "30.5.1", - "@jest/test-result": "30.5.1", - "@jest/transform": "30.5.1", + "@jest/console": "30.5.2", + "@jest/test-result": "30.5.2", + "@jest/transform": "30.5.2", "@jest/types": "30.5.1", "@jridgewell/trace-mapping": "^0.3.31", "@types/node": "*", @@ -4608,9 +4608,9 @@ } }, "node_modules/@jest/source-map": { - "version": "30.5.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.5.0.tgz", - "integrity": "sha512-xWpTJP9D0bDFGbPGT8XuWSwwha/iHADyyKzUnMx4UbdgnHugxrDaQFO4RZ8x4ZsFzRP6pNii8uvlgKCDxCIuDg==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.5.2.tgz", + "integrity": "sha512-c5CehvkbfHX6yyNg7bMn2ylqlp9AHXuZ/3hPH/Lh5bxD/vefd/lV9HBjMqXef9yQNqkdwyZvkLSVSwB38hy8Qw==", "dev": true, "license": "MIT", "dependencies": { @@ -4631,13 +4631,13 @@ "license": "MIT" }, "node_modules/@jest/test-result": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.5.1.tgz", - "integrity": "sha512-A/1S6ZBdpic50E0pxLgvaB9XNPL4k7AksmG69OO2oiotxciWZwHkbOec+qbIi+uUtIIByOVlXJUl97oZUsz+Jw==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.5.2.tgz", + "integrity": "sha512-eO6YU5rsLfs60ne694e0IAmRgeBnoA8mu0nlxXDbl/1j5km0o2vO9/VbbUIKIH+WRKKEI+ELgwraRGn2Lhep8g==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.5.1", + "@jest/console": "30.5.2", "@jest/types": "30.5.1", "@types/istanbul-lib-coverage": "^2.0.6", "collect-v8-coverage": "^1.0.2" @@ -4647,13 +4647,13 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.5.1.tgz", - "integrity": "sha512-SHcPnrjdVRYJv6y6l4JUTy4Jccu7zmO6BmiOfOA34UiVBto22s19WiDC0A/2qfM7MWB/qdcoqfSIRMitpjTT4A==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.5.2.tgz", + "integrity": "sha512-bmij8jZyYAC47ExT2GeP7PcrlwSNS+Bp3KeRuBH88gpcxqDv6fljN8PemS4J/lLZ79xb6mpaennQTTq0zUAVVg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "30.5.1", + "@jest/test-result": "30.5.2", "graceful-fs": "^4.2.11", "jest-haste-map": "30.5.1", "slash": "^3.0.0" @@ -4663,9 +4663,9 @@ } }, "node_modules/@jest/transform": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.5.1.tgz", - "integrity": "sha512-EDnDhn0jleU9ZhpVoA4gvqw+Ev0iw/r5upNT2b79RiwiaTiYAMMhvNJP3lmocjIe5J2ZkoNr0B3K/J6O5GIm4Q==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.5.2.tgz", + "integrity": "sha512-LBGwmaE886C41jDZ65eqR1YbXM7642MK3ZhTowZd5+xDlrDLuf4ePuDdDmVSvcr8NTVJ3MqxLkMbUCzuigUaoQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5890,9 +5890,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.63.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.3.tgz", - "integrity": "sha512-w3Jnvi1ocaVm/c7yVPpfB98XeSRBMyzp6njL5MVVbGyXjpmUkN+s6Hp4t0PqhGCCaI1ZHMKXt/w0lA1RCaLVcw==", + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.4.tgz", + "integrity": "sha512-I+BSHzTAhKN2n7ZwGZsegGcZjDpLqFOMAtJz/u6uFGe0pUFbq56dEHjqJV/ZUdRJtNXNxA+hREUatZBvMR3Oiw==", "cpu": [ "arm" ], @@ -5903,9 +5903,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.63.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.3.tgz", - "integrity": "sha512-uI/ESiaIbbRYAEhzy8PCUWDp1hB0bjAqM06mW9flOoNO4Q8DQpeoREhBR5Hegfl+wpXiguyJv6XSPzEN7OxyHQ==", + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.4.tgz", + "integrity": "sha512-pu3BdjS2LtEzRu2elmGzS3fIeWSZy4BMDIaLNwjorO76+k2d0LMluijhsDx3KQyQBQ/lLUZCQA9/s6csvUfuhw==", "cpu": [ "arm64" ], @@ -5916,9 +5916,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.63.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.3.tgz", - "integrity": "sha512-oxhrd1jmXLwWZ83eQYDXxuqRdkqkzrjR3JobKeuUyfdNZo11FuQIvqEOZhyIT7OBHxXoGslDDjN0cQcM6T0TqQ==", + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.4.tgz", + "integrity": "sha512-xfSrj9MHnWK9GaSqT9U0ImHtH/N8WZlHLx4cZHiuLcqs640hvZ3hLPd5UR2AZS57FaE8HrRUSpltbZdWRxHiDA==", "cpu": [ "arm64" ], @@ -5929,9 +5929,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.63.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.3.tgz", - "integrity": "sha512-7/YiIMghVE8DrxKvNdorAaJVdriOFgOIpdStnPx8ppx5zfTwC3jBCSEAIzB7JD5404m65THl6H93UTTVUvypmg==", + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.4.tgz", + "integrity": "sha512-bqU99PLJb/dqb3S0GIMdeuyAEETSUgZBoqXYd3Sd+WCsV+MmPhnN6JrotWyir31+QgH7EvvE5/mwGJlEoci8Fw==", "cpu": [ "x64" ], @@ -5942,9 +5942,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.63.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.3.tgz", - "integrity": "sha512-GXFZRRoMAytaI5z6N3Zhfw0WL18Q0M8r95D5hlC4GqE/lGk8pbSJNUBoOWDfbm6dTciqHj2nU87tI5f6XhQiOg==", + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.4.tgz", + "integrity": "sha512-JinsFZ5G40oXQb+sUuiA5x689vhr6dDYK0H0NL+rwKdL6CqnmYN8PE4ZwfRSoIjrCxqTQG/SLfTtSvHeGxoVlw==", "cpu": [ "arm64" ], @@ -5955,9 +5955,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.63.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.3.tgz", - "integrity": "sha512-77W+8X3ddYgPxUpB8nZFQs2Mq+wc4HVlcSRtApXLjYBcnPMkttrSnU8VwKQjeWYhMsITHFs5cWBQ8vz1Q+5RHQ==", + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.4.tgz", + "integrity": "sha512-GAdA4UxpiNm27cLHr2GqXBpAD0x9FqwYBY7/YSP0Ss0/PNi4k8gbviqpIpYbVSRBaS2ZcegXEzgTQMbRNCwxCw==", "cpu": [ "x64" ], @@ -5968,9 +5968,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.63.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.3.tgz", - "integrity": "sha512-FVkwK+iUC+mq+GipVK46rRVticfAPtvPUNlqlGXUDxdVk/UGjQiiiUVPUrEXdSpU2ufU0XxLGyTqDtBidDOVmg==", + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.4.tgz", + "integrity": "sha512-qDd6NoA1znaLjp4jR5U/KWCdLAKDJNB8W9ChbbDaKbo0xA+Atln5HK6LFCZ4oJQpemtRZA288DCirFRjrspptw==", "cpu": [ "arm" ], @@ -5984,9 +5984,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.63.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.3.tgz", - "integrity": "sha512-+aGU1t3398yQOVj1Bz8o3e+KtswxAPvO+mtxtNdfXYMkXIHu7XhhkCD7/DEH9q8tF8uhDnMWvfpUKI8y1sZJsg==", + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.4.tgz", + "integrity": "sha512-WtB5Tz5KTNINb8ZA+8sQ7bmjuS1JrRT7YverYIhUGdWWDlpzVWmIwuZE+jidkEXUn1l0zrEkaIMa8dHF3NGcsA==", "cpu": [ "arm" ], @@ -6000,9 +6000,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.63.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.3.tgz", - "integrity": "sha512-cR0kjpRXR2KJ2oQK8E2KTPtphs+b9hZ8IhTZubNryt/RsqgdOZBQ2Zq0q5UedtiIi0rs3jVhJh55RE1ZHUVGUA==", + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.4.tgz", + "integrity": "sha512-VcQ3L1tjnkKzWjryAVaFhHEWcqOfICX9uxVVoDzm2t0DpgKRHd2zOpVrJc0xsWeBZcBFyYROCIBdyR/fS174pg==", "cpu": [ "arm64" ], @@ -6016,9 +6016,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.63.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.3.tgz", - "integrity": "sha512-y1RYi4Q3/9ByVWSSt9kX2ustE0B7kFYbJ6zZdVZVyqopZs3yhCTwRfrjIX4vezUJInma/Gs6BOFDJg7yZmJ0IQ==", + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.4.tgz", + "integrity": "sha512-6+ZQX6P5s0cMDN2Ypb8Lbm2+/sZYmZjdaYny992ujUU9UKi/4CWoJWsl1pNvjWJHNHGK51m+jKGLlh1ylb2ifQ==", "cpu": [ "arm64" ], @@ -6032,9 +6032,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.63.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.3.tgz", - "integrity": "sha512-DNhEA5viIj3Z5bZLE4z4oV8N5ozWqDwyt7T6KG7VdLDJ0nW+rNOYlphBl4/3HQkK75qipPLsVOfStHHOwN9WSg==", + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.4.tgz", + "integrity": "sha512-D72ZnvkFkBXOfzMMQLcwfPLyGkKb7HZ9/mf97B7v6/P5Lbv4oFOtSY/uHbS8lH6uKUOxoKiuokdb50XZSzzbJw==", "cpu": [ "loong64" ], @@ -6048,9 +6048,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.63.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.3.tgz", - "integrity": "sha512-17gQCqrIpXBX2Cmi9/TygnVOqGbzsba/iaqcYSL8FY7lNugg+7AiYNs5c5nKWD+NRQha36Sa0CqkJqH4XVHwnQ==", + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.4.tgz", + "integrity": "sha512-piU6BxeqA3O9KSu3kRCIQQtNqFFaTu21SEV4FwaRZowpnj3bLaWPZHw+xFqCs0XlJ+aOH3PTRWGoglH+mKA/OA==", "cpu": [ "loong64" ], @@ -6064,9 +6064,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.63.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.3.tgz", - "integrity": "sha512-6LwVnZRIyINpdku/yOcI8Tm9YqLmhHK5emmlOOnW9tO0SYEm1FmKPcsSAGp0NBlqR2P04xaND4jvN6sTHqhq8A==", + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.4.tgz", + "integrity": "sha512-/5PGpHwqt2EEEOUs1XwzubE/ucr0dWDQ+to3zqi4Ds7EWpwtQ79wXc4JBoxqj/OwpawTsKWzJxHfSuBOq3DrWA==", "cpu": [ "ppc64" ], @@ -6080,9 +6080,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.63.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.3.tgz", - "integrity": "sha512-xMUqkTXlEUtI/p5AAukMwBRr1enU3efsTeF+bskeFfk8t1C9rcC8sLREcZXmTfAXEbvRdJVSonVJez3TMlbR3w==", + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.4.tgz", + "integrity": "sha512-cX3beZDLWt7G2oJF+nhChiT+qtaihs+S2xi7ziGmVB+2pwPng6D0Ed0HmElQOgv2UsUmSJJLGwpBao/3TDx3VA==", "cpu": [ "ppc64" ], @@ -6096,9 +6096,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.63.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.3.tgz", - "integrity": "sha512-S3E94co9F9WRRqEaUoQZ38K1gCz6KiM+nL7/3ijq7fDGF3OznjS5TasgYITlvl27GQKtu4lOAOsr5MFwkijvOA==", + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.4.tgz", + "integrity": "sha512-1uz2mGWHyptR7DgHHrlbdRAjXK7v7elGZ9lMja910/RP+ZYbX6xAmCiU9UZSX4hqmgtHMv6lr5l3kq1HIOpcag==", "cpu": [ "riscv64" ], @@ -6112,9 +6112,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.63.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.3.tgz", - "integrity": "sha512-1QtRDwG42x5BJI3s9mxu5rEjDnfbSnk20HQ9/ylTAYnSwYwxMVb+Vgu34wzzTQ7ogqBybebgQNUDAvZVQ38DbA==", + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.4.tgz", + "integrity": "sha512-nLS8topojxyz7SRpKR2IODRpQ0XPZ+xaOXvT3+hqK/Uy8Lo5HFgkkIBiIrCu5tL5YqzTvgovGw55PwpahTAGig==", "cpu": [ "riscv64" ], @@ -6128,9 +6128,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.63.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.3.tgz", - "integrity": "sha512-BQhejF6ZXOpxbngiNTP12GCGQeaDVL2QXGeBVViKIYzFHM5RKxTxwUMB1fr1BeNFphFMpnRqC5QSXFSa4z6UQw==", + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.4.tgz", + "integrity": "sha512-gs7DRKotr3l3q+jGPQBjH0ng1FjlEDm5ueQrkw5JtQvtLyEIcLASqAEaor56BhkKRzk+IcQzrcanBdb/bBQn8g==", "cpu": [ "s390x" ], @@ -6144,9 +6144,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.63.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.3.tgz", - "integrity": "sha512-SXagRwnI2Wlwlitllu59UK/nGVbD1CKPcNqDplHwIC4BqJcpXFjD32d1R/RbuISa95HdQrZM3/7v4bKiowFaLA==", + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.4.tgz", + "integrity": "sha512-791ET7W17NnScOZM7h4dX5hYspxE28htPFsb1awY/NRR8+PRNkS53e475rDdxXXDrP+kwnCcNWg9CX5ztn/Aqw==", "cpu": [ "x64" ], @@ -6160,9 +6160,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.63.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.3.tgz", - "integrity": "sha512-2IPozoEALRCziGqE8O9KMK60PMu5TS1huv4fwoeCexj+WjmcwFtX9CTOVbfXCUqcELAubEwRFPYlzb/WvwY2HQ==", + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.4.tgz", + "integrity": "sha512-iwZQRcmj7g88g3tzefIrQY7qvmuA/cfYwhrDtTBhsmukO4U2huVO5W+86XacUMRvdSFVAc6kZUZy21JaRwiB9w==", "cpu": [ "x64" ], @@ -6176,9 +6176,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.63.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.3.tgz", - "integrity": "sha512-AoxqosUHT9IX54hFn2TiN6A7d6ZKTtE6pd2bqWtqkkNJ6HJGaU6FRouGX8L1O7R/ZwsnCnpQrHzb4pDEx+UHRQ==", + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.4.tgz", + "integrity": "sha512-dVHFp9gRWrdTpnqQuGfCwd7hOQDatK1VCP2iWhLY/cGrOQs/ucFzJ6A5SRqbXX12ZDI8EUuejSM5kwg+ja7Png==", "cpu": [ "x64" ], @@ -6189,9 +6189,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.63.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.3.tgz", - "integrity": "sha512-d+CaftKgmkFBzCwezMqqy1d0QNNYugqLCMcYVQWBy5SS2YfeMP8Q8ripkgx9O8IyBXXLHrJ+aaCV4U96usv6Yg==", + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.4.tgz", + "integrity": "sha512-t3NlauOW6gxZVVFcBEnO62Cb4wbyDFL416gTg1uFI/2tgqYQlf69FbSE115Ajre9I+c26Lk4mcmdFUsS/DGifQ==", "cpu": [ "arm64" ], @@ -6202,9 +6202,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.63.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.3.tgz", - "integrity": "sha512-xXlDF6nR1eOuXbdDy5Hl5fmtY7teUDevF/k0O7IPoZe4Tpmdv+lgdE5JRsnhQtt37ql9P0VF2kAN9a0OCZdo+Q==", + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.4.tgz", + "integrity": "sha512-xWuIaSye5FWZF8+UYtVEcHtRJDN5kN9Kfgxx3Kq8XIov9KSKbc1fiqQCm90SKrgQbUXZelbnUhnlUJmfSE7P9A==", "cpu": [ "arm64" ], @@ -6215,9 +6215,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.63.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.3.tgz", - "integrity": "sha512-YtXAgLN+JP7Ay6qG3eWhc7IHMQPzLc8r3uvhAvlJIoCz/4Q32+Bl9Fmnywidh8v1GOIMmymjovfqY9ETAtysvA==", + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.4.tgz", + "integrity": "sha512-9ALJJUOg/ZflMJepVo2PlgsGxSaxN7SQ4Z8GoZfVlarWr6r3rkHUNsd/zAio7p4YMtChSMXPionxej4Hkf6CXQ==", "cpu": [ "ia32" ], @@ -6228,9 +6228,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.63.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.3.tgz", - "integrity": "sha512-WuWtSJRNo549vzcfZyEgfqb6zeSgn1F+UE5kQ+BCjzz0W4MGCjntUHkZVc1VRuAM7+ULaSyhiPxD1spyewFvkQ==", + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.4.tgz", + "integrity": "sha512-blj9z5qx/Pv4WU0W1NMFDB97e0JH5ed+aZGywW8WCvp/NhWX/4PFAq5uu6Q0AebNn+Vo6KzUYDT++JzTT5ojlQ==", "cpu": [ "x64" ], @@ -6241,9 +6241,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.63.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.3.tgz", - "integrity": "sha512-+lIKX7O0+IGe7WuhATaAMMeT7B76vfhXH/l9wLQL+nvyhbw2ohYCKIdWL56JfDu75CWt5oKRP4QFH/jkMtBquA==", + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.4.tgz", + "integrity": "sha512-Erx822VRBwLa124shbj+wNXe//BOgMEctDV0m1aqTQdNO1S69DgNUCFKC1RCeZfixs1J31l6igk1ziyXErbigQ==", "cpu": [ "x64" ], @@ -7373,9 +7373,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "26.6.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.1.tgz", - "integrity": "sha512-VqGJBMCtdhqkBUCcBLvywI0NJ+KLuVzgNnlBUNFOQjqVxzo2lxLUNg1DSey8+u2u6ktswSAxg+s68QLzWHNOuA==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.6.2.tgz", + "integrity": "sha512-X1P21scMv4zGKLYqjdGjaKa7COa0RKVYYZZN/NfvLQ1JegxFhdhpZG/Lyn8AXx6CDUavKAd11v6BvfpkDByK8g==", "license": "MIT", "dependencies": { "undici-types": "~8.9.0" @@ -8553,13 +8553,13 @@ } }, "node_modules/babel-jest": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.5.1.tgz", - "integrity": "sha512-ge1xUVZS91ml09YRMgRGgeKJ4YJpcOiuwteAxFBYLugQyp7cRw+hHej6Ho0vPjvLrjq60bb7JPHH9LAMA1/krA==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.5.2.tgz", + "integrity": "sha512-ES8WeJ2fNWPEDunyAtUfJ12nHyaWUloCHdkfK2oW5uSoQSUmjNKdWiGaXJITJwvFEWoD/evHEg/QoCXAvLaQqQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/transform": "30.5.1", + "@jest/transform": "30.5.2", "@types/babel__core": "^7.20.5", "babel-plugin-istanbul": "^8.0.0", "babel-preset-jest": "30.5.0", @@ -8799,9 +8799,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.11.24", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.24.tgz", - "integrity": "sha512-hYrgxie335U08WqICoGqKRzV1HFXv6zdxwJE4ekCb80CM9a0SVVsN4QPwT67RraRo+9h8IATk6uxHJw7QSkdOg==", + "version": "2.11.25", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.25.tgz", + "integrity": "sha512-gMmEShwwq7FJqMwvfRwvCl00v4kN+KOfJqXn+f4nrufak5gNHJOksd/60Dvjuz7sI8Y5WiSFBa8FEYr+zoyqCw==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.cjs" @@ -10025,9 +10025,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.430", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.430.tgz", - "integrity": "sha512-e1QEj72Y4zd8RlNZVmoTg+iCOSVwpk05IOiiQwdrkwCSVlZfPthevErhE+nckGd2YbsXfp1SkisznhGVIXP2NQ==", + "version": "1.5.433", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.433.tgz", + "integrity": "sha512-5lCAbyZBjtmUt/RAGHRqrL2q0oEFRThDAsZHHDn9XHa89Qw7gMYOeSicBTy+AHfvo0r6vwsZvqNJTQIQy1BLzA==", "license": "ISC" }, "node_modules/emittery": { @@ -10184,9 +10184,9 @@ } }, "node_modules/eslint": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.10.0.tgz", - "integrity": "sha512-NPXn6r5zl4uET1DAVPaOwzX3rut4c0wcmw3dWJAfOsTM5+TogXo0DDjz8pwm/hL8cyVNpHqeK4JpN0NjnyFFNw==", + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.11.0.tgz", + "integrity": "sha512-P7a6UEEqb9G95MYAtqkmsTbVXIYyzIfl6NGOIJk162PaahFxFyeGcrlXYFSiagECg4sEm8IseJdZBKR3rx6MsQ==", "dev": true, "license": "MIT", "workspaces": [ @@ -10469,17 +10469,17 @@ } }, "node_modules/expect": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-30.5.1.tgz", - "integrity": "sha512-m8YrYgvKe9+9gEnWEuKz+qCGfHqkrff7PPfyDnOFkjsfYRKqiYyOxDFMFieCGAuhtk/VNm63tvNgKZVzVy+Hvg==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.5.2.tgz", + "integrity": "sha512-0LNuMvs8/5mRYhnCR4k+lGV7fqPMs6Bnksda4S3zsCUmdxBpAn4zU4NNzXdq1pMKe/H4W5t/zVIDSJ/H3e0vDA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/expect-utils": "30.5.1", + "@jest/expect-utils": "30.5.2", "@jest/get-type": "30.5.0", - "jest-matcher-utils": "30.5.1", + "jest-matcher-utils": "30.5.2", "jest-message-util": "30.5.1", - "jest-mock": "30.5.1", + "jest-mock": "30.5.2", "jest-util": "30.5.1" }, "engines": { @@ -10855,9 +10855,9 @@ } }, "node_modules/get-east-asian-width": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", - "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.7.0.tgz", + "integrity": "sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==", "dev": true, "license": "MIT", "engines": { @@ -11025,9 +11025,9 @@ } }, "node_modules/globby": { - "version": "16.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-16.2.2.tgz", - "integrity": "sha512-NLvV9ubZ6NDsJaOpKPy3cQeJpKi9DcWiyCiFUpJPA0YihRqiE6RWaLUmgNNPr8MgPpLZjnBjSmou7uZBRJv9wA==", + "version": "16.2.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-16.2.4.tgz", + "integrity": "sha512-c8B/VNLmxRcmqqenRA9t+9IyOjf9+V6lTxPaUJLqOCONdQkWZ0ETYgX0qbtJqPsgCNusT9MZ5Jeidw8Eb9tn2g==", "dev": true, "license": "MIT", "dependencies": { @@ -11035,6 +11035,7 @@ "fast-glob": "^3.3.3", "ignore": "^7.0.5", "is-path-inside": "^4.0.0", + "micromatch": "^4.0.8", "slash": "^5.1.0", "unicorn-magic": "^0.4.0" }, @@ -11460,12 +11461,12 @@ "license": "MIT" }, "node_modules/is-core-module": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", - "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.17.0.tgz", + "integrity": "sha512-J/vG0zBCbIKOQFfufSwyXdMrsohyJIUNkrnmo6WZGzoM7tr/lsbfW5b2BvisL6zsyMzK9UxV9L6c7AoFbyXHOA==", "license": "MIT", "dependencies": { - "hasown": "^2.0.3" + "hasown": "^2.0.4" }, "engines": { "node": ">= 0.4" @@ -11765,16 +11766,16 @@ "license": "MIT" }, "node_modules/jest": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-30.5.1.tgz", - "integrity": "sha512-3qrR8+ZXFnn7y0H2yjWQNkGGBLBY4zTRoTMAq9zJcgwLLtlyonfsCLviIXK9xuE2KgIyM+M36AFcoK2DgFR36w==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/jest/-/jest-30.5.2.tgz", + "integrity": "sha512-3gnpdBIza8ijCl3iMV9ChE3hSt1+46865qqod863gQtJr1DixOkAU5DoGbi3u+XlRcw++BhZQMu/y4xBdHBvSQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "30.5.1", + "@jest/core": "30.5.2", "@jest/types": "30.5.1", "import-local": "^3.2.0", - "jest-cli": "30.5.1" + "jest-cli": "30.5.2" }, "bin": { "jest": "bin/jest.js" @@ -11854,26 +11855,26 @@ } }, "node_modules/jest-circus": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.5.1.tgz", - "integrity": "sha512-NgliezXQ6yznqR4W5Gqw++0cZSbBZlF0NknNIAE5VmSJKWOtmWJmWnBq3TSkUOVBTPrT7FGGhVdA8DLWnxo2Sw==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.5.2.tgz", + "integrity": "sha512-vffFgjs5JSJ9q4ds1vNW3klKYPJfYfIY61LT/zaZgvTeASJOWZUt8LBfHgIcV4rwxlPBLl/ePBGccHEclS4PlQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.5.1", - "@jest/expect": "30.5.1", - "@jest/test-result": "30.5.1", + "@jest/environment": "30.5.2", + "@jest/expect": "30.5.2", + "@jest/test-result": "30.5.2", "@jest/types": "30.5.1", "@types/node": "*", "chalk": "^4.1.2", "co": "^4.6.0", "dedent": "^1.6.0", "is-generator-fn": "^2.1.0", - "jest-each": "30.5.1", - "jest-matcher-utils": "30.5.1", + "jest-each": "30.5.2", + "jest-matcher-utils": "30.5.2", "jest-message-util": "30.5.1", - "jest-runtime": "30.5.1", - "jest-snapshot": "30.5.1", + "jest-runtime": "30.5.2", + "jest-snapshot": "30.5.2", "jest-util": "30.5.1", "p-limit": "^3.1.0", "pretty-format": "30.5.1", @@ -11948,19 +11949,19 @@ } }, "node_modules/jest-cli": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.5.1.tgz", - "integrity": "sha512-uwNYepWgaNBCplm42fCIUZTf/tIEHIy5AYvx7eL1BrwIgyjPt+2poouR23UO2yopIP+kV8oZFHfv+l4pg/8prQ==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.5.2.tgz", + "integrity": "sha512-YYYxUUVjFgPvgEleKNKMaYGIFgR3l3832Cl0kRL/oCiDZ03v7wImUtquHl2OOBCCNgprjZgBN5bczS/JklPBDg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "30.5.1", - "@jest/test-result": "30.5.1", + "@jest/core": "30.5.2", + "@jest/test-result": "30.5.2", "@jest/types": "30.5.1", "chalk": "^4.1.2", "exit-x": "^0.2.2", "import-local": "^3.2.0", - "jest-config": "30.5.1", + "jest-config": "30.5.2", "jest-util": "30.5.1", "jest-validate": "30.5.1", "yargs": "^17.7.2" @@ -12102,29 +12103,29 @@ } }, "node_modules/jest-config": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.5.1.tgz", - "integrity": "sha512-L8PKM2X/ngG8PxfLMqglKGZjylPgw84bVPUlMY9W/o76TnLqPWrmQgsaT0HrheGdRtpGE5FbmREA0Kvb+Qx5gQ==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.5.2.tgz", + "integrity": "sha512-U6221OZekabePvGcGPf4raIBKMvYQWFHvhobDJRojOYaFMj2HaGytAdknjDhYc6JTz2fdHW9+6k0wWUDaNeOFQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.27.4", "@jest/get-type": "30.5.0", "@jest/pattern": "30.5.0", - "@jest/test-sequencer": "30.5.1", + "@jest/test-sequencer": "30.5.2", "@jest/types": "30.5.1", - "babel-jest": "30.5.1", + "babel-jest": "30.5.2", "chalk": "^4.1.2", "ci-info": "^4.2.0", "deepmerge": "^4.3.1", "glob": "^13.0.6", "graceful-fs": "^4.2.11", - "jest-circus": "30.5.1", + "jest-circus": "30.5.2", "jest-docblock": "30.5.0", - "jest-environment-node": "30.5.1", + "jest-environment-node": "30.5.2", "jest-regex-util": "30.5.0", "jest-resolve": "30.5.1", - "jest-runner": "30.5.1", + "jest-runner": "30.5.2", "jest-util": "30.5.1", "jest-validate": "30.5.1", "parse-json": "^5.2.0", @@ -12215,9 +12216,9 @@ } }, "node_modules/jest-diff": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.5.1.tgz", - "integrity": "sha512-e3cNNMpv8Kh20MjjphTXs+3Vz7DQyLM1nft7KJhnh46atFhjVJRa+0Hq0beywuwsACtMQUBihQkFl8zxb7gt1Q==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.5.2.tgz", + "integrity": "sha512-rBtHnI6BWTiWj3lM7fOLVfChx7R9B0u9VV3PRHawKs79x6ZjW1QoSrKenaigNGWlvhtoi2BqvDbABDie+Os3xQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12306,15 +12307,16 @@ } }, "node_modules/jest-each": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.5.1.tgz", - "integrity": "sha512-S1af0TU4v1EZ/AUlkFs/sxf/5KGsbAT9kRgdyoMX/x72y7C8ZEgETE5o1TPnbKRnrbprc5FR/moYLfdRmqEjsQ==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.5.2.tgz", + "integrity": "sha512-GRrW+7fmmgmkvyfEBqc1QFdWnF1Ex5yG6Y6AWL4TTxnkWlKIT98dsKh3P3UuWm6v4XsQwVE6DEzXIPMzWJ3ZbA==", "dev": true, "license": "MIT", "dependencies": { "@jest/get-type": "30.5.0", "@jest/types": "30.5.1", "chalk": "^4.1.2", + "jest-regex-util": "30.5.0", "jest-util": "30.5.1", "pretty-format": "30.5.1" }, @@ -12385,14 +12387,14 @@ } }, "node_modules/jest-environment-jsdom": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-30.5.1.tgz", - "integrity": "sha512-8lzKbC/SRbQE24wr1OOJV+aYtDAuVNKBryN6YcFiCcaZZ3I7grcZY7w91BwNvGET0ubKDmomEHZFHMaF+6pAlA==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-30.5.2.tgz", + "integrity": "sha512-6NOZjEP+WNi4WXjbxb/1ROnfaMxn6Dhqu6uSC22o0H28z+uppejs/jZ9KCVoLepqqoCjcNZujtzQqC9jSV15jg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.5.1", - "@jest/environment-jsdom-abstract": "30.5.1", + "@jest/environment": "30.5.2", + "@jest/environment-jsdom-abstract": "30.5.2", "@types/jsdom": "^21.1.7", "jsdom": "^26.1.0" }, @@ -12409,17 +12411,17 @@ } }, "node_modules/jest-environment-node": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.5.1.tgz", - "integrity": "sha512-LrPj3sPMjsQoOB3jrb8p/sa+XkSFNKo60TTsyc+EB2kxQJHgbwElpXnx1yX25fdFn5958FIObRtcLSHyV8VIAw==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.5.2.tgz", + "integrity": "sha512-Ciz4KgTGIbojxSKpuFImgWJj5EyqfE8xMq9NxWmOXnQywHHS03H9Mv+vaCB29J5pr3JBrY27WbRV18rBdjh8Dg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.5.1", - "@jest/fake-timers": "30.5.1", + "@jest/environment": "30.5.2", + "@jest/fake-timers": "30.5.2", "@jest/types": "30.5.1", "@types/node": "*", - "jest-mock": "30.5.1", + "jest-mock": "30.5.2", "jest-util": "30.5.1", "jest-validate": "30.5.1" }, @@ -12481,15 +12483,15 @@ } }, "node_modules/jest-matcher-utils": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.5.1.tgz", - "integrity": "sha512-aroZVqwOz/wC2y6pC+obgFWKV9viaQWQTTSB6W5H55+egtUczIfXR/rxExTv92xD/ADYwpqaYfVWx1aqwKg7FA==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.5.2.tgz", + "integrity": "sha512-lFkB365PTIHOhPzwrb9T6gvlDnPpOZ7/c3ewOKKB7bzztqjVrtlyRL2MkyfJXpyY2u2SKw001JKrTx14fBUFcQ==", "dev": true, "license": "MIT", "dependencies": { "@jest/get-type": "30.5.0", "chalk": "^4.1.2", - "jest-diff": "30.5.1", + "jest-diff": "30.5.2", "pretty-format": "30.5.1" }, "engines": { @@ -12643,13 +12645,13 @@ } }, "node_modules/jest-mock": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.5.1.tgz", - "integrity": "sha512-9fVjc3leUpGID2/by/LU4Dvdcp7PFh9LlxS3QRWK3ABm+KtvEVsG/AEGeLY3gKOZsjkBxyfwGltoAVlW7dygHg==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.5.2.tgz", + "integrity": "sha512-KTHb37Fhj8xY8qPFvTFaFJHcdsumQp+ExsUlgoX232Agmc706gagBs53+CYvulV7MVQo9AgXOUxsqzzVBoJlrA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/expect-utils": "30.5.1", + "@jest/expect-utils": "30.5.2", "@jest/types": "30.5.1", "@types/node": "*", "jest-util": "30.5.1" @@ -12688,14 +12690,14 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.5.1.tgz", - "integrity": "sha512-JKpXGONDcTaunrNVn8KCl6qAnwl06jIkvv70lhq0Ze47lsPx9sH5HoeEUiXX6iFGnliHN/qpIbQ0l38wrVmXaw==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.5.2.tgz", + "integrity": "sha512-GMI0DP5enX9Z2qW2zFy1bOkrCfWAOPRJQ7qHt0pdfrxBPsgWxglMPrRSK2TX/wRWYxcPRSLFg3Z88qPOzHx7FQ==", "dev": true, "license": "MIT", "dependencies": { "jest-regex-util": "30.5.0", - "jest-snapshot": "30.5.1" + "jest-snapshot": "30.5.2" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -12748,17 +12750,17 @@ } }, "node_modules/jest-runner": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.5.1.tgz", - "integrity": "sha512-FPlQE4+mwnFxXmpPrSi836KV2ZzvK1g6/nPCT8o5BcoDUUNJQeHo1/Qdkoe/QeoL4M7OeJpbnGUhYKhC1VMdaQ==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.5.2.tgz", + "integrity": "sha512-/B6px7hiiNhVSRwuv9AGn0nawYvwsHeQZ3ItTd5Gp2diFd0EOKaWVeWqcbw3L88vx1GfpCKjQkxWItZCTl11Rw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.5.1", - "@jest/environment": "30.5.1", - "@jest/source-map": "30.5.0", - "@jest/test-result": "30.5.1", - "@jest/transform": "30.5.1", + "@jest/console": "30.5.2", + "@jest/environment": "30.5.2", + "@jest/source-map": "30.5.2", + "@jest/test-result": "30.5.2", + "@jest/transform": "30.5.2", "@jest/types": "30.5.1", "@types/node": "*", "chalk": "^4.1.2", @@ -12766,14 +12768,14 @@ "exit-x": "^0.2.2", "graceful-fs": "^4.2.11", "jest-docblock": "30.5.0", - "jest-environment-node": "30.5.1", + "jest-environment-node": "30.5.2", "jest-haste-map": "30.5.1", "jest-leak-detector": "30.5.1", "jest-message-util": "30.5.1", "jest-resolve": "30.5.1", - "jest-runtime": "30.5.1", + "jest-runtime": "30.5.2", "jest-util": "30.5.1", - "jest-watcher": "30.5.1", + "jest-watcher": "30.5.2", "jest-worker": "30.5.1", "p-limit": "^3.1.0" }, @@ -12828,18 +12830,18 @@ } }, "node_modules/jest-runtime": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.5.1.tgz", - "integrity": "sha512-UB88+NRkK2Tw/OqV7dofYcyiUGrVZtD41k/N0xQOs9fG//57XHK7JLWG52HD1UYpUAhjK4xm6DBvFX3yWudsMA==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.5.2.tgz", + "integrity": "sha512-0paUAHBlheai10A3XSy9Xh+YBG0IROy+/qzcDPzQ/nbbXrznQzeWy5qniICWK6d3W3scaRQCVAbXdcK0ibBq4w==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.5.1", - "@jest/fake-timers": "30.5.1", - "@jest/globals": "30.5.1", - "@jest/source-map": "30.5.0", - "@jest/test-result": "30.5.1", - "@jest/transform": "30.5.1", + "@jest/environment": "30.5.2", + "@jest/fake-timers": "30.5.2", + "@jest/globals": "30.5.2", + "@jest/source-map": "30.5.2", + "@jest/test-result": "30.5.2", + "@jest/transform": "30.5.2", "@jest/types": "30.5.1", "@types/node": "*", "chalk": "^4.1.2", @@ -12850,10 +12852,10 @@ "graceful-fs": "^4.2.11", "jest-haste-map": "30.5.1", "jest-message-util": "30.5.1", - "jest-mock": "30.5.1", + "jest-mock": "30.5.2", "jest-regex-util": "30.5.0", "jest-resolve": "30.5.1", - "jest-snapshot": "30.5.1", + "jest-snapshot": "30.5.2", "jest-util": "30.5.1", "slash": "^3.0.0", "strip-bom": "^4.0.0" @@ -12916,9 +12918,9 @@ } }, "node_modules/jest-snapshot": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.5.1.tgz", - "integrity": "sha512-cNWFdSb5xuDGl8hKkAZJ3YtI/PzHpAPFV+HUXWIOG8rMhpDTLVbvAc2d2wRicoYw2wGsJGLaurJT6BLC97bLXQ==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.5.2.tgz", + "integrity": "sha512-jKIdes25AnAH73dOCi2qE6J6vHJ6L2vyBS11M89kT50DVJcLTf2AOjvcc+2vVaN8lUbY5v2R83aqXo3Ro9fqYA==", "dev": true, "license": "MIT", "dependencies": { @@ -12927,17 +12929,17 @@ "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1", "@babel/types": "^7.27.3", - "@jest/expect-utils": "30.5.1", + "@jest/expect-utils": "30.5.2", "@jest/get-type": "30.5.0", "@jest/snapshot-utils": "30.5.1", - "@jest/transform": "30.5.1", + "@jest/transform": "30.5.2", "@jest/types": "30.5.1", "babel-preset-current-node-syntax": "^1.2.0", "chalk": "^4.1.2", - "expect": "30.5.1", + "expect": "30.5.2", "graceful-fs": "^4.2.11", - "jest-diff": "30.5.1", - "jest-matcher-utils": "30.5.1", + "jest-diff": "30.5.2", + "jest-matcher-utils": "30.5.2", "jest-message-util": "30.5.1", "jest-util": "30.5.1", "pretty-format": "30.5.1", @@ -13168,13 +13170,13 @@ } }, "node_modules/jest-watcher": { - "version": "30.5.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.5.1.tgz", - "integrity": "sha512-+FHJ7C+S7b3ySfhA1aFmoa6TztsnwZVv84ycPRn0tVN93np2EU4b8C/KadqA3l6igdjgLBTnUotab9ER0HLG8A==", + "version": "30.5.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.5.2.tgz", + "integrity": "sha512-rqRgg4R11GA9m1UsEZwQeixHsgZReCn6TOHAHtIH33yXrIvoX0OGPA20Yzzjkz7X40fZvcRSxEpQppYPcWzmcQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "30.5.1", + "@jest/test-result": "30.5.2", "@jest/types": "30.5.1", "@types/node": "*", "ansi-escapes": "^4.3.2", @@ -13589,9 +13591,9 @@ "license": "MIT" }, "node_modules/linkify-it": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.2.tgz", - "integrity": "sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-6.1.0.tgz", + "integrity": "sha512-wJ/TwpSDTLepCrQoYWYIExIKg5Zchex2Nn5yk2mFnB+6PtdkHtyLx742md9csRjjOnGkKIS/RrbY7l8D6gT9Vw==", "dev": true, "funding": [ { @@ -13605,7 +13607,7 @@ ], "license": "MIT", "dependencies": { - "uc.micro": "^2.0.0" + "uc.micro": "^3.0.0" } }, "node_modules/listr2": { @@ -13890,9 +13892,9 @@ } }, "node_modules/markdown-it": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.3.0.tgz", - "integrity": "sha512-RCEsPjR+sr0x+AuYp601tKTkgFG4YEPLCzHST3cQ/fhlJkqAkz1L2/Qbp1j9qw5SBwQHFBoW8+hoN5xssOF0Tw==", + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-15.0.1.tgz", + "integrity": "sha512-9/7gE95FNPkfUWrjJIoHZza2iLmuJlPD0UNMxPi7bxUrbCR525YZY0r+zyfes0dZI5ZZ/uNIXUJca0pJvtw41g==", "dev": true, "funding": [ { @@ -13906,17 +13908,47 @@ ], "license": "MIT", "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.5.0", - "linkify-it": "^5.0.2", - "mdurl": "^2.0.0", + "argparse": "^3.0.0", + "entities": "^8.0.0", + "linkify-it": "^6.0.0", + "mdurl": "^2.1.0", "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" + "uc.micro": "^3.0.0" }, "bin": { "markdown-it": "bin/markdown-it.mjs" } }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-3.0.2.tgz", + "integrity": "sha512-mFdDM6WqWKraGLsVb+C9CahPnzTXOefAOLq3jYcca2YZ8bEWpr++Tzj+zSaKW9+X9L5uSxcm1AZ3Y6aZJ09OhQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "PSF-2.0" + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.1.0.tgz", + "integrity": "sha512-kxL7msIffSuh9aaFAMD7rxAIuTRMAHMeBtgHW2yUdWw732ZNh4MehkF2gdjvtdmikkaIP9bFDDJOPlsvm7avrA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/markdownlint": { "version": "0.41.1", "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.41.1.tgz", @@ -13942,21 +13974,21 @@ } }, "node_modules/markdownlint-cli2": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.23.2.tgz", - "integrity": "sha512-eUhcnkSpzURo/o4htSqc7LPDszgOOTknhU4eY/sPHvMCLxnTCYscv1gw1/js/idmaZPisv9ECVEIORcllqjTUw==", + "version": "0.23.3", + "resolved": "https://registry.npmjs.org/markdownlint-cli2/-/markdownlint-cli2-0.23.3.tgz", + "integrity": "sha512-xAr5o/TGpC3v6lE6cKIW4b5eOFRrRX5u7Vtjae9ix3RALv8nNOd94XMkD/1OXXBtpMcJ4uQGbpSo3hv5UqS4uQ==", "dev": true, "license": "MIT", "dependencies": { - "globby": "16.2.2", - "js-yaml": "5.2.2", + "globby": "16.2.4", + "js-yaml": "5.4.1", "jsonc-parser": "3.3.1", "jsonpointer": "5.0.1", - "markdown-it": "14.3.0", + "markdown-it": "15.0.1", "markdownlint": "0.41.1", "markdownlint-cli2-formatter-default": "0.0.6", "micromatch": "4.0.8", - "smol-toml": "1.7.0" + "smol-toml": "1.8.0" }, "bin": { "markdownlint-cli2": "markdownlint-cli2-bin.mjs" @@ -13982,9 +14014,9 @@ } }, "node_modules/markdownlint-cli2/node_modules/js-yaml": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-5.2.2.tgz", - "integrity": "sha512-dayzUzKkJ1MkuUtZglSebU43utNXH0OWQByK9rKOOuYIO8M5TV1y+n8ALMdG0rdzBnfNkOmZEqrURepb0ejqBw==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-5.4.1.tgz", + "integrity": "sha512-28R/k+NAjeuf7+CKlTxWZVExJGwVVLwY06DgEnOMz2gEpfNkDcD7QvyiVPT0xy0XXhU8vHsd4Ot42OOPdJG7dQ==", "dev": true, "funding": [ { @@ -14707,9 +14739,9 @@ } }, "node_modules/minimizer-webpack-plugin": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.10.1.tgz", - "integrity": "sha512-+dsZEyTcy1lkq41lxdiOqvb26gXbYGgwY+30w37f9PqUVkuEBejBLDotsHOTjuga9xJyGLW2DqzKDUyJ4W/PMQ==", + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.11.0.tgz", + "integrity": "sha512-2JVy2DY+iBtfRyrQB5cRM7lfurnJIi6jFTgLip/7FxDu0WxswrIRzr4fBySQ0X7HqM7BcwE28zm+HfQ5V6y4Cg==", "license": "MIT", "peer": true, "dependencies": { @@ -14993,9 +15025,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.55", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.55.tgz", - "integrity": "sha512-mIrE/Cw9y+9Au6dS5vDKDhQza9YvG6w+ZrS6X+ZzA7yFW/soAeaups4Qzn1bL6g5FVy8WtP79+0j82oPIbqRjQ==", + "version": "2.0.56", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.56.tgz", + "integrity": "sha512-x0InOIyzgdk+eyaWaRJFH5snEtiImgBgblZ2CyPrLmqqcuMQkEvcDPHbzqbD8eDsSeJbVOjn+crzyzHaM4D+/A==", "license": "MIT", "engines": { "node": ">=18" @@ -15038,9 +15070,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.27", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.27.tgz", - "integrity": "sha512-gQPNF78qebCQ6tvVFBYrvJdBNOrYZm90ZlXgpIFm06p6qHDHq/XC4TnJftN6OMbxVE0UTBAoRgcsDeJBBooITw==", + "version": "2.2.28", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.28.tgz", + "integrity": "sha512-IlVB7OS7qrOsVYlpnFIkETjMwT9jwvmocJmmM+GZU/PAB3uGi9Ezd7vcWhWBUnSc0ya4ppmQITOyP1ez9gg8cg==", "dev": true, "license": "MIT" }, @@ -15299,9 +15331,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.5.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", - "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "version": "11.5.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.3.tgz", + "integrity": "sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" @@ -15476,9 +15508,9 @@ } }, "node_modules/prettier": { - "version": "3.9.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.7.tgz", - "integrity": "sha512-T3mF5P7HFzZVLDQuCUNtJj6WK1pcpLMweMNUVwGb01bLNkH9AkKxtZvmInw8K6bnn2O3d6/5RHl6zSHiBAD0Og==", + "version": "3.9.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.8.tgz", + "integrity": "sha512-WRFq3Wn3WId7LLROfMLdH7xaFr2jR62wU8nLO6rQUOLOxNZUviyJQs1M0iIhLexSFy+L+w0ch66wtoO2jRjG0A==", "dev": true, "license": "MIT", "bin": { @@ -15825,9 +15857,9 @@ "license": "MIT" }, "node_modules/regjsparser": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.2.tgz", - "integrity": "sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==", + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.3.tgz", + "integrity": "sha512-ycwFAS14Jw4mppvmK4GR/J6u3WpWpjkEApehuHtLc/8VpPNpDMbQ4WjqwplXifGeyKOzHSFLmSPqzksDQE2Sfg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -15997,9 +16029,9 @@ "license": "MIT" }, "node_modules/rollup": { - "version": "4.63.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.3.tgz", - "integrity": "sha512-1i2XreiAoMMXuPGD6Msj2xWrMMkHojNRKivInxGQcg7/1KuPuYlfUutLyh4drnOxUTHX9cHI4wFoat8D/NKaBw==", + "version": "4.63.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.4.tgz", + "integrity": "sha512-4U0liVayNIoLp3GFl1FcI8561WepLnZ1rqfraGh7S9B3Ur5F9S283y8Futii7RUU2C/97tOBmBy7nYvhoiOpbQ==", "license": "MIT", "dependencies": { "@types/estree": "1.0.9" @@ -16013,31 +16045,31 @@ }, "optionalDependencies": { "@napi-rs/lzma-linux-x64-gnu": "1.5.1", - "@rollup/rollup-android-arm-eabi": "4.63.3", - "@rollup/rollup-android-arm64": "4.63.3", - "@rollup/rollup-darwin-arm64": "4.63.3", - "@rollup/rollup-darwin-x64": "4.63.3", - "@rollup/rollup-freebsd-arm64": "4.63.3", - "@rollup/rollup-freebsd-x64": "4.63.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.63.3", - "@rollup/rollup-linux-arm-musleabihf": "4.63.3", - "@rollup/rollup-linux-arm64-gnu": "4.63.3", - "@rollup/rollup-linux-arm64-musl": "4.63.3", - "@rollup/rollup-linux-loong64-gnu": "4.63.3", - "@rollup/rollup-linux-loong64-musl": "4.63.3", - "@rollup/rollup-linux-ppc64-gnu": "4.63.3", - "@rollup/rollup-linux-ppc64-musl": "4.63.3", - "@rollup/rollup-linux-riscv64-gnu": "4.63.3", - "@rollup/rollup-linux-riscv64-musl": "4.63.3", - "@rollup/rollup-linux-s390x-gnu": "4.63.3", - "@rollup/rollup-linux-x64-gnu": "4.63.3", - "@rollup/rollup-linux-x64-musl": "4.63.3", - "@rollup/rollup-openbsd-x64": "4.63.3", - "@rollup/rollup-openharmony-arm64": "4.63.3", - "@rollup/rollup-win32-arm64-msvc": "4.63.3", - "@rollup/rollup-win32-ia32-msvc": "4.63.3", - "@rollup/rollup-win32-x64-gnu": "4.63.3", - "@rollup/rollup-win32-x64-msvc": "4.63.3", + "@rollup/rollup-android-arm-eabi": "4.63.4", + "@rollup/rollup-android-arm64": "4.63.4", + "@rollup/rollup-darwin-arm64": "4.63.4", + "@rollup/rollup-darwin-x64": "4.63.4", + "@rollup/rollup-freebsd-arm64": "4.63.4", + "@rollup/rollup-freebsd-x64": "4.63.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.63.4", + "@rollup/rollup-linux-arm-musleabihf": "4.63.4", + "@rollup/rollup-linux-arm64-gnu": "4.63.4", + "@rollup/rollup-linux-arm64-musl": "4.63.4", + "@rollup/rollup-linux-loong64-gnu": "4.63.4", + "@rollup/rollup-linux-loong64-musl": "4.63.4", + "@rollup/rollup-linux-ppc64-gnu": "4.63.4", + "@rollup/rollup-linux-ppc64-musl": "4.63.4", + "@rollup/rollup-linux-riscv64-gnu": "4.63.4", + "@rollup/rollup-linux-riscv64-musl": "4.63.4", + "@rollup/rollup-linux-s390x-gnu": "4.63.4", + "@rollup/rollup-linux-x64-gnu": "4.63.4", + "@rollup/rollup-linux-x64-musl": "4.63.4", + "@rollup/rollup-openbsd-x64": "4.63.4", + "@rollup/rollup-openharmony-arm64": "4.63.4", + "@rollup/rollup-win32-arm64-msvc": "4.63.4", + "@rollup/rollup-win32-ia32-msvc": "4.63.4", + "@rollup/rollup-win32-x64-gnu": "4.63.4", + "@rollup/rollup-win32-x64-msvc": "4.63.4", "fsevents": "~2.3.2" } }, @@ -16446,9 +16478,9 @@ } }, "node_modules/smol-toml": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.7.0.tgz", - "integrity": "sha512-aqVvWoyO21L23mb+drl4RmMXbf6N7FdHjAhTRA9ZBL7apWBgfWC16KjrASI+1p9GAroljyMHj6fK67i0UiTNvQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.8.0.tgz", + "integrity": "sha512-kCZr2V3ch9i00x8zXRhjUNVcjG9ijES5dDudkXvUVCT5QlJNQWElSJdZqyPemffHoLNUYwOcou0Fy+ojN0uHSQ==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -16970,9 +17002,9 @@ } }, "node_modules/systeminformation": { - "version": "5.33.11", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.33.11.tgz", - "integrity": "sha512-CNGk+882EQbsbPzaoxeBcYyx+nk0uTj5JzW8w0EXGSCazndNRAh9SE0V5tyMbdONGKilbIBJsyskF4WmZDk7uA==", + "version": "5.33.13", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.33.13.tgz", + "integrity": "sha512-GtyakkchTQKymM1WeAB652zi3rM1q00RKdc+jZe9KGstuc/mWUwAnQGN/RE5gVYvHIR8xYOUIUD9irVKDtA0wA==", "dev": true, "license": "MIT", "os": [ @@ -17345,9 +17377,9 @@ } }, "node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-3.0.0.tgz", + "integrity": "sha512-U3PppEkleoTnIfi8BozMx3yju3qc/L6SwqWo2Sw+54PX+PX0q9I+r1Um5HCmqD7n9VDX5/v3vQH/AjA6deDdtw==", "dev": true, "license": "MIT" }, @@ -17612,9 +17644,9 @@ } }, "node_modules/webpack": { - "version": "5.111.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.111.0.tgz", - "integrity": "sha512-A2R74kfE6b3eLKS91iZiol03Ebx7avmJJBOyiP+4LePW9NNeNJGQkKeSQos4dk6R4H0YAMYlv+aOrs1CyWT3eA==", + "version": "5.111.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.111.1.tgz", + "integrity": "sha512-cNypaz0RP+S4cvQVi1M/3bRUkvNP0xZpL0TjFx+c6jg64VbxD+2weWDgY9UnjRI6dhZgtaj8DU76GGFcJ79xPQ==", "license": "MIT", "peer": true, "dependencies": { diff --git a/package.json b/package.json index d318136..10445a2 100644 --- a/package.json +++ b/package.json @@ -54,18 +54,18 @@ "@trivago/prettier-plugin-sort-imports": "^6.0.2", "@types/jest": "^30.0.0", "@types/lodash": "^4.17.25", - "@types/node": "^26.6.1", + "@types/node": "^26.6.2", "@types/react": "^19.3.0", "@types/react-dom": "^19.3.0", "@typescript-eslint/parser": "^8.70.0", "concurrently": "^10.0.5", "cypress": "^15.21.0", "cypress-axe": "^1.7.0", - "eslint": "^10.10.0", - "jest": "^30.5.1", - "jest-environment-jsdom": "^30.5.1", - "markdownlint-cli2": "^0.23.2", - "prettier": "^3.9.7", + "eslint": "^10.11.0", + "jest": "^30.5.2", + "jest-environment-jsdom": "^30.5.2", + "markdownlint-cli2": "^0.23.3", + "prettier": "^3.9.8", "sass": "^1.104.1", "start-server-and-test": "^3.0.12", "typescript": "^6.0.3"