UNPKG

1.99 kBPlain TextView Raw
1import chalk from "chalk";
2
3import { ExecutionMode, getExecutionMode } from "./execution-mode";
4
5let cachedIsTypescriptSupported: boolean | undefined;
6
7export function isTypescriptSupported() {
8 if (cachedIsTypescriptSupported === undefined) {
9 const executionMode = getExecutionMode();
10 if (executionMode === ExecutionMode.EXECUTION_MODE_GLOBAL_INSTALLATION) {
11 cachedIsTypescriptSupported = false;
12 } else if (
13 executionMode === ExecutionMode.EXECUTION_MODE_LOCAL_INSTALLATION
14 ) {
15 try {
16 // We resolve these from Buidler's installation.
17 require.resolve("typescript");
18 require.resolve("ts-node");
19 cachedIsTypescriptSupported = true;
20 } catch {
21 cachedIsTypescriptSupported = false;
22 }
23 } else {
24 // We are inside this project (e.g. running tests), or Buidler is
25 // linked and we can't get the Buidler project's node_modules, so we
26 // return true.
27 //
28 // This is safe because Buidler will use this project's installation of
29 // TypeScript and ts-node. We need them for compilation and testing, so
30 // they'll always be installed.
31 cachedIsTypescriptSupported = true;
32 }
33 }
34
35 return cachedIsTypescriptSupported;
36}
37
38export function loadTsNodeIfPresent() {
39 if (isTypescriptSupported()) {
40 // See: https://github.com/nomiclabs/buidler/issues/265
41 if (process.env.TS_NODE_FILES === undefined) {
42 process.env.TS_NODE_FILES = "true";
43 }
44
45 try {
46 // tslint:disable-next-line no-implicit-dependencies
47 require("ts-node/register");
48 } catch (error) {
49 // See: https://github.com/nomiclabs/buidler/issues/274
50 if (error.message.includes("Cannot find module 'typescript'")) {
51 console.warn(
52 chalk.yellow(
53 "Failed to load TypeScript support. Please update ts-node."
54 )
55 );
56
57 return;
58 }
59
60 // tslint:disable-next-line only-buidler-error
61 throw error;
62 }
63 }
64}