From cbef3daafcf28017b1cd3ba32bca5c4e5b0e15ce Mon Sep 17 00:00:00 2001 From: nitodeco Date: Thu, 5 Feb 2026 02:47:33 +0100 Subject: [PATCH 1/3] feat: show warning on pkg fetch error --- src/providers/hover/npmx.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/providers/hover/npmx.ts b/src/providers/hover/npmx.ts index ab18522..19d1a98 100644 --- a/src/providers/hover/npmx.ts +++ b/src/providers/hover/npmx.ts @@ -30,8 +30,14 @@ export class NpmxHoverProvider implements HoverProvider { const { name } = dep const pkg = await getPackageInfo(name) - if (!pkg) - return + if (!pkg) { + const errorMd = new MarkdownString('', true) + + errorMd.isTrusted = true + errorMd.appendMarkdown('$(warning) Unable to fetch package information') + + return new Hover(errorMd) + } const md = new MarkdownString('', true) md.isTrusted = true From 8f5fdd91c6ffdbaddf2e535f78fb3aba5e54ef2e Mon Sep 17 00:00:00 2001 From: nitodeco Date: Thu, 5 Feb 2026 11:40:47 +0100 Subject: [PATCH 2/3] feat: show jsr links --- src/providers/hover/npmx.ts | 25 +++++++++++++++++++------ src/utils/links.ts | 10 +++++++++- src/utils/package.ts | 11 +++++++++++ 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/providers/hover/npmx.ts b/src/providers/hover/npmx.ts index 19d1a98..497c60f 100644 --- a/src/providers/hover/npmx.ts +++ b/src/providers/hover/npmx.ts @@ -2,8 +2,8 @@ import type { Extractor } from '#types/extractor' import type { HoverProvider, Position, TextDocument } from 'vscode' import { SPACER } from '#constants' import { getPackageInfo } from '#utils/api/package' -import { npmPacakgeUrl, npmxDocsUrl, npmxPackageUrl } from '#utils/links' -import { parseVersion } from '#utils/package' +import { jsrPackageUrl, npmPackageUrl, npmxDocsUrl, npmxPackageUrl } from '#utils/links' +import { isJsrSpecifier, parseVersion } from '#utils/package' import { Hover, MarkdownString } from 'vscode' export class NpmxHoverProvider implements HoverProvider { @@ -23,12 +23,25 @@ export class NpmxHoverProvider implements HoverProvider { if (!dep) return - const parsed = parseVersion(dep.version) + const { name, version } = dep + + if (isJsrSpecifier(version)) { + const jsrMd = new MarkdownString('', true) + const jsrUrl = jsrPackageUrl(name, version) + + jsrMd.isTrusted = true + + const jsrPackageLink = `[$(package)${SPACER}View on jsr.io](${jsrUrl})` + const npmxWarning = '$(warning) Not on npmx' + jsrMd.appendMarkdown(`${jsrPackageLink} | ${npmxWarning}`) + + return new Hover(jsrMd) + } + + const parsed = parseVersion(version) if (!parsed) return - const { name } = dep - const pkg = await getPackageInfo(name) if (!pkg) { const errorMd = new MarkdownString('', true) @@ -47,7 +60,7 @@ export class NpmxHoverProvider implements HoverProvider { const currentVersion = pkg.versionsMeta[semver] if (currentVersion) { if (currentVersion.provenance) - md.appendMarkdown(`[$(verified)${SPACER}Verified provenance](${npmPacakgeUrl(name, semver)}#provenance)\n\n`) + md.appendMarkdown(`[$(verified)${SPACER}Verified provenance](${npmPackageUrl(name, semver)}#provenance)\n\n`) } const packageLink = `[$(package)${SPACER}View on npmx](${npmxPackageUrl(name)})` diff --git a/src/utils/links.ts b/src/utils/links.ts index 3a411fb..cda3097 100644 --- a/src/utils/links.ts +++ b/src/utils/links.ts @@ -1,6 +1,7 @@ import { NPMJS_COM, NPMX_DEV } from '#constants' +import { extractVersion } from '#utils/package' -export function npmPacakgeUrl(name: string, version?: string): string { +export function npmPackageUrl(name: string, version?: string): string { return version ? `${NPMJS_COM}/package/${name}/v/${version}` : `${NPMJS_COM}/package/${name}` @@ -15,3 +16,10 @@ export function npmxPackageUrl(name: string, version?: string): string { export function npmxDocsUrl(name: string, version: string): string { return `${NPMX_DEV}/docs/${name}/v/${version}` } + +export function jsrPackageUrl(name: string, version: string): string { + const jsrVersionRange = version.replace(/^jsr:/, '') + const jsrVersion = extractVersion(jsrVersionRange) + + return `https://jsr.io/${name}@${jsrVersion}` +} diff --git a/src/utils/package.ts b/src/utils/package.ts index 8043e05..6d2b08b 100644 --- a/src/utils/package.ts +++ b/src/utils/package.ts @@ -57,3 +57,14 @@ export function parseVersion(rawVersion: string): ParsedVersion | null { return { protocol, prefix, semver } } + +export function isJsrSpecifier(rawVersion: string): boolean { + return rawVersion.startsWith('jsr:') +} + +export function extractVersion(rawVersionRange: string): string { + const normalizedVersionRange = rawVersionRange.trim().replace(/^[~^]/, '') + const versionMatch = normalizedVersionRange.match(/\d+\.\d+\.\d+(?:-[0-9a-z.-]+)?/i) + + return versionMatch ? versionMatch[0] : normalizedVersionRange +} From 8132f5839c3594c0d19c57aabc74e505608df608 Mon Sep 17 00:00:00 2001 From: Vida Xie Date: Thu, 5 Feb 2026 23:14:50 +0800 Subject: [PATCH 3/3] cleanup --- src/utils/links.ts | 6 +----- src/utils/package.ts | 11 ----------- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/src/utils/links.ts b/src/utils/links.ts index cda3097..435d844 100644 --- a/src/utils/links.ts +++ b/src/utils/links.ts @@ -1,5 +1,4 @@ import { NPMJS_COM, NPMX_DEV } from '#constants' -import { extractVersion } from '#utils/package' export function npmPackageUrl(name: string, version?: string): string { return version @@ -18,8 +17,5 @@ export function npmxDocsUrl(name: string, version: string): string { } export function jsrPackageUrl(name: string, version: string): string { - const jsrVersionRange = version.replace(/^jsr:/, '') - const jsrVersion = extractVersion(jsrVersionRange) - - return `https://jsr.io/${name}@${jsrVersion}` + return `https://jsr.io/${name}@${version}` } diff --git a/src/utils/package.ts b/src/utils/package.ts index 802b33c..487798e 100644 --- a/src/utils/package.ts +++ b/src/utils/package.ts @@ -57,14 +57,3 @@ export function parseVersion(rawVersion: string): ParsedVersion | null { return { protocol, prefix, semver } } - -export function isJsrSpecifier(rawVersion: string): boolean { - return rawVersion.startsWith('jsr:') -} - -export function extractVersion(rawVersionRange: string): string { - const normalizedVersionRange = rawVersionRange.trim().replace(/^[~^]/, '') - const versionMatch = normalizedVersionRange.match(/\d+\.\d+\.\d+(?:-[0-9a-z.-]+)?/i) - - return versionMatch ? versionMatch[0] : normalizedVersionRange -}