Skip to content
This repository was archived by the owner on Sep 5, 2024. It is now read-only.

Commit d85e14a

Browse files
fix(build): correct detection and generation ngMaterial module definition
Correct the dynamic generation of the `ngMaterial` module definition with dependencies on angular material components only. ```js angular.module('ngMaterial', ["ng","ngAnimate","ngAria","material.core","material.core.gestures","material.layout".... ]); ```
1 parent e4ca61f commit d85e14a

File tree

9 files changed

+155
-127
lines changed

9 files changed

+155
-127
lines changed

config/ngModuleData.js

Lines changed: 45 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,48 @@
1-
// Regex adapted from https://github.com/ceymard/gulp-ngcompile
2-
3-
module.exports = function processContent(fileContent, materialOnly) {
4-
var NG_MODULE_REGEX = materialOnly ? /\.module\(('material\.[^']*'|"material\.[^"]*")\s*,(?:\s*\[([^\]]+)\])?/g : /\.module\(('[^']*'|"[^"]*")\s*,(?:\s*\[([^\]]+)\])?/g;
5-
var match = NG_MODULE_REGEX.exec(fileContent || '');
6-
var module = match && match[1] && match[1].slice(1, -1); //remove quotes
7-
var depsMatch = match && match[2] && match[2].trim();
8-
9-
var dependencies = [];
10-
if (depsMatch) {
11-
dependencies = depsMatch.split(/\s*,\s*/).map(function(dep) {
12-
dep = dep.slice(1, -1); //remove quotes
13-
return dep;
14-
});
1+
/**
2+
* The Angular Material module `ngMaterial` is generated by scanning all Material components
3+
* for valid module definitions. @see gulp-utils.js ::buildNgMaterialDefinition()
4+
*
5+
* angular.module('ngMaterial', [
6+
* "ng","ngAnimate","ngAria",
7+
* "material.core","material.core.gestures","material.layout","material.core.theming.palette",
8+
* ...
9+
* ]);
10+
*
11+
*/
12+
13+
// Define patterns for AngularJS Module definitions
14+
15+
var MATERIAL_ONLY = /\.module\(['|"](material\.[a-zA-Z\-\.]*)['|"]\s*,(\s*\[([^\]]*)\])/;
16+
var ANY = /\.module\(('[^']*'|"[^"]*")\s*,(?:\s*\[([^\]]+)\])?/;
17+
18+
/**
19+
* Find module definition s that match the module definition pattern
20+
*/
21+
function buildScanner(pattern) {
22+
23+
return function findPatternIn(content) {
24+
var dependencies;
25+
var match = pattern.exec(content || '');
26+
var moduleName = match ? match[1].replace(/\'/gi,'') : null;
27+
var depsMatch = match && match[2] && match[2].trim();
28+
29+
if (depsMatch) {
30+
dependencies = depsMatch.split(/\s*,\s*/).map(function(dep) {
31+
dep = dep.trim().slice(1, -1); //remove quotes
32+
return dep;
33+
});
34+
}
35+
36+
return match ? {
37+
name : moduleName || '',
38+
module : moduleName || '',
39+
dependencies : dependencies || [ ]
40+
} : null;
1541
}
42+
}
1643

17-
return {
18-
module: module || '',
19-
dependencies: dependencies
20-
};
44+
module.exports = {
45+
material : buildScanner( MATERIAL_ONLY ),
46+
any : buildScanner( ANY )
2147
};
48+

docs/app/js/app.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
var DocsApp = angular.module('docsApp', ['ngMaterial', 'ngRoute', 'angularytics', 'ngMessages'])
1+
var DocsApp = angular.module('docsApp', [ 'angularytics', 'ngRoute', 'ngMessages', 'ngMaterial' ])
22

33
.config([
44
'SERVICES',
@@ -716,5 +716,4 @@ function($rootScope, $scope, component, demos, $http, $templateCache, $q) {
716716
}
717717
return str;
718718
};
719-
})
720-
;
719+
});

scripts/gulp-utils.js

Lines changed: 34 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ var Buffer = require('buffer').Buffer;
77
var fs = require('fs');
88

99
var path = require('path');
10-
11-
var getModuleInfo = require('../config/ngModuleData.js');
10+
var findModule = require('../config/ngModuleData.js');
1211

1312
exports.humanizeCamelCase = function(str) {
1413
switch (str) {
@@ -77,7 +76,7 @@ exports.readModuleDemos = function(moduleName, fileTasks) {
7776
} else {
7877
var fileType = path.extname(file.path).substring(1);
7978
if (fileType == 'js') {
80-
demo.ngModule = demo.ngModule || getModuleInfo(file.contents.toString());
79+
demo.ngModule = demo.ngModule || findModule.any(file.contents.toString());
8180
}
8281
demo[fileType] && demo[fileType].push(toDemoObject(file));
8382
}
@@ -106,8 +105,8 @@ exports.pathsForModule = function(name) {
106105
function lookupPath() {
107106
gulp.src('src/{services,components,core}/**/*')
108107
.pipe(through2.obj(function(file, enc, next) {
109-
var modName = getModuleInfo(file.contents).module;
110-
if (modName == name) {
108+
var module = findModule.any(file.contents);
109+
if (module && module.name == name) {
111110
var modulePath = file.path.split(path.sep).slice(0, -1).join(path.sep);
112111
pathsForModules[name] = modulePath + '/**';
113112
}
@@ -123,8 +122,8 @@ exports.filesForModule = function(name) {
123122
} else {
124123
return gulp.src('src/{services,components,core}/**/*')
125124
.pipe(through2.obj(function(file, enc, next) {
126-
var modName = getModuleInfo(file.contents).module;
127-
if (modName == name) {
125+
var module = findModule.any(file.contents);
126+
if (module && (module.name == name)) {
128127
var modulePath = file.path.split(path.sep).slice(0, -1).join(path.sep);
129128
pathsForModules[name] = modulePath + '/**';
130129
var self = this;
@@ -165,29 +164,33 @@ exports.appendToFile = function(filePath) {
165164
};
166165

167166
exports.buildNgMaterialDefinition = function() {
168-
var buffer = [];
167+
var srcBuffer = [];
169168
var modulesSeen = [];
169+
var count = 0;
170170
return through2.obj(function(file, enc, next) {
171-
var moduleName;
172-
if (moduleName = getModuleInfo(file.contents, true).module) {
173-
modulesSeen.push(moduleName);
174-
}
175-
buffer.push(file);
171+
var module = findModule.material(file.contents);
172+
if (module) modulesSeen.push(module.name);
173+
srcBuffer.push(file);
176174
next();
177175
}, function(done) {
178-
var EXPLICIT_DEPS = ['ng', 'ngAnimate', 'ngAria'];
179-
var angularFileContents = "angular.module('ngMaterial', " + JSON.stringify(EXPLICIT_DEPS.concat(modulesSeen)) + ');';
176+
var self = this;
177+
var requiredLibs = ['ng', 'ngAnimate', 'ngAria'];
178+
var dependencies = JSON.stringify(requiredLibs.concat(modulesSeen));
179+
var ngMaterialModule = "angular.module('ngMaterial', " + dependencies + ');';
180180
var angularFile = new gutil.File({
181181
base: process.cwd(),
182182
path: process.cwd() + '/ngMaterial.js',
183-
contents: new Buffer(angularFileContents)
183+
contents: new Buffer(ngMaterialModule)
184184
});
185-
this.push(angularFile);
186-
var self = this;
187-
buffer.forEach(function(file) {
185+
186+
// Elevate ngMaterial module registration to first in queue
187+
self.push(angularFile);
188+
189+
srcBuffer.forEach(function(file) {
188190
self.push(file);
189191
});
190-
buffer = [];
192+
193+
srcBuffer = [];
191194
done();
192195
});
193196
};
@@ -197,8 +200,8 @@ function moduleNameToClosureName(name) {
197200
}
198201
exports.addJsWrapper = function(enforce) {
199202
return through2.obj(function(file, enc, next) {
200-
var moduleInfo = getModuleInfo(file.contents);
201-
if (!!enforce || moduleInfo.module) {
203+
var module = findModule.any(file.contents);
204+
if (!!enforce || module) {
202205
file.contents = new Buffer([
203206
!!enforce ? '(function(){' : '(function( window, angular, undefined ){',
204207
'"use strict";\n',
@@ -212,18 +215,18 @@ exports.addJsWrapper = function(enforce) {
212215
};
213216
exports.addClosurePrefixes = function() {
214217
return through2.obj(function(file, enc, next) {
215-
var moduleInfo = getModuleInfo(file.contents);
216-
if (moduleInfo.module) {
217-
var closureModuleName = moduleNameToClosureName(moduleInfo.module);
218-
var requires = (moduleInfo.dependencies || []).sort().map(function(dep) {
219-
return dep.indexOf(moduleInfo.module) === 0 ? '' : 'goog.require(\'' + moduleNameToClosureName(dep) + '\');';
218+
var module = findModule.any(file.contents);
219+
if (module) {
220+
var closureModuleName = moduleNameToClosureName(module.name);
221+
var requires = (module.dependencies || []).sort().map(function(dep) {
222+
return dep.indexOf(module.name) === 0 ? '' : 'goog.require(\'' + moduleNameToClosureName(dep) + '\');';
220223
}).join('\n');
221224

222225
file.contents = new Buffer([
223226
'goog.provide(\'' + closureModuleName + '\');',
224227
requires,
225228
file.contents.toString(),
226-
closureModuleName + ' = angular.module("' + moduleInfo.module + '");'
229+
closureModuleName + ' = angular.module("' + module.name + '");'
227230
].join('\n'));
228231
}
229232
this.push(file);
@@ -234,10 +237,10 @@ exports.addClosurePrefixes = function() {
234237
exports.buildModuleBower = function(name, version) {
235238
return through2.obj(function(file, enc, next) {
236239
this.push(file);
237-
var moduleInfo = getModuleInfo(file.contents);
238-
if (moduleInfo.module) {
240+
var module = findModule.any(file.contents);
241+
if (module) {
239242
var bowerDeps = {};
240-
(moduleInfo.dependencies || []).forEach(function(dep) {
243+
(module.dependencies || []).forEach(function(dep) {
241244
var convertedName = 'angular-material-' + dep.split('.').pop();
242245
bowerDeps[convertedName] = version;
243246
});

src/components/bottomSheet/bottom-sheet.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@
44
* @description
55
* BottomSheet
66
*/
7-
angular.module('material.components.bottomSheet', [
8-
'material.core',
9-
'material.components.backdrop'
10-
])
7+
angular
8+
.module('material.components.bottomSheet', [
9+
'material.core',
10+
'material.components.backdrop'
11+
])
1112
.directive('mdBottomSheet', MdBottomSheetDirective)
1213
.provider('$mdBottomSheet', MdBottomSheetProvider);
1314

src/components/select/select.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ var SELECT_EDGE_MARGIN = 8;
2222
var selectNextId = 0;
2323

2424
angular.module('material.components.select', [
25-
'material.core',
26-
'material.components.backdrop'
27-
])
25+
'material.core',
26+
'material.components.backdrop'
27+
])
2828
.directive('mdSelect', SelectDirective)
2929
.directive('mdSelectMenu', SelectMenuDirective)
3030
.directive('mdOption', OptionDirective)

src/components/sidenav/sidenav.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
* @description
66
* A Sidenav QP component.
77
*/
8-
angular.module('material.components.sidenav', [
8+
angular
9+
.module('material.components.sidenav', [
910
'material.core',
1011
'material.components.backdrop'
1112
])
@@ -16,7 +17,6 @@ angular.module('material.components.sidenav', [
1617

1718

1819
/**
19-
* @private
2020
* @ngdoc service
2121
* @name $mdSidenav
2222
* @module material.components.sidenav

0 commit comments

Comments
 (0)