Skip to content
This repository was archived by the owner on Jul 13, 2020. It is now read-only.
This repository was archived by the owner on Jul 13, 2020. It is now read-only.

When loading commonjs modules, named exports after the default export are 'undefined' #527

Closed
@nnajm

Description

@nnajm

Hello,

Issue type: Bug
Version: 2.1.0

When using systemjs to load transpiled typescript to commonjs modules, if a named export comes after a default export, the named export will be lost.

Example:

  • comp.ts
export const b = 3;
export default 1;
export const c = 5;
  • main.ts
import a, {b, c} from './comp';

console.log(a + b + c); // <== c will be undefined
  • system.config.js
System.config({
  //use typescript for compilation
  transpiler: 'ts',
  typescriptOptions: {
    "module": "commonjs"
  },
  //map tells the System loader where to look for things
  map: {
    ts: "https://raw.githubusercontent.com/frankwallis/plugin-typescript/master/lib/plugin.js",
    typescript: "https://cdnjs.cloudflare.com/ajax/libs/typescript/2.1.6/typescript.js"
  },
  //packages defines our app package
  packages: {
    src: {
      main: './main'
    }
  },
  meta: {
    "*.ts": {
      "loader": "ts"
    },
    typescript: {
      "exports": "ts"
    }
  }
});

Plunker: https://plnkr.co/edit/JP20hkNbmryPVYhvcklP?p=preview


Proposed solution

I've found the location of the bug to be in register-loader.js/doEvaluate

// __esModule flag extension support via lifting
if (moduleObj.default && moduleObj.default.__esModule) {
    moduleObj.__useDefault = false;
    for (var p in moduleObj.default) {
        if (Object.hasOwnProperty.call(moduleObj.default, p))
            moduleObj[p] = moduleObj.default[p];
        }
        moduleObj.__esModule = true;
}

A solution would be to save a reference to default obj before copying it to moduleObj:

var moduleDefault = moduleObj.default;

// __esModule flag extension support via lifting
if (moduleDefault && moduleDefault.__esModule) {
    moduleObj.__useDefault = false;

    for (var p in moduleDefault) {
        if (Object.hasOwnProperty.call(moduleDefault, p))
            moduleObj[p] = moduleDefault[p];
    }

    moduleObj.__esModule = true;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions