Skip to content

Commit f396904

Browse files
committed
Put AMD dependency list inline with define call in UMD modules
Fixes microsoft#4952.
1 parent 76ef9ce commit f396904

11 files changed

Lines changed: 73 additions & 49 deletions

src/compiler/emitter.ts

Lines changed: 43 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6404,19 +6404,13 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
64046404
write("});");
64056405
}
64066406

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

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

6448+
return { aliasedModuleNames, unaliasedModuleNames, importAliasNames };
6449+
}
6450+
6451+
function emitAMDDependencies(node: SourceFile, includeNonAmdDependencies: boolean) {
6452+
// An AMD define function has the following shape:
6453+
// define(id?, dependencies?, factory);
6454+
//
6455+
// This has the shape of
6456+
// define(name, ["module1", "module2"], function (module1Alias) {
6457+
// The location of the alias in the parameter list in the factory function needs to
6458+
// match the position of the module name in the dependency list.
6459+
//
6460+
// To ensure this is true in cases of modules with no aliases, e.g.:
6461+
// `import "module"` or `<amd-dependency path= "a.css" />`
6462+
// we need to add modules without alias names to the end of the dependencies list
6463+
6464+
let dependencyNames = getAMDDependencyNames(node, includeNonAmdDependencies);
6465+
emitAMDDependencyList(dependencyNames);
6466+
write(", ");
6467+
emitAMDFactoryHeader(dependencyNames);
6468+
}
6469+
6470+
function emitAMDDependencyList({ aliasedModuleNames, unaliasedModuleNames }: AMDDependencyNames) {
64546471
write("[\"require\", \"exports\"");
64556472
if (aliasedModuleNames.length) {
64566473
write(", ");
@@ -6460,11 +6477,16 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
64606477
write(", ");
64616478
write(unaliasedModuleNames.join(", "));
64626479
}
6463-
write("], function (require, exports");
6480+
write("]");
6481+
}
6482+
6483+
function emitAMDFactoryHeader({ importAliasNames }: AMDDependencyNames) {
6484+
write("function (require, exports");
64646485
if (importAliasNames.length) {
64656486
write(", ");
64666487
write(importAliasNames.join(", "));
64676488
}
6489+
write(") {");
64686490
}
64696491

64706492
function emitAMDModule(node: SourceFile, startIndex: number) {
@@ -6477,7 +6499,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
64776499
write("\"" + node.moduleName + "\", ");
64786500
}
64796501
emitAMDDependencies(node, /*includeNonAmdDependencies*/ true);
6480-
write(") {");
64816502
increaseIndent();
64826503
emitExportStarHelper();
64836504
emitCaptureThisForNodeIfNecessary(node);
@@ -6503,17 +6524,20 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi
65036524
emitEmitHelpers(node);
65046525
collectExternalModuleInfo(node);
65056526

6527+
let dependencyNames = getAMDDependencyNames(node, /*includeNonAmdDependencies*/ false);
6528+
65066529
// Module is detected first to support Browserify users that load into a browser with an AMD loader
6507-
writeLines(`(function (deps, factory) {
6530+
writeLines(`(function (factory) {
65086531
if (typeof module === 'object' && typeof module.exports === 'object') {
65096532
var v = factory(require, exports); if (v !== undefined) module.exports = v;
65106533
}
65116534
else if (typeof define === 'function' && define.amd) {
6512-
define(deps, factory);
6513-
}
6535+
define(`);
6536+
emitAMDDependencyList(dependencyNames);
6537+
write(", factory);");
6538+
writeLines(` }
65146539
})(`);
6515-
emitAMDDependencies(node, false);
6516-
write(") {");
6540+
emitAMDFactoryHeader(dependencyNames);
65176541
increaseIndent();
65186542
emitExportStarHelper();
65196543
emitCaptureThisForNodeIfNecessary(node);

tests/baselines/reference/es5-umd2.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ export class A
1515

1616

1717
//// [es5-umd2.js]
18-
(function (deps, factory) {
18+
(function (factory) {
1919
if (typeof module === 'object' && typeof module.exports === 'object') {
2020
var v = factory(require, exports); if (v !== undefined) module.exports = v;
2121
}
2222
else if (typeof define === 'function' && define.amd) {
23-
define(deps, factory);
23+
define(["require", "exports"], factory);
2424
}
25-
})(["require", "exports"], function (require, exports) {
25+
})(function (require, exports) {
2626
var A = (function () {
2727
function A() {
2828
}

tests/baselines/reference/es5-umd3.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ export default class A
1515

1616

1717
//// [es5-umd3.js]
18-
(function (deps, factory) {
18+
(function (factory) {
1919
if (typeof module === 'object' && typeof module.exports === 'object') {
2020
var v = factory(require, exports); if (v !== undefined) module.exports = v;
2121
}
2222
else if (typeof define === 'function' && define.amd) {
23-
define(deps, factory);
23+
define(["require", "exports"], factory);
2424
}
25-
})(["require", "exports"], function (require, exports) {
25+
})(function (require, exports) {
2626
var A = (function () {
2727
function A() {
2828
}

tests/baselines/reference/es5-umd4.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@ export = A;
1717

1818

1919
//// [es5-umd4.js]
20-
(function (deps, factory) {
20+
(function (factory) {
2121
if (typeof module === 'object' && typeof module.exports === 'object') {
2222
var v = factory(require, exports); if (v !== undefined) module.exports = v;
2323
}
2424
else if (typeof define === 'function' && define.amd) {
25-
define(deps, factory);
25+
define(["require", "exports"], factory);
2626
}
27-
})(["require", "exports"], function (require, exports) {
27+
})(function (require, exports) {
2828
var A = (function () {
2929
function A() {
3030
}

tests/baselines/reference/es6-umd2.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@ export class A
1414
}
1515

1616
//// [es6-umd2.js]
17-
(function (deps, factory) {
17+
(function (factory) {
1818
if (typeof module === 'object' && typeof module.exports === 'object') {
1919
var v = factory(require, exports); if (v !== undefined) module.exports = v;
2020
}
2121
else if (typeof define === 'function' && define.amd) {
22-
define(deps, factory);
22+
define(["require", "exports"], factory);
2323
}
24-
})(["require", "exports"], function (require, exports) {
24+
})(function (require, exports) {
2525
class A {
2626
constructor() {
2727
}

tests/baselines/reference/exportNonInitializedVariablesUMD.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,14 @@ export let h1: D = new D;
3535

3636

3737
//// [exportNonInitializedVariablesUMD.js]
38-
(function (deps, factory) {
38+
(function (factory) {
3939
if (typeof module === 'object' && typeof module.exports === 'object') {
4040
var v = factory(require, exports); if (v !== undefined) module.exports = v;
4141
}
4242
else if (typeof define === 'function' && define.amd) {
43-
define(deps, factory);
43+
define(["require", "exports"], factory);
4444
}
45-
})(["require", "exports"], function (require, exports) {
45+
})(function (require, exports) {
4646
var ;
4747
let;
4848
var ;

tests/baselines/reference/isolatedModulesPlainFile-UMD.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ run(1);
55

66

77
//// [isolatedModulesPlainFile-UMD.js]
8-
(function (deps, factory) {
8+
(function (factory) {
99
if (typeof module === 'object' && typeof module.exports === 'object') {
1010
var v = factory(require, exports); if (v !== undefined) module.exports = v;
1111
}
1212
else if (typeof define === 'function' && define.amd) {
13-
define(deps, factory);
13+
define(["require", "exports"], factory);
1414
}
15-
})(["require", "exports"], function (require, exports) {
15+
})(function (require, exports) {
1616
run(1);
1717
});

tests/baselines/reference/umdDependencyComment2.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ m1.f();
77

88
//// [umdDependencyComment2.js]
99
///<amd-dependency path='bar'/>
10-
(function (deps, factory) {
10+
(function (factory) {
1111
if (typeof module === 'object' && typeof module.exports === 'object') {
1212
var v = factory(require, exports); if (v !== undefined) module.exports = v;
1313
}
1414
else if (typeof define === 'function' && define.amd) {
15-
define(deps, factory);
15+
define(["require", "exports", "bar", "m2"], factory);
1616
}
17-
})(["require", "exports", "bar", "m2"], function (require, exports) {
17+
})(function (require, exports) {
1818
var m1 = require("m2");
1919
m1.f();
2020
});

tests/baselines/reference/umdDependencyCommentName1.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ m1.f();
77

88
//// [umdDependencyCommentName1.js]
99
///<amd-dependency path='bar' name='b'/>
10-
(function (deps, factory) {
10+
(function (factory) {
1111
if (typeof module === 'object' && typeof module.exports === 'object') {
1212
var v = factory(require, exports); if (v !== undefined) module.exports = v;
1313
}
1414
else if (typeof define === 'function' && define.amd) {
15-
define(deps, factory);
15+
define(["require", "exports", "bar", "m2"], factory);
1616
}
17-
})(["require", "exports", "bar", "m2"], function (require, exports, b) {
17+
})(function (require, exports, b) {
1818
var m1 = require("m2");
1919
m1.f();
2020
});

tests/baselines/reference/umdDependencyCommentName2.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ m1.f();
1111
///<amd-dependency path='bar' name='b'/>
1212
///<amd-dependency path='foo'/>
1313
///<amd-dependency path='goo' name='c'/>
14-
(function (deps, factory) {
14+
(function (factory) {
1515
if (typeof module === 'object' && typeof module.exports === 'object') {
1616
var v = factory(require, exports); if (v !== undefined) module.exports = v;
1717
}
1818
else if (typeof define === 'function' && define.amd) {
19-
define(deps, factory);
19+
define(["require", "exports", "bar", "goo", "foo", "m2"], factory);
2020
}
21-
})(["require", "exports", "bar", "goo", "foo", "m2"], function (require, exports, b, c) {
21+
})(function (require, exports, b, c) {
2222
var m1 = require("m2");
2323
m1.f();
2424
});

0 commit comments

Comments
 (0)