diff --git a/tools/bundler.js b/tools/bundler.js index c26b307351..8368e3b3ab 100644 --- a/tools/bundler.js +++ b/tools/bundler.js @@ -187,9 +187,9 @@ _.extend(PackageBundlingInfo.prototype, { return; self.files[where][rel_path] = true; - var ext = path.extname(rel_path).substr(1); - var handler = self.get_source_handler(ext); - if (handler) { + var ext = files.registered_file_extension(rel_path, self.api.registered_extensions()); + if (!! ext) { + var handler = self.get_source_handler(ext.substr(1)); handler(self.bundle.api, path.join(self.pkg.source_root, rel_path), path.join(self.pkg.serve_root, rel_path), diff --git a/tools/files.js b/tools/files.js index bbe6bde871..9827ac9599 100644 --- a/tools/files.js +++ b/tools/files.js @@ -85,7 +85,7 @@ var files = module.exports = { extensions, func); }); }); - } else if (_.indexOf(extensions, path.extname(filepath)) !== -1) { + } else if (!! files.registered_file_extension(filepath, extensions)) { func(filepath); } }); @@ -101,13 +101,29 @@ var files = module.exports = { ret = ret.concat(files.file_list_sync( path.join(filepath, fileName), extensions)); }); - } else if (_.indexOf(extensions, path.extname(filepath)) !== -1) { + } else if (!! files.registered_file_extension(filepath, extensions)) { ret.push(filepath); } return ret; }, + // Given a path, return his file extension. + // Return false if there are no registered extensions that match. + // This function support multiple extensions such as `.coffee.md` + // unlike the node native `path.extname` function + registered_file_extension: function(filepath, extsList) { + parts = filepath.split('.'); + ext = ""; + for (var i = parts.length - 1; i > 0; i--) { + ext = '.' + parts[i] + ext; + if (_.indexOf(extsList, ext) !== -1) { + return ext; + } + } + return false; + }, + // given a path, returns true if it is a meteor application (has a // .meteor directory with a 'packages' file). false otherwise. is_app_dir: function (filepath) {