diff --git a/packages/babel-core/src/transformation/file/file.js b/packages/babel-core/src/transformation/file/file.js index 71e61a808de8..d3104c07acb9 100644 --- a/packages/babel-core/src/transformation/file/file.js +++ b/packages/babel-core/src/transformation/file/file.js @@ -1,7 +1,7 @@ // @flow import * as helpers from "@babel/helpers"; -import { NodePath, Hub, Scope } from "@babel/traverse"; +import { NodePath, Scope, type HubInterface } from "@babel/traverse"; import { codeFrameColumns } from "@babel/code-frame"; import traverse from "@babel/traverse"; import * as t from "@babel/types"; @@ -27,10 +27,18 @@ export default class File { ast: Object = {}; scope: Scope; metadata: {} = {}; - hub: Hub = new Hub(this); code: string = ""; inputMap: Object | null = null; + hub: HubInterface = { + // keep it for the usage in babel-core, ex: path.hub.file.opts.filename + file: this, + getCode: () => this.code, + getScope: () => this.scope, + addHelper: this.addHelper.bind(this), + buildError: this.buildCodeFrameError.bind(this), + }; + constructor(options: {}, { code, ast, inputMap }: NormalizedFile) { this.opts = options; this.code = code; diff --git a/packages/babel-helper-module-imports/src/import-builder.js b/packages/babel-helper-module-imports/src/import-builder.js index 95b2c9a3833a..7513c8549324 100644 --- a/packages/babel-helper-module-imports/src/import-builder.js +++ b/packages/babel-helper-module-imports/src/import-builder.js @@ -10,11 +10,11 @@ export default class ImportBuilder { _resultName = null; _scope = null; - _file = null; + _hub = null; - constructor(importedSource, scope, file) { + constructor(importedSource, scope, hub) { this._scope = scope; - this._file = file; + this._hub = hub; this._importedSource = importedSource; } @@ -91,10 +91,10 @@ export default class ImportBuilder { } defaultInterop() { - return this._interop(this._file.addHelper("interopRequireDefault")); + return this._interop(this._hub.addHelper("interopRequireDefault")); } wildcardInterop() { - return this._interop(this._file.addHelper("interopRequireWildcard")); + return this._interop(this._hub.addHelper("interopRequireWildcard")); } _interop(callee) { diff --git a/packages/babel-helper-module-imports/src/import-injector.js b/packages/babel-helper-module-imports/src/import-injector.js index 5574ba2a3236..0e38f9188ab9 100644 --- a/packages/babel-helper-module-imports/src/import-injector.js +++ b/packages/babel-helper-module-imports/src/import-injector.js @@ -108,7 +108,7 @@ export default class ImportInjector { /** * The file used to inject helpers and resolve paths. */ - _file; + _hub; /** * The default options to use with this instance when imports are added. @@ -127,7 +127,7 @@ export default class ImportInjector { this._programPath = programPath; this._programScope = programPath.scope; - this._file = programPath.hub.file; + this._hub = programPath.hub; this._defaultOpts = this._applyDefaults(importedSource, opts, true); } @@ -218,7 +218,7 @@ export default class ImportInjector { const builder = new ImportBuilder( importedSource, this._programScope, - this._file, + this._hub, ); if (importedType === "es6") { diff --git a/packages/babel-helper-module-transforms/src/index.js b/packages/babel-helper-module-transforms/src/index.js index 859b63989fe3..5735ad951e8d 100644 --- a/packages/babel-helper-module-transforms/src/index.js +++ b/packages/babel-helper-module-transforms/src/index.js @@ -112,7 +112,7 @@ export function wrapInterop( throw new Error(`Unknown interop: ${type}`); } - return t.callExpression(programPath.hub.file.addHelper(helper), [expr]); + return t.callExpression(programPath.hub.addHelper(helper), [expr]); } /** diff --git a/packages/babel-plugin-transform-react-jsx-source/src/index.js b/packages/babel-plugin-transform-react-jsx-source/src/index.js index 71add8d1b52c..70820c61e0eb 100644 --- a/packages/babel-plugin-transform-react-jsx-source/src/index.js +++ b/packages/babel-plugin-transform-react-jsx-source/src/index.js @@ -59,10 +59,13 @@ export default declare(api => { const fileNameIdentifier = path.scope.generateUidIdentifier( FILE_NAME_VAR, ); - path.hub.file.scope.push({ - id: fileNameIdentifier, - init: t.stringLiteral(fileName), - }); + const scope = path.hub.getScope(); + if (scope) { + scope.push({ + id: fileNameIdentifier, + init: t.stringLiteral(fileName), + }); + } state.fileNameIdentifier = fileNameIdentifier; } diff --git a/packages/babel-plugin-transform-spread/src/index.js b/packages/babel-plugin-transform-spread/src/index.js index 0a65a2501648..50592fafbf12 100644 --- a/packages/babel-plugin-transform-spread/src/index.js +++ b/packages/babel-plugin-transform-spread/src/index.js @@ -143,7 +143,7 @@ export default declare((api, options) => { } path.replaceWith( - t.callExpression(path.hub.file.addHelper("construct"), [ + t.callExpression(path.hub.addHelper("construct"), [ node.callee, args, ]), diff --git a/packages/babel-traverse/src/hub.js b/packages/babel-traverse/src/hub.js index 69f9406fc9cb..3cd5c645f0e8 100644 --- a/packages/babel-traverse/src/hub.js +++ b/packages/babel-traverse/src/hub.js @@ -1,5 +1,22 @@ -export default class Hub { - constructor(file) { - this.file = file; +import type Scope from "./scope"; + +export interface HubInterface { + getCode(): ?string; + getScope(): ?Scope; + addHelper(name: string): Object; + buildError(node: Object, msg: string, Error: Class): Error; +} + +export default class Hub implements HubInterface { + getCode() {} + + getScope() {} + + addHelper() { + throw new Error("Helpers are not supported by the default hub."); + } + + buildError(node, msg, Error = TypeError): Error { + return new Error(msg); } } diff --git a/packages/babel-traverse/src/index.js b/packages/babel-traverse/src/index.js index db1898f5d57b..5b1ebfdc6ed2 100644 --- a/packages/babel-traverse/src/index.js +++ b/packages/babel-traverse/src/index.js @@ -7,6 +7,7 @@ import * as cache from "./cache"; export { default as NodePath } from "./path"; export { default as Scope } from "./scope"; export { default as Hub } from "./hub"; +export type { HubInterface } from "./hub"; export { visitors }; diff --git a/packages/babel-traverse/src/path/conversion.js b/packages/babel-traverse/src/path/conversion.js index b192b4d9d5ca..cf45cc320b2b 100644 --- a/packages/babel-traverse/src/path/conversion.js +++ b/packages/babel-traverse/src/path/conversion.js @@ -133,7 +133,7 @@ export function arrowFunctionToExpression({ this.get("body").unshiftContainer( "body", t.expressionStatement( - t.callExpression(this.hub.file.addHelper("newArrowCheck"), [ + t.callExpression(this.hub.addHelper("newArrowCheck"), [ t.thisExpression(), checkBinding ? t.identifier(checkBinding.name) diff --git a/packages/babel-traverse/src/path/index.js b/packages/babel-traverse/src/path/index.js index dbdc0a08af8d..506a25e95ded 100644 --- a/packages/babel-traverse/src/path/index.js +++ b/packages/babel-traverse/src/path/index.js @@ -1,4 +1,4 @@ -import type Hub from "../hub"; +import type { HubInterface } from "../hub"; import type TraversalContext from "../context"; import * as virtualTypes from "./lib/virtual-types"; import buildDebug from "debug"; @@ -24,7 +24,7 @@ import * as NodePath_comments from "./comments"; const debug = buildDebug("babel"); export default class NodePath { - constructor(hub: Hub, parent: Object) { + constructor(hub: HubInterface, parent: Object) { this.parent = parent; this.hub = hub; this.contexts = []; @@ -49,7 +49,7 @@ export default class NodePath { } parent: Object; - hub: Hub; + hub: HubInterface; contexts: Array; data: Object; shouldSkip: boolean; @@ -121,7 +121,7 @@ export default class NodePath { } buildCodeFrameError(msg: string, Error: typeof Error = SyntaxError): Error { - return this.hub.file.buildCodeFrameError(this.node, msg, Error); + return this.hub.buildError(this.node, msg, Error); } traverse(visitor: Object, state?: any) { diff --git a/packages/babel-traverse/src/path/introspection.js b/packages/babel-traverse/src/path/introspection.js index 078fee374039..0752bc88574d 100644 --- a/packages/babel-traverse/src/path/introspection.js +++ b/packages/babel-traverse/src/path/introspection.js @@ -196,10 +196,10 @@ export function referencesImport(moduleSource, importName) { export function getSource() { const node = this.node; if (node.end) { - return this.hub.file.code.slice(node.start, node.end); - } else { - return ""; + const code = this.hub.getCode(); + if (code) return code.slice(node.start, node.end); } + return ""; } export function willIMaybeExecuteBefore(target) { diff --git a/packages/babel-traverse/src/scope/index.js b/packages/babel-traverse/src/scope/index.js index 7c41d5738b63..b91eeeb25c4b 100644 --- a/packages/babel-traverse/src/scope/index.js +++ b/packages/babel-traverse/src/scope/index.js @@ -362,7 +362,7 @@ export default class Scope { (local.kind === "param" && (kind === "let" || kind === "const")); if (duplicate) { - throw this.hub.file.buildCodeFrameError( + throw this.hub.buildError( id, `Duplicate declaration "${name}"`, TypeError, @@ -404,9 +404,7 @@ export default class Scope { console.log(sep); } - toArray(node: Object, i?: number | boolean) { - const file = this.hub.file; - + toArray(node: Object, i?: number) { if (t.isIdentifier(node)) { const binding = this.getBinding(node.name); if (binding && binding.constant && binding.path.isGenericType("Array")) { @@ -444,12 +442,12 @@ export default class Scope { // Used in array-rest to create an array from a subset of an iterable. helperName = "slicedToArray"; - // TODO if (this.hub.file.isLoose("es6.forOf")) helperName += "-loose"; + // TODO if (this.hub.isLoose("es6.forOf")) helperName += "-loose"; } else { // Used in array-rest to create an array helperName = "toArray"; } - return t.callExpression(file.addHelper(helperName), args); + return t.callExpression(this.hub.addHelper(helperName), args); } hasLabel(name: string) { diff --git a/packages/babel-traverse/test/arrow-transform.js b/packages/babel-traverse/test/arrow-transform.js index d0471d9dfe1e..d74ca8f71196 100644 --- a/packages/babel-traverse/test/arrow-transform.js +++ b/packages/babel-traverse/test/arrow-transform.js @@ -13,13 +13,11 @@ function assertConversion( const rootPath = NodePath.get({ hub: { - file: { - addHelper(helperName) { - return t.memberExpression( - t.identifier("babelHelpers"), - t.identifier(helperName), - ); - }, + addHelper(helperName) { + return t.memberExpression( + t.identifier("babelHelpers"), + t.identifier(helperName), + ); }, }, parentPath: null, diff --git a/packages/babel-traverse/test/hub.js b/packages/babel-traverse/test/hub.js new file mode 100644 index 000000000000..3c8cbe36c4b5 --- /dev/null +++ b/packages/babel-traverse/test/hub.js @@ -0,0 +1,10 @@ +import assert from "assert"; +import { Hub } from "../lib"; + +describe("hub", function() { + it("default buildError should return TypeError", function() { + const hub = new Hub(); + const msg = "test_msg"; + assert.deepEqual(hub.buildError(null, msg), new TypeError(msg)); + }); +});