2021-11-24 11:43:18 +01:00

303 lines
10 KiB
JavaScript

import path from "path";
import { fileURLToPath } from "url";
import * as babel from "../lib/index.js";
import {
spawnTransformAsync,
spawnTransformSync,
supportsESM,
} from "./helpers/esm.js";
const nodeGte8 = (...args) => {
// "minNodeVersion": "8.0.0" <-- For Ctrl+F when dropping node 6
const testFn = process.version.slice(0, 3) === "v6." ? it.skip : it;
testFn(...args);
};
describe("asynchronicity", () => {
const base = path.join(
path.dirname(fileURLToPath(import.meta.url)),
"fixtures",
"async",
);
let cwd;
beforeEach(function () {
cwd = process.cwd();
process.chdir(base);
});
afterEach(function () {
process.chdir(cwd);
});
describe("config file", () => {
describe("async function", () => {
nodeGte8("called synchronously", () => {
process.chdir("config-file-async-function");
expect(() =>
babel.transformSync(""),
).toThrowErrorMatchingInlineSnapshot(
`"You appear to be using an async configuration, which your current version of Babel does` +
` not support. We may add support for this in the future, but if you're on the most recent` +
` version of @babel/core and still seeing this error, then you'll need to synchronously` +
` return your config."`,
);
});
nodeGte8("called asynchronously", async () => {
process.chdir("config-file-async-function");
await expect(
babel.transformAsync(""),
).rejects.toThrowErrorMatchingInlineSnapshot(
`"You appear to be using an async configuration, which your current version of Babel does` +
` not support. We may add support for this in the future, but if you're on the most recent` +
` version of @babel/core and still seeing this error, then you'll need to synchronously` +
` return your config."`,
);
});
});
describe("promise", () => {
it("called synchronously", () => {
process.chdir("config-file-promise");
expect(() =>
babel.transformSync(""),
).toThrowErrorMatchingInlineSnapshot(
`"You appear to be using an async configuration, which your current version of Babel does` +
` not support. We may add support for this in the future, but if you're on the most recent` +
` version of @babel/core and still seeing this error, then you'll need to synchronously` +
` return your config."`,
);
});
it("called asynchronously", async () => {
process.chdir("config-file-promise");
await expect(
babel.transformAsync(""),
).rejects.toThrowErrorMatchingInlineSnapshot(
`"You appear to be using an async configuration, which your current version of Babel does` +
` not support. We may add support for this in the future, but if you're on the most recent` +
` version of @babel/core and still seeing this error, then you'll need to synchronously` +
` return your config."`,
);
});
});
describe("cache.using", () => {
nodeGte8("called synchronously", () => {
process.chdir("config-cache");
expect(() =>
babel.transformSync(""),
).toThrowErrorMatchingInlineSnapshot(
`"You appear to be using an async cache handler, which your current version of Babel does` +
` not support. We may add support for this in the future, but if you're on the most recent` +
` version of @babel/core and still seeing this error, then you'll need to synchronously` +
` handle your caching logic."`,
);
});
nodeGte8("called asynchronously", async () => {
process.chdir("config-cache");
await expect(
babel.transformAsync(""),
).rejects.toThrowErrorMatchingInlineSnapshot(
`"You appear to be using an async cache handler, which your current version of Babel does` +
` not support. We may add support for this in the future, but if you're on the most recent` +
` version of @babel/core and still seeing this error, then you'll need to synchronously` +
` handle your caching logic."`,
);
});
});
});
describe("plugin", () => {
describe("factory function", () => {
nodeGte8("called synchronously", () => {
process.chdir("plugin");
expect(() => babel.transformSync("")).toThrow(
`[BABEL] unknown: You appear to be using an async plugin/preset, but Babel` +
` has been called synchronously`,
);
});
nodeGte8("called asynchronously", async () => {
process.chdir("plugin");
await expect(babel.transformAsync("")).resolves.toMatchObject({
code: `"success"`,
});
});
});
describe(".pre", () => {
nodeGte8("called synchronously", () => {
process.chdir("plugin-pre");
expect(() =>
babel.transformSync(""),
).toThrowErrorMatchingInlineSnapshot(
`"unknown: You appear to be using an plugin with an async .pre, which your current version` +
` of Babel does not support. If you're using a published plugin, you may need to upgrade your` +
` @babel/core version."`,
);
});
nodeGte8("called asynchronously", async () => {
process.chdir("plugin-pre");
await expect(
babel.transformAsync(""),
).rejects.toThrowErrorMatchingInlineSnapshot(
`"unknown: You appear to be using an plugin with an async .pre, which your current version` +
` of Babel does not support. If you're using a published plugin, you may need to upgrade your` +
` @babel/core version."`,
);
});
});
describe(".post", () => {
nodeGte8("called synchronously", () => {
process.chdir("plugin-post");
expect(() =>
babel.transformSync(""),
).toThrowErrorMatchingInlineSnapshot(
`"unknown: You appear to be using an plugin with an async .post, which your current version` +
` of Babel does not support. If you're using a published plugin, you may need to upgrade your` +
` @babel/core version."`,
);
});
nodeGte8("called asynchronously", async () => {
process.chdir("plugin-post");
await expect(
babel.transformAsync(""),
).rejects.toThrowErrorMatchingInlineSnapshot(
`"unknown: You appear to be using an plugin with an async .post, which your current version` +
` of Babel does not support. If you're using a published plugin, you may need to upgrade your` +
` @babel/core version."`,
);
});
});
describe("inherits", () => {
nodeGte8("called synchronously", () => {
process.chdir("plugin-inherits");
expect(() => babel.transformSync("")).toThrow(
`[BABEL] unknown: You appear to be using an async plugin/preset, but Babel has been` +
` called synchronously`,
);
});
nodeGte8("called asynchronously", async () => {
process.chdir("plugin-inherits");
await expect(babel.transformAsync("")).resolves.toMatchObject({
code: `"success 2"\n"success"`,
});
});
});
(supportsESM ? describe : describe.skip)(".mjs files", () => {
it("called synchronously", async () => {
process.chdir("plugin-mjs-native");
await expect(spawnTransformSync()).rejects.toThrow(
`[BABEL]: You appear to be using a native ECMAScript module plugin, which is` +
` only supported when running Babel asynchronously.`,
);
});
it("called asynchronously", async () => {
process.chdir("plugin-mjs-native");
await expect(spawnTransformAsync()).resolves.toMatchObject({
code: `"success"`,
});
});
});
});
describe("preset", () => {
describe("factory function", () => {
nodeGte8("called synchronously", () => {
process.chdir("preset");
expect(() => babel.transformSync("")).toThrow(
`[BABEL] unknown: You appear to be using an async plugin/preset, ` +
`but Babel has been called synchronously`,
);
});
nodeGte8("called asynchronously", async () => {
process.chdir("preset");
await expect(babel.transformAsync("")).resolves.toMatchObject({
code: `"success"`,
});
});
});
describe("plugins", () => {
nodeGte8("called synchronously", () => {
process.chdir("preset-plugin-promise");
expect(() => babel.transformSync("")).toThrow(
`[BABEL] unknown: You appear to be using a promise as a plugin, which your` +
` current version of Babel does not support. If you're using a published` +
` plugin, you may need to upgrade your @babel/core version. As an` +
` alternative, you can prefix the promise with "await".`,
);
});
nodeGte8("called asynchronously", async () => {
process.chdir("preset-plugin-promise");
await expect(babel.transformAsync("")).rejects.toThrow(
`[BABEL] unknown: You appear to be using a promise as a plugin, which your` +
` current version of Babel does not support. If you're using a published` +
` plugin, you may need to upgrade your @babel/core version. As an` +
` alternative, you can prefix the promise with "await".`,
);
});
});
(supportsESM ? describe : describe.skip)(".mjs files", () => {
it("called synchronously", async () => {
process.chdir("preset-mjs-native");
await expect(spawnTransformSync()).rejects.toThrow(
`[BABEL]: You appear to be using a native ECMAScript module preset, which is` +
` only supported when running Babel asynchronously.`,
);
});
it("called asynchronously", async () => {
process.chdir("preset-mjs-native");
await expect(spawnTransformAsync()).resolves.toMatchObject({
code: `"success"`,
});
});
it("must use the 'default' export", async () => {
process.chdir("preset-mjs-named-exports-native");
await expect(spawnTransformAsync()).rejects.toThrow(
`Unexpected falsy value: undefined`,
);
});
});
});
});