From cf26c377bfde653ce9aa390e15374467b7c76044 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Tue, 26 Apr 2022 17:40:49 -0400 Subject: [PATCH 01/22] type: refine assumptions interface --- packages/babel-core/src/config/helpers/config-api.ts | 4 ++-- packages/babel-core/src/config/validation/options.ts | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/babel-core/src/config/helpers/config-api.ts b/packages/babel-core/src/config/helpers/config-api.ts index 3275c193da5f..446d01e13ba0 100644 --- a/packages/babel-core/src/config/helpers/config-api.ts +++ b/packages/babel-core/src/config/helpers/config-api.ts @@ -9,7 +9,7 @@ import type { SimpleType, } from "../caching"; -import type { CallerMetadata } from "../validation/options"; +import type { AssumptionName, CallerMetadata } from "../validation/options"; import * as Context from "../cache-contexts"; @@ -24,7 +24,7 @@ type CallerFactory = ( extractor: (callerMetadata: CallerMetadata | void) => unknown, ) => SimpleType; type TargetsFunction = () => Targets; -type AssumptionFunction = (name: string) => boolean | void; +type AssumptionFunction = (name: AssumptionName) => boolean; export type ConfigAPI = { version: string; diff --git a/packages/babel-core/src/config/validation/options.ts b/packages/babel-core/src/config/validation/options.ts index 7b9361bcd176..d2a60c77b740 100644 --- a/packages/babel-core/src/config/validation/options.ts +++ b/packages/babel-core/src/config/validation/options.ts @@ -254,7 +254,7 @@ type EnvPath = Readonly<{ export type NestingPath = RootPath | OverridesPath | EnvPath; -export const assumptionsNames = new Set([ +const knownAssumptions = [ "arrayLikeIsIterable", "constantReexports", "constantSuper", @@ -276,7 +276,9 @@ export const assumptionsNames = new Set([ "setSpreadProperties", "skipForOfIteratorClosing", "superIsCallableConstructor", -]); +] as const; +export type AssumptionName = typeof knownAssumptions[number]; +export const assumptionsNames = new Set(knownAssumptions); function getSource(loc: NestingPath): OptionsSource { return loc.type === "root" ? loc.source : getSource(loc.parent); From dd73f4c6e176af78004ec2f2816238703c697700 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Wed, 27 Apr 2022 09:49:02 -0400 Subject: [PATCH 02/22] fix: use UidIdentifier when partial callee is not identifier --- .../src/index.ts | 11 +++++++++-- .../test/fixtures/general/curry/exec.js | 5 +++++ .../test/fixtures/general/curry/input.js | 3 +++ .../test/fixtures/general/curry/output.js | 7 +++++++ 4 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 packages/babel-plugin-proposal-partial-application/test/fixtures/general/curry/exec.js create mode 100644 packages/babel-plugin-proposal-partial-application/test/fixtures/general/curry/input.js create mode 100644 packages/babel-plugin-proposal-partial-application/test/fixtures/general/curry/output.js diff --git a/packages/babel-plugin-proposal-partial-application/src/index.ts b/packages/babel-plugin-proposal-partial-application/src/index.ts index 9b10ac7357cd..6acf64e25298 100644 --- a/packages/babel-plugin-proposal-partial-application/src/index.ts +++ b/packages/babel-plugin-proposal-partial-application/src/index.ts @@ -125,10 +125,17 @@ export default declare(api => { ); } else { sequenceParts.push( - t.assignmentExpression("=", t.cloneNode(functionLVal), node.callee), + t.assignmentExpression( + "=", + t.cloneNode(functionLVal), + // @ts-expect-error V8 intrinsics will not support partial application + node.callee, + ), ...argsInitializers, t.functionExpression( - t.cloneNode(node.callee), + t.isIdentifier(node.callee) + ? t.cloneNode(node.callee) + : path.scope.generateUidIdentifierBasedOnNode(node.callee), placeholdersParams, t.blockStatement( [ diff --git a/packages/babel-plugin-proposal-partial-application/test/fixtures/general/curry/exec.js b/packages/babel-plugin-proposal-partial-application/test/fixtures/general/curry/exec.js new file mode 100644 index 000000000000..8b5dd94fb2ca --- /dev/null +++ b/packages/babel-plugin-proposal-partial-application/test/fixtures/general/curry/exec.js @@ -0,0 +1,5 @@ +const binary = x => (y, z) => x( y, z ); + +const add1 = binary((y, z) => y + z)(1, ?); + +expect(add1(1)).toBe(2); diff --git a/packages/babel-plugin-proposal-partial-application/test/fixtures/general/curry/input.js b/packages/babel-plugin-proposal-partial-application/test/fixtures/general/curry/input.js new file mode 100644 index 000000000000..f8fef799a899 --- /dev/null +++ b/packages/babel-plugin-proposal-partial-application/test/fixtures/general/curry/input.js @@ -0,0 +1,3 @@ +const binary = x => (y, z) => x( y, z ); + +const add1 = binary((y, z) => y + z)(1, ?); diff --git a/packages/babel-plugin-proposal-partial-application/test/fixtures/general/curry/output.js b/packages/babel-plugin-proposal-partial-application/test/fixtures/general/curry/output.js new file mode 100644 index 000000000000..b15675ccc7f6 --- /dev/null +++ b/packages/babel-plugin-proposal-partial-application/test/fixtures/general/curry/output.js @@ -0,0 +1,7 @@ +var _binary; + +const binary = x => (y, z) => x(y, z); + +const add1 = (_binary = binary((y, z) => y + z), function _binary2(_argPlaceholder) { + return _binary(1, _argPlaceholder); +}); From 7a21c70f38b2eef24dfe3ae0480440cdc1016fce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Wed, 27 Apr 2022 11:03:29 -0400 Subject: [PATCH 03/22] perf: scan object properties in one pass --- .../src/index.ts | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/babel-plugin-transform-property-mutators/src/index.ts b/packages/babel-plugin-transform-property-mutators/src/index.ts index 3ed962f38f33..8323bda0acfe 100644 --- a/packages/babel-plugin-transform-property-mutators/src/index.ts +++ b/packages/babel-plugin-transform-property-mutators/src/index.ts @@ -11,25 +11,25 @@ export default declare(api => { visitor: { ObjectExpression(path, file) { const { node } = path; - let hasAny = false; - for (const prop of node.properties) { - if (prop.kind === "get" || prop.kind === "set") { - hasAny = true; - break; + let mutatorMap; + const newProperties = node.properties.filter(function (prop) { + if (t.isObjectMethod(prop)) { + if (prop.kind === "get" || prop.kind === "set") { + mutatorMap ??= {}; + if (!prop.computed) { + defineMap.push(mutatorMap, prop, null, file); + return false; + } + } } - } - if (!hasAny) return; + return true; + }); - const mutatorMap = {}; + if (mutatorMap === undefined) { + return; + } - node.properties = node.properties.filter(function (prop) { - if (!prop.computed && (prop.kind === "get" || prop.kind === "set")) { - defineMap.push(mutatorMap, prop, null, file); - return false; - } else { - return true; - } - }); + node.properties = newProperties; path.replaceWith( t.callExpression( From 11c80b9434bf39702b0920c32948f2defa2c8a75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Wed, 27 Apr 2022 14:15:20 -0400 Subject: [PATCH 04/22] fix: support private name in member proeprty --- .../src/index.ts | 22 ++++++++----------- .../member-expression-private-name/exec.js | 12 ++++++++++ .../member-expression-private-name/input.js | 8 +++++++ .../options.json | 4 ++++ .../member-expression-private-name/output.js | 14 ++++++++++++ 5 files changed, 47 insertions(+), 13 deletions(-) create mode 100644 packages/babel-plugin-proposal-partial-application/test/fixtures/general/member-expression-private-name/exec.js create mode 100644 packages/babel-plugin-proposal-partial-application/test/fixtures/general/member-expression-private-name/input.js create mode 100644 packages/babel-plugin-proposal-partial-application/test/fixtures/general/member-expression-private-name/options.json create mode 100644 packages/babel-plugin-proposal-partial-application/test/fixtures/general/member-expression-private-name/output.js diff --git a/packages/babel-plugin-proposal-partial-application/src/index.ts b/packages/babel-plugin-proposal-partial-application/src/index.ts index 6acf64e25298..6f88b628258d 100644 --- a/packages/babel-plugin-proposal-partial-application/src/index.ts +++ b/packages/babel-plugin-proposal-partial-application/src/index.ts @@ -83,27 +83,23 @@ export default declare(api => { scope.push({ id: functionLVal }); if (node.callee.type === "MemberExpression") { - const receiverLVal = path.scope.generateUidIdentifierBasedOnNode( - node.callee.object, - ); + const { object: receiver, property } = node.callee; + const receiverLVal = + path.scope.generateUidIdentifierBasedOnNode(receiver); scope.push({ id: receiverLVal }); + sequenceParts.push( - t.assignmentExpression( - "=", - t.cloneNode(receiverLVal), - node.callee.object, - ), + t.assignmentExpression("=", t.cloneNode(receiverLVal), receiver), t.assignmentExpression( "=", t.cloneNode(functionLVal), - t.memberExpression( - t.cloneNode(receiverLVal), - node.callee.property, - ), + t.memberExpression(t.cloneNode(receiverLVal), property), ), ...argsInitializers, t.functionExpression( - t.cloneNode(node.callee.property), + t.isIdentifier(property) + ? t.cloneNode(property) + : path.scope.generateUidIdentifierBasedOnNode(property), placeholdersParams, t.blockStatement( [ diff --git a/packages/babel-plugin-proposal-partial-application/test/fixtures/general/member-expression-private-name/exec.js b/packages/babel-plugin-proposal-partial-application/test/fixtures/general/member-expression-private-name/exec.js new file mode 100644 index 000000000000..c5704f8f4342 --- /dev/null +++ b/packages/babel-plugin-proposal-partial-application/test/fixtures/general/member-expression-private-name/exec.js @@ -0,0 +1,12 @@ +class obj { + static #add = (x, y) => x + y; + static test() { + const addOne = obj.#add(1, ?); + + expect(addOne(5)).toEqual(6); + expect(addOne.length).toEqual(1); + expect(addOne.name).toEqual("_add"); + } +} + +obj.test(); diff --git a/packages/babel-plugin-proposal-partial-application/test/fixtures/general/member-expression-private-name/input.js b/packages/babel-plugin-proposal-partial-application/test/fixtures/general/member-expression-private-name/input.js new file mode 100644 index 000000000000..b81595d89184 --- /dev/null +++ b/packages/babel-plugin-proposal-partial-application/test/fixtures/general/member-expression-private-name/input.js @@ -0,0 +1,8 @@ +class obj { + static #add = (x, y) => x + y; + static test() { + const addOne = obj.#add(1, ?); + } +} + +obj.test(); diff --git a/packages/babel-plugin-proposal-partial-application/test/fixtures/general/member-expression-private-name/options.json b/packages/babel-plugin-proposal-partial-application/test/fixtures/general/member-expression-private-name/options.json new file mode 100644 index 000000000000..5633c730075f --- /dev/null +++ b/packages/babel-plugin-proposal-partial-application/test/fixtures/general/member-expression-private-name/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["proposal-partial-application"], + "minNodeVersion": "12.11.0" +} diff --git a/packages/babel-plugin-proposal-partial-application/test/fixtures/general/member-expression-private-name/output.js b/packages/babel-plugin-proposal-partial-application/test/fixtures/general/member-expression-private-name/output.js new file mode 100644 index 000000000000..17def2511a06 --- /dev/null +++ b/packages/babel-plugin-proposal-partial-application/test/fixtures/general/member-expression-private-name/output.js @@ -0,0 +1,14 @@ +class obj { + static #add = (x, y) => x + y; + + static test() { + var _obj$add, _obj; + + const addOne = (_obj = obj, _obj$add = _obj.#add, function _add(_argPlaceholder) { + return _obj$add.call(_obj, 1, _argPlaceholder); + }); + } + +} + +obj.test(); From 1a016a2e3097d52bebb01f07909de7a39a3d07a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Wed, 27 Apr 2022 15:19:06 -0400 Subject: [PATCH 05/22] fix: add pipeline operator to BinaryOperators --- packages/babel-types/src/ast-types/generated/index.ts | 3 ++- packages/babel-types/src/builders/generated/index.ts | 3 ++- packages/babel-types/src/constants/index.ts | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/babel-types/src/ast-types/generated/index.ts b/packages/babel-types/src/ast-types/generated/index.ts index f750429c735d..2a36e2e11346 100644 --- a/packages/babel-types/src/ast-types/generated/index.ts +++ b/packages/babel-types/src/ast-types/generated/index.ts @@ -334,7 +334,8 @@ export interface BinaryExpression extends BaseNode { | ">" | "<" | ">=" - | "<="; + | "<=" + | "|>"; left: Expression | PrivateName; right: Expression; } diff --git a/packages/babel-types/src/builders/generated/index.ts b/packages/babel-types/src/builders/generated/index.ts index 130814020c40..ae8a309fb83d 100644 --- a/packages/babel-types/src/builders/generated/index.ts +++ b/packages/babel-types/src/builders/generated/index.ts @@ -42,7 +42,8 @@ export function binaryExpression( | ">" | "<" | ">=" - | "<=", + | "<=" + | "|>", left: t.Expression | t.PrivateName, right: t.Expression, ): t.BinaryExpression { diff --git a/packages/babel-types/src/constants/index.ts b/packages/babel-types/src/constants/index.ts index f1155ee7b3d2..e3ece7c5d7f5 100644 --- a/packages/babel-types/src/constants/index.ts +++ b/packages/babel-types/src/constants/index.ts @@ -38,6 +38,7 @@ export const BINARY_OPERATORS = [ "+", ...NUMBER_BINARY_OPERATORS, ...BOOLEAN_BINARY_OPERATORS, + "|>", ]; export const ASSIGNMENT_OPERATORS = [ From dc43dd071afee69044ef345cd7b923a4474680d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Wed, 27 Apr 2022 16:51:28 -0400 Subject: [PATCH 06/22] typings: fix GeneratorOptions --- packages/babel-generator/src/index.ts | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/packages/babel-generator/src/index.ts b/packages/babel-generator/src/index.ts index 6c449e0413bc..ea60b833d314 100644 --- a/packages/babel-generator/src/index.ts +++ b/packages/babel-generator/src/index.ts @@ -1,7 +1,7 @@ import SourceMap from "./source-map"; import Printer from "./printer"; import type * as t from "@babel/types"; - +import type { Opts as jsescOptions } from "jsesc"; import type { Format } from "./printer"; /** @@ -186,19 +186,12 @@ export interface GeneratorOptions { /** * Options for outputting jsesc representation. */ - jsescOption?: { - /** - * The type of quote to use in the output. If omitted, autodetects based on `ast.tokens`. - */ - quotes?: "single" | "double"; - - /** - * When enabled, the output is a valid JavaScript string literal wrapped in quotes. The type of quotes can be specified through the quotes setting. - * Defaults to `true`. - */ - wrap?: boolean; - }; + jsescOption?: jsescOptions; + /** + * For use with the recordAndTuple token. + */ + recordAndTupleSyntaxType?: "hash" | "bar"; /** * For use with the Hack-style pipe operator. * Changes what token is used for pipe bodies’ topic references. From 046daab907633755979128b4767525a5ab6833d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Wed, 27 Apr 2022 16:53:02 -0400 Subject: [PATCH 07/22] update babel parser typings --- packages/babel-parser/typings/babel-parser.d.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/babel-parser/typings/babel-parser.d.ts b/packages/babel-parser/typings/babel-parser.d.ts index f2f4db699757..c293ea77f32c 100644 --- a/packages/babel-parser/typings/babel-parser.d.ts +++ b/packages/babel-parser/typings/babel-parser.d.ts @@ -182,7 +182,7 @@ export interface DecoratorsPluginOptions { export interface PipelineOperatorPluginOptions { proposal: "minimal" | "fsharp" | "hack" | "smart"; - topicToken?: "%" | "#" | "@@" | "^^"; + topicToken?: "%" | "#" | "@@" | "^^" | "^"; } export interface RecordAndTuplePluginOptions { @@ -191,6 +191,7 @@ export interface RecordAndTuplePluginOptions { export interface FlowPluginOptions { all?: boolean; + enums?: boolean; } export interface TypeScriptPluginOptions { From 8ef9dd2e7dae4a718a1f02f35b5c56f76ed31f87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Wed, 27 Apr 2022 17:06:58 -0400 Subject: [PATCH 08/22] fix: add predicate to @babel/types --- .../src/index.ts | 4 +++- .../babel-types/src/ast-types/generated/index.ts | 3 +++ packages/babel-types/src/definitions/core.ts | 12 ++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/babel-plugin-transform-flow-strip-types/src/index.ts b/packages/babel-plugin-transform-flow-strip-types/src/index.ts index 6b5ec02a255a..f5b873c88507 100644 --- a/packages/babel-plugin-transform-flow-strip-types/src/index.ts +++ b/packages/babel-plugin-transform-flow-strip-types/src/index.ts @@ -145,7 +145,9 @@ export default declare((api, opts) => { } } - node.predicate = null; + if (!t.isMethod(node)) { + node.predicate = null; + } }, TypeCastExpression(path) { diff --git a/packages/babel-types/src/ast-types/generated/index.ts b/packages/babel-types/src/ast-types/generated/index.ts index 2a36e2e11346..919a581737ff 100644 --- a/packages/babel-types/src/ast-types/generated/index.ts +++ b/packages/babel-types/src/ast-types/generated/index.ts @@ -444,6 +444,7 @@ export interface FunctionDeclaration extends BaseNode { generator?: boolean; async?: boolean; declare?: boolean | null; + predicate?: DeclaredPredicate | InferredPredicate | null; returnType?: TypeAnnotation | TSTypeAnnotation | Noop | null; typeParameters?: | TypeParameterDeclaration @@ -459,6 +460,7 @@ export interface FunctionExpression extends BaseNode { body: BlockStatement; generator?: boolean; async?: boolean; + predicate?: DeclaredPredicate | InferredPredicate | null; returnType?: TypeAnnotation | TSTypeAnnotation | Noop | null; typeParameters?: | TypeParameterDeclaration @@ -722,6 +724,7 @@ export interface ArrowFunctionExpression extends BaseNode { async?: boolean; expression: boolean; generator?: boolean; + predicate?: DeclaredPredicate | InferredPredicate | null; returnType?: TypeAnnotation | TSTypeAnnotation | Noop | null; typeParameters?: | TypeParameterDeclaration diff --git a/packages/babel-types/src/definitions/core.ts b/packages/babel-types/src/definitions/core.ts index df9783987d60..49e1768571a2 100644 --- a/packages/babel-types/src/definitions/core.ts +++ b/packages/babel-types/src/definitions/core.ts @@ -407,6 +407,10 @@ defineType("FunctionDeclaration", { body: { validate: assertNodeType("BlockStatement"), }, + predicate: { + validate: assertNodeType("DeclaredPredicate", "InferredPredicate"), + optional: true, + }, }, aliases: [ "Scopable", @@ -450,6 +454,10 @@ defineType("FunctionExpression", { body: { validate: assertNodeType("BlockStatement"), }, + predicate: { + validate: assertNodeType("DeclaredPredicate", "InferredPredicate"), + optional: true, + }, }, }); @@ -1247,6 +1255,10 @@ defineType("ArrowFunctionExpression", { body: { validate: assertNodeType("BlockStatement", "Expression"), }, + predicate: { + validate: assertNodeType("DeclaredPredicate", "InferredPredicate"), + optional: true, + }, }, }); From 381fd185e8214c317dfcc9bba4f2a0483f6604a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Wed, 27 Apr 2022 16:52:12 -0400 Subject: [PATCH 09/22] typings: export Plugin/Preset related types --- packages/babel-core/src/config/index.ts | 11 ++++++++++ .../config/validation/option-assertions.ts | 3 ++- .../src/config/validation/options.ts | 6 ++++-- .../src/config/validation/plugins.ts | 21 +++++++++++-------- packages/babel-core/src/index.ts | 7 +++++++ 5 files changed, 36 insertions(+), 12 deletions(-) diff --git a/packages/babel-core/src/config/index.ts b/packages/babel-core/src/config/index.ts index 2aad3de17bcf..d231a8ec6d59 100644 --- a/packages/babel-core/src/config/index.ts +++ b/packages/babel-core/src/config/index.ts @@ -9,6 +9,17 @@ export type { import type { PluginTarget } from "./validation/options"; +import type { + PluginAPI as basePluginAPI, + PresetAPI as basePresetAPI, +} from "./helpers/config-api"; +export type { PluginObject } from "./validation/plugins"; +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"; + import loadFullConfig from "./full"; import { loadPartialConfig as loadPartialConfigRunner } from "./partial"; diff --git a/packages/babel-core/src/config/validation/option-assertions.ts b/packages/babel-core/src/config/validation/option-assertions.ts index e53aff72890c..8f141a1c160a 100644 --- a/packages/babel-core/src/config/validation/option-assertions.ts +++ b/packages/babel-core/src/config/validation/option-assertions.ts @@ -20,6 +20,7 @@ import type { CallerMetadata, RootMode, TargetsListOrObject, + AssumptionName, } from "./options"; import { assumptionsNames } from "./options"; @@ -462,7 +463,7 @@ export function assertAssumptions( for (const name of Object.keys(value)) { const subLoc = access(loc, name); - if (!assumptionsNames.has(name)) { + if (!assumptionsNames.has(name as AssumptionName)) { throw new Error(`${msg(subLoc)} is not a supported assumption.`); } if (typeof value[name] !== "boolean") { diff --git a/packages/babel-core/src/config/validation/options.ts b/packages/babel-core/src/config/validation/options.ts index d2a60c77b740..2b256fd2b8e5 100644 --- a/packages/babel-core/src/config/validation/options.ts +++ b/packages/babel-core/src/config/validation/options.ts @@ -28,6 +28,8 @@ import { } from "./option-assertions"; import type { ValidatorSet, Validator, OptionPath } from "./option-assertions"; import type { UnloadedDescriptor } from "../config-descriptors"; +import type { ParserOptions } from "@babel/parser"; +import type { GeneratorOptions } from "@babel/generator"; const ROOT_VALIDATORS: ValidatorSet = { cwd: assertString as Validator, @@ -181,9 +183,9 @@ export type ValidatedOptions = { sourceFileName?: string; sourceRoot?: string; // Deprecate top level parserOpts - parserOpts?: {}; + parserOpts?: ParserOptions; // Deprecate top level generatorOpts - generatorOpts?: {}; + generatorOpts?: GeneratorOptions; }; export type NormalizedOptions = { diff --git a/packages/babel-core/src/config/validation/plugins.ts b/packages/babel-core/src/config/validation/plugins.ts index 9731b4b36dc2..f638033526af 100644 --- a/packages/babel-core/src/config/validation/plugins.ts +++ b/packages/babel-core/src/config/validation/plugins.ts @@ -11,6 +11,10 @@ import type { OptionPath, RootPath, } from "./option-assertions"; +import type { ParserOptions } from "@babel/parser"; +import type { Visitor } from "@babel/traverse"; +import PluginPass from "../../transformation/plugin-pass"; +import type { ValidatedOptions } from "./options"; // Note: The casts here are just meant to be static assertions to make sure // that the assertion functions actually assert that the value's type matches @@ -31,7 +35,7 @@ const VALIDATORS: ValidatorSet = { >, }; -function assertVisitorMap(loc: OptionPath, value: unknown): VisitorMap { +function assertVisitorMap(loc: OptionPath, value: unknown): Visitor { const obj = assertObject(loc, value); if (obj) { Object.keys(obj).forEach(prop => assertVisitorHandler(prop, obj[prop])); @@ -45,7 +49,7 @@ function assertVisitorMap(loc: OptionPath, value: unknown): VisitorMap { ); } } - return obj as VisitorMap; + return obj as Visitor; } function assertVisitorHandler( @@ -74,17 +78,16 @@ type VisitorHandler = exit?: Function; }; -export type VisitorMap = { - [x: string]: VisitorHandler; -}; - -export type PluginObject = { +export type PluginObject = { name?: string; - manipulateOptions?: (options: unknown, parserOpts: unknown) => void; + manipulateOptions?: ( + options: ValidatedOptions, + parserOpts: ParserOptions, + ) => void; pre?: Function; post?: Function; inherits?: Function; - visitor?: VisitorMap; + visitor?: Visitor; parserOverride?: Function; generatorOverride?: Function; }; diff --git a/packages/babel-core/src/index.ts b/packages/babel-core/src/index.ts index 8abd7cc17489..cdbc2e6998bb 100644 --- a/packages/babel-core/src/index.ts +++ b/packages/babel-core/src/index.ts @@ -29,6 +29,13 @@ export { loadOptionsAsync, } from "./config"; +export type { + PluginAPI, + PluginObject, + PresetAPI, + PresetObject, +} from "./config"; + export { transform, transformSync, transformAsync } from "./transform"; export { transformFile, From 99d3abd58b0e3f585afbbf3180c276f9f057e214 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Wed, 27 Apr 2022 16:52:50 -0400 Subject: [PATCH 10/22] feat: add declarePreset method and refine declare types --- .../babel-helper-plugin-utils/src/index.ts | 42 ++++++++++++------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/packages/babel-helper-plugin-utils/src/index.ts b/packages/babel-helper-plugin-utils/src/index.ts index 53c7caaa0f48..8e6902df9525 100644 --- a/packages/babel-helper-plugin-utils/src/index.ts +++ b/packages/babel-helper-plugin-utils/src/index.ts @@ -1,20 +1,24 @@ -export function declare< - Args extends - | [any] - | [any, any?] - | [any, any?, any?] - | [any, any] - | [any, any, any?] - | [any, any, any], - Builder extends (...args: Args) => any, ->( - builder: Builder, - // todo(flow->ts) maybe add stricter type for returned function - // reason any is there to not expose exact implementation details in type - // example of issue with this packages/babel-preset-typescript/src/index.ts -): Builder extends (...args: infer A) => any ? (...args: A) => any : never { +import type { + PluginAPI, + PluginObject, + PluginPass, + PresetAPI, + PresetObject, +} from "@babel/core"; + +export function declare( + builder: ( + api: API, + options: Option, + dirname: string, + ) => PluginObject, +): ( + api: API, + options: Option, + dirname: string, +) => PluginObject { // @ts-ignore - return (api, options, dirname) => { + return (api, options: Option, dirname: string) => { let clonedApi; for (const name of Object.keys(apiPolyfills)) { @@ -30,6 +34,12 @@ export function declare< }; } +export function declarePreset