Skip to content

Commit

Permalink
Retain reexports in js emit even when they export nothing (#37124)
Browse files Browse the repository at this point in the history
  • Loading branch information
weswigham committed Mar 2, 2020
1 parent 478dbfd commit af4201f
Show file tree
Hide file tree
Showing 29 changed files with 525 additions and 22 deletions.
8 changes: 5 additions & 3 deletions src/compiler/transformers/ts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2859,9 +2859,11 @@ namespace ts {
return undefined;
}

if (!node.exportClause) {
// Elide a star export if the module it references does not export a value.
return compilerOptions.isolatedModules || resolver.moduleExportsSomeValue(node.moduleSpecifier!) ? node : undefined;
if (!node.exportClause || isNamespaceExport(node.exportClause)) {
// never elide `export <whatever> from <whereever>` declarations -
// they should be kept for sideffects/untyped exports, even when the
// type checker doesn't know about any exports
return node;
}

if (!resolver.isValueAliasDeclaration(node)) {
Expand Down
11 changes: 11 additions & 0 deletions tests/baselines/reference/declarationEmitAliasExportStar.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,18 @@ export const thing2 = (param: things.ThingB) => null;
exports.__esModule = true;
//// [things.js]
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (!exports.hasOwnProperty(p)) __createBinding(exports, m, p);
}
exports.__esModule = true;
__exportStar(require("./thingB"), exports);
//// [index.js]
"use strict";
exports.__esModule = true;
Expand Down
2 changes: 2 additions & 0 deletions tests/baselines/reference/es6ExportEqualsInterop.js
Original file line number Diff line number Diff line change
Expand Up @@ -300,6 +300,8 @@ var class_2 = require("class");
__createBinding(exports, class_2, "a", "a9");
var class_module_2 = require("class-module");
__createBinding(exports, class_module_2, "a", "a0");
// export-star
__exportStar(require("interface"), exports);
__exportStar(require("variable"), exports);
__exportStar(require("interface-variable"), exports);
__exportStar(require("module"), exports);
Expand Down
13 changes: 12 additions & 1 deletion tests/baselines/reference/exportStarForValues.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,19 @@ define(["require", "exports"], function (require, exports) {
exports.__esModule = true;
});
//// [file2.js]
define(["require", "exports"], function (require, exports) {
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (!exports.hasOwnProperty(p)) __createBinding(exports, m, p);
}
define(["require", "exports", "file1"], function (require, exports, file1_1) {
"use strict";
exports.__esModule = true;
__exportStar(file1_1, exports);
var x;
});
5 changes: 4 additions & 1 deletion tests/baselines/reference/exportStarForValues10.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ System.register([], function (exports_1, context_1) {
};
});
//// [file2.js]
System.register(["file0"], function (exports_1, context_1) {
System.register(["file0", "file1"], function (exports_1, context_1) {
"use strict";
var x;
var __moduleName = context_1 && context_1.id;
Expand All @@ -49,6 +49,9 @@ System.register(["file0"], function (exports_1, context_1) {
setters: [
function (file0_1_1) {
exportStar_1(file0_1_1);
},
function (file1_1_1) {
exportStar_1(file1_1_1);
}
],
execute: function () {
Expand Down
26 changes: 24 additions & 2 deletions tests/baselines/reference/exportStarForValues2.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,36 @@ define(["require", "exports"], function (require, exports) {
exports.__esModule = true;
});
//// [file2.js]
define(["require", "exports"], function (require, exports) {
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (!exports.hasOwnProperty(p)) __createBinding(exports, m, p);
}
define(["require", "exports", "file1"], function (require, exports, file1_1) {
"use strict";
exports.__esModule = true;
__exportStar(file1_1, exports);
var x = 1;
});
//// [file3.js]
define(["require", "exports"], function (require, exports) {
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (!exports.hasOwnProperty(p)) __createBinding(exports, m, p);
}
define(["require", "exports", "file2"], function (require, exports, file2_1) {
"use strict";
exports.__esModule = true;
__exportStar(file2_1, exports);
var x = 1;
});
53 changes: 49 additions & 4 deletions tests/baselines/reference/exportStarForValues3.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,26 +29,71 @@ define(["require", "exports"], function (require, exports) {
exports.__esModule = true;
});
//// [file2.js]
define(["require", "exports"], function (require, exports) {
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (!exports.hasOwnProperty(p)) __createBinding(exports, m, p);
}
define(["require", "exports", "file1"], function (require, exports, file1_1) {
"use strict";
exports.__esModule = true;
__exportStar(file1_1, exports);
var x = 1;
});
//// [file3.js]
define(["require", "exports"], function (require, exports) {
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (!exports.hasOwnProperty(p)) __createBinding(exports, m, p);
}
define(["require", "exports", "file1"], function (require, exports, file1_1) {
"use strict";
exports.__esModule = true;
__exportStar(file1_1, exports);
var x = 1;
});
//// [file4.js]
define(["require", "exports"], function (require, exports) {
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (!exports.hasOwnProperty(p)) __createBinding(exports, m, p);
}
define(["require", "exports", "file2", "file3"], function (require, exports, file2_1, file3_1) {
"use strict";
exports.__esModule = true;
__exportStar(file2_1, exports);
__exportStar(file3_1, exports);
var x = 1;
});
//// [file5.js]
define(["require", "exports"], function (require, exports) {
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (!exports.hasOwnProperty(p)) __createBinding(exports, m, p);
}
define(["require", "exports", "file4"], function (require, exports, file4_1) {
"use strict";
exports.__esModule = true;
__exportStar(file4_1, exports);
var x = 1;
});
27 changes: 25 additions & 2 deletions tests/baselines/reference/exportStarForValues4.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,37 @@ define(["require", "exports"], function (require, exports) {
exports.__esModule = true;
});
//// [file3.js]
define(["require", "exports"], function (require, exports) {
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (!exports.hasOwnProperty(p)) __createBinding(exports, m, p);
}
define(["require", "exports", "file2"], function (require, exports, file2_1) {
"use strict";
exports.__esModule = true;
__exportStar(file2_1, exports);
var x = 1;
});
//// [file2.js]
define(["require", "exports"], function (require, exports) {
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (!exports.hasOwnProperty(p)) __createBinding(exports, m, p);
}
define(["require", "exports", "file1", "file3"], function (require, exports, file1_1, file3_1) {
"use strict";
exports.__esModule = true;
__exportStar(file1_1, exports);
__exportStar(file3_1, exports);
var x = 1;
});
13 changes: 12 additions & 1 deletion tests/baselines/reference/exportStarForValues5.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,19 @@ define(["require", "exports"], function (require, exports) {
exports.__esModule = true;
});
//// [file2.js]
define(["require", "exports"], function (require, exports) {
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (!exports.hasOwnProperty(p)) __createBinding(exports, m, p);
}
define(["require", "exports", "file1"], function (require, exports, file1_1) {
"use strict";
exports.__esModule = true;
exports.x = void 0;
__exportStar(file1_1, exports);
});
18 changes: 16 additions & 2 deletions tests/baselines/reference/exportStarForValues6.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,26 @@ System.register([], function (exports_1, context_1) {
};
});
//// [file2.js]
System.register([], function (exports_1, context_1) {
System.register(["file1"], function (exports_1, context_1) {
"use strict";
var x;
var __moduleName = context_1 && context_1.id;
var exportedNames_1 = {
"x": true
};
function exportStar_1(m) {
var exports = {};
for (var n in m) {
if (n !== "default" && !exportedNames_1.hasOwnProperty(n)) exports[n] = m[n];
}
exports_1(exports);
}
return {
setters: [],
setters: [
function (file1_1_1) {
exportStar_1(file1_1_1);
}
],
execute: function () {
exports_1("x", x = 1);
}
Expand Down
13 changes: 12 additions & 1 deletion tests/baselines/reference/exportStarForValues7.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,21 @@ define(["require", "exports"], function (require, exports) {
exports.__esModule = true;
});
//// [file2.js]
define(["require", "exports"], function (require, exports) {
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (!exports.hasOwnProperty(p)) __createBinding(exports, m, p);
}
define(["require", "exports", "file1"], function (require, exports, file1_1) {
"use strict";
exports.__esModule = true;
exports.x = void 0;
__exportStar(file1_1, exports);
exports.x = 1;
});
//// [file3.js]
Expand Down
26 changes: 24 additions & 2 deletions tests/baselines/reference/exportStarForValues8.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,17 +29,39 @@ define(["require", "exports"], function (require, exports) {
exports.__esModule = true;
});
//// [file2.js]
define(["require", "exports"], function (require, exports) {
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (!exports.hasOwnProperty(p)) __createBinding(exports, m, p);
}
define(["require", "exports", "file1"], function (require, exports, file1_1) {
"use strict";
exports.__esModule = true;
exports.x = void 0;
__exportStar(file1_1, exports);
exports.x = 1;
});
//// [file3.js]
define(["require", "exports"], function (require, exports) {
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (!exports.hasOwnProperty(p)) __createBinding(exports, m, p);
}
define(["require", "exports", "file1"], function (require, exports, file1_1) {
"use strict";
exports.__esModule = true;
exports.x = void 0;
__exportStar(file1_1, exports);
exports.x = 1;
});
//// [file4.js]
Expand Down
3 changes: 2 additions & 1 deletion tests/baselines/reference/exportStarForValues9.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,11 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
var __exportStar = (this && this.__exportStar) || function(m, exports) {
for (var p in m) if (!exports.hasOwnProperty(p)) __createBinding(exports, m, p);
}
define(["require", "exports", "file3"], function (require, exports, file3_1) {
define(["require", "exports", "file1", "file3"], function (require, exports, file1_1, file3_1) {
"use strict";
exports.__esModule = true;
exports.x = void 0;
__exportStar(file1_1, exports);
__exportStar(file3_1, exports);
exports.x = 1;
});
15 changes: 13 additions & 2 deletions tests/baselines/reference/exportStarForValuesInSystem.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,23 @@ System.register([], function (exports_1, context_1) {
};
});
//// [file2.js]
System.register([], function (exports_1, context_1) {
System.register(["file1"], function (exports_1, context_1) {
"use strict";
var x;
var __moduleName = context_1 && context_1.id;
function exportStar_1(m) {
var exports = {};
for (var n in m) {
if (n !== "default") exports[n] = m[n];
}
exports_1(exports);
}
return {
setters: [],
setters: [
function (file1_1_1) {
exportStar_1(file1_1_1);
}
],
execute: function () {
x = 1;
}
Expand Down
Loading

0 comments on commit af4201f

Please sign in to comment.