Skip to content

chore(deps): update npm dependencies updates - #99

Open
renovate[bot] wants to merge 1 commit into
developfrom
renovate/npm-dependencies-updates
Open

renovate[bot] wants to merge 1 commit into
developfrom
renovate/npm-dependencies-updates

Conversation

@renovate

@renovate renovate Bot commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Note

This PR body was truncated due to platform limits.

This PR contains the following updates:

Package Change Age Confidence
cypress (source) 16.1.* → 16.2.* age confidence
dotenv 18.0.5 → 18.0.10 age confidence
jscpd (source) 5.4.0 → 5.4.3 age confidence
release-it 21.1.0 → 21.1.2 age confidence

Release Notes

cypress-io/cypress (cypress)

v16.2.1

Compare Source

Changelog: https://docs.cypress.io/app/references/changelog#16-2-1

v16.2.0

Compare Source

Changelog: https://docs.cypress.io/app/references/changelog#16-2-0

motdotla/dotenv (dotenv)

v18.0.10

Compare Source

Changed
  • Fix dotenv.parse in Vite by moving the CLI shebang to a separate entry point (#​1082)

v18.0.9

Compare Source

Changed
  • Permit DOTENV_PATH being empty string with the CLI (#​1076)

v18.0.8

Compare Source

Changed
  • Fast parser should strip appended extra quotes (#​1073)
  • Type detail improvement (#​1074)

v18.0.7

Compare Source

Changed
  • Treat undefined settings like quiet: true as null rather than falsey (#​1070)
  • CLI should honor DOTENV_QUIET setting in .env file (#​1071)

v18.0.6

Compare Source

Changed
  • Use smarter parseBoolean not Boolean() to fix override (#​1069)
kucherenko/jscpd (jscpd)

v5.4.3

Compare Source

New Features
  • runJscpd() runs the jscpd binary from Node.js. require("jscpd") and import { runJscpd } from "jscpd" now export runJscpd(args, options). It finds the platform binary the way the jscpd command does and returns the result of spawnSync, so a script no longer starts a second Node.js process to run the command, and tools such as knip see that the script uses jscpd. Where the command prints an error and exits, the function throws an Error with the same message. The types are in index.d.ts. Detection still runs only in the Rust binary, and nothing parses or returns clones in JavaScript. By @​abrahamguo. (#​1238)

  • The HTML report shows both fragments of a clone and highlights the code. "Show code" used to open only the first fragment. Now it opens both side by side, or one above the other on a narrow screen, each under its file with line numbers in a gutter, and a long line scrolls inside its pane. The report highlights the code with Prism 1.30.0 again, as the v4 report did, and inlines only the languages it shows. A block inside another file, such as guide.md:typescript, keeps the lines that detection gives it. (#​1263, #​1265)

Bug Fixes
  • The GitHub Action installed the newest jscpd, whatever ref you pinned. The version input defaulted to latest, so kucherenko/jscpd@v5.4.1 installed 5.4.2 once it came out. Now an empty version installs the release that the action's own ref belongs to, so pinning the action pins jscpd, and a Dependabot bump of the action updates both. version: latest still installs the newest release. This works from v5.4.3 on: older tags still install the newest jscpd. Reported by @​dannystaple, fixed by @​sarankumar1325. (#​1240, #​1249)

  • A /* or // inside a JS or TS string ended a jscpd:ignore region. The tokenizer looked for the markers with a byte scan that took every /* and // for a comment, so 'a /* b' inside a marked region opened a comment that ran to the end marker, and the code after the string came back as clones. The markers are now found by their text, as in the other languages, so a region runs from jscpd:ignore-start to the next jscpd:ignore-end. Markers inside template literals, such as the CSS of a styled component, keep working. Reported by @​bauchdj, fixed by @​sarankumar1325. (#​1257, #​1258)

  • "Ignore this clone" in the language server broke JSX. It wrote // jscpd:ignore-start among JSX children, where the page shows it as text, and could put a marker inside a tag, such as < /* jscpd:ignore-end *//ul>, which TypeScript can't parse. Now it writes {/* jscpd:ignore-start */} among children and never puts a marker inside a tag. The start goes before the tag and the end after it, so the region still covers the clone. Each copy of a --cross-formats clone gets the comment of its own format, JSX in the <script lang="tsx"> of a Vue, Svelte or Astro component gets the JSX markers, and a marker after / gets a space so it doesn't turn into a line comment. (#​1260, #​1264)

  • --dead-code reported a file loaded with import(`./x`) or import('$lib/x') as unused. import() read only quoted specifiers and turned away any specifier with a $ in it, so a backtick import() with nothing interpolated and SvelteKit's $lib alias were never followed. The importing file also lost 30 points of confidence on every finding. jscpd dropped import.meta.glob(`./pages/*.ts`) the same way. Now only ${ inside backticks counts as interpolation. On six repositories nothing new was reported. Reported with the cause by @​abrahamguo. (#​1239, #​1251)

  • --dead-code reported constructors and dunder methods as unused members. constructor in JavaScript and __init__ or __repr__ in Python are called by the runtime, not by name, and the unused-member check didn't skip them. It does now. Reported by @​abrahamguo, fixed by @​sarankumar1325. (#​1253, #​1254)

  • --dead-code reported knip's knip.ts and knip.js as unused files. They are knip's config, but no rule knew them. The new knip framework entry keeps them as entry points, and knip shows up in the console's Frameworks: line. Reported with the fix by @​abrahamguo. (#​1255, #​1256)

  • The Linux binaries accepted certificates from the leaked emSign intermediate CAs. rustls-webpki moved to 0.103.16 and webpki-roots and webpki-root-certs to 1.0.10, so they reject them. This matters for --semantic-url with a remote API on Linux. Model downloads are pinned by SHA-256, and macOS and Windows use the system TLS stack. (RUSTSEC-2026-0381, 0382, 0383, #​1236)

  • nix run github:kucherenko/jscpd didn't build. The flake built the dependencies without the workspace's paste shim and left out files that the crates include at compile time. It takes the whole rust/ folder now, and a new Nix workflow builds and runs the package on Linux and macOS. (#​1272)

Other
  • The release pipeline asks npmmirror to sync every npm package after a release, because the mirror never copied jscpd-linux-x64-gnu@5.4.2, and pnpm installs from it lost the Linux binary without a warning. Reported by @​icret. (#​1261, #​1262)
  • The release pipeline waits up to 30 minutes for npm to serve a new version, and the release tag now points at the release commit. (#​1232, #​1250)
  • The Super Linter section of docs/ci-and-hooks.md shows where the config file goes and how to gate on new clones only, with Super Linter v9.0.0 or later. (#​994)
  • The README's "Who Uses jscpd" lists 28 projects and the file in each one that runs jscpd. (#​1287)
Dependencies
  • candle moved to 0.11.1 and zip to 9.3.0, which fixes RUSTSEC-2026-0429 and the three zip advisories that were ignored until now (#​1278, #​1279)
  • askama builds without its config feature, so the unmaintained basic-toml leaves the build (RUSTSEC-2026-0374, #​1230)
  • oxc, ruff, tree-sitter 0.27.1, tree-sitter-scala 0.26.4, serde-saphyr 2.0.0, ureq 3.5.1, ignore 0.4.34, memmap2 0.9.12 and log 0.4.35 moved to newer releases
Thank You ❤️

Published Packages

  • basta@0.3.3 on crates.io
  • cpd-core@0.1.23 on crates.io
  • cpd-finder@0.1.22 on crates.io
  • cpd-reporter@0.1.24 on crates.io
  • cpd-semantic@0.1.4 on crates.io
  • cpd-similarity@0.1.1 on crates.io
  • cpd-tokenizer@0.1.22 on crates.io
  • jscpd@5.4.3 on crates.io
  • cpd@5.4.3 on npm
  • jscpd@5.4.3 on npm
  • jscpd-darwin-arm64@5.4.3 on npm
  • jscpd-darwin-x64@5.4.3 on npm
  • jscpd-linux-x64-gnu@5.4.3 on npm
  • jscpd-linux-arm64-gnu@5.4.3 on npm
  • jscpd-linux-x64-musl@5.4.3 on npm
  • jscpd-linux-arm64-musl@5.4.3 on npm
  • jscpd-windows-x64-msvc@5.4.3 on npm
  • jscpd-windows-arm64-msvc@5.4.3 on npm
  • jscpd==5.4.3 on PyPI

Verify

Archives are signed with Sigstore (keyless, <asset>.sigstore.json)
and carry SLSA build provenance. Replace jscpd-linux-x64-gnu.tar.gz with your asset:

cosign verify-blob \
  --bundle jscpd-linux-x64-gnu.tar.gz.sigstore.json \
  --certificate-identity-regexp '^https://github\.com/kucherenko/jscpd/' \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com \
  jscpd-linux-x64-gnu.tar.gz
gh attestation verify jscpd-linux-x64-gnu.tar.gz --repo kucherenko/jscpd
sha256sum --check --ignore-missing checksums.txt

v5.4.2

Compare Source

The post What's new in jscpd 5.4.2 shows the new features with commands and real output.

New Features
  • Boundaries keep the code of a module inside it. The new boundaries key of the config file lists rules. A rule names the code it protects (code: a folder, a file, a glob, or a method as path#name), where copies of it must not show up (notIn, or every file outside code when it is left out) and where they may after all (allow). Every clone run checks the rules, and a copy of protected code outside its boundary fails the run with exit code 1. Import linters miss such copies, because a copied function imports nothing.

    • jscpd looks for copies three ways, and a rule can set its own bars in thresholds. Token clones find copy-paste, the structure comparison of --similarity finds an edited copy, and the --semantic model finds the same logic written again, often in another language. disable turns kinds off by their --kind names. Without a downloaded model, jscpd prints a warning and checks the rules without the semantic search.
    • A mistake in a rule, such as an unknown key or a glob that doesn't compile, stops the run with an error that names the rule. A rule that checks nothing in a run, after a typo in a path or a method name for example, gets a warning.
    • The console, console-full, ai and json reporters show the violations, the json one under boundaries. Baselines and --changed don't apply to violations yet, and SARIF, the language server and the MCP server don't report them.
    • fixtures/boundaries-demo is a small shop whose web app copies the backend's pricing and loan code. (#​1225, #​1227)
  • --ignore-identifiers pairs a name with one name. Every name used to match every other name, so x = x + x * x was a clone of d = a + b * c, although its data flows another way. Now a name on one side has to stand for the same name on the other side every time, and two names can't stand for one, as in Baker's parameterized matching and NiCad's consistent renaming. On 24 projects in 11 languages, 6,942 of the 14,501 renamed clones that the old matching reported had no such mapping.

    • jscpd cuts a clone where a name starts to stand for two and still reports every part of --min-tokens tokens or more.
    • A name reached as a member, after . or ?., and after -> in C, C++, PHP and Perl, is another name than a local of the same text. A constructor that sets this.url = url still matches its copy that sets this.url = link (#​1220).
    • --ignore-identifiers and --ignore-identifiers=consistent give the new matching, --ignore-identifiers=blind the old one. The config takes "ignoreIdentifiers": true, "consistent" or "blind", and the Action input takes consistent or blind. The value goes after = only, so --ignore-identifiers src/ still scans src/.
    • fixtures/type2-demo has the consistent and members examples. (#​1217, #​1218)
  • --similarity pairs a name with one name too. The fingerprint of a subtree now records how its names repeat, so x = x + x * x no longer scores 1.0 against d = a + b * c, and a renamed copy still does. Members, labels such as keyword arguments and object keys, and types each have names of their own, so self.url = url still matches self.url = link. A function's own name matches any name. Kotlin's true, false and null and Clojure's true, false and nil are literals now. On the same 24 projects, 15 of 23,530 pairs fell below 0.8, and runs take 2 to 9% longer. --ignore-identifiers=blind brings back the old scores and also turns on renamed token clones. fixtures/similarity-demo/names scores a renamed copy at 1.00 and a mirrored function at 0.74. (#​1219)

  • --history tracks the health score, and a bare --history walks the last 30 commits. Every commit of the series gets the score that jscpd --health gives its tree. The console draws a health chart under the duplication chart and adds HEALTH and CHANGE columns, and every point of the JSON report has health. --health and --dashboard take --history now: the badge or the dashboard comes first, then the series, in the markdown and html reports too.

    • jscpd --history used to fail with "a value is required". Without a value the flag takes the config's history, or else the newest 30 commits of HEAD (--history-limit). --history-every N spaces them N commits apart, and the Action's history input takes true.
    • jscpd scans a commit the way it scans the working tree: --ignore and --pattern see its files at their working-tree paths, and the checkout runs none of the repository's hooks. A walk that stops at the edge of a shallow clone prints a warning that names the commit.
    • The last 30 commits of axios take about 5.4 seconds, against 4.9 without the health score. (#​1199)
  • jscpd knows 73 more formats by extension, and files by name. 94 of 224 formats had no built-in extension, a gap that came from v4, so jscpd . skipped Dockerfiles, Makefiles, go.mod, Elixir and Nix files unless you mapped them. The new extensions come from GitHub Linguist, and a table of file names maps Dockerfile, Containerfile, Makefile, go.mod, CMakeLists.txt, Gemfile, Jenkinsfile and others. Existing formats got more suffixes, such as .zsh, .jsonc, .tfvars and .sbt. A Markdown fence such as ```dockerfile takes its format from the same table, and --formats-exts and --formats-names still win over every built-in mapping. FORMATS.md lists the file names too. (#​1174, #​1192)

Changes

  • jscpd . scans more files. On 22 repositories the new file associations picked up 1 to 5 more files each, mostly Dockerfiles, .editorconfig, .jsonc, Makefiles and go.mod, and jscpd scans the .rst files of Sphinx docs like Markdown. The duplication percentage can move, and a --threshold gate can fail. (#​1192)

  • --ignore-identifiers reports fewer renamed clones, and some of them are shorter. A baseline that 5.4 made with --ignore-identifiers is a blind one. Keep --ignore-identifiers=blind with it or update the baseline, or --fail-on-new-clones reports the cut clones as new. (#​1218)

  • --history walks first parents. A merged branch counts as its merge commit, so a range across merged branches gives fewer points than before. jscpd builds a series only when a reporter shows it (console, console-full, ai or json, and markdown or html with --health or --dashboard), so a badge-only --health job no longer walks the range. The ai lines read 37be780 2026-08-08 2/1/47.6 +47.6 health 72 -2 now, and a wrong health or dead-code option no longer fails a clone run. (#​1199)

Bug Fixes

  • jscpd aborted on a Markdown page whose front matter ran into a code fence. A page that opens with a horizontal rule and later shows a Python stub had front matter from the rule down to the stub's ..., across the fence, and the scan panicked: jscpd exited with 134, and jscpd --mcp and jscpd --lsp died. A --- on the first line now opens front matter only when the next line isn't blank, as Pandoc reads it, and only a --- or ... line before the first code fence closes it. The frontmatter of an Astro component follows the same rule. A page of code fences that never close used to take quadratic time, 3.9 seconds for 100 KB, and takes 0.04 seconds now. (#​1223, #​1226)

  • A Razor view was read out of order. jscpd tokenized the HTML of a whole view and then the C# of its blocks, so a clone across that seam ended before it started: release builds printed ranges such as [48:48 - 5:35], and debug builds panicked. A view is now one stream in the order of its text. Two identical views count as duplicated from the first line to the last, and markup in an @if or @foreach block matches the same markup outside one. (#​1221, #​1222)

  • The MCP server's check_duplication never matched a Vue, Svelte or Astro snippet. It tokenized a snippet as one stream, while a scan splits a component into its blocks and a Markdown file into its prose and fences. A component snippet met only the components inside Markdown fences, by meaning it found nothing, and the fences of a Markdown snippet matched nothing either. The server now splits a snippet the way a scan splits a file of its format. Each match has format and lines, and the note names every block too short to match. #​1228 also fixed how jscpd counts the duplicated lines of a clone whose two fragments swap places, so the statistics of a --cross-formats run can change a little. (#​1224, #​1228, #​1229)

  • --history failed when git's log.showSignature was on. git printed the signature check of each signed commit before the commit, and jscpd took that line for a commit hash. jscpd now passes --no-show-signature and reads only lines that start with a commit hash. Reported with an exact reproduction by @​vitorcsbrito. (#​1195, #​1196)

  • --compare paired a function with every near-best lookalike. It took the rule of --semantic, where a group of near-equal functions all pair with each other, but in a port a function has one counterpart. A pair now stays only when it is the best match of one of its two functions, and a near tie goes to the partner in a file of the same name. On the analysis modules of Lucene and Lucene.NET the pairs went from 2,219 to 1,392, and the share of pairs between files of the same name from 46% to 73%. Analysis and numbers by @​MysterionRise. (#​1162, #​1194)

  • --semantic reported a page and the component it renders as a clone. It skips a pair when one function calls the other, but it didn't count a JSX element such as <EditUserForm /> as a call. It does now, and so does the call graph of --compare. Reported by @​Rosenblad, fixed by @​cristianchiriac. (#​1210, #​1211)

  • Reports named a clone in a Markdown block or a component like guide.md:markup. The VS Code extension opened that name as a file and failed. The JSON name, the language server's jscpd/clones and jscpd/semantic, the XML path and the xcode location now name the file, and the JSON keeps the block's language in format. The console, ai and HTML reports still name the block. (#​1200)

  • Every repository counted the hook samples in .git/hooks. The walk takes hidden files, so it went into .git too, and the 9 bash files and 1 perl file that git init writes counted in the file count, the line totals and the health score. jscpd now skips .git folders. (#​1193)

Other

  • jscpd depends on basta 0.3.2. basta reads YAML with serde-saphyr now, since its old parser, serde_yaml_ng, sits on the unmaintained unsafe-libyaml (RUSTSEC-2024-0449) (#​1198), and it gives --history the dead-code report without the compiler's Rust findings (#​1199).
  • The README shows the duplication of jscpd's own Rust code and a badge to follow the author on X (#​1197).

Dependencies

  • rustls moved to 0.23.46 for RUSTSEC-2026-0346 to 0349 (#​1201). cargo deny and cargo audit ignore three advisories about extracting zip archives, RUSTSEC-2026-0367 to 0369: jscpd extracts no archive, and candle-core 0.11 still needs zip 8 (#​1215, #​1216).
  • ruff moved to 0.0.17 (#​1202), tree-sitter-php to 0.25.1 (#​1204), tree-sitter-language to 0.1.9 (#​1205), sha2 to 0.11.1 (#​1207) and serde_json to 1.0.154 (#​1208).
  • In CI, actions/setup-node moved to 7.1.0 (#​1203), actions/download-artifact to 8.0.2 (#​1206) and taiki-e/install-action to 2.87.28 (#​1209).

Thank You ❤️

Published Packages

  • basta@0.3.2 on crates.io
  • cpd-core@0.1.22 on crates.io
  • cpd-finder@0.1.22 on crates.io
  • cpd-reporter@0.1.23 on crates.io
  • cpd-semantic@0.1.3 on crates.io
  • cpd-similarity@0.1.1 on crates.io
  • cpd-tokenizer@0.1.21 on crates.io
  • jscpd@5.4.2 on crates.io
  • cpd@5.4.2 on npm
  • jscpd@5.4.2 on npm
  • jscpd-darwin-arm64@5.4.2 on npm
  • jscpd-darwin-x64@5.4.2 on npm
  • jscpd-linux-x64-gnu@5.4.2 on npm
  • jscpd-linux-arm64-gnu@5.4.2 on npm
  • jscpd-linux-x64-musl@5.4.2 on npm
  • jscpd-linux-arm64-musl@5.4.2 on npm
  • jscpd-windows-x64-msvc@5.4.2 on npm
  • jscpd-windows-arm64-msvc@5.4.2 on npm
  • jscpd==5.4.2 on PyPI

Verify

Archives are signed with Sigstore (keyless, <asset>.sigstore.json)
and carry SLSA build provenance. Replace jscpd-linux-x64-gnu.tar.gz with your asset:

cosign verify-blob \
  --bundle jscpd-linux-x64-gnu.tar.gz.sigstore.json \
  --certificate-identity-regexp '^https://github\.com/kucherenko/jscpd/' \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com \
  jscpd-linux-x64-gnu.tar.gz
gh attestation verify jscpd-linux-x64-gnu.tar.gz --repo kucherenko/jscpd
sha256sum --check --ignore-missing checksums.txt

v5.4.1

Compare Source

New Features
  • --similarity compares the structure of functions in 15 languages. jscpd parses every function and method and normalizes its syntax tree: the names of the functions it calls and its operators stay, local names, field names and literals become markers, and comments and the parentheses around one expression drop out. Every subtree of that tree is a fingerprint, and two functions score the Jaccard index of their two fingerprint sets, so a renamed copy scores 1 and an edited statement lowers the score.

    • It reads JavaScript, TypeScript, Python, Java, Kotlin, Scala, C#, Go, Rust, C, C++, PHP, Ruby, Swift and Clojure, and the code blocks of Markdown files and the scripts of Vue, Svelte and Astro components. 5.4.0 compared JavaScript and TypeScript only.
    • The search is exact: it finds every pair at or above the ratio. A function nested in another is part of it, and test files and Rust mod tests are left out. Code between jscpd:ignore-start and jscpd:ignore-end, or matched by --ignore-pattern, adds nothing to a function (#​1144).
    • --similarity alone compares at 0.8. --min-nodes (config key minNodes, 20 by default) sets the smallest normalized tree that takes part, --min-lines applies as before and --min-tokens does not. The JSON report gives the node count of both functions as nodes.
    • While the method was built, a check on 100 open-source repositories against a brute-force implementation of it, which scores every pair, found the same 58,405 pairs with the same scores, and jscpd's runs took 64.8 seconds on one thread against 498.
    • fixtures/similarity-demo has a runnable example in every language. (#​1129, #​1132, #​1134, #​1136, #​1139, #​1147, #​1148, #​1149, #​1150, #​1152, #​1155, #​1138, #​1141, #​1142, #​1143, #​1145, #​1146, #​1156)
  • An edn reporter. -r edn writes jscpd-report.edn with {:candidates [...] :clones [...]}. The candidates are every pair --similarity found, most similar first, with their score, language, both locations and node counts, also the pairs a token clone already reports. The clones are the ones the other passes found, with their kind, method and score. (#​1151, #​1153, #​1156)

  • --changed reports the clones of the files you are working on. The changed files are the ones git status lists: staged, unstaged and untracked files, and a renamed file under its new name. jscpd still scans every file and reports a clone when one of its fragments is in a changed file, so a new file that copies an unchanged one shows up.

    • The first run saves the clones of HEAD to .jscpd-baseline.json at the repository root, or to the --baseline file, with the commit and a hash of the scan paths and options. Later runs read it and mark the clones HEAD did not have as [NEW], so --fail-on-new-clones works with it. jscpd builds the file again after a commit or for other paths or options. A baseline file without a commit, such as one --update-baseline wrote, is used as it is.
    • --changed-only scans the changed files alone, and they match only one another.
    • Both flags are command line only. fixtures/changed-demo walks through five steps. (#​1154, #​1172)
  • --report-name sets the base name of the report files. Linter aggregators such as MegaLinter run several tools into one reports folder, and two jscpd runs there overwrote each other's jscpd-report.json. --report-name megalinter-jscpd (config key reportName) names the json, xml, csv, html, markdown, sarif and edn reports, and the GitHub Action takes it as the report-name input. The badge, OpenMetrics and CodeClimate files keep their names. The name must be a plain file name: a path, an extension or an empty name is an error. Contributed by @​MannXo. (#​1015, #​1058)

  • The MCP server finds every type of clone and compares folders. Every tool takes kinds: exact, renamed, similar and semantic, or type1 to type4. Without it, a tool reports what jscpd reports with the server's options. compare_folders(left, right) returns the JSON report of --compare for two folders. The server speaks the MCP revision 2026-07-28, and clients of the older revisions keep working. check_duplication now finds every copy of a snippet, where it used to match one of two, and --mcp no longer ignores --semantic. (#​1135, #​1137)

Changes
  • --similarity scores differ from 5.4.0. The method is new, so a pair that scored 0.85 before can score lower now. Refresh a --threshold or a baseline that was set on the old results. --similarity 1 now reports functions with the same structure; up to 5.4.0 a ratio of 1 turned the search off, and jscpd prints a warning that says so. The options that the method replaced never reached a release. (#​1156)
Bug Fixes
  • --semantic and --compare found functions named if in C, C++ and C# code. Around #if and #ifdef, the grammars read else if (…) { } as a function named if, or while or await, and every if ( in the scan counted as a call to it, so in --compare one such branch could collect thousands of callers. jscpd now drops a function whose type is the keyword else. A word such as if, while or catch before a parenthesis counts as a call only as a member, as in promise.catch(f). Reported by @​MysterionRise, fixed by @​mvanhorn. (#​1163, #​1188)

  • Three --compare fixes found on Apache Lucene and Lucene.NET, all by @​MysterionRise:

    • Test helpers now count toward the namesakes of a call. A private assertEquals in Lucene's benchmark code took all 6,127 calls to the name, 6,126 of them from tests. (#​1165)
    • The HTML map cuts a long folder label in its middle, so the folders of one module no longer read alike. (#​1166)
    • A .NET test project counts as tests wherever Tests sits in its dotted name, as in Lucene.Net.Tests.Analysis.Common. Before, 6,736 functions in 771 files of such projects counted as code. (#​1167)
  • The --compare reports disagreed. The console and the HTML map now round a share the same way, so 60 of 147 functions read 41% in both. A Tests block appears only when a side has a test that counts, and a declaration without a body no longer counts as a function. (#​1130)

  • --dead-code reported an import used only in a TSDoc link as unused. {@link X}, {@linkcode X} and {@linkplain X} now count as uses of X, as TypeScript counts them, and in JavaScript files the JSDoc types of @param, @returns, @type and the like count too. A name in the docs credits the import only, so a function that only a link names is still reported. (#​1170, #​1171)

  • --ignore-pattern dropped the wrong tokens in code blocks. jscpd computed the ranges on the host file but tokenized Markdown fences, component scripts and Razor blocks from the block's own offsets. The ranges now move to the block. (#​1144)

  • git commands run from a hook acted on the hook's repository. jscpd's git subprocesses now drop the variables git exports to hooks, such as GIT_DIR and GIT_INDEX_FILE; before, --baseline-from-ref in a pre-commit hook wrote the base tree into the commit's index. A --history range or a --baseline-from-ref ref that starts with - is refused, so a scanned repository's config can no longer pass git an option such as --output=<file>. The worktree cleanup no longer prunes the user's other worktrees, and an API key that an embeddings API echoes in an error is redacted. (#​1169)

  • The Nix flake warned about stdenv.isDarwin. It uses stdenv.hostPlatform.isDarwin now. Contributed by @​mlavrinenko. (#​1133)

Other
  • The minimum Rust version is 1.97. oxc 0.153 and ruff 0.0.16 need it. (#​1187)
  • jscpd depends on basta 0.3.1, which has the dead-code fixes above.
  • The tests check behavior instead of implementation details, and CI measures line coverage (#​1168). The release retries cargo publish while the crates.io index catches up (#​1123), and the compare-codebases skill keeps vendored and build folders out of a comparison (#​1124).
Dependencies
  • oxc moved to 0.153 (#​1125, #​1184), ruff to 0.0.16 (#​1185) and tree-sitter-swift to 0.7.4 (#​1186), together in #​1187. The new Swift grammar reads nil as a node of its own, and --similarity treats it as a literal.
  • xxhash-rust moved to 0.8.19 (#​1126, #​1140), and yoke-derive to 0.8.4 because 0.8.3 was yanked.
  • In CI, taiki-e/install-action moved to 2.87.26 (#​1127, #​1183) and dorny/test-reporter to 3.2.0 (#​1182).
Thank You ❤️

Published Packages

  • basta@0.3.1 on crates.io
  • cpd-core@0.1.21 on crates.io
  • cpd-finder@0.1.21 on crates.io
  • cpd-reporter@0.1.22 on crates.io
  • cpd-semantic@0.1.2 on crates.io
  • cpd-similarity@0.1.0 on crates.io
  • cpd-tokenizer@0.1.20 on crates.io
  • jscpd@5.4.1 on crates.io
  • cpd@5.4.1 on npm
  • jscpd@5.4.1 on npm
  • jscpd-darwin-arm64@5.4.1 on npm
  • jscpd-darwin-x64@5.4.1 on npm
  • jscpd-linux-x64-gnu@5.4.1 on npm
  • jscpd-linux-arm64-gnu@5.4.1 on npm
  • jscpd-linux-x64-musl@5.4.1 on npm
  • jscpd-linux-arm64-musl@5.4.1 on npm
  • jscpd-windows-x64-msvc@5.4.1 on npm
  • jscpd-windows-arm64-msvc@5.4.1 on npm
  • jscpd==5.4.1 on PyPI

Verify

Archives are signed with [S

[!IMPORTANT]
✂ PR body was truncated to here.


Configuration

📅 Schedule: (in timezone Europe/Paris)

  • Branch creation
    • "before 8am on monday"
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate
renovate Bot force-pushed the renovate/npm-dependencies-updates branch 3 times, most recently from 4763681 to 88a6535 Compare October 20, 2026 19:25
@renovate
renovate Bot force-pushed the renovate/npm-dependencies-updates branch 2 times, most recently from e0133a1 to 918b4b1 Compare October 28, 2026 20:26
@renovate
renovate Bot force-pushed the renovate/npm-dependencies-updates branch from 918b4b1 to 33aa66d Compare October 30, 2026 20:35
@renovate
renovate Bot force-pushed the renovate/npm-dependencies-updates branch from 33aa66d to dda9e6b Compare November 8, 2026 12:46
@renovate
renovate Bot force-pushed the renovate/npm-dependencies-updates branch from dda9e6b to 2bb3c3f Compare November 9, 2026 03:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants