@tevm/ts-plugin
Version:
A typescript plugin for tevm
67 lines (63 loc) • 2.4 kB
text/typescript
import { createRequire } from 'node:module'
import path from 'node:path'
import type typescript from 'typescript/lib/tsserverlibrary.js'
import { isRelativeSolidity } from './isRelativeSolidity.js'
import { isSolidity } from './isSolidity.js'
/**
* Resolves a Solidity module name to its filesystem location and TypeScript type information.
*
* This utility handles three different import scenarios:
* 1. Relative Solidity imports (like './Contract.sol')
* 2. Package Solidity imports (like 'package/Contract.sol')
* 3. Special case for '@tevm/contract' imports which need special resolution
*
* When Solidity files are imported, they're treated as TypeScript declaration files (.d.ts)
* to provide type checking and IDE support for the contracts.
*
* @param moduleName - The module name to resolve (e.g., './Contract.sol')
* @param ts - TypeScript library instance
* @param createInfo - Plugin creation information from TypeScript
* @param containingFile - Path to the file containing the import
* @returns A resolved module with filename and extension information, or undefined if not resolvable
*/
export const solidityModuleResolver = (
moduleName: string,
ts: typeof typescript,
createInfo: typescript.server.PluginCreateInfo,
containingFile: string,
): typescript.ResolvedModuleFull | undefined => {
if (isRelativeSolidity(moduleName)) {
return {
extension: ts.Extension.Dts,
isExternalLibraryImport: false,
resolvedFileName: path.resolve(path.dirname(containingFile), moduleName),
}
}
if (isSolidity(moduleName)) {
return {
extension: ts.Extension.Dts,
isExternalLibraryImport: false,
resolvedFileName: createRequire(path.dirname(containingFile)).resolve(moduleName),
}
}
// to handle the case where the import is coming from a node_module or a different workspace
// we need to always point @tevm/contract to the local version
if (moduleName.startsWith('@tevm/contract')) {
const result = ts.resolveModuleName(
moduleName,
containingFile,
createInfo.project.getCompilerOptions(),
createInfo.project,
)
if (result.resolvedModule) {
return {
extension: ts.Extension.Dts,
isExternalLibraryImport: true,
resolvedFileName: result.resolvedModule.resolvedFileName,
}
}
console.error('Could not resolve module. Is tevm/core installed?', moduleName, result)
return undefined
}
return undefined
}