From 47cb291729561112f6b3660da05872b6d6884d59 Mon Sep 17 00:00:00 2001 From: Eduard Fischer-Szava Date: Wed, 29 Apr 2026 23:46:20 +0200 Subject: [PATCH] fix(shared): replace CJS require() with static ESM import for semver Dynamic require('semver') inside an ESM bundle causes a runtime error: 'Dynamic require of semver is not supported' This affects all examples when run with tsx (Node ESM mode) because tsup bundles the lazy-init require() into the .mjs output where CJS require() is unavailable. Fix: replace the lazy require() pattern with a static top-level import. The lazy-loading was only an optimisation (defer cost until first call); with a static import tsup can tree-shake unused exports and the bundle resolves the module correctly in both CJS and ESM contexts. Tested: pnpm build + tsx examples/agent-cli/index.tsx now starts correctly. --- packages/shared/src/semver.ts | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/packages/shared/src/semver.ts b/packages/shared/src/semver.ts index fb67462..1ef5b87 100644 --- a/packages/shared/src/semver.ts +++ b/packages/shared/src/semver.ts @@ -1,36 +1,29 @@ /** * Semver comparison utilities. - * Uses npm semver package (no Bun.semver). + * Uses npm semver package with static ESM import to avoid CJS require() issues. */ - -let _npmSemver: typeof import("semver") | undefined; - -function getNpmSemver(): typeof import("semver") { - // eslint-disable-next-line @typescript-eslint/no-require-imports - _npmSemver ??= require("semver") as typeof import("semver"); - return _npmSemver; -} +import semver from "semver"; export function gt(a: string, b: string): boolean { - return getNpmSemver().gt(a, b, { loose: true }); + return semver.gt(a, b, { loose: true }) ?? false; } export function gte(a: string, b: string): boolean { - return getNpmSemver().gte(a, b, { loose: true }); + return semver.gte(a, b, { loose: true }) ?? false; } export function lt(a: string, b: string): boolean { - return getNpmSemver().lt(a, b, { loose: true }); + return semver.lt(a, b, { loose: true }) ?? false; } export function lte(a: string, b: string): boolean { - return getNpmSemver().lte(a, b, { loose: true }); + return semver.lte(a, b, { loose: true }) ?? false; } export function satisfies(version: string, range: string): boolean { - return getNpmSemver().satisfies(version, range, { loose: true }); + return semver.satisfies(version, range, { loose: true }); } export function order(a: string, b: string): -1 | 0 | 1 { - return getNpmSemver().compare(a, b, { loose: true }); + return semver.compare(a, b, { loose: true }); }