diff --git a/packages/babel-core/src/config/index.ts b/packages/babel-core/src/config/index.ts index d231a8ec6d59..aff0cc5b7fd2 100644 --- a/packages/babel-core/src/config/index.ts +++ b/packages/babel-core/src/config/index.ts @@ -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"; diff --git a/packages/babel-core/src/index.ts b/packages/babel-core/src/index.ts index cdbc2e6998bb..fdebb2cd1a4c 100644 --- a/packages/babel-core/src/index.ts +++ b/packages/babel-core/src/index.ts @@ -30,6 +30,8 @@ export { } from "./config"; export type { + CallerMetadata, + InputOptions, PluginAPI, PluginObject, PresetAPI, diff --git a/packages/babel-plugin-transform-runtime/src/get-runtime-path/browser.ts b/packages/babel-plugin-transform-runtime/src/get-runtime-path/browser.ts index 94af79f4ce4d..53cc0f75469c 100644 --- a/packages/babel-plugin-transform-runtime/src/get-runtime-path/browser.ts +++ b/packages/babel-plugin-transform-runtime/src/get-runtime-path/browser.ts @@ -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(); diff --git a/packages/babel-plugin-transform-runtime/src/get-runtime-path/index.ts b/packages/babel-plugin-transform-runtime/src/get-runtime-path/index.ts index 37fdc83a6827..ac92873a8e05 100644 --- a/packages/babel-plugin-transform-runtime/src/get-runtime-path/index.ts +++ b/packages/babel-plugin-transform-runtime/src/get-runtime-path/index.ts @@ -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( @@ -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, "/"); } diff --git a/packages/babel-plugin-transform-runtime/src/helpers.ts b/packages/babel-plugin-transform-runtime/src/helpers.ts index ad77e524f9ae..bea33ed07af0 100644 --- a/packages/babel-plugin-transform-runtime/src/helpers.ts +++ b/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. diff --git a/packages/babel-plugin-transform-runtime/src/index.ts b/packages/babel-plugin-transform-runtime/src/index.ts index b734e4b6e3fc..d16ea9acae92 100644 --- a/packages/babel-plugin-transform-runtime/src/index.ts +++ b/packages/babel-plugin-transform-runtime/src/index.ts @@ -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"; @@ -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; } @@ -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); @@ -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 " + @@ -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 " + @@ -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( + 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, @@ -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); @@ -184,7 +235,7 @@ export default declare((api, options: Options, dirname) => { name: "transform-runtime", inherits: injectCoreJS2 - ? createCorejsPlgin( + ? createCorejsPlgin( pluginCorejs2, { method: "usage-pure", @@ -202,7 +253,7 @@ export default declare((api, options: Options, dirname) => { }), ) : injectCoreJS3 - ? createCorejsPlgin( + ? createCorejsPlgin( pluginCorejs3, { method: "usage-pure", @@ -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. @@ -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