Skip to content

Commit

Permalink
Improve fixture-test-runner typings (#14625)
Browse files Browse the repository at this point in the history
* plugin-test-runner

* fixture-test-runner

* Update packages/babel-helper-fixtures/src/index.ts

Co-authored-by: Nicol貌 Ribaudo <nicolo.ribaudo@gmail.com>

Co-authored-by: Nicol貌 Ribaudo <nicolo.ribaudo@gmail.com>
  • Loading branch information
JLHwung and nicolo-ribaudo committed Jun 21, 2022
1 parent 8718bd2 commit 505c59b
Show file tree
Hide file tree
Showing 7 changed files with 113 additions and 51 deletions.
7 changes: 6 additions & 1 deletion packages/babel-core/src/index.ts
Expand Up @@ -40,7 +40,12 @@ export type {
PresetObject,
} from "./config";

export { transform, transformSync, transformAsync } from "./transform";
export {
transform,
transformSync,
transformAsync,
type FileResult,
} from "./transform";
export {
transformFile,
transformFileSync,
Expand Down
2 changes: 2 additions & 0 deletions packages/babel-core/src/transform.ts
Expand Up @@ -6,6 +6,8 @@ import { run } from "./transformation";

import type { FileResult, FileResultCallback } from "./transformation";

export type { FileResult } from "./transformation";

type Transform = {
(code: string, callback: FileResultCallback): void;
(
Expand Down
2 changes: 1 addition & 1 deletion packages/babel-core/src/transformation/index.ts
Expand Up @@ -23,7 +23,7 @@ export type FileResultCallback = {
export type FileResult = {
metadata: {};
options: {};
ast: {} | null;
ast: t.File | null;
code: string | null;
map: SourceMap | null;
sourceType: "string" | "module";
Expand Down
84 changes: 59 additions & 25 deletions packages/babel-helper-fixtures/src/index.ts
Expand Up @@ -3,56 +3,81 @@ import path from "path";
import fs from "fs";
import { fileURLToPath } from "url";
import { createRequire } from "module";
import type { InputOptions } from "@babel/core";
import type { EncodedSourceMap, Mapping } from "@jridgewell/gen-mapping";

const require = createRequire(import.meta.url);

const nodeVersion = semver.clean(process.version.slice(1));

function humanize(val, noext?) {
function humanize(val: string, noext?: boolean) {
if (noext) val = path.basename(val, path.extname(val));
return val.replace(/-/g, " ");
}

type TestFile = {
interface TestIO {
loc: string;
code: string;
}

export interface TestFile extends TestIO {
filename: string;
};
}

type Test = {
export interface Test {
taskDir: string;
title: string;
disabled: boolean;
options: any;
options: TaskOptions;
optionsDir: string;
doNotSetSourceType: boolean;
externalHelpers: boolean;
ignoreOutput: boolean;
stdout: TestIO;
stderr: TestIO;
exec: TestFile;
actual: TestFile;
expected: TestFile;
// todo(flow->ts): improve types here
sourceMappings;
sourceMap;
expect: TestFile;
inputSourceMap?: EncodedSourceMap;
sourceMappings?: Mapping[];
sourceMap: string;
sourceMapFile: TestFile;
};
validateLogs: boolean;
}

interface TaskOptions extends InputOptions {
BABEL_8_BREAKING?: boolean;
DO_NOT_SET_SOURCE_TYPE?: boolean;
externalHelpers?: boolean;
ignoreOutput?: boolean;
minNodeVersion?: string;
sourceMap?: boolean;
os?: string | string[];
validateLogs?: boolean;
throws?: boolean | string;
}

type Suite = {
options: any;
options: TaskOptions;
tests: Array<Test>;
title: string;
filename: string;
};

function tryResolve(module) {
function tryResolve(module: string) {
try {
return require.resolve(module);
} catch (e) {
return null;
}
}
function assertDirectory(loc) {
function assertDirectory(loc: string) {
if (!fs.statSync(loc).isDirectory()) {
throw new Error(`Expected ${loc} to be a directory.`);
}
}

function shouldIgnore(name, ignore?: Array<string>) {
function shouldIgnore(name: string, ignore?: Array<string>) {
if (ignore && ignore.indexOf(name) >= 0) {
return true;
}
Expand Down Expand Up @@ -87,7 +112,12 @@ function findFile(filepath: string, allowJSON?: boolean) {
return matches[0];
}

function pushTask(taskName, taskDir, suite, suiteName) {
function pushTask(
taskName: string,
taskDir: string,
suite: Suite,
suiteName: string,
) {
const taskDirStats = fs.statSync(taskDir);
let actualLoc = findFile(taskDir + "/input");
let execLoc = findFile(taskDir + "/exec");
Expand Down Expand Up @@ -126,12 +156,12 @@ function pushTask(taskName, taskDir, suite, suiteName) {
execLocAlias = suiteName + "/" + taskName;
}

const taskOpts = JSON.parse(JSON.stringify(suite.options));
const taskOpts: TaskOptions = JSON.parse(JSON.stringify(suite.options));

const taskOptsLoc = tryResolve(taskDir + "/options");
if (taskOptsLoc) Object.assign(taskOpts, require(taskOptsLoc));

const test = {
const test: Test = {
taskDir,
optionsDir: taskOptsLoc ? path.dirname(taskOptsLoc) : null,
title: humanize(taskName, true),
Expand Down Expand Up @@ -264,7 +294,7 @@ function pushTask(taskName, taskDir, suite, suiteName) {
(test.stdout.code ? stdoutLoc : stderrLoc),
);
}
if (test.options.ignoreOutput) {
if (test.ignoreOutput) {
if (test.expect.code) {
throw new Error(
"Test cannot ignore its output and also validate it: " + expectLoc,
Expand All @@ -284,7 +314,11 @@ function pushTask(taskName, taskDir, suite, suiteName) {
delete test.options.externalHelpers;
}

function wrapPackagesArray(type, names, optionsDir) {
function wrapPackagesArray(
type: "plugin" | "preset",
names: (string | [string, object?, string?])[],
optionsDir: string,
) {
return names.map(function (val) {
if (typeof val === "string") val = [val];

Expand Down Expand Up @@ -362,10 +396,10 @@ export function resolveOptionPluginOrPreset(
return options;
}

export default function get(entryLoc): Array<Suite> {
export default function get(entryLoc: string): Array<Suite> {
const suites = [];

let rootOpts = {};
let rootOpts: TaskOptions = {};
const rootOptsLoc = tryResolve(entryLoc + "/options");
if (rootOptsLoc) rootOpts = require(rootOptsLoc);

Expand All @@ -374,7 +408,7 @@ export default function get(entryLoc): Array<Suite> {

const suite = {
options: { ...rootOpts },
tests: [],
tests: [] as Test[],
title: humanize(suiteName),
filename: entryLoc + "/" + suiteName,
};
Expand All @@ -398,8 +432,8 @@ export default function get(entryLoc): Array<Suite> {
return suites;
}

export function multiple(entryLoc, ignore?: Array<string>) {
const categories = {};
export function multiple(entryLoc: string, ignore?: Array<string>) {
const categories: Record<string, unknown> = {};

for (const name of fs.readdirSync(entryLoc)) {
if (shouldIgnore(name, ignore)) continue;
Expand All @@ -413,7 +447,7 @@ export function multiple(entryLoc, ignore?: Array<string>) {
return categories;
}

export function readFile(filename) {
export function readFile(filename: string) {
if (fs.existsSync(filename)) {
let file = fs.readFileSync(filename, "utf8").trimRight();
file = file.replace(/\r\n/g, "\n");
Expand Down
2 changes: 1 addition & 1 deletion packages/babel-helper-plugin-test-runner/src/index.ts
Expand Up @@ -2,7 +2,7 @@ import testRunner from "@babel/helper-transform-fixture-test-runner";
import path from "path";
import { URL } from "url";

export default function (loc) {
export default function (loc: string) {
if (!process.env.BABEL_8_BREAKING) {
if (!loc.startsWith("file://")) {
const name = path.basename(path.dirname(loc));
Expand Down
@@ -1,7 +1,7 @@
export function assertNoOwnProperties(obj) {
export function assertNoOwnProperties(obj: {}) {
expect(Object.getOwnPropertyNames(obj)).toHaveLength(0);
}

export function multiline(arr) {
export function multiline(arr: string[]) {
return arr.join("\n");
}

0 comments on commit 505c59b

Please sign in to comment.