hardhat
Version:
Hardhat is an extensible developer tool that helps smart contract developers increase productivity by reliably bringing together the tools they want.
101 lines (80 loc) • 2.4 kB
text/typescript
import type { Remapping } from "./types.js";
/**
* Tries to parse a remapping string, returning undefined if it's invalid.
*/
export function parseRemappingString(remapping: string): Remapping | undefined {
let rest = remapping;
const colon = rest.indexOf(":");
let context: string;
if (colon !== -1) {
context = rest.substring(0, colon);
rest = rest.substring(colon + 1);
} else {
context = "";
}
const equal = rest.indexOf("=");
if (equal === -1) {
return undefined;
}
const prefix = rest.substring(0, equal);
if (prefix === "") {
return undefined;
}
const target = rest.substring(equal + 1);
return { context, prefix, target };
}
/**
* Selects the best remapping for a direct import, if any.
*
* @param fromInputSourceName The input source name of the file with the import.
* @param directImport The import path, which must be a direct import.
* @param remappings The array of remappings to consider.
* @returns The best remappings index or undefined if none is found.
*/
export function selectBestRemapping(
fromInputSourceName: string,
directImport: string,
remappings: Remapping[],
): number | undefined {
let bestRemappingIndex: number | undefined;
let longestContext = 0;
let longestPrefix = 0;
for (let i = 0; i < remappings.length; i++) {
const remapping = remappings[i];
const contextLength = remapping.context.length;
if (contextLength < longestContext) {
continue;
}
if (!fromInputSourceName.startsWith(remapping.context)) {
continue;
}
if (
remapping.prefix.length < longestPrefix &&
contextLength === longestContext
) {
continue;
}
if (!directImport.startsWith(remapping.prefix)) {
continue;
}
longestContext = contextLength;
longestPrefix = remapping.prefix.length;
bestRemappingIndex = i;
}
return bestRemappingIndex;
}
/**
* Applies a remapping assuming that it's valid for this importPath.
*/
export function applyValidRemapping(
importPath: string,
remapping: Remapping,
): string {
return remapping.target + importPath.substring(remapping.prefix.length);
}
export function formatRemapping(remapping: Remapping): string {
if (remapping.context === "") {
return `${remapping.prefix}=${remapping.target}`;
}
return `${remapping.context}:${remapping.prefix}=${remapping.target}`;
}