From d9593a20e08fc9ae8dac79dac86b415e73b464ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Wed, 14 Dec 2022 17:24:38 +0100 Subject: [PATCH 1/4] Move functions to inline file --- .../package.json | 2 +- .../src/define-map.ts | 155 ++++++++++++++++++ .../src/index.ts | 8 +- yarn.lock | 4 +- 4 files changed, 162 insertions(+), 7 deletions(-) create mode 100644 packages/babel-plugin-transform-property-mutators/src/define-map.ts diff --git a/packages/babel-plugin-transform-property-mutators/package.json b/packages/babel-plugin-transform-property-mutators/package.json index d618289d3fe3..8e7885a18080 100644 --- a/packages/babel-plugin-transform-property-mutators/package.json +++ b/packages/babel-plugin-transform-property-mutators/package.json @@ -17,7 +17,7 @@ "babel-plugin" ], "dependencies": { - "@babel/helper-define-map": "workspace:^", + "@babel/helper-function-name": "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..d696cacb973f --- /dev/null +++ b/packages/babel-plugin-transform-property-mutators/src/define-map.ts @@ -0,0 +1,155 @@ +import { types as t, type File } from "@babel/core"; +import type { Scope } from "@babel/traverse"; +import nameFunction from "@babel/helper-function-name"; + +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; + +const has = Function.prototype.call.bind(Object.prototype.hasOwnProperty); + +export function pushProperty( + mutatorMap: MutatorMap, + node: t.Property | t.Method, + kind: DefineMap["kind"], + file: File, + scope?: Scope, +) { + const alias = t.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 || t.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 ( + t.isObjectProperty(node) || + t.isObjectMethod(node) || + t.isClassMethod(node) + ) { + key = t.toComputedKey(node, node.key); + } + + if (t.isProperty(node)) { + value = node.value as t.Expression; + } else if (t.isObjectMethod(node) || t.isClassMethod(node)) { + value = t.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 && + t.isStringLiteral(key) && + (kind === "value" || kind === "initializer") && + t.isFunctionExpression(value) + ) { + value = nameFunction({ id: key, node: value, scope }); + } + + if (value) { + t.inheritsComments(value, node); + map[kind] = value; + } + + return map; +} + +function toKind(node: t.Property | t.Method) { + if (t.isClassMethod(node) || t.isObjectMethod(node)) { + if (node.kind === "get" || node.kind === "set") { + return node.kind; + } + } + + return "value"; +} + +export function toDefineObject(mutatorMap: any) { + Object.keys(mutatorMap).forEach(function (key) { + const map = mutatorMap[key]; + if (map.value) map.writable = t.booleanLiteral(true); + map.configurable = t.booleanLiteral(true); + map.enumerable = t.booleanLiteral(true); + }); + + return toClassObject(mutatorMap); +} + +function toClassObject(mutatorMap: any) { + const objExpr = t.objectExpression([]); + + Object.keys(mutatorMap).forEach(function (mutatorMapKey) { + const map = mutatorMap[mutatorMapKey]; + 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..08f091d08a3b 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, pushProperty, toDefineObject } from "./define-map"; import { types as t } from "@babel/core"; export default declare(api => { @@ -11,13 +11,13 @@ export default declare(api => { visitor: { ObjectExpression(path, { file }) { const { node } = path; - let mutatorMap: defineMap.MutatorMap | void; + let mutatorMap: MutatorMap | void; 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); + pushProperty(mutatorMap, prop, null, file); return false; } } @@ -37,7 +37,7 @@ export default declare(api => { t.identifier("Object"), t.identifier("defineProperties"), ), - [node, defineMap.toDefineObject(mutatorMap)], + [node, toDefineObject(mutatorMap)], ), ); }, diff --git a/yarn.lock b/yarn.lock index c8e9cfbe3859..a7b42041cb5d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -624,7 +624,7 @@ __metadata: languageName: unknown linkType: soft -"@babel/helper-define-map@workspace:^, @babel/helper-define-map@workspace:packages/babel-helper-define-map": +"@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: @@ -2903,7 +2903,7 @@ __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-function-name": "workspace:^" "@babel/helper-plugin-test-runner": "workspace:^" "@babel/helper-plugin-utils": "workspace:^" peerDependencies: From ea67d4eb630af8e7685c06378b92c1e7b9465637 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Wed, 14 Dec 2022 17:42:29 +0100 Subject: [PATCH 2/4] Simplify code --- .../package.json | 1 - .../src/define-map.ts | 133 +++--------------- .../src/index.ts | 24 ++-- yarn.lock | 1 - 4 files changed, 35 insertions(+), 124 deletions(-) diff --git a/packages/babel-plugin-transform-property-mutators/package.json b/packages/babel-plugin-transform-property-mutators/package.json index 8e7885a18080..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-function-name": "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 index d696cacb973f..cb495e4a6dad 100644 --- a/packages/babel-plugin-transform-property-mutators/src/define-map.ts +++ b/packages/babel-plugin-transform-property-mutators/src/define-map.ts @@ -1,138 +1,49 @@ -import { types as t, type File } from "@babel/core"; -import type { Scope } from "@babel/traverse"; -import nameFunction from "@babel/helper-function-name"; +import { types as t } from "@babel/core"; type DefineMap = { - decorators: t.ArrayExpression; - _computed: boolean; _inherits: t.Node[]; - _key: t.Expression | t.PrivateName; - value?: t.Expression; - initializer?: t.Expression; + _key: t.Expression; get?: t.Expression; set?: t.Expression; - kind: "get" | "set" | "value" | "initializer"; + kind: "get" | "set"; }; export type MutatorMap = Record; -const has = Function.prototype.call.bind(Object.prototype.hasOwnProperty); - -export function pushProperty( +export function pushAccessor( mutatorMap: MutatorMap, - node: t.Property | t.Method, - kind: DefineMap["kind"], - file: File, - scope?: Scope, + node: t.ObjectMethod & { kind: "get" | "set"; computed: false }, ) { const alias = t.toKeyAlias(node); + const map = (mutatorMap[alias] ??= { + _inherits: [], + _key: node.key, + } as DefineMap); - // - - 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 || t.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 ( - t.isObjectProperty(node) || - t.isObjectMethod(node) || - t.isClassMethod(node) - ) { - key = t.toComputedKey(node, node.key); - } - - if (t.isProperty(node)) { - value = node.value as t.Expression; - } else if (t.isObjectMethod(node) || t.isClassMethod(node)) { - value = t.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 && - t.isStringLiteral(key) && - (kind === "value" || kind === "initializer") && - t.isFunctionExpression(value) - ) { - value = nameFunction({ id: key, node: value, scope }); - } - - if (value) { - t.inheritsComments(value, node); - map[kind] = value; - } + 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; } -function toKind(node: t.Property | t.Method) { - if (t.isClassMethod(node) || t.isObjectMethod(node)) { - if (node.kind === "get" || node.kind === "set") { - return node.kind; - } - } - - return "value"; -} - export function toDefineObject(mutatorMap: any) { - Object.keys(mutatorMap).forEach(function (key) { - const map = mutatorMap[key]; - if (map.value) map.writable = t.booleanLiteral(true); - map.configurable = t.booleanLiteral(true); - map.enumerable = t.booleanLiteral(true); - }); - - return toClassObject(mutatorMap); -} - -function toClassObject(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); diff --git a/packages/babel-plugin-transform-property-mutators/src/index.ts b/packages/babel-plugin-transform-property-mutators/src/index.ts index 08f091d08a3b..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 { type MutatorMap, pushProperty, toDefineObject } from "./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: 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) { - pushProperty(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; }); diff --git a/yarn.lock b/yarn.lock index a7b42041cb5d..201186b1a212 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2903,7 +2903,6 @@ __metadata: resolution: "@babel/plugin-transform-property-mutators@workspace:packages/babel-plugin-transform-property-mutators" dependencies: "@babel/core": "workspace:^" - "@babel/helper-function-name": "workspace:^" "@babel/helper-plugin-test-runner": "workspace:^" "@babel/helper-plugin-utils": "workspace:^" peerDependencies: From a86a60c2eb7d6e0491b0a666eb662f1496b613a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Wed, 14 Dec 2022 17:43:07 +0100 Subject: [PATCH 3/4] Delete `@babel/helper-define-map` --- packages/babel-helper-define-map/.npmignore | 3 - packages/babel-helper-define-map/README.md | 19 -- packages/babel-helper-define-map/package.json | 43 ---- packages/babel-helper-define-map/src/index.ts | 197 ------------------ yarn.lock | 9 - 5 files changed, 271 deletions(-) delete mode 100644 packages/babel-helper-define-map/.npmignore delete mode 100644 packages/babel-helper-define-map/README.md delete mode 100644 packages/babel-helper-define-map/package.json delete mode 100644 packages/babel-helper-define-map/src/index.ts 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/yarn.lock b/yarn.lock index 201186b1a212..f98f2734cd5e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -624,15 +624,6 @@ __metadata: languageName: unknown linkType: soft -"@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" From 75ce088c93c5db5a10e51e7895fd49428117a3a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Wed, 14 Dec 2022 17:57:36 +0100 Subject: [PATCH 4/4] `make code-quality` --- tsconfig.json | 4 ---- 1 file changed, 4 deletions(-) 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" ],