Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve fixture-test-runner typings #14625

Merged
merged 3 commits into from Jun 1, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 6 additions & 1 deletion packages/babel-core/src/index.ts
Expand Up @@ -38,7 +38,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");
}