Skip to content

__importDefault without tslib in output when noEmitHelpers and importHelpers set to true #40328

Closed
@mrttrifork

Description

@mrttrifork

TypeScript Version: 4.0.2

Search Terms:

tslib, __importDefault

Code

Using "noEmitHelpers": true and "importHelpers": true does not always include tslib_1 in files, in the last example __importDefault is in the index.js file, without any tslib_1

tsconfig

{
  "compileOnSave": false,
  "compilerOptions": {
    "target": "es5",
    "lib": [
      "es2017", "dom", "es2018.promise"
    ],
    "module": "commonjs",
    "moduleResolution": "node",
    "rootDir": "./src",
    "declaration": true,
    "noLib": false,
    "outDir": "target/lib/ts",
    "allowSyntheticDefaultImports": true,
    "sourceMap": true,
    "strictBindCallApply": false,
    "esModuleInterop": true,
    "strictNullChecks": true,
    "noUnusedLocals": true,
    "noImplicitAny": true,
    "noEmitHelpers": true,
    "importHelpers": true
  },
  "exclude": [
    "node_modules",
    "target"
  ]
}

TypeScript 3.9.7

// index.ts
export * from "./core/Core";
export {default as HandlerManager} from "./core/HandlerManager";

// becomes

// index.js
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
tslib_1.__exportStar(require("./core/Core"), exports);
var HandlerManager_1 = require("./core/HandlerManager");
Object.defineProperty(exports, "HandlerManager", { enumerable: true, get: function () { return HandlerManager_1.default; } });

Here tslib_1 is only used for exportStar and HandlerManager is not wrapped in __importDefault

TypeScript 4.0.2

// index.ts
export * from "./core/Core";
export {default as HandlerManager} from "./core/HandlerManager";

// becomes

// index.js
Object.defineProperty(exports, "__esModule", { value: true });
// lots of exports, removed because only HandlerManager is relevant
exports.firstExport = ... = exports.HandlerManager = void 0;
var tslib_1 = require("tslib");
tslib_1.__exportStar(require("./core/Core"), exports);
var HandlerManager_1 = require("./core/HandlerManager");
Object.defineProperty(exports, "HandlerManager", { enumerable: true, get: function () { return tslib_1.__importDefault(HandlerManager_1).default; } });

Here HandlerManager is imported correct with tslib_1, however if we remove the * import from index.ts, we have

// index.ts
// export * from "./core/Core";
export {default as HandlerManager} from "./core/HandlerManager";

// becomes

// index.js
Object.defineProperty(exports, "__esModule", { value: true });
// lots of exports, removed because only HandlerManager is relevant
exports.firstExport = ... = exports.HandlerManager = void 0;
// export * from "./core/Core";
var HandlerManager_1 = require("./core/HandlerManager");
Object.defineProperty(exports, "HandlerManager", { enumerable: true, get: function () { return __importDefault(HandlerManager_1).default; } });

Now we have __importDefault , but tslib is not imported and __importDefault doesn't come from tslib, so __importDefault is undefined

Expected behavior:

tslib should be imported in index.js and importDefault should be called like tslib_1.__importDefault

Actual behavior:

__importDefault without any tslib in index.js

Playground Link: Not possible, requires more than 1 file

Related Issues: No similar issues

Metadata

Metadata

Assignees

Labels

Fix AvailableA PR has been opened for this issueRescheduledThis issue was previously scheduled to an earlier milestone

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions