Skip to content

Proposal: export as namespace for UMD module output #26532

@saschanaz

Description

@saschanaz

Current problem

TypeScript supports UMD output but does not support exporting as a global namespace.

Syntax

  NamespaceExportDeclaration:
   exportasnamespaceIdentifierPath

Behavior

export var x = 0;
export function y() {}
export default {};
export as namespace My.Custom.Namespace;

// emits:

(function (global, 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);
  }
  else {
    global.My = global.My || {};
    global.My.Custom = global.My.Custom || {};
    global.My.Custom.Namespace = global.My.Custom.Namespace || {};
    var exports = global.My.Custom.Namespace;
    factory(global.require, exports);
  }
})(this, function (require, exports) {
  "use strict";
  exports.__esModule = true;
  exports.x = 0;
  function y() { }
  exports.y = y;
  exports["default"] = {};
});

Note

  • This proposal basically follows Babel behavior.
  • Importing any module without a module loader will throw in this proposal. A further extension may use global namespaces as Babel does.
  • Babel overwrites on the existing namespace whereas this proposal extends the existing one, as TS namespace does.
  • Rollup has a special behavior where export default X works like CommonJS module.exports = X whereas this proposal does not.

Prior arts: Babel exactGlobals, Webpack multi part library, Rollup output.name option with namespace support

See also

#8436
#10907
#20990

Metadata

Metadata

Assignees

No one assigned

    Labels

    In DiscussionNot yet reached consensusSuggestionAn idea for TypeScript

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions