import { dirname, join } from "node:path"; import ts from "typescript"; import type { StaticModuleReferenceKind } from "./module-import-syntax-test-support"; export type StaticModuleReference = Readonly<{ referenceKind: StaticModuleReferenceKind; specifier: string; }>; export function formatStaticModuleReference( reference: StaticModuleReference, ): string { return reference.referenceKind === "module" ? reference.specifier : `${reference.referenceKind}:${reference.specifier}`; } export function resolveStaticModuleReferenceFileName( reference: StaticModuleReference, importerFilePath: string, compilerOptions: ts.CompilerOptions, ): string | undefined { switch (reference.referenceKind) { case "amd": case "module": case "path": return ts.resolveModuleName( reference.specifier, importerFilePath, compilerOptions, ts.sys, ).resolvedModule?.resolvedFileName; case "types": return ts.resolveTypeReferenceDirective( reference.specifier, importerFilePath, compilerOptions, ts.sys, ).resolvedTypeReferenceDirective?.resolvedFileName; case "lib": { const libFilePath = join( dirname(ts.getDefaultLibFilePath(compilerOptions)), `lib.${reference.specifier.toLowerCase()}.d.ts`, ); return ts.sys.fileExists(libFilePath) ? libFilePath : undefined; } } }