steal-tools
Version:
Futuristic build tools for ES6 Module applications.
121 lines (108 loc) • 3.27 kB
JavaScript
var path = require("path");
var supportedBuildTypes = ["js","css"];
var npmUtils = require("steal/ext/npm-utils");
var extend = function(d, s){
for(var prop in s){
d[prop] = s[prop];
}
return d;
};
var baseHelper = {
parseModuleName: function(moduleName, currentPackageName) {
var pluginParts = moduleName.split('!');
var modulePathParts = pluginParts[0].split("#");
var versionParts = modulePathParts[0].split("@");
// it could be something like `@empty`
if(!modulePathParts[1] && !versionParts[0]) {
versionParts = ["@"+versionParts[0]];
}
var packageName,
modulePath;
// if relative, use currentPackageName
if( currentPackageName && moduleName[0] === "." ) {
packageName= currentPackageName;
modulePath = versionParts[0];
} else {
if(modulePathParts[1]) { // foo@1.2#./path
packageName = versionParts[0];
modulePath = modulePathParts[1];
} else {
// test/abc
var folderParts = versionParts[0].split("/");
packageName = folderParts.shift();
modulePath = folderParts.join("/");
}
}
return {
plugin: pluginParts.length === 2 ? "!"+pluginParts[1] : undefined,
version: versionParts[1],
modulePath: modulePath,
packageName: packageName,
moduleName: moduleName
};
},
makeHelper: function(settings){
var func = function(options){
options = extend({}, options|| {});
for(var prop in settings) {
options[prop] = settings[prop](options[prop]);
}
return options;
};
extend(func, settings);
return func;
},
extend: extend,
cleanModuleName: function(moduleName){
return moduleName.replace(/!.*$/,"");
},
basename: function(depLoad){
var buildType = depLoad.metadata.buildType || "js";
if( supportedBuildTypes.indexOf(buildType) >= 0 ) {
// this will end in .js ... use the address
var base = path.basename(depLoad.address),
ext = path.extname(base);
// might want to change to tabs.less.css
return base+("."+buildType === ext ? "" : "."+buildType);
} else {
throw ("unsupported build type "+buildType);
}
},
removeFileProtocol: function(path){
if(path.indexOf("file:") ===0 ){
return path.substr(5);
}
return path;
},
makeDest: function(distFolder){
return function(aliases, distPath){
if(typeof aliases === "string") {
distPath = aliases;
aliases = {};
}
aliases = aliases || {};
return function(moduleName, moduleData, load, System){
var baseRoot = distPath || path.join( baseHelper.removeFileProtocol(System.baseURL), distFolder);
if(aliases[moduleName]) {
return path.join(baseRoot, aliases[moduleName]);
}
if(npmUtils.moduleName.isNpm(moduleName)) {
moduleName = npmUtils.moduleName.parse(moduleName).modulePath;
}
// move it to lib/cjs and rename it
var address = path.dirname(baseHelper.cleanModuleName(moduleName));
var basename = baseHelper.basename(load);
return path.join(baseRoot, address, basename);
};
};
},
normalizeEndingSlash: function(moduleName) {
if(moduleName.lastIndexOf("/") === moduleName.length - 1) {
var parts = moduleName.split("/");
parts[parts.length-1] = parts[parts.length-2];
return parts.join("/");
}
return moduleName;
}
};
module.exports = baseHelper;