Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Use __createBinding for individual reexports when target is es3
  • Loading branch information
weswigham committed Jan 6, 2020
commit 3fa1d0f4e7d9d9e5193d646113bb5b1942a85bd0
61 changes: 41 additions & 20 deletions src/compiler/transformers/module/module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -991,20 +991,34 @@ namespace ts {
);
}
for (const specifier of node.exportClause.elements) {
const exportedValue = createPropertyAccess(
generatedName,
specifier.propertyName || specifier.name
);
statements.push(
setOriginalNode(
setTextRange(
createExpressionStatement(
createExportExpression(getExportName(specifier), exportedValue, /* location */ undefined, /* liveBinding */ true)
),
specifier),
specifier
)
);
if (languageVersion === ScriptTarget.ES3) {
statements.push(
setOriginalNode(
setTextRange(
createExpressionStatement(
createCreateBindingHelper(context, generatedName, createLiteral(specifier.propertyName || specifier.name), specifier.propertyName ? createLiteral(specifier.name!) : undefined)
),
specifier),
specifier
)
);
}
else {
const exportedValue = createPropertyAccess(
generatedName,
specifier.propertyName || specifier.name
);
statements.push(
setOriginalNode(
setTextRange(
createExpressionStatement(
createExportExpression(getExportName(specifier), exportedValue, /* location */ undefined, /* liveBinding */ true)
),
specifier),
specifier
)
);
}
}

return singleOrMany(statements);
Expand Down Expand Up @@ -1831,16 +1845,23 @@ namespace ts {
scoped: false,
priority: 1,
text: `
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k) {
Object.defineProperty(o, k, {
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
Comment thread
weswigham marked this conversation as resolved.
if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, {
Comment thread
weswigham marked this conversation as resolved.
Outdated
enumerable: true,
get: function() { return m[k]; }
});
}) : (function(o, m, k) {
o[k] = m[k];
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));`
};

function createCreateBindingHelper(context: TransformationContext, module: Expression, inputName: Expression, outputName: Expression | undefined) {
context.requestEmitHelper(createBindingHelper);
return createCall(getUnscopedHelperName("__createBinding"), /*typeArguments*/ undefined, [createIdentifier("exports"), module, inputName, ...(outputName ? [outputName] : [])]);
}

export const setModuleDefaultHelper: UnscopedEmitHelper = {
name: "typescript:commonjscreatevalue",
importName: "__setModuleDefault",
Expand All @@ -1855,7 +1876,7 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
}) : function(o, v) {
o["default"] = v;
});`
}
};

// emit output for the __export helper function
const exportStarHelper: UnscopedEmitHelper = {
Expand All @@ -1870,7 +1891,7 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
}`
};

function createExportStarHelper(context:TransformationContext, module: Expression) {
function createExportStarHelper(context: TransformationContext, module: Expression) {
context.requestEmitHelper(exportStarHelper);
return createCall(getUnscopedHelperName("__exportStar"), /*typeArguments*/ undefined, [module, createIdentifier("exports")]);
}
Expand Down
22 changes: 17 additions & 5 deletions tests/baselines/reference/ambientShorthand_reExport.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,30 @@ x($);

//// [reExportX.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];
}));
exports.__esModule = true;
var jquery_1 = require("jquery");
exports.x = jquery_1.x;
__createBinding(exports, jquery_1, "x");
//// [reExportAll.js]
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k) {
Object.defineProperty(o, k, {
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) {
o[k] = 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);
Expand Down
12 changes: 11 additions & 1 deletion tests/baselines/reference/constEnumPreserveEmitReexport.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,16 @@ var ConstEnum_1 = require("./ConstEnum");
exports["default"] = ConstEnum_1.MyConstEnum;
//// [ReExport.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];
}));
exports.__esModule = true;
var ConstEnum_1 = require("./ConstEnum");
exports["default"] = ConstEnum_1.MyConstEnum;
__createBinding(exports, ConstEnum_1, "MyConstEnum", "default");
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,15 @@ var pkg2_1 = require("@raymondfeng/pkg2");
exports.ADMIN = pkg2_1.MetadataAccessor.create('1');
//// [index.js]
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k) {
Object.defineProperty(o, k, {
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) {
o[k] = 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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,13 +53,15 @@ var pkg2_1 = require("@raymondfeng/pkg2");
exports.ADMIN = pkg2_1.MetadataAccessor.create('1');
//// [index.js]
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k) {
Object.defineProperty(o, k, {
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) {
o[k] = 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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,15 @@ var pkg2_1 = require("@raymondfeng/pkg2");
exports.ADMIN = pkg2_1.MetadataAccessor.create('1');
//// [index.js]
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k) {
Object.defineProperty(o, k, {
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) {
o[k] = 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);
Expand Down
10 changes: 6 additions & 4 deletions tests/baselines/reference/doubleUnderscoreExportStarConflict.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,15 @@ function __foo() { }
exports.__foo = __foo;
//// [index.js]
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k) {
Object.defineProperty(o, k, {
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) {
o[k] = 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);
Expand Down
10 changes: 6 additions & 4 deletions tests/baselines/reference/es6ExportAllInEs5.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,15 @@ var m;
exports.x = 10;
//// [client.js]
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k) {
Object.defineProperty(o, k, {
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) {
o[k] = 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);
Expand Down
30 changes: 16 additions & 14 deletions tests/baselines/reference/es6ExportEqualsInterop.js
Original file line number Diff line number Diff line change
Expand Up @@ -209,13 +209,15 @@ export * from "class-module";
//// [main.js]
"use strict";
/// <reference path="modules.d.ts"/>
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k) {
Object.defineProperty(o, k, {
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) {
o[k] = 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);
Expand Down Expand Up @@ -282,25 +284,25 @@ class_1.a;
class_module_1.a;
// named export
var interface_2 = require("interface");
exports.a1 = interface_2.a;
__createBinding(exports, interface_2, "a", "a1");
var variable_2 = require("variable");
exports.a2 = variable_2.a;
__createBinding(exports, variable_2, "a", "a2");
var interface_variable_2 = require("interface-variable");
exports.a3 = interface_variable_2.a;
__createBinding(exports, interface_variable_2, "a", "a3");
var module_2 = require("module");
exports.a4 = module_2.a;
__createBinding(exports, module_2, "a", "a4");
var interface_module_2 = require("interface-module");
exports.a5 = interface_module_2.a;
__createBinding(exports, interface_module_2, "a", "a5");
var variable_module_2 = require("variable-module");
exports.a6 = variable_module_2.a;
__createBinding(exports, variable_module_2, "a", "a6");
var function_2 = require("function");
exports.a7 = function_2.a;
__createBinding(exports, function_2, "a", "a7");
var function_module_2 = require("function-module");
exports.a8 = function_module_2.a;
__createBinding(exports, function_module_2, "a", "a8");
var class_2 = require("class");
exports.a9 = class_2.a;
__createBinding(exports, class_2, "a", "a9");
var class_module_2 = require("class-module");
exports.a0 = class_module_2.a;
__createBinding(exports, class_module_2, "a", "a0");
__exportStar(require("variable"), exports);
__exportStar(require("interface-variable"), exports);
__exportStar(require("module"), exports);
Expand Down
10 changes: 6 additions & 4 deletions tests/baselines/reference/esModuleInterop.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,15 @@ fs;

//// [mjts.js]
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k) {
Object.defineProperty(o, k, {
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) {
o[k] = m[k];
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", {
Expand Down
10 changes: 6 additions & 4 deletions tests/baselines/reference/esModuleInteropImportCall.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,15 @@ import("./foo").then(f => {
});

//// [index.js]
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k) {
Object.defineProperty(o, k, {
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) {
o[k] = m[k];
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", {
Expand Down
10 changes: 6 additions & 4 deletions tests/baselines/reference/esModuleInteropImportNamespace.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,15 @@ foo.default;

//// [index.js]
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k) {
Object.defineProperty(o, k, {
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) {
o[k] = m[k];
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", {
Expand Down
10 changes: 6 additions & 4 deletions tests/baselines/reference/esModuleInteropNamedDefaultImports.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,15 @@ var Bar = /** @class */ (function () {
exports.Bar = Bar;
//// [idx.js]
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k) {
Object.defineProperty(o, k, {
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) {
o[k] = m[k];
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", {
Expand Down
Loading