<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: siddiksawani</title>
    <description>The latest articles on DEV Community by siddiksawani (@siddiksawani).</description>
    <link>https://dev.to/siddiksawani</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F730509%2F6c855280-8cbb-417a-bec9-cbf0a606f8b9.png</url>
      <title>DEV Community: siddiksawani</title>
      <link>https://dev.to/siddiksawani</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/siddiksawani"/>
    <language>en</language>
    <item>
      <title>Reading npm compatibility results across Node.js, Bun and Deno</title>
      <dc:creator>siddiksawani</dc:creator>
      <pubDate>Tue, 13 Oct 2026 02:34:21 +0000</pubDate>
      <link>https://dev.to/siddiksawani/reading-npm-compatibility-results-across-nodejs-bun-and-deno-27ib</link>
      <guid>https://dev.to/siddiksawani/reading-npm-compatibility-results-across-nodejs-bun-and-deno-27ib</guid>
      <description>&lt;p&gt;Adapted from the &lt;a href="https://compatlab.me/articles/npm-package-compatibility-node-bun-deno" rel="noopener noreferrer"&gt;original article&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Disclosure: I maintain CompatLab, the source of these measurements. An AI agent drafted this article and checked its claims against the linked reports.&lt;/p&gt;

&lt;p&gt;By CompatLab · October 5, 2026 · Updated October 13, 2026&lt;/p&gt;

&lt;p&gt;Express loaded in all four runtime profiles. Preact’s root did too, while its server entries exposed missing prerequisites and uncertain results. Zod passed 80 loading checks and still received an inconclusive result. Each finding answers a different part of the compatibility question.&lt;/p&gt;

&lt;p&gt;You have a Node.js application and want to try Bun or Deno. Before changing the start command, you need to know whether your dependencies will load. A package’s README may name Node versions, but it rarely covers the exact package release, import style and alternative runtime you intend to use.&lt;/p&gt;

&lt;p&gt;The observations below come from CompatLab, an open-source loading-test harness. Each report identifies an exact npm artifact, dependency snapshot and set of runtime images. The cases show how optional peers, wildcard exports and a shared process can limit the conclusion you draw from a compatibility result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four packages, with the reports attached
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Correction, October 12, 2026&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The original article called Preact and the Convex agent “Mixed results.” Their retained reports are now inconclusive. The classifier distinguishes missing optional peers and failures after an earlier failed load in the same batch. In particular, the Convex &lt;code&gt;/test&lt;/code&gt; results were not confirmed in fresh processes and do not establish a runtime-specific defect. The links below use the October 11 classifications of the same October 5 executions. Raw evidence and observation dates are unchanged; this was not a rescan.&lt;/p&gt;

&lt;p&gt;These packages were tested on October 5, 2026. Each report uses Linux amd64 with glibc, Node.js 24.21.0, Node.js 26.10.0, Bun 1.4.2 and Deno 2.9.7. Install scripts stay disabled. Within each report, the runtimes read the same prepared dependency files.&lt;/p&gt;

&lt;p&gt;October 5 observations with their October 11 classifications&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package and report&lt;/th&gt;
&lt;th&gt;Root checks&lt;/th&gt;
&lt;th&gt;Subpath checks&lt;/th&gt;
&lt;th&gt;Overall result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://compatlab.me/reports/282cda8a-7447-43b3-a4aa-5bcf57ddbb8f" rel="noopener noreferrer"&gt;express@5.2.1&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;8 passed&lt;/td&gt;
&lt;td&gt;None planned&lt;/td&gt;
&lt;td&gt;Passed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://compatlab.me/reports/141416b5-91ca-443e-98dd-4a077d938f54" rel="noopener noreferrer"&gt;preact@11.0.0&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;8 passed&lt;/td&gt;
&lt;td&gt;96 passed · 13 missing peer · 2 unconfirmed · 1 failure without diagnostics&lt;/td&gt;
&lt;td&gt;Inconclusive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://compatlab.me/reports/3db91aae-f19a-4ba7-bc04-39443c27e622" rel="noopener noreferrer"&gt;zod@4.6.5&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;8 passed&lt;/td&gt;
&lt;td&gt;72 passed · wildcard omitted&lt;/td&gt;
&lt;td&gt;Inconclusive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://compatlab.me/reports/6e840923-8326-48c6-8273-c4fe7e85d1c7" rel="noopener noreferrer"&gt;@convex-dev/agent@0.7.3&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;8 passed&lt;/td&gt;
&lt;td&gt;24 passed · 6 missing peer · 8 unconfirmed · 2 failures without diagnostics&lt;/td&gt;
&lt;td&gt;Inconclusive&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Eight root checks means one ESM &lt;code&gt;import&lt;/code&gt; and one CommonJS &lt;code&gt;require&lt;/code&gt; for each of the four runtime profiles. Counts measure loading operations, not distinct features. These selected examples are not a representative sample of npm and do not rank the runtimes. Reports also record exact image and dependency identities; a matching version number alone does not make two scans identical.&lt;/p&gt;

&lt;h2&gt;
  
  
  Express loads; your HTTP application still needs tests
&lt;/h2&gt;

&lt;p&gt;In the &lt;a href="https://compatlab.me/reports/282cda8a-7447-43b3-a4aa-5bcf57ddbb8f" rel="noopener noreferrer"&gt;Express 5.2.1 report&lt;/a&gt;, import and require passed on both Node.js versions, Bun and Deno. The planner selected no explicit executable subpaths, so the result covers those eight root operations.&lt;/p&gt;

&lt;p&gt;That gives you a concrete first answer about npm package compatibility: this release resolved and evaluated in those environments. We did not start an Express server, send requests, exercise middleware or connect to a database. Before migrating an application, run its integration tests under the runtime you plan to deploy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preact’s server entries need context
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://compatlab.me/reports/141416b5-91ca-443e-98dd-4a077d938f54" rel="noopener noreferrer"&gt;Preact 11.0.0&lt;/a&gt; passed its root checks across the matrix. Each runtime and loading mode then passed 12 of 14 subpath checks. The two non-passing entries were &lt;code&gt;preact/compat/server&lt;/code&gt; and &lt;code&gt;preact/compat/server.browser&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Thirteen subpath checks identify a missing &lt;code&gt;preact-render-to-string&lt;/code&gt; dependency. Preact’s &lt;a href="https://registry.npmjs.org/preact/11.0.0" rel="noopener noreferrer"&gt;published manifest&lt;/a&gt; declares it as an optional peer. The consumer workspace for this report installed Preact alone. A project that uses those server-rendering entry points needs to account for that peer.&lt;/p&gt;

&lt;p&gt;The remaining three checks are in Bun: one import failure has no captured diagnostic, and two later batch failures have no fresh-process confirmation. Their causes cannot all be attributed to the missing peer. The current overall result is inconclusive.&lt;/p&gt;

&lt;p&gt;The useful next step is to install the intended peer in your application and test its server-rendering path. We have not performed that follow-up in this report, so we cannot claim it resolves the full workflow. These observations describe this dependency snapshot; they do not establish a Bun-only or Deno-only defect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zod passes its checks, but the wildcard remains untested
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://compatlab.me/reports/3db91aae-f19a-4ba7-bc04-39443c27e622" rel="noopener noreferrer"&gt;Zod 4.6.5&lt;/a&gt; passed both root modes and nine explicit subpaths per mode on all four profiles: 80 passed loading operations and zero recorded failures. CompatLab still labels the report inconclusive because the published export map also contains &lt;code&gt;./v4/locales/*&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The current planner checks explicit executable exports and records wildcard patterns as omitted coverage. We cannot claim complete coverage of that package’s exports from these observations. If your application imports a particular locale, include that import in your own tests. Passing the observed entries and covering all public entries are separate requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Zod load in Bun and Deno when the overall result is inconclusive?
&lt;/h3&gt;

&lt;p&gt;In a separate execution on October 12, 2026 at 21:26 UTC, &lt;a href="https://compatlab.me/reports/98dbec06-fdb3-4718-b60f-43f42171ad6c" rel="noopener noreferrer"&gt;Zod 4.6.7&lt;/a&gt; again passed all 80 planned loading operations. That includes the root import in &lt;a href="https://compatlab.me/reports/98dbec06-fdb3-4718-b60f-43f42171ad6c?cell=bun_1_4_2-root-esm&amp;amp;entry=0#selected-result" rel="noopener noreferrer"&gt;Bun 1.4.2&lt;/a&gt; and &lt;a href="https://compatlab.me/reports/98dbec06-fdb3-4718-b60f-43f42171ad6c?cell=deno_2_9_7-root-esm&amp;amp;entry=0#selected-result" rel="noopener noreferrer"&gt;Deno 2.9.7&lt;/a&gt;, plus the root and explicit subpaths in Node.js 24.21.0 and 26.10.0. The unexpanded &lt;code&gt;./v4/locales/*&lt;/code&gt; pattern keeps overall coverage incomplete. It is not a recorded Bun or Deno loading failure.&lt;/p&gt;

&lt;p&gt;Match your actual import before using the result: &lt;code&gt;zod&lt;/code&gt;, &lt;code&gt;zod/mini&lt;/code&gt; and &lt;a href="https://compatlab.me/reports/98dbec06-fdb3-4718-b60f-43f42171ad6c?cell=bun_1_4_2-subpaths-esm&amp;amp;entry=7#selected-result" rel="noopener noreferrer"&gt;&lt;code&gt;zod/v4/core&lt;/code&gt;&lt;/a&gt; are different planned entries. A wildcard locale import needs its own check. In your application's pinned dependency installation, load the same path and test a representative valid input, invalid input, transform and locale you depend on. Those schema behaviors were not exercised by this report. These observations use Linux amd64/glibc with install scripts and execution networking disabled.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://compatlab.me/npm/zod/4.6.7" rel="noopener noreferrer"&gt;Zod 4.6.7 version summary&lt;/a&gt; separates the selected checks from omitted exports. Check the artifact version before applying a result to a dependency upgrade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Different error messages do not confirm an independent failure
&lt;/h2&gt;

&lt;p&gt;In &lt;a href="https://compatlab.me/reports/6e840923-8326-48c6-8273-c4fe7e85d1c7" rel="noopener noreferrer"&gt;@convex-dev/agent 0.7.3&lt;/a&gt;, all root checks passed. Each subpath batch passed three entries and recorded two failures. For &lt;code&gt;/react&lt;/code&gt;, Node and Deno identify a missing optional React peer; Bun captured no error message. The later &lt;code&gt;/test&lt;/code&gt; entry failed in the same process and was not independently confirmed in any of the eight runtime/mode combinations. Those entries are now inconclusive.&lt;/p&gt;

&lt;p&gt;Historical ESM batch errors for @convex-dev/agent/test; all unconfirmed&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Runtime&lt;/th&gt;
&lt;th&gt;Recorded batch error, not an independently confirmed cause&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Node.js 24.21.0 and 26.10.0&lt;/td&gt;
&lt;td&gt;Type stripping under node_modules is unsupported.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bun 1.4.2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;import.meta.glob is not a function&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deno 2.9.7&lt;/td&gt;
&lt;td&gt;Type stripping under node_modules is unsupported.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These messages remain useful investigation clues, but a shared batch’s earlier failure can affect later loads. They cannot establish how this entry behaves in a fresh process or which runtime is more compatible. Test the documented entry with its required tooling and dependencies in isolation before drawing that conclusion. The package root passed; its application behavior was not tested.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we test Node, Bun and Deno compatibility
&lt;/h2&gt;

&lt;p&gt;We prepare the published npm artifact with a pinned npm installer, retain its lockfile, then mount the same sealed dependency snapshot into each runtime’s sandbox. We disable lifecycle scripts during installation and networking during loading. The runtime profiles have bounded time, memory and output, with gVisor providing the execution boundary.&lt;/p&gt;

&lt;p&gt;Each root mode starts in a fresh sandbox. Subpaths run in ordered batches and share that batch’s module cache and globals. Reports expose those choices alongside omitted entries, failures and exact runtime images. Read the &lt;a href="https://compatlab.me/methodology" rel="noopener noreferrer"&gt;methodology&lt;/a&gt; for the full scope and limits.&lt;/p&gt;

&lt;p&gt;Import style deserves its own check. Node’s &lt;a href="https://nodejs.org/api/packages.html#conditional-exports" rel="noopener noreferrer"&gt;conditional exports&lt;/a&gt; let a package choose different entry files for import and require. A package name and a runtime name leave out that part of the experiment. Native binaries, optional peers and installation prerequisites can also change the result.&lt;/p&gt;

&lt;p&gt;Deno npm compatibility also depends on the execution profile. Our Deno checks use an existing npm-prepared &lt;code&gt;node_modules&lt;/code&gt; tree and &lt;code&gt;-A&lt;/code&gt; inside the OS sandbox. They do not test Deno’s default permission prompts or compare its installer with npm. Consult &lt;a href="https://docs.deno.com/runtime/fundamentals/node/" rel="noopener noreferrer"&gt;Deno’s npm guide&lt;/a&gt; for the setup your application uses. Bun’s &lt;a href="https://bun.com/docs/runtime/nodejs-compat" rel="noopener noreferrer"&gt;Node.js compatibility documentation&lt;/a&gt; describes its supported APIs; our reports add observations for an exact package.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apply the evidence to your application
&lt;/h2&gt;

&lt;p&gt;Before using a loading result in a migration decision, write down the exact package version, import path and loading mode your application uses. Compare those with the observed entries and the omitted coverage. A pass for the package root does not establish whether an untested server adapter or locale import loads.&lt;/p&gt;

&lt;p&gt;Reproduce the relevant import in your application's pinned installation, including its optional peers and native prerequisites. Then run a test of the behavior you need: a middleware request for Express, server rendering for Preact, or representative valid and invalid inputs for Zod. The loading reports above did not exercise those behaviors.&lt;/p&gt;

&lt;p&gt;Keep the observation date, runtime versions and dependency identity with your test notes. A later classification can change the interpretation without running the package again; a new execution can use a different dependency snapshot even when the top-level package version stays the same. Those are different reasons for a result to change.&lt;/p&gt;

&lt;p&gt;For a failed subpath in a shared batch, test that entry in a fresh process before attributing the failure to the runtime. For an omitted export, record the question as unanswered until you test it. Those two steps avoid treating uncertain evidence as a compatibility defect.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>bunjs</category>
      <category>deno</category>
    </item>
  </channel>
</rss>
