chore(deps): update npm dependencies updates - #142
Open
renovate[bot] wants to merge 1 commit into
Open
renovate[bot] wants to merge 1 commit into
renovate[bot] wants to merge 1 commit into
Conversation
renovate
Bot
force-pushed
the
renovate/npm-dependencies-updates
branch
2 times, most recently
from
September 23, 2026 01:14
a3d3b75 to
5c2df66
Compare
renovate
Bot
force-pushed
the
renovate/npm-dependencies-updates
branch
from
September 23, 2026 23:48
5c2df66 to
08c5758
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
16.3.5→16.3.65.2.*→5.3.*Release Notes
vercel/next.js (create-next-app)
v16.3.6Compare Source
This release contains a security fix for GHSA-vcvr-r3jv-pc5j: Remote Code Execution in next/og ImageResponse
kucherenko/jscpd (jscpd)
v5.3.2Compare Source
New Features
cargo buildalready prints lines likefunctionreprintis never used, with real name resolution, trait dispatch and macro expansion behind them. The dead-code run now reads that output, from the JSON ofcargo check(orbuild,clippy,test --no-run), and reports it next to everything else, through the same categories, reporters and--min-confidence, at 100% confidence.bastatakes--rust-diagnostics <file>, or-for a pipe:cargo check --all-targets --message-format=json | basta . --rust-diagnostics -.--dead-code,--dashboardand--health, so a Rust project gets its health badge from the check it already runs:cargo check --all-targets --message-format=json | jscpd . --health --rust-diagnostics - --reporters badge. The dead-code section of the config file takes the file asrustDiagnostics.--all-targetsreports twice is counted once. A diagnostic inside a macro expansion, or for a crate outside the scanned paths, is left out.--include-tests, at 85%.manifest_pathin a hand-edited or copied file is resolved from where the file lives.pubitem of a library, and it has no notion of an unused file, so jscpd reports neither for Rust.fixtures/dead-code-demo. (#1089)Bug Fixes
Text around an embedded code block was counted as code. A
tsblock in a markdown file, a<script>in a single-file component: jscpd scans these under the embedded language's own format, and the block keeps the line numbers of the file it lives in. The statistics read those numbers as if the block ran the whole way, which put the markdown prose and the component templates into the embedded language's line counts — both the total and the duplicated lines. On a repository with about 3600 markdown files the typescript row said 51.30% of lines were duplicated where the same code, scanned with-f typescript, said 3.37%. Neither number was a typo and both came from the same run.An embedded source now counts the lines its blocks occupy, and a clone counts the block lines it covers rather than everything its fragment reaches across. The two percentage columns agree again, which is the quickest way to check a run: they measure the same duplication, so when the line column sits far below the token column it is counting text that holds no code. Ordinary files are counted exactly as before. See
fixtures/embedded-stats-demo. (#1091, closes #1090)Every clone was one line short. Duplicated lines came from
end - start, so a clone covering lines 10 through 19 counted nine — while the console printed10 linesfor it, from its own arithmetic. Line counts are inclusive now, and the header and the table come from one place. Expect duplicated-line totals to rise by about one line per clone, and percentages with them. (#1091)Other
bastaon npm, crates.io and GitHub.Published Packages
basta@0.3.0on crates.iocpd-core@0.1.18on crates.iocpd-finder@0.1.18on crates.iocpd-reporter@0.1.19on crates.iocpd-tokenizer@0.1.17on crates.iojscpd@5.3.2on crates.iocpd@5.3.2on npmjscpd@5.3.2on npmjscpd-darwin-arm64@5.3.2on npmjscpd-darwin-x64@5.3.2on npmjscpd-linux-x64-gnu@5.3.2on npmjscpd-linux-arm64-gnu@5.3.2on npmjscpd-linux-x64-musl@5.3.2on npmjscpd-linux-arm64-musl@5.3.2on npmjscpd-windows-x64-msvc@5.3.2on npmjscpd-windows-arm64-msvc@5.3.2on npmjscpd==5.3.2on PyPIVerify
Archives are signed with Sigstore (keyless,
<asset>.sigstore.json)and carry SLSA build provenance. Replace
jscpd-linux-x64-gnu.tar.gzwith 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.txtv5.3.1Compare Source
New Features
--dashboardlists the largest code files. The Project section now ranks files by lines, with their tokens and size, next to the largest formats — the files worth splitting, beside the most complex ones further down. Only code is ranked: a lockfile, a changelog or a long HTML page is often the longest file in a repository and nothing anyone would refactor, so prose, data and markup files are left out, as they are from the complexity list.--summary-topsets the rows, and thejson,markdownandhtmlreporters carry the same list (project.largestFilesinjscpd-dashboard.json, an added key). Seefixtures/dashboard-demo. (#1086)basta now detects which frameworks a project uses. A framework runs files that nothing imports: a router's pages, a runtime's plugin directories, handlers it finds by convention. basta used to know three such cases, hard-coded: Nuxt, Nitro and WXT. It now reads them from a list of about fifty definitions built into the binary,
frameworks.yaml. The list covers Next.js, Nuxt, Nitro, WXT, Plasmo, Remix, React Router, SvelteKit, Astro, SolidStart, TanStack Start, Qwik City, Gatsby, RedwoodJS, Angular, NestJS, AdonisJS, Sails,@fastify/autoload, Strapi, Medusa, Ember, Quasar, React Native, Expo, Cloudflare Workers, Vercel, Netlify, Serverless, Trigger.dev, Docusaurus, VitePress, Eleventy, Storybook, Histoire, Jest, Vitest, Mocha, AVA, Playwright, Cypress, Cucumber, Prisma, Knex, Sequelize, TypeORM, Hardhat and Create React App.package.jsondependencies, or its section inpackage.json. basta checks every directory that holds scanned files, so each package of a monorepo is treated as its own project.srcDir,entrypointsDir,appDirectory,sourceRootinnest-cli.json, andimports: false.Frameworks: next (apps/web), vitest. Bothbastaandjscpd --dead-codeprint it.bastaflags:--list-frameworksprints the list.--framework <name>treats a framework as present, which helps when the scan starts below itspackage.json.--no-frameworksturns detection off.--frameworks-config <file>loads your own definitions, in YAML or JSON, in the same shape as the built-in list. basta also picks upbasta.frameworks.{yaml,yml,json}from the working directory. Your definitions can add a framework basta does not know, or replace a built-in one that has the same name. If the file fails to load, basta stops with an error, because running without it would report as dead the very files the definitions protect.globals. The built-in list hasgetServerSideProps,generateMetadataand the route segment config for Next;loader,actionandmetafor Remix and React Router;load,actions,prerenderand the hooks for SvelteKit;getStaticPathsfor Astro; the Gatsby Node, browser and SSR APIs; the lifecycle methods of Angular and Nest;onRequest*for Cloudflare Pages Functions;handlerfor Netlify and Serverless functions; and more. basta treats a declaration with such a name as used. It never reports it, including under--include-entry-exportsand as an unused member, and everything the declaration calls stays reachable.globalsapplies to every file of the project. The{ names, files }form limits names to the files the framework reads them from, soloadercounts for Remix under the app directory and is an ordinary name everywhere else. This also fixes a React Router route named fromroutes.ts. basta reaches that file through a string, so it is not an entry point, and itsloaderused to be reported as an unused export.srcDirand treatstasks/as loaded by the framework.fixtures/dead-code-demo. (#1087).jscpd.jsoncan hold dead-code settings in a section of their own. ThedeadCodekey (also spelleddead-codeorbasta) used to be a boolean that turned the mode on. It can now also be an object with these keys:enabled,categories,minConfidence,minLines,entry,ignore,includeTests,includeEntryExports,threshold, and the framework settingsframeworks(definitions written inline, in the shape offrameworks.yaml),frameworksConfig,frameworkandnoFrameworks."enabled": true, so you can keep clone settings and dead-code settings in one file and choose the run on the command line."deadCode": truestill works as the switch.minConfidence,entry,deadCodeCategories, …), which still work.minLinesandthresholdexist only inside the section, because the top-level keys with those names are about clones. The top-levelminLinesis the smallest clone to report and is never applied to a dead-code run. The top-levelthresholdis a limit for duplicated lines. A dead-code run still falls back to it when the section sets nothreshold, as before.jscpd --dead-codeand--dashboardnow also pick upbasta.frameworks.{yaml,yml,json}from the working directory.bastabinary reads the same section from the same file. It has a new-c, --config <file>flag. Without it, basta looks in the working directory for.jscpd.json,.config/jscpd.jsonorpackage.json. Both tools give the same result when you start them in the same directory.fixtures/dead-code-demo. (#1087)Fixes
We ran basta next to knip and fallow on 55 repositories: the GitHub trending lists for JavaScript, TypeScript, Vue, Svelte and Astro, plus the source code of Nuxt, Next.js, Svelte, Gatsby and Astro. The run found these problems in basta, all fixed in [#1087](#1087:
--dead-codewas very slow on projects with many path aliases. basta tested every import against every alias in the project, and it did the slow check first: comparing the importer's path with the directory of the config that declared the alias, one path segment at a time. A monorepo with 150 packages, each listing a few hundredpaths, took 198 s (ever-gauzy). Next.js took 83 s. basta now checks first whether the alias pattern matches the import at all, which fails on the first character for almost every alias. The same two projects now take 3.3 s and 4.4 s, and the findings are byte for byte the same."*": ["./*", "../../node_modules/*"], an import ofreactwent through the resolver from every file, and each miss built and hashed about twenty candidate paths. The module index can now tell in two lookups whether a path could name any module, under any extension or as a directory index, and the answer is exact. LibreChat went from 4.0 s to 0.86 s with identical findings.'@': '/src'alias was read as the root of the file system. In a Vite alias target a leading/means the project root, as it does in a URL, and many projects write the alias that way. basta lost every@/import in such a project and reported its components as unused files at 95% confidence. MoeKoeMusic went from 55 unused files to 0.require(`./x`)with backticks was ignored. A template literal with nothing interpolated is as static as a quoted string, and Gatsby writes every string that way. Gatsby went from 584 unused files to 352.<script on:load={() => { … }} src=…>, basta took the>of=>for the end of the tag and passed the rest of the attribute to the JavaScript parser as the component's script. The file failed to parse, and everything it imports was reported as unused. cobalt went from 37 unused files to 8.admin.py,apps.py, template tags, and the modules that settings name by dotted path. Django, Alembic and Scrapy are now in the framework list, detected bymanage.py,alembic.iniandscrapy.cfg. AdventureLog went from 144 unused Python files to 6.resolve(distDir, 'runtime/handlers/island')is how a framework registers a file it loads itself. It is not an import, and basta does not treat it as one. But a file whose own path ends the same way now gets a new reason,path-appears-in-string("its path appears in a string literal"), which costs 40 points. That puts the file under the default threshold of 60, and it still shows up with--min-confidence 0. Nuxt went from 83 unused files to 46. The reason is a new possible value ofreasonsin the JSON report.--dead-coderead a WXT browser extension as almost entirely dead (#1082): the framework'sentrypoints/directory — background, content scripts, popup pages — was not recognized as entry points, and its@/~→srcDir,@@/~~→ root aliases live only in the generated.wxt/tsconfig.json, which no repository commits, so the whole tree dangled and cascaded (Tencent/BrowserSkill: 27.9% "unused", 115 unused files — now 0.4% and 5). Awxt.config.*now marks the entrypoints and auto-import directories as entries, honoringsrcDir,entrypointsDirandimports: false, and declares the conventional aliases, the same waynuxt.config.*roots Nuxt's directories andsvelte.config.*supplies$lib. (#1083)if,foror a media query'sandas branches — an HTML page could top the "Most complex files" list. These formats now have complexity0, like prose and data files already did, and are therefore no longer counted as code by the health score: an all-markup project reports "no code files" instead of being scored on its markup. Component formats (Vue, Svelte, Astro) still count in full through their script blocks. The markup block of a component file (tokenized ashtml) is now also excluded from the duplication share, matching thecss/scssblocks that already were. (#1081) (#1084)Other
bastaon npm, crates.io and GitHub.Published Packages
basta@0.2.0on crates.iocpd-core@0.1.16on crates.iocpd-finder@0.1.17on crates.iocpd-reporter@0.1.17on crates.iocpd-tokenizer@0.1.17on crates.iojscpd@5.3.1on crates.iocpd@5.3.1on npmjscpd@5.3.1on npmjscpd-darwin-arm64@5.3.1on npmjscpd-darwin-x64@5.3.1on npmjscpd-linux-x64-gnu@5.3.1on npmjscpd-linux-arm64-gnu@5.3.1on npmjscpd-linux-x64-musl@5.3.1on npmjscpd-linux-arm64-musl@5.3.1on npmjscpd-windows-x64-msvc@5.3.1on npmjscpd-windows-arm64-msvc@5.3.1on npmjscpd==5.3.1on PyPIVerify
Archives are signed with Sigstore (keyless,
<asset>.sigstore.json)and carry SLSA build provenance. Replace
jscpd-linux-x64-gnu.tar.gzwith 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.txtv5.3.0Compare Source
jscpd 5.3.0 adds a health score for your codebase, a full project dashboard, and a batch of fixes found during a pre-release review.
Highlights
🩺
--health— one score for the codebase. A single 0–100 number (with an A–E grade) built from three shares of the code: duplication, dead code and complexity. Small projects aren't unfairly punished — the score adjusts for project size — and a dimension jscpd can't measure (no JS/TS/Python to check for dead code, say) is left out and labeledn/arather than silently scored as perfect. Plug in your own metrics — coverage, security scan results, whatever you track — with--health-input.📊
--dashboard— the whole picture on one screen. Everything above, plus project size, a duplication breakdown by format, your most complex files, and dead-code findings by category — all in one run, one report.markdownandhtmlreporters are new for both--dashboardand--health, alongside the existingconsole,jsonandbadge(SVG) output.⚡
--complexity— just the complexity half of--summary, without a clone scan. Handy when all you want is "what's the most complex file in here," fast.🎯
--kind— filter clones by how they were found: exact, renamed, or similar (and, for similar, whether it was a near-miss gap merge or a structural match). Typos are caught rather than silently returning a clean report.🧮 More accurate complexity counting. The
--summary --summary-by complexityestimate now tracks real cyclomatic complexity much more closely — short-circuit operators (&&,||) count properly across every language, branches are counted the way each language actually spells them (Rustmatcharms, Swiftguard, Goselect, and so on), and complexity is measured per function instead of per file. Validated against lizard across nine languages, with agreement on file ranking rising from 0.83 to 0.92.🧟
--dead-code— find code nothing runs. A new engine, basta, builds your project's import graph from its real entry points and reports unused files, exports, and imports across JavaScript, TypeScript, Vue, Svelte, Astro and Python — including monorepo package names, path aliases, and framework conventions (Nuxt, SvelteKit, Astro components). Every finding comes with a confidence score, so you know how much to trust it. It's available inside jscpd as--dead-code, and also ships as its own standalonebastacommand.See the full changelog for the details on all of the above.
Fixes
.jscpd.jsonno longer throws out the whole config — only the bad field is dropped, everything else still applies.--dashboard/--healthand their markdown/html output now escape untrusted values (file paths, custom format names, external metric IDs) before rendering them, closing off ways a crafted file name could break a table or inject content.--dashboard/--healthnow drop the dead-code section gracefully when--formatexcludes every language it can analyze, instead of failing the whole report.--complexity --fail-on-emptynow writes its reports before failing, matching every other mode.--min-confidenceabove 100 is now clamped (with a warning) everywhere it's read, not just in the standalone--dead-codemode.oxcparser crates to 0.150.Thanks
Thanks to @Dev-next-gen for fixing how plain text, log and CSV files handle comments (#1065) 🙌
Published Packages
basta@0.1.1on crates.iocpd-core@0.1.15on crates.iocpd-finder@0.1.17on crates.iocpd-reporter@0.1.16on crates.iocpd-tokenizer@0.1.17on crates.iojscpd@5.3.0on crates.iocpd@5.3.0on npmjscpd@5.3.0on npmjscpd-darwin-arm64@5.3.0on npmjscpd-darwin-x64@5.3.0on npmjscpd-linux-x64-gnu@5.3.0on npmjscpd-linux-arm64-gnu@5.3.0on npmjscpd-linux-x64-musl@5.3.0on npmjscpd-linux-arm64-musl@5.3.0on npmjscpd-windows-x64-msvc@5.3.0on npmjscpd-windows-arm64-msvc@5.3.0on npmjscpd==5.3.0on PyPIVerify
Archives are signed with Sigstore (keyless,
<asset>.sigstore.json)and carry SLSA build provenance. Replace
jscpd-linux-x64-gnu.tar.gzwith 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.txtConfiguration
📅 Schedule: (in timezone Europe/Paris)
🚦 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.
This PR was generated by Mend Renovate. View the repository job log.