diff --git a/.gitignore b/.gitignore index d901bc558d..c8b22692b3 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ test/tmp *.log *.cache /templates.json +/tests.json /browser.js coverage dist diff --git a/.npmignore b/.npmignore index c87e6a0a2f..79fa07bb98 100644 --- a/.npmignore +++ b/.npmignore @@ -7,4 +7,5 @@ benchmark Makefile .* dist +tests.json !README.md diff --git a/Makefile b/Makefile index 1bb6873b93..2274e81ee4 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,6 @@ +BROWSERIFY_CMD = node_modules/browserify/bin/cmd.js ISTANBUL_CMD = node_modules/istanbul/lib/cli.js cover +UGLIFY_CMD = node_modules/uglify-js/bin/uglifyjs JSHINT_CMD = node_modules/jshint/bin/jshint MOCHA_CMD = node_modules/mocha/bin/_mocha @@ -26,8 +28,13 @@ test-travis: if test -n "$$CODECLIMATE_REPO_TOKEN"; then codeclimate < coverage/lcov.info; fi test-browser: - make build - node bin/generate-browser-test >dist/6to5-test.js + mkdir -p dist + + node bin/cache-templates + node bin/cache-tests + node $(BROWSERIFY_CMD) -e test/_browser.js >dist/6to5-test.js + rm -rf templates.json tests.json + test -n "`which open`" && open test/browser.html build: @@ -35,8 +42,8 @@ build: node bin/cache-templates - browserify lib/6to5/browser.js -s to5 >dist/6to5.js - uglifyjs dist/6to5.js >dist/6to5.min.js + node $(BROWSERIFY_CMD) lib/6to5/browser.js -s to5 >dist/6to5.js + node $(UGLIFY_CMD) dist/6to5.js >dist/6to5.min.js rm -rf templates.json diff --git a/README.md b/README.md index f74281f289..f1391bbe64 100644 --- a/README.md +++ b/README.md @@ -222,7 +222,7 @@ Just include one of those in the browser and access the transform method via the global `to5`. ```javascript -to5("class Test {}").code; +to5.transform("class Test {}").code; ``` #### Test diff --git a/bin/cache-tests b/bin/cache-tests new file mode 100644 index 0000000000..00e2fc8f2f --- /dev/null +++ b/bin/cache-tests @@ -0,0 +1,5 @@ +#!/usr/bin/env node + +var fs = require("fs"); +var cache = require("../test/_helper").cache; +fs.writeFileSync("tests.json", JSON.stringify(cache)); diff --git a/bin/generate-browser-test b/bin/generate-browser-test deleted file mode 100755 index 2c37f08cee..0000000000 --- a/bin/generate-browser-test +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env node - -var helper = require("../test/_helper"); -var util = require("../lib/6to5/util"); - -console.log("(" + helper.runTransformationTests + ")(" + JSON.stringify(helper.getTransformationTests()) + ", to5, proclaim)"); diff --git a/lib/6to5/browser.js b/lib/6to5/browser.js index cc739ecb40..aab38a962b 100644 --- a/lib/6to5/browser.js +++ b/lib/6to5/browser.js @@ -1,3 +1,6 @@ -var transform = require("./transform"); +Error.captureStackTrace = Error.captureStackTrace || function (obj) { + obj.stack = [{ toString: null }]; +}; -module.exports = transform; +exports.generate = require("./generator"); +exports.transform = require("./transform"); diff --git a/lib/6to5/transform.js b/lib/6to5/transform.js index 6a3047a25a..aa4b114a05 100644 --- a/lib/6to5/transform.js +++ b/lib/6to5/transform.js @@ -1,10 +1,11 @@ module.exports = transform; var Transformer = require("./transformer"); -var sourceMap = require("source-map"); var generate = require("./generator"); +var assert = require("assert"); var File = require("./file"); var util = require("./util"); +var chai = require("chai"); var _ = require("lodash"); function transform(code, opts) { @@ -15,66 +16,6 @@ function transform(code, opts) { return file.parse(code); } -transform.test = function (task, assert) { - var actual = task.actual; - var expect = task.expect; - var opts = task.options; - var exec = task.exec; - - var getOpts = function (filename) { - return _.merge({ - whtiespace: true, - filename: filename - }, opts); - }; - - var execCode = exec.code.trim(); - var result; - - if (execCode) { - result = transform(execCode, getOpts(exec.filename)); - execCode = result.code; - - require("./polyfill"); - - try { - var fn = new Function("assert", execCode); - fn(assert); - } catch (err) { - err.message += util.codeFrame(execCode); - throw err; - } - } else { - var actualCode = actual.code.trim(); - var expectCode = expect.code.trim(); - - result = transform(actualCode, getOpts(actual.filename)); - actualCode = result.code; - - try { - assert.equal(actualCode, expectCode); - } catch (err) { - err.showDiff = true; - throw err; - } - } - - if (task.sourceMap) { - assert.deepEqual(task.sourceMap, result.map); - } - - if (task.sourceMappings) { - var consumer = new sourceMap.SourceMapConsumer(result.map); - - _.each(task.sourceMappings, function (mapping, i) { - var expect = mapping.original; - - var actual = consumer.originalPositionFor(mapping.generated); - assert.equal(actual.line + ":" + actual.column, expect.line + ":" + expect.column); - }); - } -}; - transform._ensureTransformerNames = function (type, keys) { _.each(keys, function (key) { if (!_.has(transform.transformers, key)) { diff --git a/package.json b/package.json index 80aa9dcd21..97a8983734 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,6 @@ "source-map-support": "0.2.7", "esutils": "1.1.4", "acorn-6to5": "https://github.com/sebmck/acorn-6to5/archive/master.tar.gz", - "acorn-ast-types": "0.5.3-1", "estraverse": "^1.7.0" }, "devDependencies": { @@ -57,7 +56,6 @@ "mocha": "1.21.5", "uglify-js": "2.4.15", "browserify": "6.1.0", - "proclaim": "2.0.0", "rimraf": "2.2.8", "jshint": "2.5.6", "chai": "^1.9.2" diff --git a/test/_browser.js b/test/_browser.js new file mode 100644 index 0000000000..e56629fc88 --- /dev/null +++ b/test/_browser.js @@ -0,0 +1,7 @@ +if (process.browser) { + require("../lib/6to5/browser"); + require("./generation"); + require("./transformation"); + require("./traverse"); + require("./util"); +} diff --git a/test/_helper.js b/test/_helper.js index dc892957bd..43c9d2af01 100644 --- a/test/_helper.js +++ b/test/_helper.js @@ -1,56 +1,32 @@ var fs = require("fs"); var _ = require("lodash"); -var fixturesDir = __dirname + "/fixtures/transformation"; - var humanise = function (val) { return val.replace(/-/g, " "); }; var readFile = function (filename) { if (fs.existsSync(filename)) { - return fs.readFileSync(filename, "utf8"); + return fs.readFileSync(filename, "utf8").trim(); } else { return ""; } }; -exports.runTransformationTests = function (suites, transform, assert) { - _.each(suites, function (testSuite) { - suite("transformation/" + testSuite.title, function () { - _.each(testSuite.tests, function (task) { - test(task.title, function () { - var run = function () { - transform.test(task, assert); - }; +exports.get = function (entryName) { + if (exports.cache[entryName]) return exports.cache[entryName]; - var throwMsg = task.options.throws; - if (throwMsg) { - // internal api doesn't have this option but it's best not to pollute - // the options object with useless options - delete task.options.throws; - - assert.throws(run, new RegExp(throwMsg)); - } else { - run(); - } - }); - }); - }); - }); -}; - -exports.getTransformationTests = function () { var suites = []; + var entryLoc = __dirname + "/fixtures/" + entryName; - _.each(fs.readdirSync(fixturesDir), function (suiteName) { + _.each(fs.readdirSync(entryLoc), function (suiteName) { if (suiteName[0] === ".") return; var suite = { options: {}, tests: [], title: humanise(suiteName), - filename: fixturesDir + "/" + suiteName + filename: entryLoc + "/" + suiteName }; suites.push(suite); @@ -87,10 +63,12 @@ exports.getTransformationTests = function () { filename: execLocAlias, }, actual: { + loc: actualLoc, code: readFile(actualLoc), filename: actualLocAlias, }, expect: { + loc: expectLoc, code: readFile(expectLoc), filename: expectLocAlias } @@ -112,5 +90,15 @@ exports.getTransformationTests = function () { }); }); - return suites; + 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"); +} diff --git a/test/browser.html b/test/browser.html index 8ee85790c4..962c39eb40 100644 --- a/test/browser.html +++ b/test/browser.html @@ -6,10 +6,8 @@
- -