akurath
Version:
IDE Frontend for codepsaces.io
178 lines (151 loc) • 4.97 kB
JavaScript
// Requires
var Q = require('q');
var _ = require('lodash');
var wrench = require('wrench');
var path = require('path');
var utils = require('../utils');
var ProjectType = require('./project').ProjectType;
// Supported project types
// This list is ordered
var SUPPORTED = [
//AKUNOTE : This is where you add project detection code for chef, puppet, ansible etc.
// PaaS
//require("./appengine"),
//require("./procfile"),
//require("./parse"),
//require("./maven"),
// Frameworks
//require("./django"),
//require("./gradle"),
//require("./grails"),
//require("./meteor"),
// Languages
//require("./c"),
require("./d"),
//require("./dart"),
//require("./go"),
//require("./clojure"),
//require("./java"),
//require("./logo"),
//require("./php"),
//require("./node"),
//require("./play"),
//require("./python"),
//require("./ruby"),
//require("./scala"),
//require("./lua"),
// Fallbacks
//require("./static"),
//require("./makefile")
];
// Returns true if lang is supported otherwise false
function supports(projectDir, projectType) {
// No detector
if (!projectType.detector) {
return Q(false);
}
// Detection script
return utils.execFile('/bin/bash', [projectType.detector, projectDir])
.then(
utils.constant(true),
utils.constant(false)
);
}
// Detect the project type for a workspace
var detectProjectTypes = function(projectDir) {
var _supports = _.partial(supports, projectDir);
// Try all our project types, return first supported
return Q.all(_.map(SUPPORTED, _supports))
.then(function(supported_list) {
var idx = supported_list.indexOf(true);
if(idx === -1) {
throw new Error("No supported project");
}
// List of supported project types
return _.chain(SUPPORTED)
.filter(function(lang, idx) {
return supported_list[idx];
})
.value();
})
.fail(utils.constant([]));
};
// Merge into one project type
var detectProject = function(workspace, project) {
return detectProjectTypes(workspace.root).then(function(_types) {
if (!_.size(_types)) {
project.clear();
return Q.reject(new Error("No project detected for this workspace"));
}
// Define new project
return project.define(_types);
}).then(function() {
return project;
});
};
// Get project type info by id
var getProjectType = function(typeId) {
return _.find(SUPPORTED, function(pType) {
return pType.id == typeId || _.contains(pType.otherIds, typeId);
});
};
// Set project sample
// Tke a project type id and replace workspace content with it
var useProjectSample = function(root, typeId) {
var pType = getProjectType(typeId);
if (!pType) return Q.reject(new Error("Invalid project type id"));
if (!pType.sample) return Q.reject(new Error("This project type has no sample"));
return utils.exec('rm -rf ./*', {
cwd: root
})
.then(function() {
return utils.exec('cp -R ./* "'+root+'"', {
cwd: pType.sample
});
});
};
function setup(options, imports, register) {
var workspace = imports.workspace;
var events = imports.events;
var logger = imports.logger.namespace("project");
var prev = Q();
// Create the project type
var project = new ProjectType(workspace, events, logger);
// Do the project detection manually
project.detect = _.partial(detectProject, workspace, project);
// Detect the project when the fs change
var throttled = _.throttle(project.detect, 5*60*1000);
events.on("watch.change.update", throttled);
events.on("watch.change.create", throttled);
events.on("watch.change.delete", throttled);
events.on("watch.watching.success", throttled);
return Q().then(function() {
if (!options.forceProjectSample) return;
logger.log("set workspace content with sample", options.forceProjectSample)
return useProjectSample(workspace.root, options.forceProjectSample).fail(function(err) {
logger.exception(err, false);
return Q();
})
})
.then(function() {
return {
"project": project,
"projectTypes": {
"SUPPORTED": SUPPORTED,
'add': function addProjectType(module) {
SUPPORTED.push(module);
return project.detect();
},
'useSample': function(typeId) {
return useProjectSample(workspace.root, typeId).then(function(pType) {
// Update project type
project.detect();
return pType;
});
}
}
}
});
}
// Exports
module.exports = setup;