Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 43 additions & 19 deletions src/compiler/emitter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6404,19 +6404,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
write("});");
}

function emitAMDDependencies(node: SourceFile, includeNonAmdDependencies: boolean) {
// An AMD define function has the following shape:
// define(id?, dependencies?, factory);
//
// This has the shape of
// define(name, ["module1", "module2"], function (module1Alias) {
// The location of the alias in the parameter list in the factory function needs to
// match the position of the module name in the dependency list.
//
// To ensure this is true in cases of modules with no aliases, e.g.:
// `import "module"` or `<amd-dependency path= "a.css" />`
// we need to add modules without alias names to the end of the dependencies list
interface AMDDependencyNames {
aliasedModuleNames: string[];
unaliasedModuleNames: string[];
importAliasNames: string[];
}

function getAMDDependencyNames(node: SourceFile, includeNonAmdDependencies: boolean): AMDDependencyNames {
// names of modules with corresponding parameter in the factory function
let aliasedModuleNames: string[] = [];
// names of modules with no corresponding parameters in factory function
Expand Down Expand Up @@ -6451,6 +6445,29 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
}
}

return { aliasedModuleNames, unaliasedModuleNames, importAliasNames };
}

function emitAMDDependencies(node: SourceFile, includeNonAmdDependencies: boolean) {
// An AMD define function has the following shape:
// define(id?, dependencies?, factory);
//
// This has the shape of
// define(name, ["module1", "module2"], function (module1Alias) {
// The location of the alias in the parameter list in the factory function needs to
// match the position of the module name in the dependency list.
//
// To ensure this is true in cases of modules with no aliases, e.g.:
// `import "module"` or `<amd-dependency path= "a.css" />`
// we need to add modules without alias names to the end of the dependencies list

let dependencyNames = getAMDDependencyNames(node, includeNonAmdDependencies);
emitAMDDependencyList(dependencyNames);
write(", ");
emitAMDFactoryHeader(dependencyNames);
}

function emitAMDDependencyList({ aliasedModuleNames, unaliasedModuleNames }: AMDDependencyNames) {
write("[\"require\", \"exports\"");
if (aliasedModuleNames.length) {
write(", ");
Expand All @@ -6460,11 +6477,16 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
write(", ");
write(unaliasedModuleNames.join(", "));
}
write("], function (require, exports");
write("]");
}

function emitAMDFactoryHeader({ importAliasNames }: AMDDependencyNames) {
write("function (require, exports");
if (importAliasNames.length) {
write(", ");
write(importAliasNames.join(", "));
}
write(") {");
}

function emitAMDModule(node: SourceFile, startIndex: number) {
Expand All @@ -6477,7 +6499,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
write("\"" + node.moduleName + "\", ");
}
emitAMDDependencies(node, /*includeNonAmdDependencies*/ true);
write(") {");
increaseIndent();
emitExportStarHelper();
emitCaptureThisForNodeIfNecessary(node);
Expand All @@ -6503,17 +6524,20 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
emitEmitHelpers(node);
collectExternalModuleInfo(node);

let dependencyNames = getAMDDependencyNames(node, /*includeNonAmdDependencies*/ false);

// Module is detected first to support Browserify users that load into a browser with an AMD loader
writeLines(`(function (deps, factory) {
writeLines(`(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(deps, factory);
}
define(`);
emitAMDDependencyList(dependencyNames);
write(", factory);");
writeLines(` }
})(`);
emitAMDDependencies(node, false);
write(") {");
emitAMDFactoryHeader(dependencyNames);
increaseIndent();
emitExportStarHelper();
emitCaptureThisForNodeIfNecessary(node);
Expand Down
6 changes: 3 additions & 3 deletions tests/baselines/reference/es5-umd2.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,14 @@ export class A


//// [es5-umd2.js]
(function (deps, factory) {
(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(deps, factory);
define(["require", "exports"], factory);
}
})(["require", "exports"], function (require, exports) {
})(function (require, exports) {
var A = (function () {
function A() {
}
Expand Down
6 changes: 3 additions & 3 deletions tests/baselines/reference/es5-umd3.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,14 @@ export default class A


//// [es5-umd3.js]
(function (deps, factory) {
(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(deps, factory);
define(["require", "exports"], factory);
}
})(["require", "exports"], function (require, exports) {
})(function (require, exports) {
var A = (function () {
function A() {
}
Expand Down
6 changes: 3 additions & 3 deletions tests/baselines/reference/es5-umd4.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@ export = A;


//// [es5-umd4.js]
(function (deps, factory) {
(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(deps, factory);
define(["require", "exports"], factory);
}
})(["require", "exports"], function (require, exports) {
})(function (require, exports) {
var A = (function () {
function A() {
}
Expand Down
6 changes: 3 additions & 3 deletions tests/baselines/reference/es6-umd2.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@ export class A
}

//// [es6-umd2.js]
(function (deps, factory) {
(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(deps, factory);
define(["require", "exports"], factory);
}
})(["require", "exports"], function (require, exports) {
})(function (require, exports) {
class A {
constructor() {
}
Expand Down
6 changes: 3 additions & 3 deletions tests/baselines/reference/exportNonInitializedVariablesUMD.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,14 @@ export let h1: D = new D;


//// [exportNonInitializedVariablesUMD.js]
(function (deps, factory) {
(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(deps, factory);
define(["require", "exports"], factory);
}
})(["require", "exports"], function (require, exports) {
})(function (require, exports) {
var ;
let;
var ;
Expand Down
6 changes: 3 additions & 3 deletions tests/baselines/reference/isolatedModulesPlainFile-UMD.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ run(1);


//// [isolatedModulesPlainFile-UMD.js]
(function (deps, factory) {
(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(deps, factory);
define(["require", "exports"], factory);
}
})(["require", "exports"], function (require, exports) {
})(function (require, exports) {
run(1);
});
6 changes: 3 additions & 3 deletions tests/baselines/reference/umdDependencyComment2.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@ m1.f();

//// [umdDependencyComment2.js]
///<amd-dependency path='bar'/>
(function (deps, factory) {
(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(deps, factory);
define(["require", "exports", "bar", "m2"], factory);
}
})(["require", "exports", "bar", "m2"], function (require, exports) {
})(function (require, exports) {
var m1 = require("m2");
m1.f();
});
6 changes: 3 additions & 3 deletions tests/baselines/reference/umdDependencyCommentName1.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@ m1.f();

//// [umdDependencyCommentName1.js]
///<amd-dependency path='bar' name='b'/>
(function (deps, factory) {
(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(deps, factory);
define(["require", "exports", "bar", "m2"], factory);
}
})(["require", "exports", "bar", "m2"], function (require, exports, b) {
})(function (require, exports, b) {
var m1 = require("m2");
m1.f();
});
6 changes: 3 additions & 3 deletions tests/baselines/reference/umdDependencyCommentName2.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@ m1.f();
///<amd-dependency path='bar' name='b'/>
///<amd-dependency path='foo'/>
///<amd-dependency path='goo' name='c'/>
(function (deps, factory) {
(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(deps, factory);
define(["require", "exports", "bar", "goo", "foo", "m2"], factory);
}
})(["require", "exports", "bar", "goo", "foo", "m2"], function (require, exports, b, c) {
})(function (require, exports, b, c) {
var m1 = require("m2");
m1.f();
});
6 changes: 3 additions & 3 deletions tests/cases/unittests/transpile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -202,14 +202,14 @@ var x = 0;`,
`declare function use(a: any);\n` +
`use(foo);`
let output =
`(function (deps, factory) {\n` +
`(function (factory) {\n` +
` if (typeof module === 'object' && typeof module.exports === 'object') {\n` +
` var v = factory(require, exports); if (v !== undefined) module.exports = v;\n` +
` }\n` +
` else if (typeof define === 'function' && define.amd) {\n` +
` define(deps, factory);\n` +
` define(["require", "exports", "SomeOtherName"], factory);\n` +
` }\n` +
`})(["require", "exports", "SomeOtherName"], function (require, exports) {\n` +
`})(function (require, exports) {\n` +
` var SomeName_1 = require("SomeOtherName");\n` +
` use(SomeName_1.foo);\n` +
`});\n`;
Expand Down