cor-lang
Version:
The Language of the Web
194 lines (154 loc) • 5.15 kB
JavaScript
(function(){ typeof cor === 'undefined' && (cor = {});
require('../parser.js');
require('../scope/env.js');
require('../scope/scope.js');
require('../compiler.js');
require('../sourcemap.js');
require('../loader/node.js');
var
outFilename,
confFilename,
packageType,
sourcePath,
cliInput,
cliApp,
loader = cor.loader,
embeddCrl = true,
cwd = cor.path.cwd(),
fs = require('fs'),
path = require('path'),
pkgJson = require('../../package.json');
function print() {
//empty
}
function getHeadStub() {
var
dt = new Date(),
stub = '';
stub += '// Packed by Cor ' + pkgJson.version + '\n\n';
stub += '// Date(m-d-y): ' + [dt.getMonth() + 1, dt.getDate(), dt.getFullYear()].join('-') + '\n';
stub += '// Build-Id: ' + dt.getTime() + '\n';
return stub;
}
function onLoaderReady() {
this.isReady = true;
var
name, i, len, content,
filename, temp, dep,
rInvalidChars = /[^a-zA-Z_]/g,
src = '',
depsSrcList = [],
fileNameTable = {},
dependences = [],
programs = [],
filenames = [],
moduleName = '';
print('\nCompiling:\n');
if (! outFilename) {
outFilename = sourcePath + '.js';
}
for (name in this.moduleCache) {
filename = this.moduleCache[name].filename;
//console.log(filename);
fileNameTable[filename] = filenames.length;
filenames.push(filename);
dependences.push(this.moduleCache[name].dependences);
moduleName = path.basename(filename).replace(rInvalidChars, '_');
programs.push(
'function ' + moduleName + '(require, module, exports){\n' +
this.moduleCache[name].toJs().src +
'\n}'
);
print(' ' + name + (this.moduleCache[name].usesRuntime ? ' (uses runtime)' : ''));
}
//console.log(fileNameTable);
//console.log('===========')
//console.log(dependences);
for (i = 0, len = filenames.length; i < len; i++) {
temp = [];
for (name in dependences[i]) {
depPath = dependences[i][name];
if (cor.path.ext(depPath) === '') {
filename = fileNameTable[depPath + cor.path.ext(filenames[i])];
}
else {
filename = fileNameTable[depPath];
}
if (filename) {
temp.push("'" + name + "':" + filename);
}
else {
console.log('Could not locate dependence \'' + name + '\' for: ' + filenames[i]);
global.process.exit(1);
}
}
if (temp.length > 0) {
depsSrcList.push('{' + temp.join(',') + '}');
}
else {
depsSrcList.push('null');
}
}
src += getHeadStub();
if (embeddCrl) {
src += fs.readFileSync(__dirname + '/../crl.js', 'utf8');
}
src += fs.readFileSync(__dirname + '/stubs/build.prefix', 'utf8');
for (i = 0, len = packageType.length; i < len; i++) {
try {
content = fs.readFileSync(__dirname + '/stubs/packageType.' + packageType[i], 'utf8');
} catch(e) {
throw packageType[i] + ' not supported';
}
src += content.replace('{package_name}', /^([a-zA-Z_]+)/.exec(path.basename(outFilename))[1]);
}
src += '})([\n' +
depsSrcList.join(',\n') +
'\n],[\n' +
programs.join(',') +
'\n]);';
outFilename = path.resolve(cwd, outFilename);
cliApp.print('\nWriting package to: ' + outFilename);
fs.writeFileSync(outFilename, src);
};
function build() {
cor.Loader.prototype.onLoaderReady = onLoaderReady;
var
spath, last,
path = cor.path.sanitize(sourcePath);
if (path.length === 0) {
return;
}
if (cliInput.getOption('v')) {
print = cliApp.print;
}
if (cliInput.getOption('no-crl')) {
embeddCrl = false;
}
if (!packageType) {
packageType = ['domready'];
}
else {
packageType = packageType.split(',');
}
loader.setEntry(path, confFilename);
}
var
cmd = new cor.CliCommand('build', 'compile source files and dependecies');
cmd.addArgument('path', 'path to the entry file to be compiled whith it dependences', true);
cmd.addOption('o', 'name of the file to write the compiling result');
cmd.addOption('type', 'type of the resulting package (domready, commonjs, amd and global)');
cmd.addOption('conf', 'path to the .json file which contains environment variables for cor.Loader');
cmd.addOption('no-crl', 'specify the CRL(Cor Runtime Library) should not be embedded in the head of the compiling result');
cmd.addOption('v', 'print additional information during build proccess');
cmd.setAction(function (input, app){
cliInput = input;
cliApp = app;
sourcePath = input.getArgument('path');
confFilename = input.getOption('conf');
outFilename = input.getOption('o');
packageType = input.getOption('type');
build();
});
module.exports = cmd;
}).call(this);