Skip to content

Bug with transpiling dynamic imports within class definitions #17371

@bradzacher

Description

@bradzacher

TypeScript Version: 2.4.1

Code
filename: test.ts

export async function fn() {
    const req = await import('./test') // ONE
}

export class cl1 {
    public async m() {
        const req = await import('./test') // TWO
    }
}

export const obj = {
    m: async () => {
        const req = await import('./test') // THREE
    }
}

export class cl2 {
    public p = {
        m: async () => {
            const req = await import('./test') // FOUR
        }
    }
}

export const l = async () => {
    const req = await import('./test') // FIVE
}

Command Line
tsc test.ts -t es6 -m commonjs

Expected behavior:
All dynamic imports should be converted to es6+commonjs compatible wrapped requires

Actual behavior:
Import ONE, THREE and FIVE are transpiled successfully, but imports TWO and FOUR are left as import statements.

It looks like a problem with transpiling imports within class definitions themselves.

Output js:

"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
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
    });
}
exports.fn = fn;
class cl1 {
    m() {
        return __awaiter(this, void 0, void 0, function* () {
            const req = yield import('./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
    })
};
class cl2 {
    constructor() {
        this.p = {
            m: () => __awaiter(this, void 0, void 0, function* () {
                const req = yield import('./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
});

Metadata

Metadata

Assignees

Labels

BugA bug in TypeScript

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions