diff --git a/experimental/babel-preset-env/.travis.yml b/experimental/babel-preset-env/.travis.yml new file mode 100644 index 0000000000..a86bb1211c --- /dev/null +++ b/experimental/babel-preset-env/.travis.yml @@ -0,0 +1,12 @@ +git: + depth: 1 +sudo: false +language: node_js +cache: + directories: + - node_modules +node_js: +- '6' +- '5' +- '0.12' +- '0.10' diff --git a/experimental/babel-preset-env/package.json b/experimental/babel-preset-env/package.json index ef4e7e6ebd..61e8f15974 100644 --- a/experimental/babel-preset-env/package.json +++ b/experimental/babel-preset-env/package.json @@ -1,6 +1,6 @@ { "name": "babel-preset-env", - "version": "1.0.0", + "version": "0.0.0", "description": "A Babel preset for each environment.", "author": "Henry Zhu ", "homepage": "https://babeljs.io/", @@ -14,7 +14,7 @@ "fix": "eslint src test --fix", "ci": "npm run lint && npm run test", "prepublish": "npm run build", - "test": "mocha ./test" + "test": "mocha ./test --compilers js:babel-register" }, "dependencies": { "babel-plugin-check-es2015-constants": "^6.3.13", @@ -53,13 +53,14 @@ "babel-plugin-transform-function-bind": "^6.8.0", "babel-plugin-transform-object-rest-spread": "^6.8.0", "babel-plugin-transform-proto-to-assign": "^6.9.0", - "babel-plugin-transform-regenerator": "^6.6.0", - "lodash.includes": "^4.3.0" + "babel-plugin-transform-regenerator": "^6.6.0" }, "devDependencies": { "babel-cli": "^6.11.4", "babel-eslint": "^6.1.2", "babel-plugin-transform-flow-strip-types": "^6.8.0", + "babel-preset-es2015": "^6.14.0", + "babel-register": "^6.14.0", "eslint": "^3.3.1", "eslint-config-babel": "^1.0.1", "eslint-plugin-babel": "^3.3.0", @@ -67,15 +68,15 @@ "mocha": "^3.0.2" }, "babel": { + "presets": [ + [ + "es2015", + { + "loose": true + } + ] + ], "plugins": [ - "babel-plugin-transform-es2015-destructuring", - "babel-plugin-transform-es2015-function-name", - "babel-plugin-transform-es2015-modules-commonjs", - "babel-plugin-transform-es2015-parameters", - "babel-plugin-transform-es2015-shorthand-properties", - "babel-plugin-transform-es2015-spread", - "babel-plugin-transform-es2015-sticky-regex", - "babel-plugin-transform-es2015-unicode-regex", "transform-class-properties", "transform-flow-strip-types" ] diff --git a/experimental/babel-preset-env/src/index.js b/experimental/babel-preset-env/src/index.js index 9c5cf26225..7ce10582e0 100644 --- a/experimental/babel-preset-env/src/index.js +++ b/experimental/babel-preset-env/src/index.js @@ -4,7 +4,6 @@ // "proto-to-assign", // "es5-property-mutators", -import includes from "lodash.includes"; import pluginList from "./plugins.js"; export const plugins = [ @@ -14,14 +13,6 @@ export const plugins = [ "es5-property-mutators", ]; -// modules? -export const modules = [ - "transform-es2015-modules-amd", - "transform-es2015-modules-commonjs", - "transform-es2015-modules-systemjs", - "transform-es2015-modules-umd" -]; - export const stagePlugins = [ // "transform-class-constructor-call", proposal is removed "transform-class-properties", @@ -32,6 +23,13 @@ export const stagePlugins = [ "transform-object-rest-spread", ]; +export const MODULE_TRANSFORMATIONS = { + "amd": "transform-es2015-modules-amd", + "commonjs": "transform-es2015-modules-commonjs", + "systemjs": "transform-es2015-modules-systemjs", + "umd": "transform-es2015-modules-umd" +}; + /** * Determine if a transformation is required * @param {Object} supportedEnvironments An Object containing environment keys and the lowest @@ -67,35 +65,40 @@ const getTargets = targetOpts => { // TODO: Allow specifying plugins as either shortened or full name // babel-plugin-transform-es2015-classes // transform-es2015-classes -const getLooseMode = looseOpts => { - if (!looseOpts) { return []; } - return looseOpts; +export const validateLooseOption = (looseOpt = false) => { + if (typeof looseOpt !== "boolean") { + throw new Error("Preset env: 'loose' option must be a boolean."); + } + + return looseOpt; } -// TODO: Allow specifying modules as: Boolean, String or Array of module types -const getModules = modulesOpts => { - if (!modulesOpts) { return []; } - return modulesOpts; +export const validateModulesOption = (modulesOpt = "commonjs") => { + if (modulesOpt !== false && Object.keys(MODULE_TRANSFORMATIONS).indexOf(modulesOpt) === -1) { + throw new Error("The 'modules' option must be 'false' to indicate no modules\n" + + "or a module type which be be one of: 'commonjs' (default), 'amd', 'umd', 'systemjs'"); + } + + return modulesOpt; } -export default function(opts) { - const looseMode = getLooseMode(opts.loose); - const modulesMode = getModules(opts.modules); +export function buildPreset(context, opts) { + const loose = validateLooseOption(opts.loose); + const moduleType = validateModulesOption(opts.modules); const targets = getTargets(opts.targets); const transformations = Object.keys(pluginList) .filter(pluginName => isPluginRequired(targets, pluginList[pluginName])) .map(pluginName => { - return includes(looseMode, pluginName) - ? [require(`babel-plugin-${pluginName}`), { loose: true }] - : require(`babel-plugin-${pluginName}`); + return [require(`babel-plugin-${pluginName}`), { loose }] }); - // TODO: Support loose mode - const modules = Object.keys(modulesMode) - .map(moduleType => { - return [require(`babel-plugin-transform-es2015-modules-${moduleType}`)] - }); + const modules = [ + moduleType === "commonjs" && [require("babel-plugin-transform-es2015-modules-commonjs"), { loose }], + moduleType === "systemjs" && [require("babel-plugin-transform-es2015-modules-systemjs"), { loose }], + moduleType === "amd" && [require("babel-plugin-transform-es2015-modules-amd"), { loose }], + moduleType === "umd" && [require("babel-plugin-transform-es2015-modules-umd"), { loose }], + ].filter(Boolean); return { plugins: [ diff --git a/experimental/babel-preset-env/test/index.js b/experimental/babel-preset-env/test/index.js index b1720bdf01..8c636fdf59 100644 --- a/experimental/babel-preset-env/test/index.js +++ b/experimental/babel-preset-env/test/index.js @@ -3,6 +3,11 @@ const babelPresetEnv = require("../lib/index.js"); const assert = require("assert"); +const { + validateModulesOption, + validateLooseOption +} = babelPresetEnv; + describe("babel-preset-env", () => { describe("isPluginRequired", () => { it("returns true if no targets are specified", () => { @@ -29,4 +34,62 @@ describe("babel-preset-env", () => { assert(babelPresetEnv.isPluginRequired(plugin, plugin) === true); }); }); + + describe("validateLooseOption", () => { + it("`undefined` option returns false", () => { + assert(validateLooseOption() === false); + }); + + it("`false` option returns false", () => { + assert(validateLooseOption(false) === false); + }); + + it("`true` option returns true", () => { + assert(validateLooseOption(true) === true); + }); + + it("array option is invalid", () => { + assert.throws(() => { + validateModulesOption([]); + }, Error); + }); + }); + + describe("validateModulesOption", () => { + it("`undefined` option returns commonjs", () => { + assert(validateModulesOption() === "commonjs"); + }); + + it("`false` option returns commonjs", () => { + assert(validateModulesOption(false) === false); + }); + + it("commonjs option is valid", () => { + assert(validateModulesOption("commonjs") === "commonjs"); + }); + + it("systemjs option is valid", () => { + assert(validateModulesOption("systemjs") === "systemjs"); + }); + + it("amd option is valid", () => { + assert(validateModulesOption("amd") === "amd"); + }); + + it("umd option is valid", () => { + assert(validateModulesOption("umd") === "umd"); + }); + + it("`true` option is invalid", () => { + assert.throws(() => { + validateModulesOption(true); + }, Error); + }); + + it("array option is invalid", () => { + assert.throws(() => { + assert(validateModulesOption([])); + }, Error); + }); + }); });