From 646c341b33c993f033c80234ec07bc7f86ec918d Mon Sep 17 00:00:00 2001 From: Craig Spence Date: Wed, 17 Feb 2021 03:11:01 +0100 Subject: [PATCH] =?UTF-8?q?fix(betterer=20=F0=9F=90=9B):=20make=20typescri?= =?UTF-8?q?pt=20properly=20optional?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .betterer.ts | 1 - README.md | 4 +-- packages/betterer/package.json | 3 ++ packages/betterer/src/register.ts | 39 +++++++++++++++++--------- packages/betterer/src/runner/runner.ts | 2 +- yarn.lock | 2 +- 6 files changed, 32 insertions(+), 19 deletions(-) diff --git a/.betterer.ts b/.betterer.ts index 07481f5be..783170551 100644 --- a/.betterer.ts +++ b/.betterer.ts @@ -1,4 +1,3 @@ -import { eslint } from '@betterer/eslint'; import { regexp } from '@betterer/regexp'; export default { diff --git a/README.md b/README.md index 00eb87b26..828c16135 100644 --- a/README.md +++ b/README.md @@ -17,13 +17,11 @@ npx @betterer/cli init To do it yourself, run the following from the root of your project: ```bash -npm install @betterer/cli typescript --save-dev +npm install @betterer/cli --save-dev ``` You'll then need to make your own test file and test commands. -_Note: Typescript is required to execute the `betterer` command. Your code does not have to be written in TS to use Betterer! Referencing it as a peer dependency helps to prevent unexpected behavior._ - --- ## Why? diff --git a/packages/betterer/package.json b/packages/betterer/package.json index 8ded78c99..818026f9f 100644 --- a/packages/betterer/package.json +++ b/packages/betterer/package.json @@ -44,6 +44,9 @@ "ts-node": "^9.0.0", "tslib": "^2.0.3" }, + "optionalDependencies": { + "typescript": ">=2.7" + }, "devDependencies": { "@types/callsite": "^1.0.30", "@types/prettier": "^1.12.0" diff --git a/packages/betterer/src/register.ts b/packages/betterer/src/register.ts index 4e8ea35ef..b837fc130 100644 --- a/packages/betterer/src/register.ts +++ b/packages/betterer/src/register.ts @@ -1,4 +1,4 @@ -import { RegisterOptions, register } from 'ts-node'; +import type { RegisterOptions } from 'ts-node'; import { BettererConfig } from './config'; @@ -9,7 +9,7 @@ export const TS_EXTENSION = '.ts'; type Extensions = typeof require.extensions; let isRegistered = false; -export function registerExtensions(config: BettererConfig): void { +export async function registerExtensions(config: BettererConfig): Promise { if (isRegistered) { return; } @@ -23,17 +23,7 @@ export function registerExtensions(config: BettererConfig): void { const JS = EXTENSIONS[JS_EXTENSION]; if (!EXTENSIONS[TS_EXTENSION]) { - // Use TS-Node register to allow `.betterer.ts` config files: - const tsRegisterOptions: RegisterOptions = { - transpileOnly: true, - compilerOptions: { - module: 'commonjs' - } - }; - if (config.tsconfigPath) { - tsRegisterOptions.project = config.tsconfigPath; - } - register(tsRegisterOptions); + await registerTypeScript(config); } // Force `.betterer.results` files to be loaded as JS: @@ -41,3 +31,26 @@ export function registerExtensions(config: BettererConfig): void { JS(m, filePath); }; } + +async function registerTypeScript(config: BettererConfig): Promise { + let tsNode: typeof import('ts-node'); + try { + await import('typescript'); + tsNode = await import('ts-node'); + } catch { + // Environment doesn't have TypeScript available, move on! + return; + } + + // Use TS-Node register to allow `.betterer.ts` config files: + const tsRegisterOptions: RegisterOptions = { + transpileOnly: true, + compilerOptions: { + module: 'commonjs' + } + }; + if (config.tsconfigPath) { + tsRegisterOptions.project = config.tsconfigPath; + } + tsNode.register(tsRegisterOptions); +} diff --git a/packages/betterer/src/runner/runner.ts b/packages/betterer/src/runner/runner.ts index 8f356d8b7..a13b13fbf 100644 --- a/packages/betterer/src/runner/runner.ts +++ b/packages/betterer/src/runner/runner.ts @@ -21,7 +21,7 @@ export class BettererRunnerĪ© implements BettererRunner { let reporter = loadReporters([DEFAULT_REPORTER]); try { config = await createConfig(partialConfig); - registerExtensions(config); + await registerExtensions(config); if (config.silent) { reporter = loadReporters([]); } diff --git a/yarn.lock b/yarn.lock index db7185475..576a7193a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9280,7 +9280,7 @@ typedarray@^0.0.6: resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^4.1.3: +typescript@>=2.7, typescript@^4.1.3: version "4.1.5" resolved "https://registry.npmjs.org/typescript/-/typescript-4.1.5.tgz#123a3b214aaff3be32926f0d8f1f6e704eb89a72" integrity sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA==