DocumentServer/OfficeWeb/build/Gruntfile.js
2015-04-28 17:59:00 +03:00

326 lines
14 KiB
JavaScript

/*
* (c) Copyright Ascensio System SIA 2010-2015
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia,
* EU, LV-1021.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
module.exports = function (grunt) {
var _ = require("lodash"),
defaultConfig,
packageFile,
revisionHash = "@@REVISION",
revisionTimeStamp = "@@REVISIONDATE";
grunt.loadNpmTasks("grunt-contrib");
grunt.loadNpmTasks("grunt-text-replace");
grunt.loadNpmTasks("grunt-mocha");
function doRegisterTask(name, callbackConfig) {
return grunt.registerTask(name + "-init", function () {
var additionalConfig = {},
initConfig = {};
if (_.isFunction(callbackConfig)) {
additionalConfig = callbackConfig.call(this, defaultConfig, packageFile);
}
if (!_.isUndefined(packageFile[name]["clean"])) {
initConfig["clean"] = {
options: {
force: true
},
files: packageFile[name]["clean"]
};
}
if (!_.isUndefined(packageFile[name]["copy"])) {
initConfig["copy"] = packageFile[name]["copy"];
}
grunt.initConfig(_.assign(initConfig, additionalConfig || {}));
});
}
function doRegisterInitializeAppTask(name, appName, configFile) {
return grunt.registerTask("init-build-" + name, "Initialize build " + appName, function () {
defaultConfig = configFile;
packageFile = require("./" + defaultConfig);
if (packageFile) {
grunt.log.ok(appName + " config loaded successfully".green);
} else {
grunt.log.error().writeln("Could not load config file".red);
}
});
}
grunt.registerTask("init-config", "Initialize build script", function () {
var exec = require("child_process").exec,
done = this.async(),
commandsRef = 0;
function doneTask() {
if (--commandsRef <= 0) {
done(true);
}
}
function doCommand(command, callback) {
commandsRef++;
exec(command, callback);
}
doCommand('hg log -r -1 --template "{node|short}"', function (error, stdout, stderr) {
if (error) {
grunt.log.writeln("Error: " + error);
} else {
revisionHash = stdout;
}
doneTask();
});
doCommand('hg log -r -1 --template "{date|isodate}"', function (error, stdout, stderr) {
if (error) {
grunt.log.writeln("Error: " + error);
} else {
revisionTimeStamp = stdout;
}
doneTask();
});
});
grunt.initConfig({
mocha: {
test: {
options: {
reporter: "Spec"
},
src: ["../test/common/index.html"]
}
},
jshint: {
options: {
curly: true,
eqeqeq: true,
eqnull: true,
browser: true,
globals: {
jQuery: true
},
force: true
},
common: ["../apps/common/main/lib/**/*.js"]
}
});
doRegisterTask("sdk");
doRegisterTask("api");
doRegisterTask("sockjs");
doRegisterTask("xregexp");
doRegisterTask("megapixel");
doRegisterTask("touch");
doRegisterTask("jquery");
doRegisterTask("underscore");
doRegisterTask("zeroclipboard");
doRegisterTask("bootstrap");
doRegisterTask("requirejs", function (defaultConfig, packageFile) {
return {
uglify: {
pkg: grunt.file.readJSON(defaultConfig),
options: {
banner: "/** vim: et:ts=4:sw=4:sts=4\n" + " * @license RequireJS 2.1.2 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved.\n" + " * Available via the MIT or new BSD license.\n" + " * see: http://github.com/jrburke/requirejs for details\n" + " */\n"
},
build: {
src: packageFile["requirejs"]["min"]["src"],
dest: packageFile["requirejs"]["min"]["dest"]
}
}
};
});
grunt.registerTask("main-app-init", function () {
grunt.initConfig({
pkg: grunt.file.readJSON(defaultConfig),
clean: {
options: {
force: true
},
files: packageFile["main"]["clean"]
},
less: {
options: {
cleancss: true
},
production: {
files: {
"<%= pkg.main.less.files.dest %>": packageFile["main"]["less"]["files"]["src"]
}
}
},
requirejs: {
compile: {
options: packageFile["main"]["js"]["requirejs"]["options"]
}
},
replace: {
fixLessUrl: {
src: ["<%= pkg.main.less.files.dest %>"],
overwrite: true,
replacements: packageFile["main"]["less"]["replacements"]
}
},
concat: {
options: {
stripBanners: true,
banner: "/*\n" + ' * Copyright (c) Ascensio System SIA <%= grunt.template.today("yyyy") %>. All rights reserved\n' + " *\n" + " * <%= pkg.homepage %> \n" + " *\n" + " * Version: <%= pkg.version %> (build:<%= pkg.build %>, rev:" + revisionHash + ", date:" + revisionTimeStamp + ")\n" + " */\n"
},
dist: {
src: [packageFile["main"]["js"]["requirejs"]["options"]["out"]],
dest: packageFile["main"]["js"]["requirejs"]["options"]["out"]
}
},
imagemin: {
options: {
optimizationLevel: 3
},
dynamic: {
files: [].concat(packageFile["main"]["imagemin"]["images-app"]).concat(packageFile["main"]["imagemin"]["images-common"])
}
},
copy: {
localization: {
files: packageFile["main"]["copy"]["localization"]
},
help: {
files: packageFile["main"]["copy"]["help"]
},
"index-page": {
files: packageFile["main"]["copy"]["index-page"]
}
}
});
});
grunt.registerTask("mobile-app-init", function () {
grunt.initConfig({
pkg: grunt.file.readJSON(defaultConfig),
clean: {
options: {
force: true
},
files: packageFile["mobile"]["clean"]
},
uglify: {
options: {
banner: "/*\n" + ' * Copyright (c) Ascensio System SIA <%= grunt.template.today("yyyy") %>. All rights reserved\n' + " *\n" + " * <%= pkg.homepage %>\n" + " *\n" + " * Version: <%= pkg.version %> (build:<%= pkg.build %>)\n" + " */\n"
},
build: {
src: packageFile["mobile"]["js"]["src"],
dest: packageFile["mobile"]["js"]["dist"]
}
},
cssmin: {
styles: {
files: {
"<%= pkg.mobile.css.normal.dist %>": packageFile["mobile"]["css"]["normal"]["src"],
"<%= pkg.mobile.css.retina.dist %>": packageFile["mobile"]["css"]["retina"]["src"]
}
}
},
copy: {
localization: {
files: packageFile["mobile"]["copy"]["localization"]
},
"index-page": {
files: packageFile["mobile"]["copy"]["index-page"]
},
"images-app": {
files: packageFile["mobile"]["copy"]["images-app"]
}
}
});
});
grunt.registerTask("embed-app-init", function () {
grunt.initConfig({
pkg: grunt.file.readJSON(defaultConfig),
clean: {
options: {
force: true
},
files: packageFile["embed"]["clean"]
},
uglify: {
options: {
banner: "/*\n" + ' * Copyright (c) Ascensio System SIA <%= grunt.template.today("yyyy") %>. All rights reserved\n' + " *\n" + " * <%= pkg.homepage %>\n" + " *\n" + " * Version: <%= pkg.version %> (build:<%= pkg.build %>)\n" + " */\n"
},
build: {
src: packageFile["embed"]["js"]["src"],
dest: packageFile["embed"]["js"]["dist"]
}
},
less: {
production: {
options: {
cleancss: true
},
files: {
"<%= pkg.embed.less.dist %>": packageFile["embed"]["less"]["src"]
}
}
},
copy: {
"index-page": {
files: packageFile["embed"]["copy"]["index-page"]
},
"images-app": {
files: packageFile["embed"]["copy"]["images-app"]
}
}
});
});
grunt.registerTask("increment-build", function () {
var pkg = grunt.file.readJSON(defaultConfig);
pkg.build = parseInt(pkg.build) + 1;
grunt.file.write(defaultConfig, JSON.stringify(pkg, null, 4));
});
grunt.registerTask("deploy-api", ["api-init", "clean", "copy"]);
grunt.registerTask("deploy-sdk", ["sdk-init", "clean", "copy"]);
grunt.registerTask("deploy-sockjs", ["sockjs-init", "clean", "copy"]);
grunt.registerTask("deploy-xregexp", ["xregexp-init", "clean", "copy"]);
grunt.registerTask("deploy-megapixel", ["megapixel-init", "clean", "copy"]);
grunt.registerTask("deploy-touch", ["touch-init", "clean", "copy"]);
grunt.registerTask("deploy-jquery", ["jquery-init", "clean", "copy"]);
grunt.registerTask("deploy-underscore", ["underscore-init", "clean", "copy"]);
grunt.registerTask("deploy-zeroclipboard", ["zeroclipboard-init", "clean", "copy"]);
grunt.registerTask("deploy-bootstrap", ["bootstrap-init", "clean", "copy"]);
grunt.registerTask("deploy-requirejs", ["requirejs-init", "clean", "uglify"]);
grunt.registerTask("deploy-app-main", ["main-app-init", "clean", "less", "replace:fixLessUrl", "requirejs", "concat", "imagemin", "copy"]);
grunt.registerTask("deploy-app-mobile", ["mobile-app-init", "clean", "uglify", "cssmin:styles", "copy"]);
grunt.registerTask("deploy-app-embed", ["embed-app-init", "clean", "uglify", "less", "copy"]);
doRegisterInitializeAppTask("documenteditor", "DocumentEditor", "documenteditor.json");
doRegisterInitializeAppTask("spreadsheeteditor", "SpreadsheetEditor", "spreadsheeteditor.json");
doRegisterInitializeAppTask("presentationeditor", "PresentationEditor", "presentationeditor.json");
grunt.registerTask("deploy-app", "Deploy application.", function () {
if (packageFile) {
if (packageFile["tasks"]["deploy"]) {
grunt.task.run(packageFile["tasks"]["deploy"]);
} else {
grunt.log.error().writeln('Not found "deploy" task in configure'.red);
}
} else {
grunt.log.error().writeln("Is not load configure file.".red);
}
});
grunt.registerTask("deploy-documenteditor", ["init-build-documenteditor", "init-config", "deploy-app"]);
grunt.registerTask("deploy-spreadsheeteditor", ["init-build-spreadsheeteditor", "init-config", "deploy-app"]);
grunt.registerTask("deploy-presentationeditor", ["init-build-presentationeditor", "init-config", "deploy-app"]);
grunt.registerTask("default", ["deploy-documenteditor", "deploy-spreadsheeteditor", "deploy-presentationeditor"]);
};