hardhat
Version:
Hardhat is an extensible developer tool that helps smart contract developers increase productivity by reliably bringing together the tools they want.
142 lines (121 loc) • 3.48 kB
text/typescript
import { Dependencies, PackageManager } from "./types";
function createConfirmationPrompt(name: string, message: string) {
return {
type: "confirm",
name,
message,
initial: "y",
default: "(Y/n)",
isTrue(input: string | boolean) {
if (typeof input === "string") {
return input.toLowerCase() === "y";
}
return input;
},
isFalse(input: string | boolean) {
if (typeof input === "string") {
return input.toLowerCase() === "n";
}
return input;
},
format(): string {
const that = this as any;
const value = that.value === true ? "y" : "n";
if (that.state.submitted === true) {
return that.styles.submitted(value);
}
return value;
},
};
}
export async function confirmRecommendedDepsInstallation(
depsToInstall: Dependencies,
packageManager: PackageManager
): Promise<boolean> {
const { default: enquirer } = await import("enquirer");
let responses: {
shouldInstallPlugin: boolean;
};
try {
responses = await enquirer.prompt<typeof responses>([
createConfirmationPrompt(
"shouldInstallPlugin",
`Do you want to install this sample project's dependencies with ${packageManager} (${Object.keys(
depsToInstall
).join(" ")})?`
),
]);
} catch (e) {
if (e === "") {
return false;
}
// eslint-disable-next-line @nomicfoundation/hardhat-internal-rules/only-hardhat-error
throw e;
}
return responses.shouldInstallPlugin;
}
export async function confirmProjectCreation(): Promise<{
projectRoot: string;
shouldAddGitIgnore: boolean;
}> {
const enquirer = require("enquirer");
return enquirer.prompt([
{
name: "projectRoot",
type: "input",
initial: process.cwd(),
message: "Hardhat project root:",
},
createConfirmationPrompt(
"shouldAddGitIgnore",
"Do you want to add a .gitignore?"
),
]);
}
export async function confirmTelemetryConsent(): Promise<boolean | undefined> {
return confirmationPromptWithTimeout(
"telemetryConsent",
"Help us improve Hardhat with anonymous crash reports & basic usage data?"
);
}
/**
* true = install ext
* false = don't install and don't ask again
* undefined = we couldn't confirm if the extension is installed or not
*/
export async function confirmHHVSCodeInstallation(): Promise<
boolean | undefined
> {
return confirmationPromptWithTimeout(
"shouldInstallExtension",
"Would you like to install the Hardhat for Visual Studio Code extension? It adds advanced editing assistance for Solidity to VSCode"
);
}
async function confirmationPromptWithTimeout(
name: string,
message: string,
timeoutMilliseconds: number = 10_000
): Promise<boolean | undefined> {
try {
const enquirer = require("enquirer");
const prompt = new enquirer.prompts.Confirm(
createConfirmationPrompt(name, message)
);
let timeout;
const timeoutPromise = new Promise((resolve) => {
timeout = setTimeout(resolve, timeoutMilliseconds);
});
const result = await Promise.race([prompt.run(), timeoutPromise]);
clearTimeout(timeout);
if (result === undefined) {
await prompt.cancel();
}
return result;
} catch (e: any) {
if (e === "") {
return undefined;
}
// eslint-disable-next-line @nomicfoundation/hardhat-internal-rules/only-hardhat-error
throw e;
}
}