@@ -30,6 +30,13 @@ export const OPTIONAL_PACKAGES = {
3030 "@google/genai" : "1.52.0" ,
3131} as const satisfies Record < OptionalPackage , string > ;
3232
33+ export const PINNED_PACKAGES = {
34+ ...OPTIONAL_PACKAGES ,
35+ "sherpa-onnx-node" : "1.13.8" ,
36+ } as const ;
37+
38+ type PinnedPackage = keyof typeof PINNED_PACKAGES ;
39+
3340export const CACHE_DIR = join ( homedir ( ) , ".cache" , "hyperframes" , "optional" ) ;
3441
3542export interface OptionalPackageDeps {
@@ -53,7 +60,7 @@ export function installedOptionalPackageVersion(
5360 cacheDir = CACHE_DIR ,
5461 cliUrl = import . meta. url ,
5562) : string | null {
56- if ( pinnedCopyBesideCli ( name , cliUrl ) ) return OPTIONAL_PACKAGES [ name ] ;
63+ if ( pinnedPackageBesideCli ( name , cliUrl ) ?. resolution === "entry" ) return OPTIONAL_PACKAGES [ name ] ;
5764 const dir = optionalPackageDir ( name , cacheDir ) ;
5865 if ( ! isInstalled ( dir , name ) ) return null ;
5966 return ( JSON . parse ( readFileSync ( manifestPath ( dir , name ) , "utf-8" ) ) as { version : string } )
@@ -113,28 +120,51 @@ export function isInstalled(dir: string, name: string): boolean {
113120 return existsSync ( manifestPath ( dir , name ) ) ;
114121}
115122
116- export function loadInstalled ( dir : string , name : string ) : unknown | null {
123+ export function installedPackagePath ( dir : string , name : string ) : string | null {
117124 if ( ! isInstalled ( dir , name ) ) return null ;
118- return createRequire ( join ( dir , "package.json" ) ) ( name ) ;
125+ return createRequire ( join ( dir , "package.json" ) ) . resolve ( name ) ;
119126}
120127
121- function pinnedCopyBesideCli ( name : OptionalPackage , cliUrl : string ) : boolean {
128+ function loadInstalled ( dir : string , name : string ) : unknown | null {
129+ const entry = installedPackagePath ( dir , name ) ;
130+ return entry === null ? null : createRequire ( join ( dir , "package.json" ) ) ( entry ) ;
131+ }
132+
133+ export function pinnedPackageBesideCli (
134+ name : PinnedPackage ,
135+ cliUrl = import . meta. url ,
136+ ) : { resolution : "entry" | "package" ; path : string } | null {
122137 const req = createRequire ( cliUrl ) ;
123138 try {
124- const entry = realpathSync ( req . resolve ( name ) ) ;
139+ let entry : string ;
140+ try {
141+ entry = realpathSync ( req . resolve ( name ) ) ;
142+ } catch {
143+ const copy = ( req . resolve . paths ( name ) ?? [ ] )
144+ . map ( ( dir ) => join ( dir , name ) )
145+ . find ( ( dir ) => existsSync ( join ( dir , "package.json" ) ) ) ;
146+ return copy && hasPinnedVersion ( copy , name )
147+ ? { resolution : "package" , path : realpathSync ( copy ) }
148+ : null ;
149+ }
125150 const copy = ( req . resolve . paths ( name ) ?? [ ] )
126151 . map ( ( dir ) => join ( dir , name ) )
127152 . find ( ( dir ) => existsSync ( dir ) && entry . startsWith ( realpathSync ( dir ) + sep ) ) ;
128- if ( ! copy ) return false ;
129- const manifest = readFileSync ( join ( copy , "package.json" ) , "utf-8" ) ;
130- return ( JSON . parse ( manifest ) as { version ?: string } ) . version === OPTIONAL_PACKAGES [ name ] ;
153+ if ( ! copy ) return null ;
154+ return hasPinnedVersion ( copy , name ) ? { resolution : "entry" , path : entry } : null ;
131155 } catch {
132- return false ;
156+ return null ;
133157 }
134158}
135159
136- export function loadBesideCli ( name : OptionalPackage , cliUrl = import . meta. url ) : unknown | null {
137- return pinnedCopyBesideCli ( name , cliUrl ) ? createRequire ( cliUrl ) ( name ) : null ;
160+ function hasPinnedVersion ( copy : string , name : PinnedPackage ) : boolean {
161+ const manifest = readFileSync ( join ( copy , "package.json" ) , "utf-8" ) ;
162+ return ( JSON . parse ( manifest ) as { version ?: string } ) . version === PINNED_PACKAGES [ name ] ;
163+ }
164+
165+ export function loadBesideCli ( name : PinnedPackage , cliUrl = import . meta. url ) : unknown | null {
166+ const copy = pinnedPackageBesideCli ( name , cliUrl ) ;
167+ return copy ?. resolution === "entry" ? createRequire ( cliUrl ) ( copy . path ) : null ;
138168}
139169
140170export function runNpm ( args : string [ ] , signal ?: AbortSignal ) : Promise < void > {
0 commit comments