/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at . */
"use strict";
// This test can be really slow on debug platforms and should be split.
requestLongerTimeout(30);
// Tests loading sourcemapped sources for Babel's compile output.
/* eslint-disable no-inline-comments */
const ACTIVE_TARGETS = new Set([
// "webpack3",
"webpack3-babel6",
// "webpack3-babel7",
// "webpack4",
// "webpack4-babel6",
// "webpack4-babel7",
"rollup",
// "rollup-babel6",
// "rollup-babel7",
"parcel",
]);
const ACTIVE_FIXTURES = [
testBabelBindingsWithFlow,
testBabelFlowtypeBindings,
testEvalMaps,
testForOf,
testShadowedVars,
testLineStartBindingsES6,
testThisArgumentsBindings,
testClasses,
testForLoops,
testFunctions,
testSwitches,
testTryCatches,
testLexAndNonlex,
testTypescriptClasses,
testTypeModule,
testTypeScriptCJS,
testOutOfOrderDeclarationsCJS,
testModulesCJS,
testWebpackLineMappings,
testWebpackFunctions,
testESModules,
testESModulesCJS,
testESModulesES6,
];
async function breakpointScopes(
dbg,
target,
fixture,
{ line, column },
scopes
) {
if (!ACTIVE_TARGETS.has(target)) {
return;
}
const extension = fixture == "typescript-classes" ? "ts" : "js";
const url = `${target}://./${fixture}/input.${extension}`;
const fnName = pairToFnName(target, fixture);
await invokeWithBreakpoint(dbg, fnName, url, { line, column }, async () => {
await assertScopes(dbg, scopes);
});
ok(true, `Ran tests for ${fixture} at line ${line} column ${column}`);
}
add_task(async function () {
await pushPref("devtools.debugger.map-scopes-enabled", true);
const dbg = await initDebugger("doc-sourcemapped.html");
for (const fixture of ACTIVE_FIXTURES) {
await fixture(dbg);
}
});
function targetToFlags(target) {
const isRollup = target.startsWith("rollup");
const isWebpack = target.startsWith("webpack");
const isParcel = target.startsWith("parcel");
const isWebpack4 = target.startsWith("webpack4");
// Rollup removes lots of things as dead code, so they are marked as optimized out.
const rollupOptimized = isRollup ? "(optimized away)" : null;
const webpackImportGetter = isWebpack ? "Getter" : null;
const webpack4ImportGetter = isWebpack4 ? "Getter" : null;
const maybeLineStart = col => col;
const defaultExport = isWebpack4
? name => `${name}()`
: name => [name, "(optimized away)"];
return {
isRollup,
isWebpack,
isParcel,
rollupOptimized,
webpackImportGetter,
webpack4ImportGetter,
maybeLineStart,
defaultExport,
};
}
function pairToFnName(target, fixture) {
return `${target}-${fixture}`.replace(/-([a-z])/g, (s, c) => c.toUpperCase());
}
function runtimeFunctionName(target, fixture) {
// Webpack 4 appears to output it's bundles in such a way that Spidermonkey
if (target === "webpack4") {
return "js";
}
return pairToFnName(target, fixture);
}
function webpackModule(target, fixture, optimizedOut) {
return [
runtimeFunctionName(target, fixture),
["__webpack_exports__", optimizedOut ? "(optimized away)" : "{\u2026}"],
optimizedOut
? ["__webpack_require__", "(optimized away)"]
: "__webpack_require__()",
["arguments", optimizedOut ? "(unavailable)" : "Arguments"],
];
}
async function testBabelBindingsWithFlow(dbg) {
// Flow is not available on the non-babel builds.
for (const target of [
"parcel",
"rollup-babel6",
"rollup-babel7",
"webpack3-babel6",
"webpack3-babel7",
"webpack4-babel6",
"webpack4-babel7",
]) {
const { webpackImportGetter } = targetToFlags(target);
await breakpointScopes(
dbg,
target,
"babel-bindings-with-flow",
{ line: 9, column: 3 },
[
"root",
["value", '"a-named"'],
"Module",
["aNamed", webpackImportGetter || '"a-named"'],
"root()",
]
);
}
}
async function testBabelFlowtypeBindings(dbg) {
// Flow is not available on the non-babel builds.
for (const target of [
"parcel",
"rollup-babel6",
"rollup-babel7",
"webpack3-babel6",
"webpack3-babel7",
"webpack4-babel6",
"webpack4-babel7",
]) {
const { webpackImportGetter } = targetToFlags(target);
await breakpointScopes(
dbg,
target,
"babel-flowtype-bindings",
{ line: 9, column: 3 },
[
"Module",
["aConst", '"a-const"'],
["Four", webpackImportGetter || '"one"'],
"root()",
]
);
}
}
async function testEvalMaps(dbg) {
// At times, this test has been a bit flakey due to the inlined source map
// never loading. I'm not sure what causes that. If we observe flakiness in CI,
// we should consider disabling this test for now.
for (const target of ["webpack3", "webpack4"]) {
const { defaultExport } = targetToFlags(target);
await breakpointScopes(dbg, target, "eval-maps", { line: 14, column: 5 }, [
"Block",
["", "Window"],
["three", "5"],
["two", "4"],
"Block",
["three", "3"],
["two", "2"],
"Block",
["arguments", "Arguments"],
["one", "1"],
...webpackModule(target, "eval-maps", true /* optimized out */),
["module", "(optimized away)"],
defaultExport("root"),
]);
}
for (const target of [
"parcel",
"rollup",
"rollup-babel6",
"rollup-babel7",
"webpack3-babel6",
"webpack3-babel7",
"webpack4-babel6",
"webpack4-babel7",
]) {
const { defaultExport, rollupOptimized, maybeLineStart } =
targetToFlags(target);
await breakpointScopes(
dbg,
target,
"eval-maps",
{ line: 14, column: maybeLineStart(5) },
[
"Block",
["three", "5"],
["two", "4"],
"Function Body",
["three", rollupOptimized || "3"],
["two", rollupOptimized || "2"],
"root",
["one", "1"],
"Module",
defaultExport("root"),
]
);
}
}
async function testForOf(dbg) {
for (const target of ["webpack3", "webpack4"]) {
const { defaultExport } = targetToFlags(target);
await breakpointScopes(dbg, target, "for-of", { line: 5, column: 1 }, [
"Block",
["", "Window"],
["x", "1"],
"Block",
["arguments", "Arguments"],
"class doThing",
"Block",
"mod",
...webpackModule(target, "for-of", true /* optimizedOut */),
defaultExport("forOf"),
"module",
]);
}
for (const target of [
"parcel",
"rollup",
"rollup-babel6",
"rollup-babel7",
"webpack3-babel6",
"webpack3-babel7",
"webpack4-babel6",
"webpack4-babel7",
]) {
const { defaultExport, maybeLineStart } = targetToFlags(target);
await breakpointScopes(
dbg,
target,
"for-of",
{ line: 5, column: maybeLineStart(5) },
[
"For",
["x", "1"],
"forOf",
"doThing(arg)",
"Module",
defaultExport("forOf"),
"mod",
]
);
}
}
async function testShadowedVars(dbg) {
for (const target of ["webpack3", "webpack4"]) {
await breakpointScopes(
dbg,
target,
"shadowed-vars",
{ line: 18, column: 1 },
[
"Block",
["", "Window"],
["aConst", '"const3"'],
["aLet", '"let3"'],
"Block",
["aConst", '"const2"'],
["aLet", '"let2"'],
"class Outer",
"Block",
["aConst", '"const1"'],
["aLet", '"let1"'],
"class Outer",
"Block",
["arguments", "Arguments"],
["aVar", '"var3"'],
...webpackModule(target, "shadowed-vars", true /* optimizedOut */),
["module", "(optimized away)"],
]
);
}
for (const target of [
"parcel",
"rollup",
"rollup-babel6",
"rollup-babel7",
"webpack3-babel6",
"webpack3-babel7",
"webpack4-babel6",
"webpack4-babel7",
]) {
const { isParcel, rollupOptimized, maybeLineStart } = targetToFlags(target);
await breakpointScopes(
dbg,
target,
"shadowed-vars",
{ line: 18, column: maybeLineStart(7) },
[
"Block",
["aConst", rollupOptimized || '"const3"'],
["aLet", rollupOptimized || '"let3"'],
"Block",
["aConst", rollupOptimized || '"const2"'],
["aLet", rollupOptimized || '"let2"'],
// eslint-disable-next-line no-nested-ternary
isParcel
? "Outer()"
: rollupOptimized
? ["Outer", rollupOptimized]
: "Outer:_Outer()",
"Function Body",
["aConst", rollupOptimized || '"const1"'],
["aLet", rollupOptimized || '"let1"'],
// eslint-disable-next-line no-nested-ternary
rollupOptimized
? ["Outer", rollupOptimized]
: isParcel
? "class Outer"
: "Outer()",
"default",
["aVar", rollupOptimized || '"var3"'],
]
);
}
}
async function testLineStartBindingsES6(dbg) {
for (const target of ["webpack3", "webpack4"]) {
await breakpointScopes(
dbg,
target,
"line-start-bindings-es6",
{ line: 19, column: 1 },
[
"Block",
["", "{\u2026}"],
["one", "1"],
["two", "2"],
"Block",
["arguments", "Arguments"],
"Block",
["aFunc", "(optimized away)"],
["arguments", "(unavailable)"],
...webpackModule(
target,
"line-start-bindings-es6",
true /* optimizedOut */
),
["module", "(optimized away)"],
"root()",
]
);
}
for (const target of [
"parcel",
"rollup",
"rollup-babel6",
"rollup-babel7",
"webpack3-babel6",
"webpack3-babel7",
"webpack4-babel6",
"webpack4-babel7",
]) {
const { rollupOptimized, maybeLineStart } = targetToFlags(target);
await breakpointScopes(
dbg,
target,
"line-start-bindings-es6",
{ line: 19, column: maybeLineStart(5) },
[
"Function Body",
["", "{\u2026}"],
["one", rollupOptimized || "1"],
["two", rollupOptimized || "2"],
"root",
["aFunc", "(optimized away)"],
"Module",
"root()",
]
);
}
}
async function testThisArgumentsBindings(dbg) {
for (const target of ["webpack3", "webpack4"]) {
await breakpointScopes(
dbg,
target,
"this-arguments-bindings",
{ line: 4, column: 1 },
[
"Block",
["", '"this-value"'],
["arrow", "(uninitialized)"],
"fn",
["arg", '"arg-value"'],
["arguments", "Arguments"],
"root",
["arguments", "Arguments"],
"fn()",
...webpackModule(
target,
"this-arguments-bindings",
true /* optimizedOut */
),
["module", "(optimized away)"],
"root()",
]
);
await breakpointScopes(
dbg,
target,
"this-arguments-bindings",
{ line: 8, column: 1 },
[
"Block",
["", '"this-value"'],
["argArrow", '"arrow-arg"'],
["arguments", "Arguments"],
"Block",
["arrow", "(optimized away)"],
"fn",
["arg", '"arg-value"'],
["arguments", "Arguments"],
"root",
["arguments", "Arguments"],
"fn()",
...webpackModule(
target,
"this-arguments-bindings",
true /* optimizedOut */
),
["module", "(optimized away)"],
"root()",
]
);
}
for (const target of [
"parcel",
"rollup",
"rollup-babel6",
"rollup-babel7",
"webpack3-babel6",
"webpack3-babel7",
"webpack4-babel6",
"webpack4-babel7",
]) {
const { isParcel, maybeLineStart } = targetToFlags(target);
await breakpointScopes(
dbg,
target,
"this-arguments-bindings",
{ line: 4, column: maybeLineStart(5) },
[
"Function Body",
["", '"this-value"'],
[
"arrow",
target === "rollup" || isParcel ? "(uninitialized)" : "undefined",
],
"fn",
["arg", '"arg-value"'],
["arguments", "Arguments"],
"root",
"fn(arg)",
"Module",
"root()",
]
);
await breakpointScopes(
dbg,
target,
"this-arguments-bindings",
{ line: 8, column: maybeLineStart(7) },
[
"arrow",
["", '"this-value"'],
["argArrow", '"arrow-arg"'],
"Function Body",
target === "rollup" || isParcel
? ["arrow", "(optimized away)"]
: "arrow(argArrow)",
"fn",
["arg", '"arg-value"'],
["arguments", "Arguments"],
"root",
"fn(arg)",
"Module",
"root()",
]
);
}
}
async function testClasses(dbg) {
for (const target of ["webpack3", "webpack4"]) {
await breakpointScopes(dbg, target, "classes", { line: 6, column: 1 }, [
"Block",
["", "{}"],
["arguments", "Arguments"],
"Block",
["Thing", "(optimized away)"],
"Block",
"Another()",
["one", "1"],
"Thing()",
"Block",
["arguments", "(unavailable)"],
...webpackModule(target, "classes", true /* optimizedOut */),
["module", "(optimized away)"],
"root()",
]);
await breakpointScopes(dbg, target, "classes", { line: 16, column: 1 }, [
"Block",
["", "{}"],
["three", "3"],
["two", "2"],
"Block",
["arguments", "Arguments"],
"Block",
"Another()",
"Block",
"Another()",
["one", "1"],
"Thing()",
"Block",
["arguments", "(unavailable)"],
...webpackModule(target, "classes", true /* optimizedOut */),
["module", "(optimized away)"],
"root()",
]);
}
for (const target of [
"parcel",
"rollup",
"rollup-babel6",
"rollup-babel7",
"webpack3-babel6",
"webpack3-babel7",
"webpack4-babel6",
"webpack4-babel7",
]) {
const { isParcel, rollupOptimized, maybeLineStart } = targetToFlags(target);
await breakpointScopes(
dbg,
target,
"classes",
{ line: 6, column: maybeLineStart(7) },
[
"Class",
target === "rollup" || isParcel
? ["Thing", "(optimized away)"]
: "Thing()",
"Function Body",
target === "webpack3-babel6" ? "Another()" : "class Another",
"one",
target === "rollup" || isParcel
? ["Thing", "(optimized away)"]
: "Thing()",
"Module",
"root()",
]
);
await breakpointScopes(
dbg,
target,
"classes",
{ line: 16, column: maybeLineStart(7) },
[
"Function Body",
["three", rollupOptimized || "3"],
["two", rollupOptimized || "2"],
"Class",
target === "webpack3-babel6" ? "Another()" : "class Another",
"Function Body",
target === "webpack3-babel6" ? "Another()" : "class Another",
["one", "1"],
target === "webpack3-babel6" ? "Thing()" : "class Thing",
"Module",
"root()",
]
);
}
}
async function testForLoops(dbg) {
for (const target of ["webpack3", "webpack4"]) {
await breakpointScopes(dbg, target, "for-loops", { line: 5, column: 1 }, [
"Block",
["", "Window"],
["i", "1"],
"Block",
["i", "0"],
"Block",
["arguments", "Arguments"],
...webpackModule(target, "for-loops", true /* optimizedOut */),
["module", "(optimized away)"],
"root()",
]);
await breakpointScopes(dbg, target, "for-loops", { line: 9, column: 1 }, [
"Block",
["", "Window"],
["i", '"2"'],
"Block",
["i", "0"],
"Block",
["arguments", "Arguments"],
...webpackModule(target, "for-loops", true /* optimizedOut */),
["module", "(optimized away)"],
"root()",
]);
await breakpointScopes(dbg, target, "for-loops", { line: 13, column: 1 }, [
"Block",
["", "Window"],
["i", "3"],
"Block",
["i", "0"],
"Block",
["arguments", "Arguments"],
...webpackModule(target, "for-loops", true /* optimizedOut */),
["module", "(optimized away)"],
"root()",
]);
}
for (const target of [
"parcel",
"rollup",
"rollup-babel6",
"rollup-babel7",
"webpack3-babel6",
"webpack3-babel7",
"webpack4-babel6",
"webpack4-babel7",
]) {
const { rollupOptimized, maybeLineStart } = targetToFlags(target);
await breakpointScopes(
dbg,
target,
"for-loops",
{ line: 5, column: maybeLineStart(5) },
[
"For",
["i", "1"],
"Function Body",
["i", rollupOptimized || "0"],
"Module",
"root()",
]
);
await breakpointScopes(
dbg,
target,
"for-loops",
{ line: 9, column: maybeLineStart(5) },
[
"For",
["i", '"2"'],
"Function Body",
["i", rollupOptimized || "0"],
"Module",
"root()",
]
);
await breakpointScopes(
dbg,
target,
"for-loops",
{ line: 13, column: maybeLineStart(5) },
[
"For",
["i", target === "rollup" ? "3" : rollupOptimized || "3"],
"Function Body",
["i", rollupOptimized || "0"],
"Module",
"root()",
]
);
}
}
async function testFunctions(dbg) {
for (const target of ["webpack3", "webpack4"]) {
await breakpointScopes(dbg, target, "functions", { line: 6, column: 1 }, [
"Block",
["", "(optimized away)"],
["arguments", "Arguments"],
["p3", "undefined"],
"Block",
"arrow()",
"inner",
["arguments", "Arguments"],
["p2", "undefined"],
"Block",
"inner(p2)",
"Block",
["inner", "(optimized away)"],
"decl",
["arguments", "Arguments"],
["p1", "undefined"],
"root",
["arguments", "Arguments"],
"decl()",
...webpackModule(target, "functions", true /* optimizedOut */),
["module", "(optimized away)"],
"root()",
]);
}
for (const target of [
"parcel",
"rollup",
"rollup-babel6",
"rollup-babel7",
"webpack3-babel6",
"webpack3-babel7",
"webpack4-babel6",
"webpack4-babel7",
]) {
const { isParcel, maybeLineStart } = targetToFlags(target);
await breakpointScopes(
dbg,
target,
"functions",
{ line: 6, column: maybeLineStart(9) },
[
"arrow",
["p3", "undefined"],
"Function Body",
"arrow(p3)",
"inner",
["p2", "undefined"],
"Function Expression",
"inner(p2)",
"Function Body",
target === "rollup" || isParcel
? ["inner", "(optimized away)"]
: "inner(p2)",
"decl",
["p1", "undefined"],
"root",
"decl(p1)",
"Module",
"root()",
]
);
}
}
async function testSwitches(dbg) {
for (const target of ["webpack3", "webpack4"]) {
await breakpointScopes(dbg, target, "switches", { line: 7, column: 1 }, [
"Block",
["", "Window"],
["val", "2"],
"Block",
["val", "1"],
"Block",
["arguments", "Arguments"],
...webpackModule(target, "switches", true /* optimizedOut */),
["module", "(optimized away)"],
"root()",
]);
await breakpointScopes(dbg, target, "switches", { line: 10, column: 1 }, [
"Block",
["", "Window"],
["val", "3"],
"Block",
["val", "2"],
"Block",
["val", "1"],
"Block",
["arguments", "Arguments"],
...webpackModule(target, "switches", true /* optimizedOut */),
["module", "(optimized away)"],
"root()",
]);
}
for (const target of [
"parcel",
"rollup",
"rollup-babel6",
"rollup-babel7",
"webpack3-babel6",
"webpack3-babel7",
"webpack4-babel6",
"webpack4-babel7",
]) {
const { rollupOptimized, maybeLineStart } = targetToFlags(target);
await breakpointScopes(
dbg,
target,
"switches",
{ line: 7, column: maybeLineStart(7) },
[
"Switch",
["val", rollupOptimized || "2"],
"Function Body",
["val", rollupOptimized || "1"],
"Module",
"root()",
]
);
await breakpointScopes(
dbg,
target,
"switches",
{ line: 10, column: maybeLineStart(7) },
[
"Block",
["val", rollupOptimized || "3"],
"Switch",
["val", rollupOptimized || "2"],
"Function Body",
["val", rollupOptimized || "1"],
"Module",
"root()",
]
);
}
}
async function testTryCatches(dbg) {
for (const target of ["webpack3", "webpack4"]) {
await breakpointScopes(dbg, target, "try-catches", { line: 8, column: 1 }, [
"Block",
["", "Window"],
["two", "2"],
"Block",
["err", '"AnError"'],
"Block",
["one", "1"],
"Block",
["arguments", "Arguments"],
...webpackModule(target, "try-catches", true /* optimizedOut */),
["module", "(optimized away)"],
"root()",
]);
}
for (const target of [
"parcel",
"rollup",
"rollup-babel6",
"rollup-babel7",
"webpack3-babel6",
"webpack3-babel7",
"webpack4-babel6",
"webpack4-babel7",
]) {
const { rollupOptimized, maybeLineStart } = targetToFlags(target);
await breakpointScopes(
dbg,
target,
"try-catches",
{ line: 8, column: maybeLineStart(5) },
[
"Block",
["two", rollupOptimized || "2"],
"Catch",
["err", '"AnError"'],
"Function Body",
["one", rollupOptimized || "1"],
"Module",
"root()",
]
);
}
}
async function testLexAndNonlex(dbg) {
for (const target of ["webpack3", "webpack4"]) {
await breakpointScopes(
dbg,
target,
"lex-and-nonlex",
{ line: 3, column: 1 },
[
"Block",
["", "undefined"],
["arguments", "Arguments"],
"Block",
"class Thing",
"Block",
["arguments", "(unavailable)"],
["someHelper", "(optimized away)"],
...webpackModule(target, "lex-and-nonlex", true /* optimizedOut */),
["module", "(optimized away)"],
"root()",
]
);
}
for (const target of [
"parcel",
"rollup",
"rollup-babel6",
"rollup-babel7",
"webpack3-babel6",
"webpack3-babel7",
"webpack4-babel6",
"webpack4-babel7",
]) {
const { isParcel, maybeLineStart } = targetToFlags(target);
await breakpointScopes(
dbg,
target,
"lex-and-nonlex",
{ line: 3, column: maybeLineStart(5) },
[
"Function Body",
target === "rollup" || target === "parcel" ? "class Thing" : "Thing()",
"root",
target === "rollup" || isParcel
? ["someHelper", "(optimized away)"]
: "someHelper()",
"Module",
"root()",
]
);
}
}
async function testTypescriptClasses(dbg) {
// Typescript is not available on the Babel builds.
for (const target of ["parcel", "webpack3", "webpack4", "rollup"]) {
const { isRollup, isParcel, rollupOptimized } = targetToFlags(target);
await breakpointScopes(
dbg,
target,
"typescript-classes",
{ line: 50, column: 3 },
[
"Module",
"AnotherThing()",
"AppComponent()",
"decoratorFactory(opts)",
rollupOptimized ? ["def", rollupOptimized] : "def()",
rollupOptimized
? ["ExportedOther", rollupOptimized]
: "ExportedOther()",
rollupOptimized
? ["ExpressionClass", rollupOptimized]
: "ExpressionClass:Foo()",
"fn(arg)",
// Rollup optimizes out the 'ns' reference here, but when it does, it leave a mapping
// pointed at a location that is super weird, so it ends up being unmapped instead
// be "(optimized out)".
// Parcel converts the "ns;" mapping into a single full-line mapping, for some reason.
// That may have to do with https://github.com/parcel-bundler/parcel/pull/1755#discussion_r205584159
// though it's not 100% clear.
["ns", isRollup || isParcel ? "(unmapped)" : "{\u2026}"],
"SubDecl()",
"SubVar:SubExpr()",
]
);
}
}
async function testTypeModule(dbg) {
for (const target of ["webpack3", "webpack4"]) {
await breakpointScopes(dbg, target, "type-module", { line: 7, column: 1 }, [
"Block",
["", "Window"],
["arguments", "Arguments"],
"Block",
["alsoModuleScoped", "2"],
...webpackModule(target, "type-module", true /* optimizedOut */),
["module", "(optimized away)"],
["moduleScoped", "1"],
"thirdModuleScoped()",
]);
}
for (const target of [
"parcel",
"rollup",
"rollup-babel6",
"rollup-babel7",
"webpack3-babel6",
"webpack3-babel7",
"webpack4-babel6",
"webpack4-babel7",
]) {
const { maybeLineStart } = targetToFlags(target);
await breakpointScopes(
dbg,
target,
"type-module",
{ line: 7, column: maybeLineStart(3) },
[
"Module",
["alsoModuleScoped", "2"],
["moduleScoped", "1"],
"thirdModuleScoped()",
]
);
}
}
async function testTypeScriptCJS(dbg) {
for (const target of ["webpack3", "webpack4"]) {
await breakpointScopes(
dbg,
target,
"type-script-cjs",
{ line: 7, column: 1 },
[
"Block",
["", "Window"],
["arguments", "Arguments"],
"Block",
"alsoModuleScopes",
runtimeFunctionName(target, "type-script-cjs"),
["arguments", "(unavailable)"],
["exports", "(optimized away)"],
["module", "(optimized away)"],
"moduleScoped",
"nonModules",
"thirdModuleScoped",
]
);
}
// CJS does not work on Rollup.
for (const target of [
"parcel",
"webpack3-babel6",
"webpack3-babel7",
"webpack4-babel6",
"webpack4-babel7",
]) {
await breakpointScopes(
dbg,
target,
"type-script-cjs",
{ line: 7, column: 3 },
[
"Module",
"alsoModuleScopes",
"moduleScoped",
"nonModules",
"thirdModuleScoped",
]
);
}
}
async function testOutOfOrderDeclarationsCJS(dbg) {
// CJS does not work on Rollup.
for (const target of [
"parcel",
"webpack3-babel6",
"webpack3-babel7",
"webpack4-babel6",
"webpack4-babel7",
]) {
await breakpointScopes(
dbg,
target,
"out-of-order-declarations-cjs",
{ line: 8, column: 5 },
[
"callback",
"fn(inner)",
["val", "undefined"],
"root",
["callback", "(optimized away)"],
["fn", "(optimized away)"],
["val", "(optimized away)"],
"Module",
// This value is currently optimized away, which isn't 100% accurate.
// Because import declarations is the last thing in the file, our current
// logic doesn't cover _both_ 'var' statements that it generates,
// making us use the first, optimized-out binding. Given that imports
// are almost never the last thing in a file though, this is probably not
// a huge deal for now.
[
"aDefault",
target.match(/webpack(3|4)-babel7/)
? '"a-default"'
: "(optimized away)",
],
["root", "(optimized away)"],
["val", "(optimized away)"],
]
);
}
}
async function testModulesCJS(dbg) {
for (const target of ["webpack3", "webpack4"]) {
await breakpointScopes(dbg, target, "modules-cjs", { line: 7, column: 1 }, [
"Block",
["", "Window"],
["arguments", "Arguments"],
"Block",
["alsoModuleScoped", "2"],
runtimeFunctionName(target, "modules-cjs"),
["arguments", "(unavailable)"],
["exports", "(optimized away)"],
["module", "(optimized away)"],
["moduleScoped", "1"],
"thirdModuleScoped()",
]);
}
// CJS does not work on Rollup.
for (const target of [
"parcel",
"webpack3-babel6",
"webpack3-babel7",
"webpack4-babel6",
"webpack4-babel7",
]) {
await breakpointScopes(dbg, target, "modules-cjs", { line: 7, column: 3 }, [
"Module",
["alsoModuleScoped", "2"],
["moduleScoped", "1"],
"thirdModuleScoped()",
]);
}
}
async function testWebpackLineMappings(dbg) {
await breakpointScopes(
dbg,
"webpack3",
"webpack-line-mappings",
{ line: 11, column: 1 },
[
"Block",
["", '"this-value"'],
["arg", '"arg-value"'],
["arguments", "Arguments"],
["inner", "undefined"],
"Block",
["someName", "(optimized away)"],
"Block",
["two", "2"],
"Block",
["one", "1"],
"root",
["arguments", "Arguments"],
"fn:someName()",
runtimeFunctionName("webpack3", "webpack-line-mappings"),
["__webpack_exports__", "(optimized away)"],
["__WEBPACK_IMPORTED_MODULE_0__src_mod1__", "{\u2026}"],
["__webpack_require__", "(optimized away)"],
["arguments", "(unavailable)"],
["module", "(optimized away)"],
"root()",
]
);
await breakpointScopes(
dbg,
"webpack4",
"webpack-line-mappings",
{ line: 11, column: 1 },
[
"Block",
["", '"this-value"'],
["arg", '"arg-value"'],
["arguments", "Arguments"],
["inner", "undefined"],
"Block",
["someName", "(optimized away)"],
"Block",
["two", "2"],
"Block",
["one", "1"],
"root",
["arguments", "Arguments"],
"fn:someName()",
runtimeFunctionName("webpack4", "webpack-line-mappings"),
["__webpack_exports__", "(optimized away)"],
["__webpack_require__", "(optimized away)"],
["_src_mod1__WEBPACK_IMPORTED_MODULE_0__", "{\u2026}"],
["arguments", "(unavailable)"],
["module", "(optimized away)"],
"root()",
]
);
}
async function testWebpackFunctions(dbg) {
for (const target of ["webpack3", "webpack4"]) {
const { defaultExport } = targetToFlags(target);
await breakpointScopes(
dbg,
target,
"webpack-functions",
{ line: 4, column: 1 },
[
"Block",
["", "{\u2026}"],
["arguments", "Arguments"],
["x", "4"],
runtimeFunctionName(target, "webpack-functions"),
["__webpack_exports__", "(optimized away)"],
["__webpack_require__", "(optimized away)"],
["arguments", "(unavailable)"],
["module", "{\u2026}"],
defaultExport("root"),
]
);
}
}
async function testESModules(dbg) {
await breakpointScopes(
dbg,
"webpack3",
"esmodules",
{ line: 20, column: 1 },
[
"Block",
["", "Window"],
["arguments", "Arguments"],
runtimeFunctionName("webpack3", "esmodules"),
"__webpack_exports__",
"__WEBPACK_IMPORTED_MODULE_0__src_mod1__",
"__WEBPACK_IMPORTED_MODULE_1__src_mod2__",
"__WEBPACK_IMPORTED_MODULE_10__src_optimized_out__",
"__WEBPACK_IMPORTED_MODULE_2__src_mod3__",
"__WEBPACK_IMPORTED_MODULE_3__src_mod4__",
"__WEBPACK_IMPORTED_MODULE_4__src_mod5__",
"__WEBPACK_IMPORTED_MODULE_5__src_mod6__",
"__WEBPACK_IMPORTED_MODULE_6__src_mod7__",
"__WEBPACK_IMPORTED_MODULE_7__src_mod9__",
"__WEBPACK_IMPORTED_MODULE_8__src_mod10__",
"__WEBPACK_IMPORTED_MODULE_9__src_mod11__",
"__webpack_require__",
"arguments",
"example",
"module",
"root()",
]
);
await breakpointScopes(
dbg,
"webpack4",
"esmodules",
{ line: 20, column: 1 },
[
"Block",
["", "Window"],
["arguments", "Arguments"],
runtimeFunctionName("webpack4", "esmodules"),
"__webpack_exports__",
"__webpack_require__",
"_src_mod1__WEBPACK_IMPORTED_MODULE_0__",
"_src_mod10__WEBPACK_IMPORTED_MODULE_8__",
"_src_mod11__WEBPACK_IMPORTED_MODULE_9__",
"_src_mod2__WEBPACK_IMPORTED_MODULE_1__",
"_src_mod3__WEBPACK_IMPORTED_MODULE_2__",
"_src_mod4__WEBPACK_IMPORTED_MODULE_3__",
"_src_mod5__WEBPACK_IMPORTED_MODULE_4__",
"_src_mod6__WEBPACK_IMPORTED_MODULE_5__",
"_src_mod7__WEBPACK_IMPORTED_MODULE_6__",
"_src_mod9__WEBPACK_IMPORTED_MODULE_7__",
"_src_optimized_out__WEBPACK_IMPORTED_MODULE_10__",
"arguments",
"example()",
"module",
"root()",
]
);
for (const target of [
"parcel",
"rollup",
"webpack3-babel6",
"webpack3-babel7",
"webpack4-babel6",
"webpack4-babel7",
]) {
const { defaultExport, webpackImportGetter, maybeLineStart } =
targetToFlags(target);
await breakpointScopes(
dbg,
target,
"esmodules",
{ line: 20, column: maybeLineStart(3) },
[
"Module",
["aDefault", '"a-default"'],
["aDefault2", '"a-default2"'],
["aDefault3", '"a-default3"'],
["anAliased", webpackImportGetter || '"an-original"'],
["anAliased2", webpackImportGetter || '"an-original2"'],
["anAliased3", webpackImportGetter || '"an-original3"'],
["aNamed", webpackImportGetter || '"a-named"'],
["aNamed2", webpackImportGetter || '"a-named2"'],
["aNamed3", webpackImportGetter || '"a-named3"'],
["aNamespace", "{\u2026}"],
["anotherNamed", webpackImportGetter || '"a-named"'],
["anotherNamed2", webpackImportGetter || '"a-named2"'],
["anotherNamed3", webpackImportGetter || '"a-named3"'],
defaultExport("example"),
["optimizedOut", "(optimized away)"],
"root()",
]
);
}
for (const target of ["rollup-babel6", "rollup-babel7"]) {
// This test currently bails out because Babel does not map function calls
// fully and includes the () of the call in the range of the identifier.
// this means that Rollup, has to map locations for calls to imports,
// it can fail. This will be addressed in Babel eventually.
await breakpointScopes(dbg, target, "esmodules", { line: 20, column: 3 }, [
"root",
["", "Window"],
["arguments", "Arguments"],
runtimeFunctionName(target, "esmodules"),
["aDefault", '"a-default"'],
["aDefault2", '"a-default2"'],
["aDefault3", '"a-default3"'],
["aNamed", '"a-named"'],
["aNamed$1", "(optimized away)"],
["aNamed2", '"a-named2"'],
["aNamed3", '"a-named3"'],
["aNamespace", "{\u2026}"],
["arguments", "(unavailable)"],
["mod4", "(optimized away)"],
["original", '"an-original"'],
["original$1", '"an-original2"'],
["original$2", '"an-original3"'],
"root()",
]);
}
}
async function testESModulesCJS(dbg) {
await breakpointScopes(
dbg,
"webpack3",
"esmodules-cjs",
{ line: 20, column: 1 },
[
"Block",
["", "Window"],
["arguments", "Arguments"],
runtimeFunctionName("webpack3", "esmodules-cjs"),
"__webpack_exports__",
"__WEBPACK_IMPORTED_MODULE_0__src_mod1__",
"__WEBPACK_IMPORTED_MODULE_1__src_mod2__",
"__WEBPACK_IMPORTED_MODULE_10__src_optimized_out__",
"__WEBPACK_IMPORTED_MODULE_2__src_mod3__",
"__WEBPACK_IMPORTED_MODULE_3__src_mod4__",
"__WEBPACK_IMPORTED_MODULE_4__src_mod5__",
"__WEBPACK_IMPORTED_MODULE_5__src_mod6__",
"__WEBPACK_IMPORTED_MODULE_6__src_mod7__",
"__WEBPACK_IMPORTED_MODULE_7__src_mod9__",
"__WEBPACK_IMPORTED_MODULE_8__src_mod10__",
"__WEBPACK_IMPORTED_MODULE_9__src_mod11__",
"__webpack_require__",
"arguments",
"example",
"module",
"root()",
]
);
await breakpointScopes(
dbg,
"webpack4",
"esmodules-cjs",
{ line: 20, column: 1 },
[
"Block",
["", "Window"],
["arguments", "Arguments"],
runtimeFunctionName("webpack4", "esmodules-cjs"),
"__webpack_exports__",
"__webpack_require__",
"_src_mod1__WEBPACK_IMPORTED_MODULE_0__",
"_src_mod10__WEBPACK_IMPORTED_MODULE_8__",
"_src_mod11__WEBPACK_IMPORTED_MODULE_9__",
"_src_mod2__WEBPACK_IMPORTED_MODULE_1__",
"_src_mod3__WEBPACK_IMPORTED_MODULE_2__",
"_src_mod4__WEBPACK_IMPORTED_MODULE_3__",
"_src_mod5__WEBPACK_IMPORTED_MODULE_4__",
"_src_mod6__WEBPACK_IMPORTED_MODULE_5__",
"_src_mod7__WEBPACK_IMPORTED_MODULE_6__",
"_src_mod9__WEBPACK_IMPORTED_MODULE_7__",
"_src_optimized_out__WEBPACK_IMPORTED_MODULE_10__",
"arguments",
"example()",
"module",
"root()",
]
);
// CJS does not work on Rollup.
for (const target of [
"parcel",
"webpack3-babel6",
"webpack3-babel7",
"webpack4-babel6",
"webpack4-babel7",
]) {
await breakpointScopes(
dbg,
target,
"esmodules-cjs",
{ line: 20, column: 3 },
[
"Module",
["aDefault", '"a-default"'],
["aDefault2", '"a-default2"'],
["aDefault3", '"a-default3"'],
["anAliased", '"an-original"'],
["anAliased2", '"an-original2"'],
["anAliased3", '"an-original3"'],
["aNamed", '"a-named"'],
["aNamed2", '"a-named2"'],
["aNamed3", '"a-named3"'],
["aNamespace", "{\u2026}"],
["anotherNamed", '"a-named"'],
["anotherNamed2", '"a-named2"'],
["anotherNamed3", '"a-named3"'],
["example", "(optimized away)"],
["optimizedOut", "(optimized away)"],
"root()",
]
);
}
}
async function testESModulesES6(dbg) {
await breakpointScopes(
dbg,
"webpack3",
"esmodules-es6",
{ line: 20, column: 1 },
[
"Block",
["", "Window"],
["arguments", "Arguments"],
runtimeFunctionName("webpack3", "esmodules-es6"),
"__webpack_exports__",
"__WEBPACK_IMPORTED_MODULE_0__src_mod1__",
"__WEBPACK_IMPORTED_MODULE_1__src_mod2__",
"__WEBPACK_IMPORTED_MODULE_10__src_optimized_out__",
"__WEBPACK_IMPORTED_MODULE_2__src_mod3__",
"__WEBPACK_IMPORTED_MODULE_3__src_mod4__",
"__WEBPACK_IMPORTED_MODULE_4__src_mod5__",
"__WEBPACK_IMPORTED_MODULE_5__src_mod6__",
"__WEBPACK_IMPORTED_MODULE_6__src_mod7__",
"__WEBPACK_IMPORTED_MODULE_7__src_mod9__",
"__WEBPACK_IMPORTED_MODULE_8__src_mod10__",
"__WEBPACK_IMPORTED_MODULE_9__src_mod11__",
"__webpack_require__",
"arguments",
"example",
"module",
"root()",
]
);
await breakpointScopes(
dbg,
"webpack4",
"esmodules-es6",
{ line: 20, column: 1 },
[
"Block",
["", "Window"],
["arguments", "Arguments"],
runtimeFunctionName("webpack4", "esmodules-es6"),
"__webpack_exports__",
"__webpack_require__",
"_src_mod1__WEBPACK_IMPORTED_MODULE_0__",
"_src_mod10__WEBPACK_IMPORTED_MODULE_8__",
"_src_mod11__WEBPACK_IMPORTED_MODULE_9__",
"_src_mod2__WEBPACK_IMPORTED_MODULE_1__",
"_src_mod3__WEBPACK_IMPORTED_MODULE_2__",
"_src_mod4__WEBPACK_IMPORTED_MODULE_3__",
"_src_mod5__WEBPACK_IMPORTED_MODULE_4__",
"_src_mod6__WEBPACK_IMPORTED_MODULE_5__",
"_src_mod7__WEBPACK_IMPORTED_MODULE_6__",
"_src_mod9__WEBPACK_IMPORTED_MODULE_7__",
"_src_optimized_out__WEBPACK_IMPORTED_MODULE_10__",
"arguments",
"example()",
"module",
"root()",
]
);
for (const target of [
"parcel",
"rollup",
"webpack3-babel6",
"webpack3-babel7",
"webpack4-babel6",
"webpack4-babel7",
]) {
const { defaultExport, webpack4ImportGetter, maybeLineStart } =
targetToFlags(target);
await breakpointScopes(
dbg,
target,
"esmodules-es6",
{ line: 20, column: maybeLineStart(3) },
[
"Module",
["aDefault", '"a-default"'],
["aDefault2", '"a-default2"'],
["aDefault3", '"a-default3"'],
["anAliased", webpack4ImportGetter || '"an-original"'],
["anAliased2", webpack4ImportGetter || '"an-original2"'],
["anAliased3", webpack4ImportGetter || '"an-original3"'],
["aNamed", webpack4ImportGetter || '"a-named"'],
["aNamed2", webpack4ImportGetter || '"a-named2"'],
["aNamed3", webpack4ImportGetter || '"a-named3"'],
["aNamespace", "{\u2026}"],
["anotherNamed", webpack4ImportGetter || '"a-named"'],
["anotherNamed2", webpack4ImportGetter || '"a-named2"'],
["anotherNamed3", webpack4ImportGetter || '"a-named3"'],
defaultExport("example"),
["optimizedOut", "(optimized away)"],
"root()",
]
);
}
for (const target of ["rollup-babel6", "rollup-babel7"]) {
// This test currently bails out because Babel does not map function calls
// fully and includes the () of the call in the range of the identifier.
// this means that Rollup, has to map locations for calls to imports,
// it can fail. This will be addressed in Babel eventually.
await breakpointScopes(
dbg,
target,
"esmodules-es6",
{ line: 20, column: 3 },
[
"root",
["", "Window"],
["arguments", "Arguments"],
"Block",
["aNamed", '"a-named"'],
["aNamed$1", "undefined"],
["aNamed2", '"a-named2"'],
["aNamed3", '"a-named3"'],
["original", '"an-original"'],
["original$1", '"an-original2"'],
["original$2", '"an-original3"'],
runtimeFunctionName(target, "esmodules-es6"),
["aDefault", '"a-default"'],
["aDefault2", '"a-default2"'],
["aDefault3", '"a-default3"'],
["aNamespace", "{\u2026}"],
["arguments", "(unavailable)"],
["mod4", "(optimized away)"],
"root()",
]
);
}
}