forked from
npmx.dev/npmx.dev
[READ-ONLY]
a fast, modern browser for the npm registry
1/**
2 * Metadata needed to determine if a package is binary-only.
3 */
4export interface PackageMetadata {
5 name: string
6 bin?: string | Record<string, string>
7 main?: string
8 module?: unknown
9 exports?: unknown
10}
11
12/**
13 * Determine if a package is "binary-only" (executable without library entry points).
14 * Binary-only packages should show execute commands without install commands.
15 *
16 * A package is binary-only if:
17 * - Name starts with "create-" (e.g., create-vite)
18 * - Scoped name contains "/create-" (e.g., @vue/create-app)
19 * - Has bin field but no main, module, or exports fields
20 */
21export function isBinaryOnlyPackage(pkg: PackageMetadata): boolean {
22 // Check create-* patterns
23 if (isCreatePackage(pkg.name)) {
24 return true
25 }
26
27 // Has bin but no entry points
28 const hasBin =
29 pkg.bin !== undefined && (typeof pkg.bin === 'string' || Object.keys(pkg.bin).length > 0)
30 const hasEntryPoint = !!pkg.main || !!pkg.module || !!pkg.exports
31
32 return hasBin && !hasEntryPoint
33}
34
35/**
36 * Check if a package uses the create-* naming convention.
37 */
38export function isCreatePackage(packageName: string): boolean {
39 const baseName = packageName.startsWith('@') ? packageName.split('/')[1] : packageName
40 return baseName?.startsWith('create-') || packageName.includes('/create-') || false
41}