From 8b1bcd1079415516e9c74b2daadd34c159f31c16 Mon Sep 17 00:00:00 2001 From: Bogdan Savluk Date: Fri, 21 May 2021 00:20:42 +0200 Subject: [PATCH] convert @babel/helper-compilation-targets to typescript (#13218) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Nicolò Ribaudo --- lib/babel-packages.js.flow | 4 +++ .../package.json | 4 ++- .../src/{debug.js => debug.ts} | 8 ++--- .../src/{filter-items.js => filter-items.ts} | 10 +++---- .../src/{index.js => index.ts} | 30 ++++++++----------- .../src/{options.js => options.ts} | 2 -- .../src/{pretty.js => pretty.ts} | 3 +- .../src/{targets.js => targets.ts} | 0 .../src/{types.js => types.ts} | 21 +++++-------- .../src/{utils.js => utils.ts} | 9 ++++-- packages/babel-preset-env/src/debug.js | 1 - packages/babel-preset-env/src/index.js | 10 +++---- .../babel-preset-env/src/normalize-options.js | 2 +- packages/babel-preset-env/src/types.js | 2 +- tsconfig.json | 4 +++ yarn.lock | 4 ++- 16 files changed, 58 insertions(+), 56 deletions(-) rename packages/babel-helper-compilation-targets/src/{debug.js => debug.ts} (83%) rename packages/babel-helper-compilation-targets/src/{filter-items.js => filter-items.ts} (93%) rename packages/babel-helper-compilation-targets/src/{index.js => index.ts} (92%) rename packages/babel-helper-compilation-targets/src/{options.js => options.ts} (95%) rename packages/babel-helper-compilation-targets/src/{pretty.js => pretty.ts} (92%) rename packages/babel-helper-compilation-targets/src/{targets.js => targets.ts} (100%) rename packages/babel-helper-compilation-targets/src/{types.js => types.ts} (68%) rename packages/babel-helper-compilation-targets/src/{utils.js => utils.ts} (87%) diff --git a/lib/babel-packages.js.flow b/lib/babel-packages.js.flow index 019725bc0e..dab37130a9 100644 --- a/lib/babel-packages.js.flow +++ b/lib/babel-packages.js.flow @@ -216,3 +216,7 @@ declare module "@babel/helper-module-transforms" { declare module "@babel/plugin-transform-classes" { declare module.exports: any; } + +declare module "@babel/helper-compilation-targets" { + declare module.exports: any; +} diff --git a/packages/babel-helper-compilation-targets/package.json b/packages/babel-helper-compilation-targets/package.json index 0d13129a2f..2605c4c593 100644 --- a/packages/babel-helper-compilation-targets/package.json +++ b/packages/babel-helper-compilation-targets/package.json @@ -30,6 +30,8 @@ "@babel/core": "^7.0.0" }, "devDependencies": { - "@babel/core": "workspace:*" + "@babel/core": "workspace:*", + "@babel/helper-plugin-test-runner": "workspace:*", + "@types/semver": "^5.5.0" } } diff --git a/packages/babel-helper-compilation-targets/src/debug.js b/packages/babel-helper-compilation-targets/src/debug.ts similarity index 83% rename from packages/babel-helper-compilation-targets/src/debug.js rename to packages/babel-helper-compilation-targets/src/debug.ts index aec840d2eb..aef9fc12a2 100644 --- a/packages/babel-helper-compilation-targets/src/debug.js +++ b/packages/babel-helper-compilation-targets/src/debug.ts @@ -1,5 +1,3 @@ -// @flow - import semver from "semver"; import { prettifyVersion } from "./pretty"; import { @@ -7,16 +5,16 @@ import { isUnreleasedVersion, getLowestImplementedVersion, } from "./utils"; -import type { Targets } from "./types"; +import type { Target, Targets } from "./types"; export function getInclusionReasons( item: string, targetVersions: Targets, list: { [key: string]: Targets }, ) { - const minVersions = list[item] || {}; + const minVersions = list[item] || ({} as Targets); - return Object.keys(targetVersions).reduce((result, env) => { + return (Object.keys(targetVersions) as Target[]).reduce((result, env) => { const minVersion = getLowestImplementedVersion(minVersions, env); const targetVersion = targetVersions[env]; diff --git a/packages/babel-helper-compilation-targets/src/filter-items.js b/packages/babel-helper-compilation-targets/src/filter-items.ts similarity index 93% rename from packages/babel-helper-compilation-targets/src/filter-items.js rename to packages/babel-helper-compilation-targets/src/filter-items.ts index 6969cf9d70..4f23f45170 100644 --- a/packages/babel-helper-compilation-targets/src/filter-items.js +++ b/packages/babel-helper-compilation-targets/src/filter-items.ts @@ -1,5 +1,3 @@ -// @flow - import semver from "semver"; import pluginsCompatData from "@babel/compat-data/plugins"; @@ -12,7 +10,7 @@ import { } from "./utils"; export function targetsSupported(target: Targets, support: Targets) { - const targetEnvironments = Object.keys(target); + const targetEnvironments = Object.keys(target) as Array; if (targetEnvironments.length === 0) { return false; @@ -65,9 +63,9 @@ export function isRequired( includes, excludes, }: { - compatData?: { [feature: string]: Targets }, - includes?: Set, - excludes?: Set, + compatData?: { [feature: string]: Targets }; + includes?: Set; + excludes?: Set; } = {}, ) { if (excludes?.has(name)) return false; diff --git a/packages/babel-helper-compilation-targets/src/index.js b/packages/babel-helper-compilation-targets/src/index.ts similarity index 92% rename from packages/babel-helper-compilation-targets/src/index.js rename to packages/babel-helper-compilation-targets/src/index.ts index 93cc4950f6..c407762358 100644 --- a/packages/babel-helper-compilation-targets/src/index.js +++ b/packages/babel-helper-compilation-targets/src/index.ts @@ -1,5 +1,3 @@ -// @flow - import browserslist from "browserslist"; import { findSuggestion } from "@babel/helper-validator-option"; import browserModulesData from "@babel/compat-data/native-modules"; @@ -26,6 +24,7 @@ export { TargetNames }; const ESM_SUPPORT = browserModulesData["es6.module"]; +declare const PACKAGE_JSON: { name: string; version: string }; const v = new OptionValidator(PACKAGE_JSON.name); function validateTargetNames(targets: Targets): TargetsTuple { @@ -39,17 +38,17 @@ function validateTargetNames(targets: Targets): TargetsTuple { } } - return (targets: any); + return targets as any; } -export function isBrowsersQueryValid(browsers: mixed): boolean %checks { +export function isBrowsersQueryValid(browsers: unknown): boolean { return ( typeof browsers === "string" || (Array.isArray(browsers) && browsers.every(b => typeof b === "string")) ); } -function validateBrowsers(browsers: Browsers | void) { +function validateBrowsers(browsers: Browsers | undefined) { v.invariant( browsers === undefined || isBrowsersQueryValid(browsers), `'${String(browsers)}' is not a valid browserslist query`, @@ -59,7 +58,7 @@ function validateBrowsers(browsers: Browsers | void) { } function getLowestVersions(browsers: Array): Targets { - return browsers.reduce((all: Object, browser: string): Object => { + return browsers.reduce((all: any, browser: string): any => { const [browserName, browserVersion] = browser.split(" "); const normalizedBrowserName = browserNameMap[browserName]; @@ -102,7 +101,7 @@ function getLowestVersions(browsers: Array): Targets { } function outputDecimalWarning( - decimalTargets: Array<{| target: string, value: string |}>, + decimalTargets: Array<{ target: string; value: string }>, ): void { if (!decimalTargets.length) { return; @@ -152,7 +151,7 @@ function generateTargets(inputTargets: InputTargets): Targets { const input = { ...inputTargets }; delete input.esmodules; delete input.browsers; - return ((input: any): Targets); + return input as any as Targets; } function resolveTargets(queries: Browsers): Targets { @@ -162,20 +161,17 @@ function resolveTargets(queries: Browsers): Targets { type GetTargetsOption = { // This is not the path of the config file, but the path where start searching it from - configPath?: string, - + configPath?: string; // The path of the config file - configFile?: string, - + configFile?: string; // The env to pass to browserslist - browserslistEnv?: string, - + browserslistEnv?: string; // true to disable config loading - ignoreBrowserslistConfig?: boolean, + ignoreBrowserslistConfig?: boolean; }; export default function getTargets( - inputTargets: InputTargets = {}, + inputTargets: InputTargets = {} as InputTargets, options: GetTargetsOption = {}, ): Targets { let { browsers, esmodules } = inputTargets; @@ -243,7 +239,7 @@ export default function getTargets( } // Parse remaining targets - const result: Targets = {}; + const result: Targets = {} as Targets; const decimalWarnings = []; for (const target of Object.keys(targets).sort()) { const value = targets[target]; diff --git a/packages/babel-helper-compilation-targets/src/options.js b/packages/babel-helper-compilation-targets/src/options.ts similarity index 95% rename from packages/babel-helper-compilation-targets/src/options.js rename to packages/babel-helper-compilation-targets/src/options.ts index 0c30e6113d..77f8b8294b 100644 --- a/packages/babel-helper-compilation-targets/src/options.js +++ b/packages/babel-helper-compilation-targets/src/options.ts @@ -1,5 +1,3 @@ -// @flow - export const TargetNames = { node: "node", chrome: "chrome", diff --git a/packages/babel-helper-compilation-targets/src/pretty.js b/packages/babel-helper-compilation-targets/src/pretty.ts similarity index 92% rename from packages/babel-helper-compilation-targets/src/pretty.js rename to packages/babel-helper-compilation-targets/src/pretty.ts index bc8bdd96c1..10afed440b 100644 --- a/packages/babel-helper-compilation-targets/src/pretty.js +++ b/packages/babel-helper-compilation-targets/src/pretty.ts @@ -1,5 +1,6 @@ import semver from "semver"; import { unreleasedLabels } from "./targets"; +import type { Targets } from "./types"; export function prettifyVersion(version: string) { if (typeof version !== "string") { @@ -32,5 +33,5 @@ export function prettifyTargets(targets: Targets): Targets { results[target] = value; return results; - }, {}); + }, {} as Targets); } diff --git a/packages/babel-helper-compilation-targets/src/targets.js b/packages/babel-helper-compilation-targets/src/targets.ts similarity index 100% rename from packages/babel-helper-compilation-targets/src/targets.js rename to packages/babel-helper-compilation-targets/src/targets.ts diff --git a/packages/babel-helper-compilation-targets/src/types.js b/packages/babel-helper-compilation-targets/src/types.ts similarity index 68% rename from packages/babel-helper-compilation-targets/src/types.js rename to packages/babel-helper-compilation-targets/src/types.ts index 16dd02dd14..ab32e8f1f8 100644 --- a/packages/babel-helper-compilation-targets/src/types.js +++ b/packages/babel-helper-compilation-targets/src/types.ts @@ -1,5 +1,3 @@ -// @flow - // Targets export type Target = | "node" @@ -15,24 +13,21 @@ export type Target = | "samsung"; export type Targets = { - [target: Target]: string, + [target in Target]: string; }; -export type TargetsTuple = {| - [target: Target]: string, -|}; +export type TargetsTuple = { + [target in Target]: string; +}; -export type Browsers = string | $ReadOnlyArray; +export type Browsers = string | ReadonlyArray; export type InputTargets = { - ...Targets, - - browsers?: Browsers, - + browsers?: Browsers; // When `true`, this completely replaces the `browsers` option. // When `intersect`, this is intersected with the `browsers` // option (giving the higher browsers as the result). // TODO(Babel 8): Make `true` behave like `intersect` and // remove `intersect`. - esmodules?: boolean | "intersect", -}; + esmodules?: boolean | "intersect"; +} & Targets; diff --git a/packages/babel-helper-compilation-targets/src/utils.js b/packages/babel-helper-compilation-targets/src/utils.ts similarity index 87% rename from packages/babel-helper-compilation-targets/src/utils.js rename to packages/babel-helper-compilation-targets/src/utils.ts index 5feb9c9e38..d527247e9f 100644 --- a/packages/babel-helper-compilation-targets/src/utils.js +++ b/packages/babel-helper-compilation-targets/src/utils.ts @@ -1,14 +1,18 @@ -// @flow import semver from "semver"; import { OptionValidator } from "@babel/helper-validator-option"; import { unreleasedLabels } from "./targets"; import type { Target, Targets } from "./types"; +declare const PACKAGE_JSON: { name: string; version: string }; + const versionRegExp = /^(\d+|\d+.\d+)$/; const v = new OptionValidator(PACKAGE_JSON.name); -export function semverMin(first: ?string, second: string): string { +export function semverMin( + first: string | undefined | null, + second: string, +): string { return first && semver.lt(first, second) ? first : second; } @@ -46,6 +50,7 @@ export function getLowestUnreleased(a: string, b: string, env: string): string { const unreleasedLabel = unreleasedLabels[env]; const hasUnreleased = [a, b].some(item => item === unreleasedLabel); if (hasUnreleased) { + // @ts-expect-error todo(flow->ts): probably a bug - types of a hasUnreleased to not overlap return a === hasUnreleased ? b : a || b; } return semverMin(a, b); diff --git a/packages/babel-preset-env/src/debug.js b/packages/babel-preset-env/src/debug.js index 826ca05431..3a255d9e0f 100644 --- a/packages/babel-preset-env/src/debug.js +++ b/packages/babel-preset-env/src/debug.js @@ -27,7 +27,6 @@ export const logPlugin = ( if (!first) formattedTargets += `,`; first = false; formattedTargets += ` ${target}`; - // $FlowIgnore if (support[target]) formattedTargets += ` < ${support[target]}`; } formattedTargets += ` }`; diff --git a/packages/babel-preset-env/src/index.js b/packages/babel-preset-env/src/index.js index 99b1e1b394..85eb2ff249 100644 --- a/packages/babel-preset-env/src/index.js +++ b/packages/babel-preset-env/src/index.js @@ -249,11 +249,11 @@ function getLocalTargets( `); } - return getTargets( - // $FlowIgnore optionsTargets doesn't have an "uglify" property anymore - (optionsTargets: InputTargets), - { ignoreBrowserslistConfig, configPath, browserslistEnv }, - ); + return getTargets((optionsTargets: InputTargets), { + ignoreBrowserslistConfig, + configPath, + browserslistEnv, + }); } function supportsStaticESM(caller) { diff --git a/packages/babel-preset-env/src/normalize-options.js b/packages/babel-preset-env/src/normalize-options.js index 51b265a93a..a436ddf0ba 100644 --- a/packages/babel-preset-env/src/normalize-options.js +++ b/packages/babel-preset-env/src/normalize-options.js @@ -111,7 +111,7 @@ export const checkDuplicateIncludeExcludes = ( ); }; -const normalizeTargets = targets => { +const normalizeTargets = (targets): $PropertyType => { // TODO: Allow to use only query or strings as a targets from next breaking change. if (typeof targets === "string" || Array.isArray(targets)) { return { browsers: targets }; diff --git a/packages/babel-preset-env/src/types.js b/packages/babel-preset-env/src/types.js index 780344b555..c963f410c7 100644 --- a/packages/babel-preset-env/src/types.js +++ b/packages/babel-preset-env/src/types.js @@ -32,7 +32,7 @@ export type Options = { modules: ModuleOption, shippedProposals: boolean, spec: boolean, - targets: { ...InputTargets, uglify?: boolean }, + targets: { ...InputTargets, uglify?: boolean, esmodules?: boolean }, useBuiltIns: BuiltInsOption, browserslistEnv: string, }; diff --git a/tsconfig.json b/tsconfig.json index 5618495253..a6a886b9df 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,6 +6,7 @@ "./packages/babel-core/src/**/*.ts", "./packages/babel-generator/src/**/*.ts", "./packages/babel-helper-annotate-as-pure/src/**/*.ts", + "./packages/babel-helper-compilation-targets/src/**/*.ts", "./packages/babel-helper-create-regexp-features-plugin/src/**/*.ts", "./packages/babel-helper-explode-assignable-expression/src/**/*.ts", "./packages/babel-helper-fixtures/src/**/*.ts", @@ -49,6 +50,9 @@ "@babel/helper-annotate-as-pure": [ "./packages/babel-helper-annotate-as-pure/src" ], + "@babel/helper-compilation-targets": [ + "./packages/babel-helper-compilation-targets/src" + ], "@babel/helper-create-regexp-features-plugin": [ "./packages/babel-helper-create-regexp-features-plugin/src" ], diff --git a/yarn.lock b/yarn.lock index 40ddce60ff..9495f41e45 100644 --- a/yarn.lock +++ b/yarn.lock @@ -410,7 +410,9 @@ __metadata: dependencies: "@babel/compat-data": "workspace:^7.13.15" "@babel/core": "workspace:*" + "@babel/helper-plugin-test-runner": "workspace:*" "@babel/helper-validator-option": "workspace:^7.12.17" + "@types/semver": ^5.5.0 browserslist: ^4.14.5 semver: "condition:BABEL_8_BREAKING ? ^7.3.4 : ^6.3.0" peerDependencies: @@ -4243,7 +4245,7 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:^5.4.0": +"@types/semver@npm:^5.4.0, @types/semver@npm:^5.5.0": version: 5.5.0 resolution: "@types/semver@npm:5.5.0" checksum: df74589466e171c36dd868b760609e518830f212134c238674ddd6eb83653368c59f4510aa6523b7692ec99c5d8ab40b818e30f9d65e0df97c56bdbacef06661