diff --git a/packages/babel-helper-define-map/.npmignore b/packages/babel-helper-define-map/.npmignore deleted file mode 100644 index f9806945836e..000000000000 --- a/packages/babel-helper-define-map/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -src -test -*.log diff --git a/packages/babel-helper-define-map/README.md b/packages/babel-helper-define-map/README.md deleted file mode 100644 index a21203c5615f..000000000000 --- a/packages/babel-helper-define-map/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# @babel/helper-define-map - -> Helper function to define a map - -See our website [@babel/helper-define-map](https://babeljs.io/docs/en/babel-helper-define-map) for more information. - -## Install - -Using npm: - -```sh -npm install --save @babel/helper-define-map -``` - -or using yarn: - -```sh -yarn add @babel/helper-define-map -``` diff --git a/packages/babel-helper-define-map/package.json b/packages/babel-helper-define-map/package.json deleted file mode 100644 index a559916bb278..000000000000 --- a/packages/babel-helper-define-map/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "@babel/helper-define-map", - "version": "7.18.6", - "description": "Helper function to define a map", - "repository": { - "type": "git", - "url": "https://github.com/babel/babel.git", - "directory": "packages/babel-helper-define-map" - }, - "homepage": "https://babel.dev/docs/en/next/babel-helper-define-map", - "license": "MIT", - "publishConfig": { - "access": "public" - }, - "main": "./lib/index.js", - "dependencies": { - "@babel/helper-function-name": "workspace:^", - "@babel/types": "workspace:^" - }, - "engines": { - "node": ">=6.9.0" - }, - "author": "The Babel Team (https://babel.dev/team)", - "conditions": { - "BABEL_8_BREAKING": [ - null, - { - "exports": null - } - ], - "USE_ESM": [ - { - "type": "module" - }, - null - ] - }, - "exports": { - ".": "./lib/index.js", - "./package.json": "./package.json" - }, - "type": "commonjs" -} diff --git a/packages/babel-helper-define-map/src/index.ts b/packages/babel-helper-define-map/src/index.ts deleted file mode 100644 index c303e022632f..000000000000 --- a/packages/babel-helper-define-map/src/index.ts +++ /dev/null @@ -1,197 +0,0 @@ -import nameFunction from "@babel/helper-function-name"; -import { - arrayExpression, - booleanLiteral, - functionExpression, - identifier, - inheritsComments, - isClassMethod, - isFunctionExpression, - isObjectMethod, - isObjectProperty, - isProperty, - isStringLiteral, - objectExpression, - objectProperty, - removeComments, - toComputedKey, - toKeyAlias, -} from "@babel/types"; -import type { File } from "@babel/core"; -import type * as t from "@babel/types"; -import type { Scope } from "@babel/traverse"; - -function toKind(node: t.Property | t.Method) { - if (isClassMethod(node) || isObjectMethod(node)) { - if (node.kind === "get" || node.kind === "set") { - return node.kind; - } - } - - return "value"; -} - -const has = Function.prototype.call.bind(Object.prototype.hasOwnProperty); - -type DefineMap = { - decorators: t.ArrayExpression; - _computed: boolean; - _inherits: t.Node[]; - _key: t.Expression | t.PrivateName; - value?: t.Expression; - initializer?: t.Expression; - get?: t.Expression; - set?: t.Expression; - kind: "get" | "set" | "value" | "initializer"; -}; - -export type MutatorMap = Record; - -export function push( - mutatorMap: MutatorMap, - node: t.Property | t.Method, - kind: DefineMap["kind"], - file: File, - scope?: Scope, -) { - const alias = toKeyAlias(node); - - // - - let map = {} as DefineMap; - if (has(mutatorMap, alias)) map = mutatorMap[alias]; - mutatorMap[alias] = map; - - // - - map._inherits = map._inherits || []; - map._inherits.push(node); - - map._key = node.key; - - if ( - // @ts-expect-error computed is not in private property - node.computed - ) { - map._computed = true; - } - - if (node.decorators) { - const decorators = (map.decorators = map.decorators || arrayExpression([])); - decorators.elements.push( - ...node.decorators.map(dec => dec.expression).reverse(), - ); - } - - if (map.value || map.initializer) { - throw file.buildCodeFrameError(node, "Key conflict with sibling node"); - } - - let key, value; - - // save the key so we can possibly do function name inferences - if (isObjectProperty(node) || isObjectMethod(node) || isClassMethod(node)) { - key = toComputedKey(node, node.key); - } - - if (isProperty(node)) { - value = node.value as t.Expression; - } else if (isObjectMethod(node) || isClassMethod(node)) { - value = functionExpression( - null, - // @ts-expect-error todo(flow->ts) TSParameterProperty is not assignable to parameter of type 'Identifier | RestElement | Pattern'. - node.params, - node.body, - node.generator, - node.async, - ); - value.returnType = node.returnType; - } - - const inheritedKind = toKind(node); - if (!kind || inheritedKind !== "value") { - kind = inheritedKind; - } - - // infer function name - if ( - scope && - isStringLiteral(key) && - (kind === "value" || kind === "initializer") && - isFunctionExpression(value) - ) { - value = nameFunction({ id: key, node: value, scope }); - } - - if (value) { - inheritsComments(value, node); - map[kind] = value; - } - - return map; -} - -export function hasComputed(mutatorMap: any): boolean { - for (const key of Object.keys(mutatorMap)) { - if (mutatorMap[key]._computed) { - return true; - } - } - return false; -} - -export function toComputedObjectFromClass(obj: any) { - const objExpr = arrayExpression([]); - - for (let i = 0; i < obj.properties.length; i++) { - const prop = obj.properties[i]; - const val = prop.value; - val.properties.unshift( - objectProperty( - identifier("key"), - // @ts-expect-error toComputedObjectFromClass is not used, maybe we can remove it - toComputedKey(prop), - ), - ); - objExpr.elements.push(val); - } - - return objExpr; -} - -export function toClassObject(mutatorMap: any) { - const objExpr = objectExpression([]); - - Object.keys(mutatorMap).forEach(function (mutatorMapKey) { - const map = mutatorMap[mutatorMapKey]; - const mapNode = objectExpression([]); - - const propNode = objectProperty(map._key, mapNode, map._computed); - - Object.keys(map).forEach(function (key) { - const node = map[key]; - if (key[0] === "_") return; - - const prop = objectProperty(identifier(key), node); - inheritsComments(prop, node); - removeComments(node); - - mapNode.properties.push(prop); - }); - - objExpr.properties.push(propNode); - }); - - return objExpr; -} - -export function toDefineObject(mutatorMap: any) { - Object.keys(mutatorMap).forEach(function (key) { - const map = mutatorMap[key]; - if (map.value) map.writable = booleanLiteral(true); - map.configurable = booleanLiteral(true); - map.enumerable = booleanLiteral(true); - }); - - return toClassObject(mutatorMap); -} diff --git a/packages/babel-plugin-transform-property-mutators/package.json b/packages/babel-plugin-transform-property-mutators/package.json index d618289d3fe3..345e1769d925 100644 --- a/packages/babel-plugin-transform-property-mutators/package.json +++ b/packages/babel-plugin-transform-property-mutators/package.json @@ -17,7 +17,6 @@ "babel-plugin" ], "dependencies": { - "@babel/helper-define-map": "workspace:^", "@babel/helper-plugin-utils": "workspace:^" }, "peerDependencies": { diff --git a/packages/babel-plugin-transform-property-mutators/src/define-map.ts b/packages/babel-plugin-transform-property-mutators/src/define-map.ts new file mode 100644 index 000000000000..cb495e4a6dad --- /dev/null +++ b/packages/babel-plugin-transform-property-mutators/src/define-map.ts @@ -0,0 +1,66 @@ +import { types as t } from "@babel/core"; + +type DefineMap = { + _inherits: t.Node[]; + _key: t.Expression; + get?: t.Expression; + set?: t.Expression; + kind: "get" | "set"; +}; + +export type MutatorMap = Record; + +export function pushAccessor( + mutatorMap: MutatorMap, + node: t.ObjectMethod & { kind: "get" | "set"; computed: false }, +) { + const alias = t.toKeyAlias(node); + const map = (mutatorMap[alias] ??= { + _inherits: [], + _key: node.key, + } as DefineMap); + + map._inherits.push(node); + + const value = t.functionExpression( + null, + node.params, + node.body, + node.generator, + node.async, + ); + value.returnType = node.returnType; + t.inheritsComments(value, node); + map[node.kind] = value; + + return map; +} + +export function toDefineObject(mutatorMap: any) { + const objExpr = t.objectExpression([]); + + Object.keys(mutatorMap).forEach(function (mutatorMapKey) { + const map = mutatorMap[mutatorMapKey]; + map.configurable = t.booleanLiteral(true); + map.enumerable = t.booleanLiteral(true); + + const mapNode = t.objectExpression([]); + + const propNode = t.objectProperty(map._key, mapNode, map._computed); + + Object.keys(map).forEach(function (key) { + const node = map[key]; + if (key[0] === "_") return; + + const prop = t.objectProperty(t.identifier(key), node); + t.inheritsComments(prop, node); + t.removeComments(node); + + mapNode.properties.push(prop); + }); + + objExpr.properties.push(propNode); + }); + + return objExpr; +} diff --git a/packages/babel-plugin-transform-property-mutators/src/index.ts b/packages/babel-plugin-transform-property-mutators/src/index.ts index abfff41b10c1..648c46f62ccd 100644 --- a/packages/babel-plugin-transform-property-mutators/src/index.ts +++ b/packages/babel-plugin-transform-property-mutators/src/index.ts @@ -1,5 +1,5 @@ import { declare } from "@babel/helper-plugin-utils"; -import * as defineMap from "@babel/helper-define-map"; +import { type MutatorMap, pushAccessor, toDefineObject } from "./define-map"; import { types as t } from "@babel/core"; export default declare(api => { @@ -9,18 +9,20 @@ export default declare(api => { name: "transform-property-mutators", visitor: { - ObjectExpression(path, { file }) { + ObjectExpression(path) { const { node } = path; - let mutatorMap: defineMap.MutatorMap | void; + let mutatorMap: MutatorMap | undefined; 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 ( + t.isObjectMethod(prop) && + !prop.computed && + (prop.kind === "get" || prop.kind === "set") + ) { + pushAccessor( + (mutatorMap ??= {}), + prop as t.ObjectMethod & { kind: "get" | "set"; computed: false }, + ); + return false; } return true; }); @@ -37,7 +39,7 @@ export default declare(api => { t.identifier("Object"), t.identifier("defineProperties"), ), - [node, defineMap.toDefineObject(mutatorMap)], + [node, toDefineObject(mutatorMap)], ), ); }, diff --git a/tsconfig.json b/tsconfig.json index 7f2ec10d1d85..f0b50ceeaf81 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,7 +14,6 @@ "./packages/babel-helper-compilation-targets/src/**/*.ts", "./packages/babel-helper-create-class-features-plugin/src/**/*.ts", "./packages/babel-helper-create-regexp-features-plugin/src/**/*.ts", - "./packages/babel-helper-define-map/src/**/*.ts", "./packages/babel-helper-environment-visitor/src/**/*.ts", "./packages/babel-helper-explode-assignable-expression/src/**/*.ts", "./packages/babel-helper-fixtures/src/**/*.ts", @@ -209,9 +208,6 @@ "@babel/helper-create-regexp-features-plugin": [ "./packages/babel-helper-create-regexp-features-plugin/src" ], - "@babel/helper-define-map": [ - "./packages/babel-helper-define-map/src" - ], "@babel/helper-environment-visitor": [ "./packages/babel-helper-environment-visitor/src" ], diff --git a/yarn.lock b/yarn.lock index c8e9cfbe3859..f98f2734cd5e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -624,15 +624,6 @@ __metadata: languageName: unknown linkType: soft -"@babel/helper-define-map@workspace:^, @babel/helper-define-map@workspace:packages/babel-helper-define-map": - version: 0.0.0-use.local - resolution: "@babel/helper-define-map@workspace:packages/babel-helper-define-map" - dependencies: - "@babel/helper-function-name": "workspace:^" - "@babel/types": "workspace:^" - languageName: unknown - linkType: soft - "@babel/helper-define-polyfill-provider@npm:^0.3.3": version: 0.3.3 resolution: "@babel/helper-define-polyfill-provider@npm:0.3.3" @@ -2903,7 +2894,6 @@ __metadata: resolution: "@babel/plugin-transform-property-mutators@workspace:packages/babel-plugin-transform-property-mutators" dependencies: "@babel/core": "workspace:^" - "@babel/helper-define-map": "workspace:^" "@babel/helper-plugin-test-runner": "workspace:^" "@babel/helper-plugin-utils": "workspace:^" peerDependencies: