Merge pull request #19057 from Microsoft/fix17564

Fix 'this' capturing for dynamic import
This commit is contained in:
Ron Buckton
2017-10-10 10:21:43 -07:00
committed by GitHub
40 changed files with 396 additions and 127 deletions
+6
View File
@@ -2699,6 +2699,12 @@ namespace ts {
if (expression.kind === SyntaxKind.ImportKeyword) {
transformFlags |= TransformFlags.ContainsDynamicImport;
// A dynamic 'import()' call that contains a lexical 'this' will
// require a captured 'this' when emitting down-level.
if (subtreeFlags & TransformFlags.ContainsLexicalThis) {
transformFlags |= TransformFlags.ContainsCapturedLexicalThis;
}
}
node.transformFlags = transformFlags | TransformFlags.HasComputedFlags;
+66 -23
View File
@@ -561,46 +561,89 @@ namespace ts {
// });
const resolve = createUniqueName("resolve");
const reject = createUniqueName("reject");
return createNew(
createIdentifier("Promise"),
/*typeArguments*/ undefined,
[createFunctionExpression(
const parameters = [
createParameter(/*decorator*/ undefined, /*modifiers*/ undefined, /*dotDotDotToken*/ undefined, /*name*/ resolve),
createParameter(/*decorator*/ undefined, /*modifiers*/ undefined, /*dotDotDotToken*/ undefined, /*name*/ reject)
];
const body = createBlock([
createStatement(
createCall(
createIdentifier("require"),
/*typeArguments*/ undefined,
[createArrayLiteral([firstOrUndefined(node.arguments) || createOmittedExpression()]), resolve, reject]
)
)
]);
let func: FunctionExpression | ArrowFunction;
if (languageVersion >= ScriptTarget.ES2015) {
func = createArrowFunction(
/*modifiers*/ undefined,
/*typeParameters*/ undefined,
parameters,
/*type*/ undefined,
/*equalsGreaterThanToken*/ undefined,
body);
}
else {
func = createFunctionExpression(
/*modifiers*/ undefined,
/*asteriskToken*/ undefined,
/*name*/ undefined,
/*typeParameters*/ undefined,
[createParameter(/*decorator*/ undefined, /*modifiers*/ undefined, /*dotDotDotToken*/ undefined, /*name*/ resolve),
createParameter(/*decorator*/ undefined, /*modifiers*/ undefined, /*dotDotDotToken*/ undefined, /*name*/ reject)],
parameters,
/*type*/ undefined,
createBlock([createStatement(
createCall(
createIdentifier("require"),
/*typeArguments*/ undefined,
[createArrayLiteral([firstOrUndefined(node.arguments) || createOmittedExpression()]), resolve, reject]
))])
)]);
body);
// if there is a lexical 'this' in the import call arguments, ensure we indicate
// that this new function expression indicates it captures 'this' so that the
// es2015 transformer will properly substitute 'this' with '_this'.
if (node.transformFlags & TransformFlags.ContainsLexicalThis) {
setEmitFlags(func, EmitFlags.CapturesThis);
}
}
return createNew(createIdentifier("Promise"), /*typeArguments*/ undefined, [func]);
}
function transformImportCallExpressionCommonJS(node: ImportCall): Expression {
function transformImportCallExpressionCommonJS(node: ImportCall): Expression {
// import("./blah")
// emit as
// Promise.resolve().then(function () { return require(x); }) /*CommonJs Require*/
// We have to wrap require in then callback so that require is done in asynchronously
// if we simply do require in resolve callback in Promise constructor. We will execute the loading immediately
return createCall(
createPropertyAccess(
createCall(createPropertyAccess(createIdentifier("Promise"), "resolve"), /*typeArguments*/ undefined, /*argumentsArray*/ []),
"then"),
/*typeArguments*/ undefined,
[createFunctionExpression(
const promiseResolveCall = createCall(createPropertyAccess(createIdentifier("Promise"), "resolve"), /*typeArguments*/ undefined, /*argumentsArray*/ []);
const requireCall = createCall(createIdentifier("require"), /*typeArguments*/ undefined, node.arguments);
let func: FunctionExpression | ArrowFunction;
if (languageVersion >= ScriptTarget.ES2015) {
func = createArrowFunction(
/*modifiers*/ undefined,
/*typeParameters*/ undefined,
/*parameters*/ [],
/*type*/ undefined,
/*equalsGreaterThanToken*/ undefined,
requireCall);
}
else {
func = createFunctionExpression(
/*modifiers*/ undefined,
/*asteriskToken*/ undefined,
/*name*/ undefined,
/*typeParameters*/ undefined,
/*parameters*/ undefined,
/*parameters*/ [],
/*type*/ undefined,
createBlock([createReturn(createCall(createIdentifier("require"), /*typeArguments*/ undefined, node.arguments))])
)]);
createBlock([createReturn(requireCall)]));
// if there is a lexical 'this' in the import call arguments, ensure we indicate
// that this new function expression indicates it captures 'this' so that the
// es2015 transformer will properly substitute 'this' with '_this'.
if (node.transformFlags & TransformFlags.ContainsLexicalThis) {
setEmitFlags(func, EmitFlags.CapturesThis);
}
}
return createCall(createPropertyAccess(promiseResolveCall, "then"), /*typeArguments*/ undefined, [func]);
}
/**
@@ -0,0 +1,37 @@
//// [dynamicImportWithNestedThis_es2015.ts]
// https://github.com/Microsoft/TypeScript/issues/17564
class C {
private _path = './other';
dynamic() {
return import(this._path);
}
}
const c = new C();
c.dynamic();
//// [dynamicImportWithNestedThis_es2015.js]
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports"], factory);
}
})(function (require, exports) {
"use strict";
var __syncRequire = typeof module === "object" && typeof module.exports === "object";
// https://github.com/Microsoft/TypeScript/issues/17564
class C {
constructor() {
this._path = './other';
}
dynamic() {
return __syncRequire ? Promise.resolve().then(() => require(this._path)) : new Promise((resolve_1, reject_1) => { require([this._path], resolve_1, reject_1); });
}
}
const c = new C();
c.dynamic();
});
@@ -0,0 +1,27 @@
=== tests/cases/compiler/dynamicImportWithNestedThis_es2015.ts ===
// https://github.com/Microsoft/TypeScript/issues/17564
class C {
>C : Symbol(C, Decl(dynamicImportWithNestedThis_es2015.ts, 0, 0))
private _path = './other';
>_path : Symbol(C._path, Decl(dynamicImportWithNestedThis_es2015.ts, 1, 9))
dynamic() {
>dynamic : Symbol(C.dynamic, Decl(dynamicImportWithNestedThis_es2015.ts, 2, 27))
return import(this._path);
>this._path : Symbol(C._path, Decl(dynamicImportWithNestedThis_es2015.ts, 1, 9))
>this : Symbol(C, Decl(dynamicImportWithNestedThis_es2015.ts, 0, 0))
>_path : Symbol(C._path, Decl(dynamicImportWithNestedThis_es2015.ts, 1, 9))
}
}
const c = new C();
>c : Symbol(c, Decl(dynamicImportWithNestedThis_es2015.ts, 9, 5))
>C : Symbol(C, Decl(dynamicImportWithNestedThis_es2015.ts, 0, 0))
c.dynamic();
>c.dynamic : Symbol(C.dynamic, Decl(dynamicImportWithNestedThis_es2015.ts, 2, 27))
>c : Symbol(c, Decl(dynamicImportWithNestedThis_es2015.ts, 9, 5))
>dynamic : Symbol(C.dynamic, Decl(dynamicImportWithNestedThis_es2015.ts, 2, 27))
@@ -0,0 +1,31 @@
=== tests/cases/compiler/dynamicImportWithNestedThis_es2015.ts ===
// https://github.com/Microsoft/TypeScript/issues/17564
class C {
>C : C
private _path = './other';
>_path : string
>'./other' : "./other"
dynamic() {
>dynamic : () => Promise<any>
return import(this._path);
>import(this._path) : Promise<any>
>this._path : string
>this : this
>_path : string
}
}
const c = new C();
>c : C
>new C() : C
>C : typeof C
c.dynamic();
>c.dynamic() : Promise<any>
>c.dynamic : () => Promise<any>
>c : C
>dynamic : () => Promise<any>
@@ -0,0 +1,39 @@
//// [dynamicImportWithNestedThis_es5.ts]
// https://github.com/Microsoft/TypeScript/issues/17564
class C {
private _path = './other';
dynamic() {
return import(this._path);
}
}
const c = new C();
c.dynamic();
//// [dynamicImportWithNestedThis_es5.js]
(function (factory) {
if (typeof module === "object" && typeof module.exports === "object") {
var v = factory(require, exports);
if (v !== undefined) module.exports = v;
}
else if (typeof define === "function" && define.amd) {
define(["require", "exports"], factory);
}
})(function (require, exports) {
"use strict";
var __syncRequire = typeof module === "object" && typeof module.exports === "object";
// https://github.com/Microsoft/TypeScript/issues/17564
var C = /** @class */ (function () {
function C() {
this._path = './other';
}
C.prototype.dynamic = function () {
var _this = this;
return __syncRequire ? Promise.resolve().then(function () { return require(_this._path); }) : new Promise(function (resolve_1, reject_1) { require([_this._path], resolve_1, reject_1); });
};
return C;
}());
var c = new C();
c.dynamic();
});
@@ -0,0 +1,27 @@
=== tests/cases/compiler/dynamicImportWithNestedThis_es5.ts ===
// https://github.com/Microsoft/TypeScript/issues/17564
class C {
>C : Symbol(C, Decl(dynamicImportWithNestedThis_es5.ts, 0, 0))
private _path = './other';
>_path : Symbol(C._path, Decl(dynamicImportWithNestedThis_es5.ts, 1, 9))
dynamic() {
>dynamic : Symbol(C.dynamic, Decl(dynamicImportWithNestedThis_es5.ts, 2, 27))
return import(this._path);
>this._path : Symbol(C._path, Decl(dynamicImportWithNestedThis_es5.ts, 1, 9))
>this : Symbol(C, Decl(dynamicImportWithNestedThis_es5.ts, 0, 0))
>_path : Symbol(C._path, Decl(dynamicImportWithNestedThis_es5.ts, 1, 9))
}
}
const c = new C();
>c : Symbol(c, Decl(dynamicImportWithNestedThis_es5.ts, 9, 5))
>C : Symbol(C, Decl(dynamicImportWithNestedThis_es5.ts, 0, 0))
c.dynamic();
>c.dynamic : Symbol(C.dynamic, Decl(dynamicImportWithNestedThis_es5.ts, 2, 27))
>c : Symbol(c, Decl(dynamicImportWithNestedThis_es5.ts, 9, 5))
>dynamic : Symbol(C.dynamic, Decl(dynamicImportWithNestedThis_es5.ts, 2, 27))
@@ -0,0 +1,31 @@
=== tests/cases/compiler/dynamicImportWithNestedThis_es5.ts ===
// https://github.com/Microsoft/TypeScript/issues/17564
class C {
>C : C
private _path = './other';
>_path : string
>'./other' : "./other"
dynamic() {
>dynamic : () => Promise<any>
return import(this._path);
>import(this._path) : Promise<any>
>this._path : string
>this : this
>_path : string
}
}
const c = new C();
>c : C
>new C() : C
>C : typeof C
c.dynamic();
>c.dynamic() : Promise<any>
>c.dynamic : () => Promise<any>
>c : C
>dynamic : () => Promise<any>
@@ -42,34 +42,34 @@ define(["require", "exports"], function (require, exports) {
Object.defineProperty(exports, "__esModule", { value: true });
function fn() {
return __awaiter(this, void 0, void 0, function* () {
const req = yield new Promise(function (resolve_1, reject_1) { require(['./test'], resolve_1, reject_1); }); // ONE
const req = yield new Promise((resolve_1, reject_1) => { require(['./test'], resolve_1, reject_1); }); // ONE
});
}
exports.fn = fn;
class cl1 {
m() {
return __awaiter(this, void 0, void 0, function* () {
const req = yield new Promise(function (resolve_2, reject_2) { require(['./test'], resolve_2, reject_2); }); // TWO
const req = yield new Promise((resolve_2, reject_2) => { require(['./test'], resolve_2, reject_2); }); // TWO
});
}
}
exports.cl1 = cl1;
exports.obj = {
m: () => __awaiter(this, void 0, void 0, function* () {
const req = yield new Promise(function (resolve_3, reject_3) { require(['./test'], resolve_3, reject_3); }); // THREE
const req = yield new Promise((resolve_3, reject_3) => { require(['./test'], resolve_3, reject_3); }); // THREE
})
};
class cl2 {
constructor() {
this.p = {
m: () => __awaiter(this, void 0, void 0, function* () {
const req = yield new Promise(function (resolve_4, reject_4) { require(['./test'], resolve_4, reject_4); }); // FOUR
const req = yield new Promise((resolve_4, reject_4) => { require(['./test'], resolve_4, reject_4); }); // FOUR
})
};
}
}
exports.cl2 = cl2;
exports.l = () => __awaiter(this, void 0, void 0, function* () {
const req = yield new Promise(function (resolve_5, reject_5) { require(['./test'], resolve_5, reject_5); }); // FIVE
const req = yield new Promise((resolve_5, reject_5) => { require(['./test'], resolve_5, reject_5); }); // FIVE
});
});
@@ -41,33 +41,33 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
Object.defineProperty(exports, "__esModule", { value: true });
function fn() {
return __awaiter(this, void 0, void 0, function* () {
const req = yield Promise.resolve().then(function () { return require('./test'); }); // ONE
const req = yield Promise.resolve().then(() => require('./test')); // ONE
});
}
exports.fn = fn;
class cl1 {
m() {
return __awaiter(this, void 0, void 0, function* () {
const req = yield Promise.resolve().then(function () { return require('./test'); }); // TWO
const req = yield Promise.resolve().then(() => require('./test')); // TWO
});
}
}
exports.cl1 = cl1;
exports.obj = {
m: () => __awaiter(this, void 0, void 0, function* () {
const req = yield Promise.resolve().then(function () { return require('./test'); }); // THREE
const req = yield Promise.resolve().then(() => require('./test')); // THREE
})
};
class cl2 {
constructor() {
this.p = {
m: () => __awaiter(this, void 0, void 0, function* () {
const req = yield Promise.resolve().then(function () { return require('./test'); }); // FOUR
const req = yield Promise.resolve().then(() => require('./test')); // FOUR
})
};
}
}
exports.cl2 = cl2;
exports.l = () => __awaiter(this, void 0, void 0, function* () {
const req = yield Promise.resolve().then(function () { return require('./test'); }); // FIVE
const req = yield Promise.resolve().then(() => require('./test')); // FIVE
});
@@ -51,34 +51,34 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
Object.defineProperty(exports, "__esModule", { value: true });
function fn() {
return __awaiter(this, void 0, void 0, function* () {
const req = yield __syncRequire ? Promise.resolve().then(function () { return require('./test'); }) : new Promise(function (resolve_1, reject_1) { require(['./test'], resolve_1, reject_1); }); // ONE
const req = yield __syncRequire ? Promise.resolve().then(() => require('./test')) : new Promise((resolve_1, reject_1) => { require(['./test'], resolve_1, reject_1); }); // ONE
});
}
exports.fn = fn;
class cl1 {
m() {
return __awaiter(this, void 0, void 0, function* () {
const req = yield __syncRequire ? Promise.resolve().then(function () { return require('./test'); }) : new Promise(function (resolve_2, reject_2) { require(['./test'], resolve_2, reject_2); }); // TWO
const req = yield __syncRequire ? Promise.resolve().then(() => require('./test')) : new Promise((resolve_2, reject_2) => { require(['./test'], resolve_2, reject_2); }); // TWO
});
}
}
exports.cl1 = cl1;
exports.obj = {
m: () => __awaiter(this, void 0, void 0, function* () {
const req = yield __syncRequire ? Promise.resolve().then(function () { return require('./test'); }) : new Promise(function (resolve_3, reject_3) { require(['./test'], resolve_3, reject_3); }); // THREE
const req = yield __syncRequire ? Promise.resolve().then(() => require('./test')) : new Promise((resolve_3, reject_3) => { require(['./test'], resolve_3, reject_3); }); // THREE
})
};
class cl2 {
constructor() {
this.p = {
m: () => __awaiter(this, void 0, void 0, function* () {
const req = yield __syncRequire ? Promise.resolve().then(function () { return require('./test'); }) : new Promise(function (resolve_4, reject_4) { require(['./test'], resolve_4, reject_4); }); // FOUR
const req = yield __syncRequire ? Promise.resolve().then(() => require('./test')) : new Promise((resolve_4, reject_4) => { require(['./test'], resolve_4, reject_4); }); // FOUR
})
};
}
}
exports.cl2 = cl2;
exports.l = () => __awaiter(this, void 0, void 0, function* () {
const req = yield __syncRequire ? Promise.resolve().then(function () { return require('./test'); }) : new Promise(function (resolve_5, reject_5) { require(['./test'], resolve_5, reject_5); }); // FIVE
const req = yield __syncRequire ? Promise.resolve().then(() => require('./test')) : new Promise((resolve_5, reject_5) => { require(['./test'], resolve_5, reject_5); }); // FIVE
});
});
@@ -30,6 +30,6 @@ exports.C = C;
//// [1.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
let p1 = Promise.resolve().then(function () { return require("./defaultPath"); });
let p2 = Promise.resolve().then(function () { return require("./defaultPath"); });
let p3 = Promise.resolve().then(function () { return require("./defaultPath"); });
let p1 = Promise.resolve().then(() => require("./defaultPath"));
let p2 = Promise.resolve().then(() => require("./defaultPath"));
let p3 = Promise.resolve().then(() => require("./defaultPath"));
@@ -15,12 +15,12 @@ function returnDynamicLoad(path: string) {
}
//// [importCallExpressionDeclarationEmit1.js]
Promise.resolve().then(function () { return require(getSpecifier()); });
var p0 = Promise.resolve().then(function () { return require(`${directory}\${moduleFile}`); });
var p1 = Promise.resolve().then(function () { return require(getSpecifier()); });
const p2 = Promise.resolve().then(function () { return require(whatToLoad ? getSpecifier() : "defaulPath"); });
Promise.resolve().then(() => require(getSpecifier()));
var p0 = Promise.resolve().then(() => require(`${directory}\${moduleFile}`));
var p1 = Promise.resolve().then(() => require(getSpecifier()));
const p2 = Promise.resolve().then(() => require(whatToLoad ? getSpecifier() : "defaulPath"));
function returnDynamicLoad(path) {
return Promise.resolve().then(function () { return require(path); });
return Promise.resolve().then(() => require(path));
}
@@ -39,23 +39,23 @@ define(["require", "exports"], function (require, exports) {
define(["require", "exports"], function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
new Promise(function (resolve_1, reject_1) { require(["./0"], resolve_1, reject_1); });
var p1 = new Promise(function (resolve_2, reject_2) { require(["./0"], resolve_2, reject_2); });
new Promise((resolve_1, reject_1) => { require(["./0"], resolve_1, reject_1); });
var p1 = new Promise((resolve_2, reject_2) => { require(["./0"], resolve_2, reject_2); });
p1.then(zero => {
return zero.foo();
});
exports.p2 = new Promise(function (resolve_3, reject_3) { require(["./0"], resolve_3, reject_3); });
exports.p2 = new Promise((resolve_3, reject_3) => { require(["./0"], resolve_3, reject_3); });
function foo() {
const p2 = new Promise(function (resolve_4, reject_4) { require(["./0"], resolve_4, reject_4); });
const p2 = new Promise((resolve_4, reject_4) => { require(["./0"], resolve_4, reject_4); });
}
class C {
method() {
const loadAsync = new Promise(function (resolve_5, reject_5) { require(["./0"], resolve_5, reject_5); });
const loadAsync = new Promise((resolve_5, reject_5) => { require(["./0"], resolve_5, reject_5); });
}
}
class D {
method() {
const loadAsync = new Promise(function (resolve_6, reject_6) { require(["./0"], resolve_6, reject_6); });
const loadAsync = new Promise((resolve_6, reject_6) => { require(["./0"], resolve_6, reject_6); });
}
}
exports.D = D;
@@ -36,23 +36,23 @@ exports.foo = foo;
//// [1.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
Promise.resolve().then(function () { return require("./0"); });
var p1 = Promise.resolve().then(function () { return require("./0"); });
Promise.resolve().then(() => require("./0"));
var p1 = Promise.resolve().then(() => require("./0"));
p1.then(zero => {
return zero.foo();
});
exports.p2 = Promise.resolve().then(function () { return require("./0"); });
exports.p2 = Promise.resolve().then(() => require("./0"));
function foo() {
const p2 = Promise.resolve().then(function () { return require("./0"); });
const p2 = Promise.resolve().then(() => require("./0"));
}
class C {
method() {
const loadAsync = Promise.resolve().then(function () { return require("./0"); });
const loadAsync = Promise.resolve().then(() => require("./0"));
}
}
class D {
method() {
const loadAsync = Promise.resolve().then(function () { return require("./0"); });
const loadAsync = Promise.resolve().then(() => require("./0"));
}
}
exports.D = D;
@@ -56,23 +56,23 @@ export class D {
"use strict";
var __syncRequire = typeof module === "object" && typeof module.exports === "object";
Object.defineProperty(exports, "__esModule", { value: true });
__syncRequire ? Promise.resolve().then(function () { return require("./0"); }) : new Promise(function (resolve_1, reject_1) { require(["./0"], resolve_1, reject_1); });
var p1 = __syncRequire ? Promise.resolve().then(function () { return require("./0"); }) : new Promise(function (resolve_2, reject_2) { require(["./0"], resolve_2, reject_2); });
__syncRequire ? Promise.resolve().then(() => require("./0")) : new Promise((resolve_1, reject_1) => { require(["./0"], resolve_1, reject_1); });
var p1 = __syncRequire ? Promise.resolve().then(() => require("./0")) : new Promise((resolve_2, reject_2) => { require(["./0"], resolve_2, reject_2); });
p1.then(zero => {
return zero.foo();
});
exports.p2 = __syncRequire ? Promise.resolve().then(function () { return require("./0"); }) : new Promise(function (resolve_3, reject_3) { require(["./0"], resolve_3, reject_3); });
exports.p2 = __syncRequire ? Promise.resolve().then(() => require("./0")) : new Promise((resolve_3, reject_3) => { require(["./0"], resolve_3, reject_3); });
function foo() {
const p2 = __syncRequire ? Promise.resolve().then(function () { return require("./0"); }) : new Promise(function (resolve_4, reject_4) { require(["./0"], resolve_4, reject_4); });
const p2 = __syncRequire ? Promise.resolve().then(() => require("./0")) : new Promise((resolve_4, reject_4) => { require(["./0"], resolve_4, reject_4); });
}
class C {
method() {
const loadAsync = __syncRequire ? Promise.resolve().then(function () { return require("./0"); }) : new Promise(function (resolve_5, reject_5) { require(["./0"], resolve_5, reject_5); });
const loadAsync = __syncRequire ? Promise.resolve().then(() => require("./0")) : new Promise((resolve_5, reject_5) => { require(["./0"], resolve_5, reject_5); });
}
}
class D {
method() {
const loadAsync = __syncRequire ? Promise.resolve().then(function () { return require("./0"); }) : new Promise(function (resolve_6, reject_6) { require(["./0"], resolve_6, reject_6); });
const loadAsync = __syncRequire ? Promise.resolve().then(() => require("./0")) : new Promise((resolve_6, reject_6) => { require(["./0"], resolve_6, reject_6); });
}
}
exports.D = D;
@@ -12,8 +12,8 @@ const p4 = import("pathToModule", "secondModule");
//// [importCallExpressionGrammarError.js]
var a = ["./0"];
Promise.resolve().then(function () { return require(...["PathModule"]); });
var p1 = Promise.resolve().then(function () { return require(...a); });
const p2 = Promise.resolve().then(function () { return require(); });
const p3 = Promise.resolve().then(function () { return require(); });
const p4 = Promise.resolve().then(function () { return require("pathToModule", "secondModule"); });
Promise.resolve().then(() => require(...["PathModule"]));
var p1 = Promise.resolve().then(() => require(...a));
const p2 = Promise.resolve().then(() => require());
const p3 = Promise.resolve().then(() => require());
const p4 = Promise.resolve().then(() => require("pathToModule", "secondModule"));
@@ -27,13 +27,13 @@ define(["require", "exports"], function (require, exports) {
define(["require", "exports"], function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
new Promise(function (resolve_1, reject_1) { require(["./0"], resolve_1, reject_1); });
var p1 = new Promise(function (resolve_2, reject_2) { require(["./0"], resolve_2, reject_2); });
new Promise((resolve_1, reject_1) => { require(["./0"], resolve_1, reject_1); });
var p1 = new Promise((resolve_2, reject_2) => { require(["./0"], resolve_2, reject_2); });
p1.then(zero => {
return zero.foo();
});
exports.p2 = new Promise(function (resolve_3, reject_3) { require(["./0"], resolve_3, reject_3); });
exports.p2 = new Promise((resolve_3, reject_3) => { require(["./0"], resolve_3, reject_3); });
function foo() {
const p2 = new Promise(function (resolve_4, reject_4) { require(["./0"], resolve_4, reject_4); });
const p2 = new Promise((resolve_4, reject_4) => { require(["./0"], resolve_4, reject_4); });
}
});
@@ -35,5 +35,5 @@ define(["require", "exports"], function (require, exports) {
b.print();
});
}
foo(new Promise(function (resolve_1, reject_1) { require(["./0"], resolve_1, reject_1); }));
foo(new Promise((resolve_1, reject_1) => { require(["./0"], resolve_1, reject_1); }));
});
@@ -26,7 +26,7 @@ define(["require", "exports"], function (require, exports) {
define(["require", "exports"], function (require, exports) {
"use strict";
async function foo() {
class C extends (await new Promise(function (resolve_1, reject_1) { require(["./0"], resolve_1, reject_1); })).B {
class C extends (await new Promise((resolve_1, reject_1) => { require(["./0"], resolve_1, reject_1); })).B {
}
var c = new C();
c.print();
@@ -64,30 +64,30 @@ define(["require", "exports"], function (require, exports) {
Object.defineProperty(exports, "__esModule", { value: true });
class C {
constructor() {
this.myModule = new Promise(function (resolve_1, reject_1) { require(["./0"], resolve_1, reject_1); });
this.myModule = new Promise((resolve_1, reject_1) => { require(["./0"], resolve_1, reject_1); });
}
method() {
const loadAsync = new Promise(function (resolve_2, reject_2) { require(["./0"], resolve_2, reject_2); });
const loadAsync = new Promise((resolve_2, reject_2) => { require(["./0"], resolve_2, reject_2); });
this.myModule.then(Zero => {
console.log(Zero.foo());
}, async (err) => {
console.log(err);
let one = await new Promise(function (resolve_3, reject_3) { require(["./1"], resolve_3, reject_3); });
let one = await new Promise((resolve_3, reject_3) => { require(["./1"], resolve_3, reject_3); });
console.log(one.backup());
});
}
}
class D {
constructor() {
this.myModule = new Promise(function (resolve_4, reject_4) { require(["./0"], resolve_4, reject_4); });
this.myModule = new Promise((resolve_4, reject_4) => { require(["./0"], resolve_4, reject_4); });
}
method() {
const loadAsync = new Promise(function (resolve_5, reject_5) { require(["./0"], resolve_5, reject_5); });
const loadAsync = new Promise((resolve_5, reject_5) => { require(["./0"], resolve_5, reject_5); });
this.myModule.then(Zero => {
console.log(Zero.foo());
}, async (err) => {
console.log(err);
let one = await new Promise(function (resolve_6, reject_6) { require(["./1"], resolve_6, reject_6); });
let one = await new Promise((resolve_6, reject_6) => { require(["./1"], resolve_6, reject_6); });
console.log(one.backup());
});
}
@@ -24,12 +24,12 @@ exports.foo = foo;
//// [1.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
Promise.resolve().then(function () { return require("./0"); });
var p1 = Promise.resolve().then(function () { return require("./0"); });
Promise.resolve().then(() => require("./0"));
var p1 = Promise.resolve().then(() => require("./0"));
p1.then(zero => {
return zero.foo();
});
exports.p2 = Promise.resolve().then(function () { return require("./0"); });
exports.p2 = Promise.resolve().then(() => require("./0"));
function foo() {
const p2 = Promise.resolve().then(function () { return require("./0"); });
const p2 = Promise.resolve().then(() => require("./0"));
}
@@ -32,9 +32,9 @@ exports.backup = backup;
async function compute(promise) {
let j = await promise;
if (!j) {
j = await Promise.resolve().then(function () { return require("./1"); });
j = await Promise.resolve().then(() => require("./1"));
return j.backup();
}
return j.foo();
}
compute(Promise.resolve().then(function () { return require("./0"); }));
compute(Promise.resolve().then(() => require("./0")));
@@ -31,4 +31,4 @@ function foo(x) {
b.print();
});
}
foo(Promise.resolve().then(function () { return require("./0"); }));
foo(Promise.resolve().then(() => require("./0")));
@@ -22,7 +22,7 @@ class B {
exports.B = B;
//// [2.js]
async function foo() {
class C extends (await Promise.resolve().then(function () { return require("./0"); })).B {
class C extends (await Promise.resolve().then(() => require("./0"))).B {
}
var c = new C();
c.print();
@@ -59,30 +59,30 @@ exports.backup = backup;
Object.defineProperty(exports, "__esModule", { value: true });
class C {
constructor() {
this.myModule = Promise.resolve().then(function () { return require("./0"); });
this.myModule = Promise.resolve().then(() => require("./0"));
}
method() {
const loadAsync = Promise.resolve().then(function () { return require("./0"); });
const loadAsync = Promise.resolve().then(() => require("./0"));
this.myModule.then(Zero => {
console.log(Zero.foo());
}, async (err) => {
console.log(err);
let one = await Promise.resolve().then(function () { return require("./1"); });
let one = await Promise.resolve().then(() => require("./1"));
console.log(one.backup());
});
}
}
class D {
constructor() {
this.myModule = Promise.resolve().then(function () { return require("./0"); });
this.myModule = Promise.resolve().then(() => require("./0"));
}
method() {
const loadAsync = Promise.resolve().then(function () { return require("./0"); });
const loadAsync = Promise.resolve().then(() => require("./0"));
this.myModule.then(Zero => {
console.log(Zero.foo());
}, async (err) => {
console.log(err);
let one = await Promise.resolve().then(function () { return require("./1"); });
let one = await Promise.resolve().then(() => require("./1"));
console.log(one.backup());
});
}
@@ -17,6 +17,6 @@ define(["require", "exports"], function (require, exports) {
define(["require", "exports"], function (require, exports) {
"use strict";
return async function () {
const something = await new Promise(function (resolve_1, reject_1) { require(["./something"], resolve_1, reject_1); });
const something = await new Promise((resolve_1, reject_1) => { require(["./something"], resolve_1, reject_1); });
};
});
@@ -14,5 +14,5 @@ module.exports = 42;
//// [index.js]
"use strict";
module.exports = async function () {
const something = await Promise.resolve().then(function () { return require("./something"); });
const something = await Promise.resolve().then(() => require("./something"));
};
@@ -34,6 +34,6 @@ export = async function() {
"use strict";
var __syncRequire = typeof module === "object" && typeof module.exports === "object";
return async function () {
const something = await (__syncRequire ? Promise.resolve().then(function () { return require("./something"); }) : new Promise(function (resolve_1, reject_1) { require(["./something"], resolve_1, reject_1); }));
const something = await (__syncRequire ? Promise.resolve().then(() => require("./something")) : new Promise((resolve_1, reject_1) => { require(["./something"], resolve_1, reject_1); }));
};
});
@@ -13,5 +13,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
function foo() { return "foo"; }
exports.foo = foo;
//// [1.js]
var p1 = Promise.resolve().then(function () { return require("./0"); });
var p1 = Promise.resolve().then(() => require("./0"));
function arguments() { } // this is allow as the file doesn't have implicit "use strict"
@@ -15,5 +15,5 @@ function foo() { return "foo"; }
exports.foo = foo;
//// [1.js]
"use strict";
var p1 = Promise.resolve().then(function () { return require("./0"); });
var p1 = Promise.resolve().then(() => require("./0"));
function arguments() { }
@@ -44,13 +44,13 @@ function foo() {
"use strict";
var __syncRequire = typeof module === "object" && typeof module.exports === "object";
Object.defineProperty(exports, "__esModule", { value: true });
__syncRequire ? Promise.resolve().then(function () { return require("./0"); }) : new Promise(function (resolve_1, reject_1) { require(["./0"], resolve_1, reject_1); });
var p1 = __syncRequire ? Promise.resolve().then(function () { return require("./0"); }) : new Promise(function (resolve_2, reject_2) { require(["./0"], resolve_2, reject_2); });
__syncRequire ? Promise.resolve().then(() => require("./0")) : new Promise((resolve_1, reject_1) => { require(["./0"], resolve_1, reject_1); });
var p1 = __syncRequire ? Promise.resolve().then(() => require("./0")) : new Promise((resolve_2, reject_2) => { require(["./0"], resolve_2, reject_2); });
p1.then(zero => {
return zero.foo();
});
exports.p2 = __syncRequire ? Promise.resolve().then(function () { return require("./0"); }) : new Promise(function (resolve_3, reject_3) { require(["./0"], resolve_3, reject_3); });
exports.p2 = __syncRequire ? Promise.resolve().then(() => require("./0")) : new Promise((resolve_3, reject_3) => { require(["./0"], resolve_3, reject_3); });
function foo() {
const p2 = __syncRequire ? Promise.resolve().then(function () { return require("./0"); }) : new Promise(function (resolve_4, reject_4) { require(["./0"], resolve_4, reject_4); });
const p2 = __syncRequire ? Promise.resolve().then(() => require("./0")) : new Promise((resolve_4, reject_4) => { require(["./0"], resolve_4, reject_4); });
}
});
@@ -52,5 +52,5 @@ foo(import("./0"));
b.print();
});
}
foo(__syncRequire ? Promise.resolve().then(function () { return require("./0"); }) : new Promise(function (resolve_1, reject_1) { require(["./0"], resolve_1, reject_1); }));
foo(__syncRequire ? Promise.resolve().then(() => require("./0")) : new Promise((resolve_1, reject_1) => { require(["./0"], resolve_1, reject_1); }));
});
@@ -43,7 +43,7 @@ foo();
"use strict";
var __syncRequire = typeof module === "object" && typeof module.exports === "object";
async function foo() {
class C extends (await (__syncRequire ? Promise.resolve().then(function () { return require("./0"); }) : new Promise(function (resolve_1, reject_1) { require(["./0"], resolve_1, reject_1); }))).B {
class C extends (await (__syncRequire ? Promise.resolve().then(() => require("./0")) : new Promise((resolve_1, reject_1) => { require(["./0"], resolve_1, reject_1); }))).B {
}
var c = new C();
c.print();
@@ -89,30 +89,30 @@ export class D {
Object.defineProperty(exports, "__esModule", { value: true });
class C {
constructor() {
this.myModule = __syncRequire ? Promise.resolve().then(function () { return require("./0"); }) : new Promise(function (resolve_1, reject_1) { require(["./0"], resolve_1, reject_1); });
this.myModule = __syncRequire ? Promise.resolve().then(() => require("./0")) : new Promise((resolve_1, reject_1) => { require(["./0"], resolve_1, reject_1); });
}
method() {
const loadAsync = __syncRequire ? Promise.resolve().then(function () { return require("./0"); }) : new Promise(function (resolve_2, reject_2) { require(["./0"], resolve_2, reject_2); });
const loadAsync = __syncRequire ? Promise.resolve().then(() => require("./0")) : new Promise((resolve_2, reject_2) => { require(["./0"], resolve_2, reject_2); });
this.myModule.then(Zero => {
console.log(Zero.foo());
}, async (err) => {
console.log(err);
let one = await (__syncRequire ? Promise.resolve().then(function () { return require("./1"); }) : new Promise(function (resolve_3, reject_3) { require(["./1"], resolve_3, reject_3); }));
let one = await (__syncRequire ? Promise.resolve().then(() => require("./1")) : new Promise((resolve_3, reject_3) => { require(["./1"], resolve_3, reject_3); }));
console.log(one.backup());
});
}
}
class D {
constructor() {
this.myModule = __syncRequire ? Promise.resolve().then(function () { return require("./0"); }) : new Promise(function (resolve_4, reject_4) { require(["./0"], resolve_4, reject_4); });
this.myModule = __syncRequire ? Promise.resolve().then(() => require("./0")) : new Promise((resolve_4, reject_4) => { require(["./0"], resolve_4, reject_4); });
}
method() {
const loadAsync = __syncRequire ? Promise.resolve().then(function () { return require("./0"); }) : new Promise(function (resolve_5, reject_5) { require(["./0"], resolve_5, reject_5); });
const loadAsync = __syncRequire ? Promise.resolve().then(() => require("./0")) : new Promise((resolve_5, reject_5) => { require(["./0"], resolve_5, reject_5); });
this.myModule.then(Zero => {
console.log(Zero.foo());
}, async (err) => {
console.log(err);
let one = await (__syncRequire ? Promise.resolve().then(function () { return require("./1"); }) : new Promise(function (resolve_6, reject_6) { require(["./1"], resolve_6, reject_6); }));
let one = await (__syncRequire ? Promise.resolve().then(() => require("./1")) : new Promise((resolve_6, reject_6) => { require(["./1"], resolve_6, reject_6); }));
console.log(one.backup());
});
}
@@ -42,20 +42,20 @@ exports.C = C;
//// [1.js]
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
Promise.resolve().then(function () { return require(`${directory}\${moduleFile}`); });
Promise.resolve().then(function () { return require(getSpecifier()); });
var p1 = Promise.resolve().then(function () { return require(ValidSomeCondition() ? "./0" : "externalModule"); });
var p1 = Promise.resolve().then(function () { return require(getSpecifier()); });
var p11 = Promise.resolve().then(function () { return require(getSpecifier()); });
const p2 = Promise.resolve().then(function () { return require(whatToLoad ? getSpecifier() : "defaulPath"); });
Promise.resolve().then(() => require(`${directory}\${moduleFile}`));
Promise.resolve().then(() => require(getSpecifier()));
var p1 = Promise.resolve().then(() => require(ValidSomeCondition() ? "./0" : "externalModule"));
var p1 = Promise.resolve().then(() => require(getSpecifier()));
var p11 = Promise.resolve().then(() => require(getSpecifier()));
const p2 = Promise.resolve().then(() => require(whatToLoad ? getSpecifier() : "defaulPath"));
p1.then(zero => {
return zero.foo(); // ok, zero is any
});
let j;
var p3 = Promise.resolve().then(function () { return require(j = getSpecifier()); });
var p3 = Promise.resolve().then(() => require(j = getSpecifier()));
function* loadModule(directories) {
for (const directory of directories) {
const path = `${directory}\moduleFile`;
Promise.resolve().then(function () { return require(yield path); });
Promise.resolve().then(() => require(yield path));
}
}
@@ -15,11 +15,11 @@ var p4 = import(()=>"PathToModule");
//// [importCallExpressionSpecifierNotStringTypeError.js]
// Error specifier is not assignable to string
Promise.resolve().then(function () { return require(getSpecifier()); });
var p1 = Promise.resolve().then(function () { return require(getSpecifier()); });
const p2 = Promise.resolve().then(function () { return require(whatToLoad ? getSpecifier() : "defaulPath"); });
Promise.resolve().then(() => require(getSpecifier()));
var p1 = Promise.resolve().then(() => require(getSpecifier()));
const p2 = Promise.resolve().then(() => require(whatToLoad ? getSpecifier() : "defaulPath"));
p1.then(zero => {
return zero.foo(); // ok, zero is any
});
var p3 = Promise.resolve().then(function () { return require(["path1", "path2"]); });
var p4 = Promise.resolve().then(function () { return require(() => "PathToModule"); });
var p3 = Promise.resolve().then(() => require(["path1", "path2"]));
var p4 = Promise.resolve().then(() => require(() => "PathToModule"));
@@ -15,5 +15,5 @@ function foo() { return "foo"; }
exports.foo = foo;
//// [1.js]
"use strict";
var p1 = Promise.resolve().then(function () { return require("./0"); }); // error
var p2 = Promise.resolve().then(function () { return require("./0"); }); // error
var p1 = Promise.resolve().then(() => require("./0")); // error
var p2 = Promise.resolve().then(() => require("./0")); // error
@@ -0,0 +1,14 @@
// @lib: es2015
// @target: es2015
// @module: umd
// https://github.com/Microsoft/TypeScript/issues/17564
class C {
private _path = './other';
dynamic() {
return import(this._path);
}
}
const c = new C();
c.dynamic();
@@ -0,0 +1,14 @@
// @lib: es2015
// @target: es5
// @module: umd
// https://github.com/Microsoft/TypeScript/issues/17564
class C {
private _path = './other';
dynamic() {
return import(this._path);
}
}
const c = new C();
c.dynamic();