modules/loose opts from es2015 preset, add travis (#6)

* modules/loose opts from es2015 preset, add travis

* Update .travis.yml

* fix plugin function [skip ci]
This commit is contained in:
Henry Zhu 2016-09-05 23:39:50 -04:00 committed by GitHub
parent 78c21a282a
commit 2c97212fd4
4 changed files with 118 additions and 39 deletions

View File

@ -0,0 +1,12 @@
git:
depth: 1
sudo: false
language: node_js
cache:
directories:
- node_modules
node_js:
- '6'
- '5'
- '0.12'
- '0.10'

View File

@ -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 <hi@henryzoo.com>",
"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"
]

View File

@ -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: [

View File

@ -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);
});
});
});