Skip to content

Commit

Permalink
Improve transform-runtime typings (#14605)
Browse files Browse the repository at this point in the history
* enable noImplicitAny

* codemod (#14602)

* Improve preset/plugin-typescript typings (#14603)

* preset-typescript

* transform-typescript

* Update packages/babel-plugin-transform-typescript/src/enum.ts

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

* prettier

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

* improve transform-runtime typings

Co-authored-by: Nicol貌 Ribaudo <nicolo.ribaudo@gmail.com>
  • Loading branch information
JLHwung and nicolo-ribaudo committed May 26, 2022
1 parent 5b61901 commit b646472
Show file tree
Hide file tree
Showing 6 changed files with 83 additions and 16 deletions.
5 changes: 4 additions & 1 deletion packages/babel-core/src/config/index.ts
Expand Up @@ -18,7 +18,10 @@ type PluginAPI = basePluginAPI & typeof import("..");
type PresetAPI = basePresetAPI & typeof import("..");
export type { PluginAPI, PresetAPI };
// todo: may need to refine PresetObject to be a subset of ValidatedOptions
export type { ValidatedOptions as PresetObject } from "./validation/options";
export type {
CallerMetadata,
ValidatedOptions as PresetObject,
} from "./validation/options";

import loadFullConfig from "./full";
import { loadPartialConfig as loadPartialConfigRunner } from "./partial";
Expand Down
2 changes: 2 additions & 0 deletions packages/babel-core/src/index.ts
Expand Up @@ -30,6 +30,8 @@ export {
} from "./config";

export type {
CallerMetadata,
InputOptions,
PluginAPI,
PluginObject,
PresetAPI,
Expand Down
@@ -1,4 +1,8 @@
export default function (moduleName, dirname, absoluteRuntime) {
export default function (
moduleName: string,
dirname: string,
absoluteRuntime: string | boolean,
) {
if (absoluteRuntime === false) return moduleName;

resolveFSPath();
Expand Down
Expand Up @@ -3,7 +3,11 @@ import path from "path";
import { createRequire } from "module";
const require = createRequire(import.meta.url);

export default function (moduleName, dirname, absoluteRuntime) {
export default function (
moduleName: string,
dirname: string,
absoluteRuntime: string | boolean,
) {
if (absoluteRuntime === false) return moduleName;

return resolveAbsoluteRuntime(
Expand Down Expand Up @@ -33,6 +37,6 @@ function resolveAbsoluteRuntime(moduleName: string, dirname: string) {
}
}

export function resolveFSPath(path) {
export function resolveFSPath(path: string) {
return require.resolve(path).replace(/\\/g, "/");
}
5 changes: 4 additions & 1 deletion packages/babel-plugin-transform-runtime/src/helpers.ts
@@ -1,6 +1,9 @@
import semver from "semver";

export function hasMinVersion(minVersion, runtimeVersion) {
export function hasMinVersion(
minVersion: string,
runtimeVersion: string | void,
) {
// If the range is unavailable, we're running the script during Babel's
// build process, and we want to assume that all versions are satisfied so
// that the built output will include all definitions.
Expand Down
73 changes: 62 additions & 11 deletions packages/babel-plugin-transform-runtime/src/index.ts
Expand Up @@ -4,6 +4,7 @@ import { types as t } from "@babel/core";

import { hasMinVersion } from "./helpers";
import getRuntimePath, { resolveFSPath } from "./get-runtime-path";
import type { PluginAPI, PluginObject, CallerMetadata } from "@babel/core";

import _pluginCorejs2 from "babel-plugin-polyfill-corejs2";
import _pluginCorejs3 from "babel-plugin-polyfill-corejs3";
Expand All @@ -17,7 +18,8 @@ const pluginRegenerator = (_pluginRegenerator.default ||

const pluginsCompat = "#__secret_key__@babel/runtime__compatibility";

function supportsStaticESM(caller) {
function supportsStaticESM(caller: CallerMetadata | void) {
// @ts-ignore TS does not narrow down optional chaining
return !!caller?.supportsStaticESM;
}

Expand All @@ -30,6 +32,35 @@ export interface Options {
version?: string;
}

interface CoreJS2PluginOptions {
absoluteImports: string | false;
method: "usage-pure";
[pluginsCompat]: {
runtimeVersion: string;
useBabelRuntime: string | false;
ext: string;
};
}

interface RegeneratorPluginOptions {
absoluteImports: string | false;
method: "usage-pure";
[pluginsCompat]: {
useBabelRuntime: string | false;
};
}

interface CoreJS3PluginOptions {
absoluteImports: string | false;
method: "usage-pure";
proposals: boolean;
version: number;
[pluginsCompat]: {
useBabelRuntime: string | false;
ext: string;
};
}

export default declare((api, options: Options, dirname) => {
api.assertVersion(7);

Expand Down Expand Up @@ -106,11 +137,12 @@ export default declare((api, options: Options, dirname) => {
var supportsCJSDefault = hasMinVersion(DUAL_MODE_RUNTIME, runtimeVersion);
}

function has(obj, key) {
function has(obj: {}, key: string) {
return Object.prototype.hasOwnProperty.call(obj, key);
}

if (has(options, "useBuiltIns")) {
// @ts-expect-error deprecated options
if (options["useBuiltIns"]) {
throw new Error(
"The 'useBuiltIns' option has been removed. The @babel/runtime " +
Expand All @@ -125,6 +157,7 @@ export default declare((api, options: Options, dirname) => {
}

if (has(options, "polyfill")) {
// @ts-expect-error deprecated options
if (options["polyfill"] === false) {
throw new Error(
"The 'polyfill' option has been removed. The @babel/runtime " +
Expand Down Expand Up @@ -163,8 +196,20 @@ export default declare((api, options: Options, dirname) => {

const modulePath = getRuntimePath(moduleName, dirname, absoluteRuntime);

function createCorejsPlgin(plugin, options, regeneratorPlugin) {
return (api, _, filename) => {
function createCorejsPlgin<Options extends {}>(
plugin: (
api: PluginAPI,
options: Options,
filename: string,
) => PluginObject,
options: Options,
regeneratorPlugin: (
api: PluginAPI,
options: RegeneratorPluginOptions,
filename: string,
) => PluginObject,
): (api: PluginAPI, options: {}, filename: string) => PluginObject {
return (api: PluginAPI, _: {}, filename: string) => {
return {
...plugin(api, options, filename),
inherits: regeneratorPlugin,
Expand All @@ -173,7 +218,13 @@ export default declare((api, options: Options, dirname) => {
}

// TODO: Remove this in Babel 8
function createRegeneratorPlugin(options) {
function createRegeneratorPlugin(
options: RegeneratorPluginOptions,
): (
api: PluginAPI,
options: RegeneratorPluginOptions,
filename: string,
) => PluginObject {
if (!useRuntimeRegenerator) return undefined;
return (api, _, filename) => {
return pluginRegenerator(api, options, filename);
Expand All @@ -184,7 +235,7 @@ export default declare((api, options: Options, dirname) => {
name: "transform-runtime",

inherits: injectCoreJS2
? createCorejsPlgin(
? createCorejsPlgin<CoreJS2PluginOptions>(
pluginCorejs2,
{
method: "usage-pure",
Expand All @@ -202,7 +253,7 @@ export default declare((api, options: Options, dirname) => {
}),
)
: injectCoreJS3
? createCorejsPlgin(
? createCorejsPlgin<CoreJS3PluginOptions>(
pluginCorejs3,
{
method: "usage-pure",
Expand All @@ -226,7 +277,7 @@ export default declare((api, options: Options, dirname) => {
pre(file) {
if (!useRuntimeHelpers) return;

file.set("helperGenerator", name => {
file.set("helperGenerator", (name: string) => {
// If the helper didn't exist yet at the version given, we bail
// out and let Babel either insert it directly, or throw an error
// so that plugins can handle that case properly.
Expand Down Expand Up @@ -271,9 +322,9 @@ export default declare((api, options: Options, dirname) => {
const cache = new Map();

function addDefaultImport(
source,
nameHint,
blockHoist,
source: string,
nameHint: string,
blockHoist: number,
isHelper = false,
) {
// If something on the page adds a helper when the file is an ES6
Expand Down

0 comments on commit b646472

Please sign in to comment.