From 6f3093b557bddf435413d713147b25827aaba440 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Wed, 23 May 2018 19:25:10 -0700 Subject: [PATCH 1/2] Track the sync and async implementations in the same files. --- packages/babel-core/package.json | 3 +- packages/babel-core/src/config/index.js | 7 --- packages/babel-core/src/index.js | 36 ++++++----- packages/babel-core/src/parse.js | 62 +++++++++++++++++-- packages/babel-core/src/transform-ast-sync.js | 18 ------ packages/babel-core/src/transform-ast.js | 29 +++++++-- .../babel-core/src/transform-file-sync.js | 25 -------- packages/babel-core/src/transform-file.js | 35 ++++++++++- packages/babel-core/src/transform-sync.js | 13 ---- packages/babel-core/src/transform.js | 17 +++-- 10 files changed, 144 insertions(+), 101 deletions(-) delete mode 100644 packages/babel-core/src/transform-ast-sync.js delete mode 100644 packages/babel-core/src/transform-file-sync.js delete mode 100644 packages/babel-core/src/transform-sync.js diff --git a/packages/babel-core/package.json b/packages/babel-core/package.json index 4be7bb42a635..10019a57454a 100644 --- a/packages/babel-core/package.json +++ b/packages/babel-core/package.json @@ -27,8 +27,7 @@ }, "browser": { "./lib/config/files/index.js": "./lib/config/files/index-browser.js", - "./lib/transform-file.js": "./lib/transform-file-browser.js", - "./lib/transform-file-sync.js": "./lib/transform-file-sync-browser.js" + "./lib/transform-file.js": "./lib/transform-file-browser.js" }, "dependencies": { "@babel/code-frame": "7.0.0-beta.47", diff --git a/packages/babel-core/src/config/index.js b/packages/babel-core/src/config/index.js index 734855c7bb24..51016d34c757 100644 --- a/packages/babel-core/src/config/index.js +++ b/packages/babel-core/src/config/index.js @@ -17,10 +17,3 @@ export function loadOptions(opts: {}): Object | null { return config ? config.options : null; } - -// For easier backward-compatibility, provide an API like the one we exposed in Babel 6. -export class OptionManager { - init(opts: {}) { - return loadOptions(opts); - } -} diff --git a/packages/babel-core/src/index.js b/packages/babel-core/src/index.js index d6a3e80cac66..975a82226ec9 100644 --- a/packages/babel-core/src/index.js +++ b/packages/babel-core/src/index.js @@ -13,26 +13,14 @@ export * as types from "@babel/types"; export { default as traverse } from "@babel/traverse"; export { default as template } from "@babel/template"; -export { loadPartialConfig, loadOptions, OptionManager } from "./config"; - export { createConfigItem } from "./config/item"; -export function Plugin(alias: string) { - throw new Error( - `The (${alias}) Babel 5 plugin is being run with an unsupported Babel version.`, - ); -} - -export { default as transform } from "./transform"; -export { default as transformSync } from "./transform-sync"; - -export { default as transformFile } from "./transform-file"; -export { default as transformFileSync } from "./transform-file-sync"; - -export { default as transformFromAst } from "./transform-ast"; -export { default as transformFromAstSync } from "./transform-ast-sync"; +export { loadPartialConfig, loadOptions } from "./config"; -export { default as parse } from "./parse"; +export { transform, transformSync } from "./transform"; +export { transformFile, transformFileSync } from "./transform-file"; +export { transformFromAst, transformFromAstSync } from "./transform-ast"; +export { parse, parseSync } from "./parse"; /** * Recommended set of compilable extensions. Not used in @babel/core directly, but meant as @@ -45,3 +33,17 @@ export const DEFAULT_EXTENSIONS = Object.freeze([ ".es", ".mjs", ]); + +// For easier backward-compatibility, provide an API like the one we exposed in Babel 6. +import { loadOptions } from "./config"; +export class OptionManager { + init(opts: {}) { + return loadOptions(opts); + } +} + +export function Plugin(alias: string) { + throw new Error( + `The (${alias}) Babel 5 plugin is being run with an unsupported Babel version.`, + ); +} diff --git a/packages/babel-core/src/parse.js b/packages/babel-core/src/parse.js index 94e7284520eb..679a4f7c7dd3 100644 --- a/packages/babel-core/src/parse.js +++ b/packages/babel-core/src/parse.js @@ -6,17 +6,67 @@ import normalizeOptions from "./transformation/normalize-opts"; type AstRoot = BabelNodeFile | BabelNodeProgram; -export default function parse( - code: string, - opts: InputOptions, -): AstRoot | null { +export type ParseResult = AstRoot; + +export type FileParseCallback = { + (Error, null): any, + (null, ParseResult | null): any, +}; + +type Parse = { + (code: string, callback: FileParseCallback): void, + (code: string, opts: ?InputOptions, callback: FileParseCallback): void, + + // Here for backward-compatibility. Ideally use ".parseSync" if you want + // a synchronous API. + (code: string, opts: ?InputOptions): ParseResult | null, +}; + +export const parse: Parse = (function parse(code, opts, callback) { + if (typeof opts === "function") { + opts = undefined; + callback = opts; + } + + // For backward-compat with Babel 7's early betas, we allow sync parsing when + // no callback is given. Will be dropped in some future Babel major version. + if (callback === undefined) return parseSync(code, opts); + const config = loadConfig(opts); if (config === null) { return null; } - const file = normalizeFile(config.passes, normalizeOptions(config), code); + // Reassign to keep Flowtype happy. + const cb = callback; + + // Just delaying the transform one tick for now to simulate async behavior + // but more async logic may land here eventually. + process.nextTick(() => { + let ast = null; + try { + const cfg = loadConfig(opts); + if (cfg === null) return cb(null, null); + + ast = normalizeFile(cfg.passes, normalizeOptions(cfg), code).ast; + } catch (err) { + return cb(err); + } + + cb(null, ast); + }); +}: Function); + +export function parseSync( + code: string, + opts?: InputOptions, +): ParseResult | null { + const config = loadConfig(opts); + + if (config === null) { + return null; + } - return file.ast; + return normalizeFile(config.passes, normalizeOptions(config), code).ast; } diff --git a/packages/babel-core/src/transform-ast-sync.js b/packages/babel-core/src/transform-ast-sync.js deleted file mode 100644 index 358de6848732..000000000000 --- a/packages/babel-core/src/transform-ast-sync.js +++ /dev/null @@ -1,18 +0,0 @@ -// @flow -import loadConfig, { type InputOptions } from "./config"; -import { runSync, type FileResult } from "./transformation"; - -type AstRoot = BabelNodeFile | BabelNodeProgram; - -export default function transformFromAstSync( - ast: AstRoot, - code: string, - opts: ?InputOptions, -): FileResult | null { - const config = loadConfig(opts); - if (config === null) return null; - - if (!ast) throw new Error("No AST given"); - - return runSync(config, code, ast); -} diff --git a/packages/babel-core/src/transform-ast.js b/packages/babel-core/src/transform-ast.js index dd3f6fb882bc..9097a4e72ec8 100644 --- a/packages/babel-core/src/transform-ast.js +++ b/packages/babel-core/src/transform-ast.js @@ -2,16 +2,15 @@ import loadConfig, { type InputOptions } from "./config"; import { + runSync, runAsync, type FileResult, type FileResultCallback, } from "./transformation"; -import transformAstSync from "./transform-ast-sync"; - type AstRoot = BabelNodeFile | BabelNodeProgram; -type TransformAst = { +type TransformFromAst = { (ast: AstRoot, code: string, callback: FileResultCallback): void, ( ast: AstRoot, @@ -25,7 +24,12 @@ type TransformAst = { (ast: AstRoot, code: string, opts: ?InputOptions): FileResult | null, }; -export default ((function transformFromAst(ast, code, opts, callback) { +export const transformFromAst: TransformFromAst = (function transformFromAst( + ast, + code, + opts, + callback, +) { if (typeof opts === "function") { opts = undefined; callback = opts; @@ -33,7 +37,7 @@ export default ((function transformFromAst(ast, code, opts, callback) { // For backward-compat with Babel 6, we allow sync transformation when // no callback is given. Will be dropped in some future Babel major version. - if (callback === undefined) return transformAstSync(ast, code, opts); + if (callback === undefined) return transformFromAstSync(ast, code, opts); // Reassign to keep Flowtype happy. const cb = callback; @@ -53,4 +57,17 @@ export default ((function transformFromAst(ast, code, opts, callback) { runAsync(cfg, code, ast, cb); }); -}: Function): TransformAst); +}: Function); + +export function transformFromAstSync( + ast: AstRoot, + code: string, + opts: ?InputOptions, +): FileResult | null { + const config = loadConfig(opts); + if (config === null) return null; + + if (!ast) throw new Error("No AST given"); + + return runSync(config, code, ast); +} diff --git a/packages/babel-core/src/transform-file-sync.js b/packages/babel-core/src/transform-file-sync.js deleted file mode 100644 index 6ffc747c4a19..000000000000 --- a/packages/babel-core/src/transform-file-sync.js +++ /dev/null @@ -1,25 +0,0 @@ -// @flow -import fs from "fs"; - -import loadConfig, { type InputOptions } from "./config"; -import { runSync, type FileResult } from "./transformation"; - -export default function transformFileSync( - filename: string, - opts: ?InputOptions, -): FileResult | null { - let options; - if (opts == null) { - options = { filename }; - } else if (opts && typeof opts === "object") { - options = { - ...opts, - filename, - }; - } - - const config = loadConfig(options); - if (config === null) return null; - - return runSync(config, fs.readFileSync(filename, "utf8")); -} diff --git a/packages/babel-core/src/transform-file.js b/packages/babel-core/src/transform-file.js index 8c16a0370733..b44f502cc6aa 100644 --- a/packages/babel-core/src/transform-file.js +++ b/packages/babel-core/src/transform-file.js @@ -2,14 +2,23 @@ import fs from "fs"; import loadConfig, { type InputOptions } from "./config"; -import { runAsync, type FileResultCallback } from "./transformation"; +import { + runSync, + runAsync, + type FileResult, + type FileResultCallback, +} from "./transformation"; type TransformFile = { (filename: string, callback: FileResultCallback): void, (filename: string, opts: ?InputOptions, callback: FileResultCallback): void, }; -export default ((function transformFile(filename, opts, callback) { +export const transformFile: TransformFile = (function transformFile( + filename, + opts, + callback, +) { let options; if (typeof opts === "function") { callback = opts; @@ -43,4 +52,24 @@ export default ((function transformFile(filename, opts, callback) { runAsync(config, code, null, callback); }); }); -}: Function): TransformFile); +}: Function); + +export function transformFileSync( + filename: string, + opts: ?InputOptions, +): FileResult | null { + let options; + if (opts == null) { + options = { filename }; + } else if (opts && typeof opts === "object") { + options = { + ...opts, + filename, + }; + } + + const config = loadConfig(options); + if (config === null) return null; + + return runSync(config, fs.readFileSync(filename, "utf8")); +} diff --git a/packages/babel-core/src/transform-sync.js b/packages/babel-core/src/transform-sync.js deleted file mode 100644 index d1e93fc73f76..000000000000 --- a/packages/babel-core/src/transform-sync.js +++ /dev/null @@ -1,13 +0,0 @@ -// @flow -import loadConfig, { type InputOptions } from "./config"; -import { runSync, type FileResult } from "./transformation"; - -export default function transformSync( - code: string, - opts: ?InputOptions, -): FileResult | null { - const config = loadConfig(opts); - if (config === null) return null; - - return runSync(config, code); -} diff --git a/packages/babel-core/src/transform.js b/packages/babel-core/src/transform.js index 63b82f52831d..4a5ce0f8c8b8 100644 --- a/packages/babel-core/src/transform.js +++ b/packages/babel-core/src/transform.js @@ -1,13 +1,12 @@ // @flow import loadConfig, { type InputOptions } from "./config"; import { + runSync, runAsync, type FileResult, type FileResultCallback, } from "./transformation"; -import transformSync from "./transform-sync"; - type Transform = { (code: string, callback: FileResultCallback): void, (code: string, opts: ?InputOptions, callback: FileResultCallback): void, @@ -17,7 +16,7 @@ type Transform = { (code: string, opts: ?InputOptions): FileResult | null, }; -export default ((function transform(code, opts, callback) { +export const transform: Transform = (function transform(code, opts, callback) { if (typeof opts === "function") { opts = undefined; callback = opts; @@ -43,4 +42,14 @@ export default ((function transform(code, opts, callback) { runAsync(cfg, code, null, cb); }); -}: Function): Transform); +}: Function); + +export function transformSync( + code: string, + opts: ?InputOptions, +): FileResult | null { + const config = loadConfig(opts); + if (config === null) return null; + + return runSync(config, code); +} From 0bc30275542f699a5056764fe5ad746ac70073de Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Wed, 23 May 2018 19:48:05 -0700 Subject: [PATCH 2/2] Add a promise version of each of Babel's transform functions. --- packages/babel-core/src/index.js | 16 ++++++++++++---- packages/babel-core/src/parse.js | 12 ++++++++++++ packages/babel-core/src/transform-ast.js | 13 +++++++++++++ packages/babel-core/src/transform-file.js | 12 ++++++++++++ packages/babel-core/src/transform.js | 12 ++++++++++++ 5 files changed, 61 insertions(+), 4 deletions(-) diff --git a/packages/babel-core/src/index.js b/packages/babel-core/src/index.js index 975a82226ec9..075351715ab1 100644 --- a/packages/babel-core/src/index.js +++ b/packages/babel-core/src/index.js @@ -17,10 +17,18 @@ export { createConfigItem } from "./config/item"; export { loadPartialConfig, loadOptions } from "./config"; -export { transform, transformSync } from "./transform"; -export { transformFile, transformFileSync } from "./transform-file"; -export { transformFromAst, transformFromAstSync } from "./transform-ast"; -export { parse, parseSync } from "./parse"; +export { transform, transformSync, transformAsync } from "./transform"; +export { + transformFile, + transformFileSync, + transformFileAsync, +} from "./transform-file"; +export { + transformFromAst, + transformFromAstSync, + transformFromAstAsync, +} from "./transform-ast"; +export { parse, parseSync, parseAsync } from "./parse"; /** * Recommended set of compilable extensions. Not used in @babel/core directly, but meant as diff --git a/packages/babel-core/src/parse.js b/packages/babel-core/src/parse.js index 679a4f7c7dd3..ef905efb1f62 100644 --- a/packages/babel-core/src/parse.js +++ b/packages/babel-core/src/parse.js @@ -70,3 +70,15 @@ export function parseSync( return normalizeFile(config.passes, normalizeOptions(config), code).ast; } + +export function parseAsync( + code: string, + opts?: InputOptions, +): Promise { + return new Promise((res, rej) => { + parse(code, opts, (err, result) => { + if (err == null) res(result); + else rej(err); + }); + }); +} diff --git a/packages/babel-core/src/transform-ast.js b/packages/babel-core/src/transform-ast.js index 9097a4e72ec8..62cef671e37d 100644 --- a/packages/babel-core/src/transform-ast.js +++ b/packages/babel-core/src/transform-ast.js @@ -71,3 +71,16 @@ export function transformFromAstSync( return runSync(config, code, ast); } + +export function transformFromAstAsync( + ast: AstRoot, + code: string, + opts: ?InputOptions, +): Promise { + return new Promise((res, rej) => { + transformFromAst(ast, code, opts, (err, result) => { + if (err == null) res(result); + else rej(err); + }); + }); +} diff --git a/packages/babel-core/src/transform-file.js b/packages/babel-core/src/transform-file.js index b44f502cc6aa..1011bd8a4d89 100644 --- a/packages/babel-core/src/transform-file.js +++ b/packages/babel-core/src/transform-file.js @@ -73,3 +73,15 @@ export function transformFileSync( return runSync(config, fs.readFileSync(filename, "utf8")); } + +export function transformFileAsync( + filename: string, + opts: ?InputOptions, +): Promise { + return new Promise((res, rej) => { + transformFile(filename, opts, (err, result) => { + if (err == null) res(result); + else rej(err); + }); + }); +} diff --git a/packages/babel-core/src/transform.js b/packages/babel-core/src/transform.js index 4a5ce0f8c8b8..11a8ad5c0cfa 100644 --- a/packages/babel-core/src/transform.js +++ b/packages/babel-core/src/transform.js @@ -53,3 +53,15 @@ export function transformSync( return runSync(config, code); } + +export function transformAsync( + code: string, + opts: ?InputOptions, +): Promise { + return new Promise((res, rej) => { + transform(code, opts, (err, result) => { + if (err == null) res(result); + else rej(err); + }); + }); +}