[READ-ONLY] a fast, modern browser for the npm registry
at main 41 lines 1.3 kB view raw
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}