diff --git a/packages/babel-helper-fixtures/src/index.js b/packages/babel-helper-fixtures/src/index.js index d187a118f8e6..fe30b82309a5 100644 --- a/packages/babel-helper-fixtures/src/index.js +++ b/packages/babel-helper-fixtures/src/index.js @@ -120,6 +120,8 @@ export default function get(entryLoc): Array { const expectLoc = findFile(taskDir + "/output", true /* allowJSON */) || taskDir + "/output.js"; + const stdoutLoc = taskDir + "/stdout.txt"; + const stderrLoc = taskDir + "/stderr.txt"; const actualLocAlias = suiteName + "/" + taskName + "/" + path.basename(actualLoc); @@ -146,6 +148,9 @@ export default function get(entryLoc): Array { title: humanize(taskName, true), disabled: taskName[0] === ".", options: taskOpts, + validateLogs: taskOpts.validateLogs, + stdout: { loc: stdoutLoc, code: readFile(stdoutLoc) }, + stderr: { loc: stderrLoc, code: readFile(stderrLoc) }, exec: { loc: execLoc, code: readFile(execLoc), @@ -222,6 +227,16 @@ export default function get(entryLoc): Array { ); } } + + if (!test.validateLogs && (test.stdout.code || test.stderr.code)) { + throw new Error( + "stdout.txt and stderr.txt are only allowed when the 'validateLogs' option is enabled: " + + (test.stdout.code ? stdoutLoc : stderrLoc), + ); + } + + // Delete to avoid option validation error + delete test.options.validateLogs; } } diff --git a/packages/babel-helper-transform-fixture-test-runner/src/index.js b/packages/babel-helper-transform-fixture-test-runner/src/index.js index a83e8ff1c61b..ba85918ee12f 100644 --- a/packages/babel-helper-transform-fixture-test-runner/src/index.js +++ b/packages/babel-helper-transform-fixture-test-runner/src/index.js @@ -131,11 +131,16 @@ function wrapPackagesArray(type, names, optionsDir) { } function run(task) { - const actual = task.actual; - const expected = task.expect; - const exec = task.exec; - const opts = task.options; - const optionsDir = task.optionsDir; + const { + actual, + expect: expected, + exec, + options: opts, + optionsDir, + validateLogs, + stdout, + stderr, + } = task; function getOpts(self) { const newOpts = merge( @@ -191,19 +196,34 @@ function run(task) { } } - let actualCode = actual.code; - const expectCode = expected.code; - if (!execCode || actualCode) { - result = babel.transform(actualCode, getOpts(actual)); - const expectedCode = result.code.replace( - escapeRegExp(path.resolve(__dirname, "../../../")), - "", - ); + const inputCode = actual.code; + const expectedCode = expected.code; + if (!execCode || inputCode) { + const actualLogs = { stdout: "", stderr: "" }; + let restoreSpies = null; + if (validateLogs) { + const spy1 = jest.spyOn(console, "log").mockImplementation(msg => { + actualLogs.stdout += `${msg}\n`; + }); + const spy2 = jest.spyOn(console, "warn").mockImplementation(msg => { + actualLogs.stderr += `${msg}\n`; + }); + restoreSpies = () => { + spy1.mockRestore(); + spy2.mockRestore(); + }; + } + + result = babel.transform(inputCode, getOpts(actual)); + + if (restoreSpies) restoreSpies(); + + const outputCode = normalizeOutput(result.code); checkDuplicatedNodes(babel, result.ast); if ( !expected.code && - expectedCode && + outputCode && !opts.throws && fs.statSync(path.dirname(expected.loc)).isDirectory() && !process.env.CI @@ -214,7 +234,7 @@ function run(task) { ); console.log(`New test file created: ${expectedFile}`); - fs.writeFileSync(expectedFile, `${expectedCode}\n`); + fs.writeFileSync(expectedFile, `${outputCode}\n`); if (expected.loc !== expectedFile) { try { @@ -222,25 +242,19 @@ function run(task) { } catch (e) {} } } else { - actualCode = expectedCode.trim(); - try { - expect(actualCode).toEqualFile({ - filename: expected.loc, - code: expectCode, - }); - } catch (e) { - if (!process.env.OVERWRITE) throw e; - - console.log(`Updated test file: ${expected.loc}`); - fs.writeFileSync(expected.loc, `${expectedCode}\n`); - } + validateFile(outputCode, expected.loc, expectedCode); - if (actualCode) { + if (inputCode) { expect(expected.loc).toMatch( result.sourceType === "module" ? /\.mjs$/ : /\.js$/, ); } } + + if (validateLogs) { + validateFile(normalizeOutput(actualLogs.stdout), stdout.loc, stdout.code); + validateFile(normalizeOutput(actualLogs.stderr), stderr.loc, stderr.code); + } } if (task.sourceMap) { @@ -263,6 +277,26 @@ function run(task) { } } +function validateFile(actualCode, expectedLoc, expectedCode) { + try { + expect(actualCode).toEqualFile({ + filename: expectedLoc, + code: expectedCode, + }); + } catch (e) { + if (!process.env.OVERWRITE) throw e; + + console.log(`Updated test file: ${expectedLoc}`); + fs.writeFileSync(expectedLoc, `${actualCode}\n`); + } +} + +function normalizeOutput(code) { + return code + .trim() + .replace(escapeRegExp(path.resolve(__dirname, "../../../")), ""); +} + const toEqualFile = () => ({ compare: (actual, { filename, code }) => { const pass = actual === code; diff --git a/packages/babel-plugin-proposal-dynamic-import/test/fixtures/systemjs/missing-plugin/options.json b/packages/babel-plugin-proposal-dynamic-import/test/fixtures/systemjs/missing-plugin/options.json index c4fe39793abd..c269a708f8a2 100644 --- a/packages/babel-plugin-proposal-dynamic-import/test/fixtures/systemjs/missing-plugin/options.json +++ b/packages/babel-plugin-proposal-dynamic-import/test/fixtures/systemjs/missing-plugin/options.json @@ -1,4 +1,5 @@ { + "validateLogs": true, "plugins": [ "syntax-dynamic-import", "transform-modules-systemjs", diff --git a/packages/babel-plugin-proposal-dynamic-import/test/fixtures/systemjs/missing-plugin/stderr.txt b/packages/babel-plugin-proposal-dynamic-import/test/fixtures/systemjs/missing-plugin/stderr.txt new file mode 100644 index 000000000000..6a64047d50bc --- /dev/null +++ b/packages/babel-plugin-proposal-dynamic-import/test/fixtures/systemjs/missing-plugin/stderr.txt @@ -0,0 +1,3 @@ +WARNING: Dynamic import() transformation must be enabled using the + @babel/plugin-proposal-dynamic-import plugin. Babel 8 will + no longer transform import() without using that plugin. diff --git a/packages/babel-preset-env/test/fixtures/corejs2/usage-browserslist-config-ignore/options.json b/packages/babel-preset-env/test/fixtures/corejs2/usage-browserslist-config-ignore/options.json index f0e1e2cba61d..d7dca0ca75ef 100644 --- a/packages/babel-preset-env/test/fixtures/corejs2/usage-browserslist-config-ignore/options.json +++ b/packages/babel-preset-env/test/fixtures/corejs2/usage-browserslist-config-ignore/options.json @@ -1,4 +1,5 @@ { + "validateLogs": true, "presets": [ [ "../../../../lib", diff --git a/packages/babel-preset-env/test/fixtures/corejs2/usage-browserslist-config-ignore/stdout.txt b/packages/babel-preset-env/test/fixtures/corejs2/usage-browserslist-config-ignore/stdout.txt new file mode 100644 index 000000000000..61526c5b8070 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/corejs2/usage-browserslist-config-ignore/stdout.txt @@ -0,0 +1,33 @@ +@babel/preset-env: `DEBUG` option + +Using targets: +{ + "chrome": "61", + "edge": "16", + "firefox": "60", + "ios": "10.3", + "opera": "48", + "safari": "10.1" +} + +Using modules transform: false + +Using plugins: + transform-template-literals { "ios":"10.3", "safari":"10.1" } + transform-function-name { "edge":"16" } + transform-dotall-regex { "chrome":"61", "edge":"16", "firefox":"60", "ios":"10.3", "opera":"48", "safari":"10.1" } + transform-unicode-regex { "ios":"10.3", "safari":"10.1" } + transform-parameters { "edge":"16" } + transform-block-scoping { "ios":"10.3", "safari":"10.1" } + transform-async-to-generator { "ios":"10.3", "safari":"10.1" } + proposal-async-generator-functions { "chrome":"61", "edge":"16", "ios":"10.3", "opera":"48", "safari":"10.1" } + proposal-object-rest-spread { "edge":"16", "ios":"10.3", "safari":"10.1" } + proposal-unicode-property-regex { "chrome":"61", "edge":"16", "firefox":"60", "ios":"10.3", "opera":"48", "safari":"10.1" } + proposal-json-strings { "chrome":"61", "edge":"16", "firefox":"60", "ios":"10.3", "opera":"48", "safari":"10.1" } + proposal-optional-catch-binding { "chrome":"61", "edge":"16", "ios":"10.3", "opera":"48", "safari":"10.1" } + transform-named-capturing-groups-regex { "chrome":"61", "edge":"16", "firefox":"60", "ios":"10.3", "opera":"48", "safari":"10.1" } + +Using polyfills with `usage` option: + +[/packages/babel-preset-env/test/fixtures/corejs2/usage-browserslist-config-ignore/input.mjs] Added following core-js polyfill: + web.dom.iterable { "chrome":"61", "edge":"16", "firefox":"60", "ios":"10.3", "opera":"48", "safari":"10.1" } diff --git a/packages/babel-preset-env/test/fixtures/corejs2/usage-remove-babel-polyfill-import/output.mjs b/packages/babel-preset-env/test/fixtures/corejs2/usage-remove-babel-polyfill-import/output.mjs new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/babel-preset-env/test/fixtures/corejs3/usage-browserslist-config-ignore/options.json b/packages/babel-preset-env/test/fixtures/corejs3/usage-browserslist-config-ignore/options.json index 95a82bb5ec7a..ffb21b1f8aa2 100644 --- a/packages/babel-preset-env/test/fixtures/corejs3/usage-browserslist-config-ignore/options.json +++ b/packages/babel-preset-env/test/fixtures/corejs3/usage-browserslist-config-ignore/options.json @@ -1,4 +1,5 @@ { + "validateLogs": true, "presets": [ [ "../../../../lib", diff --git a/packages/babel-preset-env/test/fixtures/corejs3/usage-browserslist-config-ignore/stdout.txt b/packages/babel-preset-env/test/fixtures/corejs3/usage-browserslist-config-ignore/stdout.txt new file mode 100644 index 000000000000..af7e5f8e39c4 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/corejs3/usage-browserslist-config-ignore/stdout.txt @@ -0,0 +1,34 @@ +@babel/preset-env: `DEBUG` option + +Using targets: +{ + "chrome": "61", + "edge": "16", + "firefox": "60", + "ios": "10.3", + "opera": "48", + "safari": "10.1" +} + +Using modules transform: false + +Using plugins: + transform-template-literals { "ios":"10.3", "safari":"10.1" } + transform-function-name { "edge":"16" } + transform-dotall-regex { "chrome":"61", "edge":"16", "firefox":"60", "ios":"10.3", "opera":"48", "safari":"10.1" } + transform-unicode-regex { "ios":"10.3", "safari":"10.1" } + transform-parameters { "edge":"16" } + transform-block-scoping { "ios":"10.3", "safari":"10.1" } + transform-async-to-generator { "ios":"10.3", "safari":"10.1" } + proposal-async-generator-functions { "chrome":"61", "edge":"16", "ios":"10.3", "opera":"48", "safari":"10.1" } + proposal-object-rest-spread { "edge":"16", "ios":"10.3", "safari":"10.1" } + proposal-unicode-property-regex { "chrome":"61", "edge":"16", "firefox":"60", "ios":"10.3", "opera":"48", "safari":"10.1" } + proposal-json-strings { "chrome":"61", "edge":"16", "firefox":"60", "ios":"10.3", "opera":"48", "safari":"10.1" } + proposal-optional-catch-binding { "chrome":"61", "edge":"16", "ios":"10.3", "opera":"48", "safari":"10.1" } + transform-named-capturing-groups-regex { "chrome":"61", "edge":"16", "firefox":"60", "ios":"10.3", "opera":"48", "safari":"10.1" } + +Using polyfills with `usage` option: + +[/packages/babel-preset-env/test/fixtures/corejs3/usage-browserslist-config-ignore/input.mjs] Added following core-js polyfills: + es.array.iterator { "chrome":"61", "opera":"48" } + web.dom-collections.iterator { "chrome":"61", "edge":"16", "ios":"10.3", "opera":"48", "safari":"10.1" } diff --git a/packages/babel-preset-env/test/fixtures/dynamic-import/auto-esm-supported-import-supported/options.json b/packages/babel-preset-env/test/fixtures/dynamic-import/auto-esm-supported-import-supported/options.json index 154ea4199025..65df7ec7a7d3 100644 --- a/packages/babel-preset-env/test/fixtures/dynamic-import/auto-esm-supported-import-supported/options.json +++ b/packages/babel-preset-env/test/fixtures/dynamic-import/auto-esm-supported-import-supported/options.json @@ -1,4 +1,5 @@ { + "validateLogs": true, "caller": { "name": "test-fixture", "supportsStaticESM": true, diff --git a/packages/babel-preset-env/test/fixtures/dynamic-import/auto-esm-supported-import-unsupported/options.json b/packages/babel-preset-env/test/fixtures/dynamic-import/auto-esm-supported-import-unsupported/options.json index c444f60ae955..85b4d7deafad 100644 --- a/packages/babel-preset-env/test/fixtures/dynamic-import/auto-esm-supported-import-unsupported/options.json +++ b/packages/babel-preset-env/test/fixtures/dynamic-import/auto-esm-supported-import-unsupported/options.json @@ -1,4 +1,5 @@ { + "validateLogs": true, "caller": { "name": "test-fixture", "supportsStaticESM": true, diff --git a/packages/babel-preset-env/test/fixtures/dynamic-import/auto-esm-supported-import-unsupported/stderr.txt b/packages/babel-preset-env/test/fixtures/dynamic-import/auto-esm-supported-import-unsupported/stderr.txt new file mode 100644 index 000000000000..f3e3df470839 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/dynamic-import/auto-esm-supported-import-unsupported/stderr.txt @@ -0,0 +1 @@ +Dynamic import can only be supported when transforming ES modules to AMD, CommonJS or SystemJS. Only the parser plugin will be enabled. diff --git a/packages/babel-preset-env/test/fixtures/dynamic-import/auto-esm-unsupported-import-unsupported/options.json b/packages/babel-preset-env/test/fixtures/dynamic-import/auto-esm-unsupported-import-unsupported/options.json index 370b48e76fb2..60d72e63221a 100644 --- a/packages/babel-preset-env/test/fixtures/dynamic-import/auto-esm-unsupported-import-unsupported/options.json +++ b/packages/babel-preset-env/test/fixtures/dynamic-import/auto-esm-unsupported-import-unsupported/options.json @@ -1,4 +1,5 @@ { + "validateLogs": true, "caller": { "name": "test-fixture", "supportsStaticESM": false, diff --git a/packages/babel-preset-env/test/fixtures/dynamic-import/modules-amd/options.json b/packages/babel-preset-env/test/fixtures/dynamic-import/modules-amd/options.json index e34f77e9664c..dad5640aa571 100644 --- a/packages/babel-preset-env/test/fixtures/dynamic-import/modules-amd/options.json +++ b/packages/babel-preset-env/test/fixtures/dynamic-import/modules-amd/options.json @@ -1,3 +1,4 @@ { + "validateLogs": true, "presets": [["env", { "modules": "amd" }]] } diff --git a/packages/babel-preset-env/test/fixtures/dynamic-import/modules-cjs/options.json b/packages/babel-preset-env/test/fixtures/dynamic-import/modules-cjs/options.json index 1b03b37c6f6d..091b0e2a32c6 100644 --- a/packages/babel-preset-env/test/fixtures/dynamic-import/modules-cjs/options.json +++ b/packages/babel-preset-env/test/fixtures/dynamic-import/modules-cjs/options.json @@ -1,3 +1,4 @@ { + "validateLogs": true, "presets": [["env", { "modules": "cjs" }]] } diff --git a/packages/babel-preset-env/test/fixtures/dynamic-import/modules-false/options.json b/packages/babel-preset-env/test/fixtures/dynamic-import/modules-false/options.json index 3c22b6872e58..c7c066f78489 100644 --- a/packages/babel-preset-env/test/fixtures/dynamic-import/modules-false/options.json +++ b/packages/babel-preset-env/test/fixtures/dynamic-import/modules-false/options.json @@ -1,3 +1,4 @@ { + "validateLogs": true, "presets": [["env", { "modules": false }]] } diff --git a/packages/babel-preset-env/test/fixtures/dynamic-import/modules-systemjs/options.json b/packages/babel-preset-env/test/fixtures/dynamic-import/modules-systemjs/options.json index 9be6fdb3812e..206e080b9c53 100644 --- a/packages/babel-preset-env/test/fixtures/dynamic-import/modules-systemjs/options.json +++ b/packages/babel-preset-env/test/fixtures/dynamic-import/modules-systemjs/options.json @@ -1,3 +1,4 @@ { + "validateLogs": true, "presets": [["env", { "modules": "systemjs" }]] } diff --git a/packages/babel-preset-env/test/fixtures/dynamic-import/modules-umd/options.json b/packages/babel-preset-env/test/fixtures/dynamic-import/modules-umd/options.json index da7772e2d584..6315da5c545a 100644 --- a/packages/babel-preset-env/test/fixtures/dynamic-import/modules-umd/options.json +++ b/packages/babel-preset-env/test/fixtures/dynamic-import/modules-umd/options.json @@ -1,3 +1,4 @@ { + "validateLogs": true, "presets": [["env", { "modules": "umd" }]] } diff --git a/packages/babel-preset-env/test/fixtures/dynamic-import/modules-umd/stderr.txt b/packages/babel-preset-env/test/fixtures/dynamic-import/modules-umd/stderr.txt new file mode 100644 index 000000000000..f3e3df470839 --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/dynamic-import/modules-umd/stderr.txt @@ -0,0 +1 @@ +Dynamic import can only be supported when transforming ES modules to AMD, CommonJS or SystemJS. Only the parser plugin will be enabled. diff --git a/packages/babel-preset-env/test/fixtures/preset-options/safari-10_3-block-scoped/options.json b/packages/babel-preset-env/test/fixtures/preset-options/safari-10_3-block-scoped/options.json index 7eca9afc37fe..daee94dc032e 100644 --- a/packages/babel-preset-env/test/fixtures/preset-options/safari-10_3-block-scoped/options.json +++ b/packages/babel-preset-env/test/fixtures/preset-options/safari-10_3-block-scoped/options.json @@ -1,4 +1,5 @@ { + "validateLogs": true, "presets": [ [ "../../../../lib", diff --git a/packages/babel-preset-env/test/fixtures/preset-options/safari-10_3-block-scoped/stdout.txt b/packages/babel-preset-env/test/fixtures/preset-options/safari-10_3-block-scoped/stdout.txt new file mode 100644 index 000000000000..494481624f2f --- /dev/null +++ b/packages/babel-preset-env/test/fixtures/preset-options/safari-10_3-block-scoped/stdout.txt @@ -0,0 +1,24 @@ +@babel/preset-env: `DEBUG` option + +Using targets: +{ + "safari": "10" +} + +Using modules transform: auto + +Using plugins: + transform-template-literals { "safari":"10" } + transform-dotall-regex { "safari":"10" } + transform-unicode-regex { "safari":"10" } + transform-block-scoping { "safari":"10" } + transform-exponentiation-operator { "safari":"10" } + transform-async-to-generator { "safari":"10" } + proposal-async-generator-functions { "safari":"10" } + proposal-object-rest-spread { "safari":"10" } + proposal-unicode-property-regex { "safari":"10" } + proposal-json-strings { "safari":"10" } + proposal-optional-catch-binding { "safari":"10" } + transform-named-capturing-groups-regex { "safari":"10" } + +Using polyfills: No polyfills were added, since the `useBuiltIns` option was not set.