diff --git a/Makefile b/Makefile index 7247d78431..b966a86e5b 100644 --- a/Makefile +++ b/Makefile @@ -25,6 +25,7 @@ clean: test-clean test-clean: rm -rf packages/*/test/tmp + rm -rf packages/*/test-fixtures.json test: lint ./scripts/test.sh @@ -32,6 +33,7 @@ test: lint test-browser: ./scripts/test-browser.sh + make test-clean test-cov: clean BABEL_ENV=test; \ diff --git a/package.json b/package.json index e3061a7771..a874927de7 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "lodash": "^3.10.0", "matcha": "^0.6.0", "mocha": "2.2.0", + "mocha-fixtures": "^1.0.5", "output-file-sync": "^1.1.1", "path-exists": "^1.0.0", "readline-sync": "^1.2.19", diff --git a/packages/babel-cli/test/index.js b/packages/babel-cli/test/index.js index b01b533bb8..3e229d87b9 100644 --- a/packages/babel-cli/test/index.js +++ b/packages/babel-cli/test/index.js @@ -1,7 +1,7 @@ if (process.env.running_under_istanbul) return; var readdir = require("fs-readdir-recursive"); -var helper = require("../../babel/test/_helper"); +var helper = require("mocha-fixtures"); var assert = require("assert"); var rimraf = require("rimraf"); var outputFileSync = require("output-file-sync"); diff --git a/packages/babel/package.json b/packages/babel/package.json index 640bfa5579..011cc2d8c8 100644 --- a/packages/babel/package.json +++ b/packages/babel/package.json @@ -72,6 +72,7 @@ "source-map-support": "^0.2.10", "strip-json-comments": "^1.0.2", "to-fast-properties": "^1.0.0", - "trim-right": "^1.0.0" + "trim-right": "^1.0.0", + "try-resolve": "^1.0.0" } -} \ No newline at end of file +} diff --git a/packages/babel/scripts/build-tests.js b/packages/babel/scripts/build-tests.js deleted file mode 100644 index ad5be52ad2..0000000000 --- a/packages/babel/scripts/build-tests.js +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env node - -var fs = require("fs"); -var cache = require("../test/_helper").cache; -fs.writeFileSync(__dirname + "/../tests.json", JSON.stringify(cache)); diff --git a/packages/babel/scripts/postpublish.js b/packages/babel/scripts/postpublish.js old mode 100644 new mode 100755 diff --git a/packages/babel/src/transformation/file/index.js b/packages/babel/src/transformation/file/index.js index f58ac13940..6f59e7f1e1 100644 --- a/packages/babel/src/transformation/file/index.js +++ b/packages/babel/src/transformation/file/index.js @@ -11,6 +11,7 @@ import codeFrame from "../../helpers/code-frame"; import defaults from "lodash/object/defaults"; import includes from "lodash/collection/includes"; import traverse from "../../traversal"; +import resolve from "try-resolve"; import Logger from "./logger"; import Plugin from "../plugin"; import parse from "../../helpers/parse"; @@ -486,7 +487,7 @@ export default class File { var ModuleFormatter = isFunction(type) ? type : moduleFormatters[type]; if (!ModuleFormatter) { - var loc = util.resolveRelative(type); + var loc = resolve.relative(type); if (loc) ModuleFormatter = require(loc); } diff --git a/packages/babel/src/transformation/file/plugin-manager.js b/packages/babel/src/transformation/file/plugin-manager.js index 98255eff10..ddfa0fe029 100644 --- a/packages/babel/src/transformation/file/plugin-manager.js +++ b/packages/babel/src/transformation/file/plugin-manager.js @@ -2,6 +2,7 @@ import Transformer from "../transformer"; import Plugin from "../plugin"; import * as types from "../../types"; import * as messages from "../../messages"; +import resolve from "try-resolve"; import traverse from "../../traversal"; import parse from "../../helpers/parse"; @@ -18,8 +19,6 @@ var context = { traverse }; -import * as util from "../../util"; - /** * [Please add a description.] */ @@ -78,7 +77,7 @@ export default class PluginManager { var match = name.match(/^(.*?):(after|before)$/); if (match) [, name, position] = match; - var loc = util.resolveRelative(`babel-plugin-${name}`) || util.resolveRelative(name); + var loc = resolve.relative(`babel-plugin-${name}`) || resolve.relative(name); if (loc) { var plugin = require(loc); return { diff --git a/packages/babel/src/types/index.js b/packages/babel/src/types/index.js index f492b4a271..a0dd718b1c 100644 --- a/packages/babel/src/types/index.js +++ b/packages/babel/src/types/index.js @@ -32,7 +32,8 @@ export const STATEMENT_OR_BLOCK_KEYS = ["consequent", "body", "alternate"]; export const FLATTENABLE_KEYS = ["body", "expressions"]; export const FOR_INIT_KEYS = ["left", "init"]; export const COMMENT_KEYS = ["leadingComments", "trailingComments", "innerComments"]; -export const INHERIT_KEYS = { + +export const INHERIT_KEYS = { optional: ["typeAnnotation", "typeParameters", "returnType"], force: ["_scopeInfo", "_paths", "range", "start", "loc", "end"] }; diff --git a/packages/babel/src/util.js b/packages/babel/src/util.js index 545d6da3a2..cae389e318 100644 --- a/packages/babel/src/util.js +++ b/packages/babel/src/util.js @@ -36,40 +36,6 @@ export function canCompile(filename: string, altExts?: Array) { canCompile.EXTENSIONS = [".js", ".jsx", ".es6", ".es"]; -/** - * Module resolver that swallows errors. - */ - -export function resolve(loc: string) { - try { - return require.resolve(loc); - } catch (err) { - return null; - } -} - -var relativeMod; - -/** - * Resolve a filename relative to the current working directory. - */ - -export function resolveRelative(loc: string) { - // we're in the browser, probably - if (typeof Module === "object") return null; - - if (!relativeMod) { - relativeMod = new Module; - relativeMod.paths = Module._nodeModulePaths(process.cwd()); - } - - try { - return Module._resolveFilename(loc, relativeMod); - } catch (err) { - return null; - } -} - /** * Create an array from any value, splitting strings by ",". */ diff --git a/packages/babel/test/_helper.js b/packages/babel/test/_helper.js deleted file mode 100644 index d66bde6363..0000000000 --- a/packages/babel/test/_helper.js +++ /dev/null @@ -1,148 +0,0 @@ -var pathExists = require("path-exists"); -var util = require("../lib/util"); -var path = require("path"); -var fs = require("fs"); -var _ = require("lodash"); - -var humanize = function (val, noext) { - if (noext) val = path.basename(val, path.extname(val)); - return val.replace(/-/g, " "); -}; - -var readFile = exports.readFile = function (filename) { - if (pathExists.sync(filename)) { - var file = fs.readFileSync(filename, "utf8").trim(); - file = file.replace(/\r\n/g, "\n"); - return file; - } else { - return ""; - } -}; - -exports.assertVendor = function (name) { - if (!pathExists.sync(__dirname + "/../../../vendor/" + name)) { - console.error("No vendor/" + name + " - run `make bootstrap`"); - process.exit(1); - } -}; - -exports.get = function (entryName, entryLoc) { - if (exports.cache[entryName]) return exports.cache[entryName]; - - var suites = []; - var entryLoc = entryLoc || __dirname + "/fixtures/" + entryName; - - _.each(fs.readdirSync(entryLoc), function (suiteName) { - if (suiteName[0] === ".") return; - - var suite = { - options: {}, - tests: [], - title: humanize(suiteName), - filename: entryLoc + "/" + suiteName - }; - suites.push(suite); - - var suiteOptsLoc = util.resolve(suite.filename + "/options"); - if (suiteOptsLoc) suite.options = require(suiteOptsLoc); - - if (fs.statSync(suite.filename).isFile()) { - push(suiteName, suite.filename); - } else { - _.each(fs.readdirSync(suite.filename), function (taskName) { - var taskDir = suite.filename + "/" + taskName; - push(taskName, taskDir); - }); - } - - function push(taskName, taskDir) { - // tracuer error tests - if (taskName.indexOf("Error_") >= 0) return; - - var actualLocAlias = suiteName + "/" + taskName + "/actual.js"; - var expectLocAlias = suiteName + "/" + taskName + "/expected.js"; - var execLocAlias = suiteName + "/" + taskName + "/exec.js"; - - var actualLoc = taskDir + "/actual.js"; - var expectLoc = taskDir + "/expected.js"; - var execLoc = taskDir + "/exec.js"; - - if (fs.statSync(taskDir).isFile()) { - var ext = path.extname(taskDir); - if (ext !== ".js" && ext !== ".module.js") return; - - execLoc = taskDir; - } - - var taskOpts = _.merge({ - filenameRelative: expectLocAlias, - sourceFileName: actualLocAlias, - sourceMapName: expectLocAlias - }, _.cloneDeep(suite.options)); - - var taskOptsLoc = util.resolve(taskDir + "/options"); - if (taskOptsLoc) _.merge(taskOpts, require(taskOptsLoc)); - - var test = { - title: humanize(taskName, true), - disabled: taskName[0] === ".", - options: taskOpts, - exec: { - loc: execLoc, - code: readFile(execLoc), - filename: execLocAlias, - }, - actual: { - loc: actualLoc, - code: readFile(actualLoc), - filename: actualLocAlias, - }, - expect: { - loc: expectLoc, - code: readFile(expectLoc), - filename: expectLocAlias - } - }; - - // traceur checks - - var shouldSkip = function (code) { - return code.indexOf("// Error:") >= 0 || code.indexOf("// Skip.") >= 0; - }; - - if (shouldSkip(test.actual.code) || shouldSkip(test.exec.code)) { - return; - } else if (test.exec.code.indexOf("// Async.") >= 0) { - //test.options.asyncExec = true; - return; - } - - suite.tests.push(test); - - var sourceMappingsLoc = taskDir + "/source-mappings.json"; - if (pathExists.sync(sourceMappingsLoc)) { - test.options.sourceMap = true; - test.sourceMappings = require(sourceMappingsLoc); - } - - var sourceMap = taskDir + "/source-map.json"; - if (pathExists.sync(sourceMap)) { - test.options.sourceMap = true; - test.sourceMap = require(sourceMap); - } - } - }); - - return exports.cache[entryName] = suites; -}; - -try { - exports.cache = require("../tests.json"); -} catch (err) { - if (err.code !== "MODULE_NOT_FOUND") throw err; - - var cache = exports.cache = {}; - cache.transformation = exports.get("transformation"); - cache.generation = exports.get("generation"); - cache.esnext = exports.get("esnext"); -} diff --git a/packages/babel/test/_transformation-helper.js b/packages/babel/test/_transformation-helper.js index baa99bfe5c..2ad933b604 100644 --- a/packages/babel/test/_transformation-helper.js +++ b/packages/babel/test/_transformation-helper.js @@ -1,15 +1,19 @@ -var transform = require("../lib/transformation"); var buildExernalHelpers = require("../lib/tools/build-external-helpers"); +var getFixtures = require("mocha-fixtures"); +var transform = require("../lib/transformation"); var sourceMap = require("source-map"); var codeFrame = require("../lib/helpers/code-frame"); var Module = require("module"); -var helper = require("./_helper"); var assert = require("assert"); var chai = require("chai"); var path = require("path"); var util = require("../lib/util"); var _ = require("lodash"); +exports.fixtures = getFixtures(__dirname + "/fixtures", function () { + return require("../test-fixtures.json"); +}); + require("../lib/polyfill"); eval(buildExernalHelpers()); @@ -54,7 +58,8 @@ var run = function (task, done) { var getOpts = function (self) { return _.merge({ suppressDeprecationMessages: true, - filename: self.loc + filename: self.loc, + sourceMap: !!(task.sourceMappings || test.sourceMap) }, opts); }; @@ -115,13 +120,14 @@ var run = function (task, done) { } }; -module.exports = function (suiteOpts, taskOpts, dynamicOpts) { +exports.run = function (name, suiteOpts, taskOpts, dynamicOpts) { + suiteOpts = suiteOpts || {}; taskOpts = taskOpts || {}; - _.each(helper.get(suiteOpts.name, suiteOpts.loc), function (testSuite) { + _.each(exports.fixtures[name], function (testSuite) { if (_.contains(suiteOpts.ignoreSuites, testSuite.title)) return; - suite(suiteOpts.name + "/" + testSuite.title, function () { + suite(name + "/" + testSuite.title, function () { setup(function () { require("../register")(taskOpts); }); diff --git a/packages/babel/test/esnext.js b/packages/babel/test/esnext.js index 7c8d38dd5c..34ca4ce32a 100644 --- a/packages/babel/test/esnext.js +++ b/packages/babel/test/esnext.js @@ -1,3 +1 @@ -require("./_transformation-helper")({ - name: "esnext" -}); +require("./_transformation-helper").run("esnext"); diff --git a/packages/babel/test/fixtures/traceur b/packages/babel/test/fixtures/traceur new file mode 120000 index 0000000000..6a1d2c380d --- /dev/null +++ b/packages/babel/test/fixtures/traceur @@ -0,0 +1 @@ +../../../../vendor/traceur/test/feature \ No newline at end of file diff --git a/packages/babel/test/generation.js b/packages/babel/test/generation.js index 834da9c663..c968672b71 100644 --- a/packages/babel/test/generation.js +++ b/packages/babel/test/generation.js @@ -1,6 +1,6 @@ var generate = require("../lib/generation"); +var fixtures = require("mocha-fixtures"); var assert = require("assert"); -var helper = require("./_helper"); var parse = require("../lib/helpers/parse"); var chai = require("chai"); var t = require("../lib/types"); @@ -19,7 +19,7 @@ suite("generation", function () { }); }); -_.each(helper.get("generation"), function (testSuite) { +_.each(require("./_transformation-helper").fixtures.generation, function (testSuite) { suite("generation/" + testSuite.title, function () { _.each(testSuite.tests, function (task) { test(task.title, !task.disabled && function () { diff --git a/packages/babel/test/traceur.js b/packages/babel/test/traceur.js index 18985a8f51..740629fb1b 100644 --- a/packages/babel/test/traceur.js +++ b/packages/babel/test/traceur.js @@ -1,12 +1,7 @@ -require("./_helper").assertVendor("traceur"); - var fs = require("fs"); var _ = require("lodash"); -require("./_transformation-helper")({ - name: "traceur", - loc: __dirname + "/../../../vendor/traceur/test/feature", - +require("./_transformation-helper").run("traceur", { ignoreSuites: [ // weird environmental issue make these hard to test "Modules", @@ -69,6 +64,7 @@ require("./_transformation-helper")({ // TODO: investigate "Classes/ExtendStrange", + "Math/fround.module", // these are the responsibility of core-js "Spread/Type", diff --git a/packages/babel/test/transformation.js b/packages/babel/test/transformation.js index 642604401e..0e4ed1321a 100644 --- a/packages/babel/test/transformation.js +++ b/packages/babel/test/transformation.js @@ -1,3 +1 @@ -require("./_transformation-helper")({ - name: "transformation" -}); +require("./_transformation-helper").run("transformation"); diff --git a/scripts/test-browser.sh b/scripts/test-browser.sh index b401618966..40e5298879 100755 --- a/scripts/test-browser.sh +++ b/scripts/test-browser.sh @@ -1,13 +1,14 @@ #!/bin/sh set -e -BROWSERIFY_CMD="node_modules/browserify/bin/cmd.js" - mkdir -p dist node packages/babel/scripts/cache-templates -node packages/babel/scripts/build-tests -node $BROWSERIFY_CMD -e test/browser.js >dist/browser-test.js -rm -rf packages/babel/templates.json packages/babel/tests.json + +for f in packages/*; do + node node_modules/mocha-fixtures/bin/mocha-fixture-dump.js $f +done + +node node_modules/browserify/bin/cmd.js -e test/browser.js >dist/browser-test.js test -n "`which open`" && open test/browser.html diff --git a/vendor/traceur b/vendor/traceur index 09d7e3023b..554afd9fab 160000 --- a/vendor/traceur +++ b/vendor/traceur @@ -1 +1 @@ -Subproject commit 09d7e3023ba2f07b8e3103027c6df3c1279fe96f +Subproject commit 554afd9fab75a149a2234ff6732f130e232f2ba0