{"record":{"id":"37119f4a5933af85","repo":"jackwener/OpenCLI","slug":"npm-package","errorCode":null,"errorMessage":"npm package","messagePattern":"npm package","errorType":"exception","errorClass":"EmptyResultError","httpStatus":null,"severity":"warning","filePath":"clis/npm/package.js","lineNumber":48,"sourceCode":"    name: 'package',\n    access: 'read',\n    description: 'Single npm package metadata (latest version, license, homepage, repository). Use `npm downloads` for stats.',\n    domain: 'registry.npmjs.org',\n    strategy: Strategy.PUBLIC,\n    browser: false,\n    args: [\n        { name: 'name', positional: true, required: true, help: 'npm package name (e.g. \"react\", \"@vercel/og\")' },\n    ],\n    columns: [\n        'name', 'latestVersion', 'description', 'license', 'homepage', 'repository',\n        'bugs', 'maintainers', 'keywords', 'created', 'modified', 'url',\n    ],\n    func: async (args) => {\n        const name = requirePackageName(args.name);\n        const body = await npmFetch(`${NPM_REGISTRY}/${name.split('/').map(encodeURIComponent).join('/')}`, `npm package ${name}`);\n        const latest = body?.['dist-tags']?.latest;\n        if (!latest) {\n            throw new EmptyResultError('npm package', `npm registry has no latest version for \"${name}\".`);\n        }\n        const v = body?.versions?.[latest] ?? {};\n        const maintainers = Array.isArray(body.maintainers)\n            ? body.maintainers.map((m) => (typeof m === 'object' && m ? m.name || m.email || '' : String(m))).filter(Boolean).join(', ')\n            : '';\n        const keywords = Array.isArray(v.keywords) ? v.keywords.join(', ') : '';\n        return [{\n            name: String(body.name ?? name),\n            latestVersion: String(latest),\n            description: String(v.description ?? body.description ?? ''),\n            license: typeof v.license === 'string' ? v.license : (v.license?.type ?? ''),\n            homepage: String(v.homepage ?? ''),\n            repository: repoUrl(v.repository),\n            bugs: bugUrl(v.bugs),\n            maintainers,\n            keywords,\n            created: String(body.time?.created ?? '').slice(0, 10),\n            modified: String(body.time?.modified ?? '').slice(0, 10),","sourceCodeStart":30,"sourceCodeEnd":66,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/npm/package.js#L30-L66","documentation":"Thrown by the `npm package` command when the registry returns packument JSON for the name but there is no `dist-tags.latest` entry (or the tag is falsy). Without a latest version the command cannot render a per-version summary, so it raises EmptyResultError. This occurs for names that exist in the registry but have no publishable latest release.","triggerScenarios":"Querying a name whose packument has no versions or no dist-tags.latest — e.g. an unpublished package (npm unpublish leaves a stub packument), a reserved name without content, a registry mirror with partial data, or a removed typosquat.","commonSituations":"Looking up a package that was unpublished; names removed for policy reasons; corporate proxies/caches serving degraded or empty packuments; deprecated packages whose dist-tags were stripped.","solutions":["Confirm the package is published with a latest release (`npm view <name> version` should return a version).","If the package was unpublished, it cannot be queried until republished — use a different package or accept absence.","Point NPM_REGISTRY at an up-to-date registry if behind a stale mirror/cache.","Catch EmptyResultError and fall back to a direct registry fetch if you need raw packument data."],"exampleFix":"// before\nawait npmPackage({ name: 'deleted-pkg' }); // EmptyResultError: no latest version\n// after\ntry {\n  return await npmPackage({ name: 'deleted-pkg' });\n} catch (e) {\n  if (e.name === 'EmptyResultError') return null; // likely unpublished; report absence\n  throw e;\n}","handlingStrategy":"try-catch","validationCode":"const res = await fetch(`https://registry.npmjs.org/${encodeURIComponent(name).replace('%2F', '/')}`);\nconst pack = await res.json();\nif (!pack || !pack['dist-tags'] || !pack['dist-tags'].latest) {\n  throw new Error(`${name} has no latest version (likely unpublished)`);\n}","typeGuard":"function hasLatestVersion(pack) {\n  return !!pack && typeof pack === 'object' &&\n    !!pack['dist-tags'] && typeof pack['dist-tags'].latest === 'string' &&\n    !!pack.versions && typeof pack.versions === 'object';\n}","tryCatchPattern":"try {\n  return await npmPackage({ name });\n} catch (e) {\n  if (e.name === 'EmptyResultError') return null; // likely unpublished; report absence\n  throw e;\n}","preventionTips":["Check `npm view <name> version` succeeds before programmatic lookups.","Remember unpublish leaves a name reserved but contentless.","Bypass stale corporate mirrors or refresh the cache when packuments look degraded.","Handle absence explicitly in consumers of package metadata."],"tags":["npm","registry","empty-result","dist-tags"],"backgroundTag":"empty-result-set","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}