web-apps/build/Gruntfile.js

591 lines
23 KiB
JavaScript
Raw Normal View History

2016-03-11 00:48:53 +00:00
module.exports = function(grunt) {
var _ = require('lodash'),
defaultConfig,
packageFile;
2016-03-11 00:48:53 +00:00
2018-10-18 15:43:21 +00:00
const copyrightHeader = 'Copyright (c) Ascensio System SIA <%= grunt.template.today("yyyy") %>. All rights reserved'
2017-01-13 15:35:56 +00:00
var copyright = '/*\n' +
2018-10-18 15:43:21 +00:00
' * ' + (process.env['APP_COPYRIGHT'] || copyrightHeader) + '\n' +
2017-01-13 15:35:56 +00:00
' *\n' +
2018-11-16 14:31:38 +00:00
' * <%= pkg.homepage %> \n' +
2017-01-13 15:35:56 +00:00
' *\n' +
2017-01-25 16:30:08 +00:00
' * Version: <%= pkg.version %> (build:<%= pkg.build %>)\n' +
2017-01-13 15:35:56 +00:00
' */\n';
2019-05-22 14:22:50 +00:00
var jsreplacements = [
2019-02-26 17:57:23 +00:00
{
from: /\{\{SUPPORT_EMAIL\}\}/g,
2019-05-22 14:22:50 +00:00
to: process.env['SUPPORT_EMAIL'] || 'support@onlyoffice.com'
2019-02-26 17:57:23 +00:00
},{
from: /\{\{SUPPORT_URL\}\}/g,
2019-05-22 14:22:50 +00:00
to: process.env['SUPPORT_URL'] || 'https://support.onlyoffice.com'
2019-02-26 17:57:23 +00:00
},{
from: /\{\{SALES_EMAIL\}\}/g,
2019-05-22 14:22:50 +00:00
to: process.env['SALES_EMAIL'] || 'sales@onlyoffice.com'
2019-02-26 17:57:23 +00:00
},{
from: /\{\{PUBLISHER_URL\}\}/g,
2019-05-22 14:22:50 +00:00
to: process.env['PUBLISHER_URL'] || 'https://www.onlyoffice.com'
2019-02-26 17:57:23 +00:00
},{
from: /\{\{PUBLISHER_PHONE\}\}/,
2019-05-22 14:22:50 +00:00
to: process.env['PUBLISHER_PHONE'] || '+371 660-16425'
2019-02-26 17:57:23 +00:00
},{
from: /\{\{PUBLISHER_NAME\}\}/g,
2019-05-22 14:22:50 +00:00
to: process.env['PUBLISHER_NAME'] || 'Ascensio System SIA'
2019-02-26 17:57:23 +00:00
},{
from: /\{\{PUBLISHER_ADDRESS\}\}/,
2019-05-22 14:22:50 +00:00
to: process.env['PUBLISHER_ADDRESS'] || '20A-12 Ernesta Birznieka-Upisha street, Riga, Latvia, EU, LV-1050'
2019-02-26 17:57:23 +00:00
},{
from: /\{\{API_URL_EDITING_CALLBACK\}\}/,
2019-05-22 14:22:50 +00:00
to: process.env['API_URL_EDITING_CALLBACK'] || 'https://api.onlyoffice.com/editors/callback'
2019-02-26 17:57:23 +00:00
},{
from: /\{\{COMPANY_NAME\}\}/g,
2019-05-22 14:22:50 +00:00
to: process.env['COMPANY_NAME'] || 'ONLYOFFICE'
2019-02-26 17:57:23 +00:00
}, {
from: /\{\{APP_TITLE_TEXT\}\}/g,
2019-05-22 14:22:50 +00:00
to: process.env['APP_TITLE_TEXT'] || 'ONLYOFFICE'
2019-08-23 08:59:24 +00:00
}, {
from: /\{\{HELP_URL\}\}/g,
to: process.env['HELP_URL'] || 'https://helpcenter.onlyoffice.com'
2019-05-22 14:22:50 +00:00
}];
var helpreplacements = [
{
from: /\{\{COEDITING_DESKTOP\}\}/g,
to: process.env['COEDITING_DESKTOP'] || 'Подключиться к облаку'
},{
from: /\{\{PLUGIN_LINK\}\}/g,
to: process.env['PLUGIN_LINK'] || 'https://api.onlyoffice.com/plugin/basic'
},{
from: /\{\{PLUGIN_LINK_MACROS\}\}/g,
to: process.env['PLUGIN_LINK_MACROS'] || 'https://api.onlyoffice.com/plugin/macros'
2019-02-26 17:57:23 +00:00
}];
2016-03-11 00:48:53 +00:00
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-less');
grunt.loadNpmTasks('grunt-contrib-requirejs');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-imagemin');
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.loadNpmTasks('grunt-contrib-htmlmin');
2018-04-09 12:02:13 +00:00
grunt.loadNpmTasks('grunt-json-minify');
2016-03-11 00:48:53 +00:00
grunt.loadNpmTasks('grunt-text-replace');
grunt.loadNpmTasks('grunt-mocha');
2017-07-17 11:57:12 +00:00
grunt.loadNpmTasks('grunt-inline');
grunt.loadNpmTasks('grunt-svgmin');
2016-03-11 00:48:53 +00:00
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) {
2019-10-14 15:58:17 +00:00
if (!!process.env['BRANDING_PATH'] &&
grunt.file.exists(process.env['BRANDING_PATH'] + '/' + configFile))
{
2019-10-14 15:58:17 +00:00
var _extConfig = require(process.env['BRANDING_PATH'] + '/' + configFile);
}
function _merge(target, ...sources) {
if (!sources.length) return target;
const source = sources.shift();
if (_.isObject(target) && _.isObject(source)) {
for (const key in source) {
if (_.isObject(source[key])) {
if (!target[key]) Object.assign(target, { [key]: {} });
else if (_.isArray(source[key])) target[key].push(...source[key]);
else _merge(target[key], source[key]);
} else {
Object.assign(target, { [key]: source[key] });
}
}
}
return _merge(target, ...sources);
}
2016-03-11 00:48:53 +00:00
return grunt.registerTask('init-build-' + name, 'Initialize build ' + appName, function(){
defaultConfig = configFile;
packageFile = require('./' + defaultConfig);
if (packageFile) {
2016-03-11 00:48:53 +00:00
grunt.log.ok(appName + ' config loaded successfully'.green);
if ( !!_extConfig && _extConfig.name == packageFile.name ) {
_merge(packageFile, _extConfig);
}
} else grunt.log.error().writeln('Could not load config file'.red);
2016-03-11 00:48:53 +00:00
});
}
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', function(defaultConfig, packageFile){
return {
pkg: packageFile,
replace: {
writeVersion: {
src: ['<%= pkg.api.copy.script.dest %>' + '/**/*.js'],
overwrite: true,
replacements: [{
from: /\{\{PRODUCT_VERSION\}\}/,
to: packageFile.version
}]
}
}
}
2016-03-11 00:48:53 +00:00
});
doRegisterTask('sockjs');
doRegisterTask('xregexp');
doRegisterTask('megapixel');
doRegisterTask('jquery');
doRegisterTask('underscore');
doRegisterTask('zeroclipboard');
doRegisterTask('bootstrap');
doRegisterTask('iscroll');
2019-05-22 14:40:10 +00:00
doRegisterTask('fetch');
doRegisterTask('es6-promise');
2016-03-11 00:48:53 +00:00
doRegisterTask('jszip');
doRegisterTask('jsziputils');
doRegisterTask('requirejs', function(defaultConfig, packageFile) {
return {
uglify: {
2017-01-25 16:30:08 +00:00
pkg: packageFile,
2016-03-11 00:48:53 +00:00
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({
2017-01-25 16:30:08 +00:00
pkg: packageFile,
2016-03-11 00:48:53 +00:00
clean: {
options: {
force: true
},
2017-07-17 11:57:12 +00:00
prebuild: {
src: packageFile['main']['clean']
},
postbuild: {
src: packageFile.main.svgicons.clean
}
2016-03-11 00:48:53 +00:00
},
less: {
production: {
options: {
compress: true,
2016-11-10 11:57:07 +00:00
ieCompat: false,
modifyVars: packageFile['main']['less']['vars'],
2016-03-11 00:48:53 +00:00
plugins: [
2016-11-10 11:57:07 +00:00
new (require('less-plugin-clean-css'))()
2016-03-11 00:48:53 +00:00
]
},
files: {
"<%= pkg.main.less.files.dest %>": packageFile['main']['less']['files']['src']
}
}
},
requirejs: {
compile: {
options: packageFile['main']['js']['requirejs']['options']
}
},
replace: {
2016-11-10 11:57:07 +00:00
writeVersion: {
src: ['<%= pkg.main.js.requirejs.options.out %>'],
2016-03-11 00:48:53 +00:00
overwrite: true,
2016-11-10 11:57:07 +00:00
replacements: [{
2017-01-25 16:30:08 +00:00
from: /\{\{PRODUCT_VERSION\}\}/,
to: packageFile.version
2016-11-10 11:57:07 +00:00
}]
},
prepareHelp: {
src: ['<%= pkg.main.copy.help[0].dest %>/ru/**/*.htm*'],
overwrite: true,
2019-05-22 14:22:50 +00:00
replacements: []
2016-03-11 00:48:53 +00:00
}
},
concat: {
options: {
stripBanners: true,
2017-01-13 15:35:56 +00:00
banner: copyright
2016-03-11 00:48:53 +00:00
},
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'])
}
},
2018-04-09 12:02:13 +00:00
'json-minify': {
build: {
files: packageFile['main']['jsonmin']['files']
}
},
2016-03-11 00:48:53 +00:00
copy: {
localization: {
files: packageFile['main']['copy']['localization']
},
help: {
files: packageFile['main']['copy']['help']
},
'index-page': {
files: packageFile['main']['copy']['index-page']
}
2017-07-17 11:57:12 +00:00
},
inline: {
dist: {
src: packageFile.main.copy['index-page'][0].dest,
dest: packageFile.main.copy['index-page'][0].dest
}
},
svgmin: {
options: {
plugins: [{
cleanupIDs: false
2019-07-29 10:04:43 +00:00
},
{
convertPathData: {
floatPrecision: 4
}
2017-07-17 11:57:12 +00:00
}]
},
dist: {
files: packageFile.main.svgicons.common
}
2016-03-11 00:48:53 +00:00
}
});
2019-02-26 17:57:23 +00:00
var replace = grunt.config.get('replace');
2019-05-22 14:22:50 +00:00
replace.writeVersion.replacements.push(...jsreplacements);
replace.prepareHelp.replacements.push(...helpreplacements);
2019-02-26 17:57:23 +00:00
grunt.config.set('replace', replace);
2016-03-11 00:48:53 +00:00
});
grunt.registerTask('deploy-reporter', function(){
grunt.initConfig({
pkg: packageFile,
uglify: {
options: {
banner: copyright
},
build: {
files: {
"<%= pkg.main.reporter.uglify.dest %>": packageFile.main.reporter.uglify.src
}
}
},
copy: packageFile.main.reporter.copy
});
grunt.task.run(['uglify', 'copy']);
});
2016-03-11 00:48:53 +00:00
grunt.registerTask('mobile-app-init', function() {
grunt.initConfig({
2017-01-25 16:30:08 +00:00
pkg: packageFile,
2016-03-11 00:48:53 +00:00
clean: {
options: {
force: true
},
'deploy': packageFile['mobile']['clean']['deploy'],
2017-01-13 15:35:56 +00:00
'template-backup': packageFile.mobile.copy['template-backup'][0].dest
},
requirejs: {
compile: {
options: packageFile['mobile']['js']['requirejs']['options']
}
2016-03-11 00:48:53 +00:00
},
2017-01-13 15:35:56 +00:00
concat: {
2016-03-11 00:48:53 +00:00
options: {
2017-01-13 15:35:56 +00:00
stripBanners: true,
banner: copyright
2016-03-11 00:48:53 +00:00
},
2017-01-13 15:35:56 +00:00
dist: {
src: packageFile.mobile.js.requirejs.options.out,
dest: packageFile.mobile.js.requirejs.options.out
2016-03-11 00:48:53 +00:00
}
},
cssmin: {
2017-02-02 15:04:42 +00:00
// options: {level: { 1: { roundingPrecision: 'all=3' }}}, // to round fw7 numbers in styles. need clean-css 4.0
target: {
2016-03-11 00:48:53 +00:00
files: {
"<%= pkg.mobile.css.ios.dist %>" : packageFile['mobile']['css']['ios']['src'],
"<%= pkg.mobile.css.material.dist %>" : packageFile['mobile']['css']['material']['src']
2016-03-11 00:48:53 +00:00
}
}
},
htmlmin: {
dist: {
options: {
removeComments: true,
collapseWhitespace: true
},
files: packageFile['mobile']['htmlmin']['templates']
}
},
2018-04-09 12:02:13 +00:00
'json-minify': {
build: {
files: packageFile['mobile']['jsonmin']['files']
}
},
2016-03-11 00:48:53 +00:00
copy: {
'template-backup': {
files: packageFile['mobile']['copy']['template-backup']
},
'template-restore': {
files: packageFile['mobile']['copy']['template-restore']
},
'localization': {
2016-03-11 00:48:53 +00:00
files: packageFile['mobile']['copy']['localization']
},
'index-page': {
files: packageFile['mobile']['copy']['index-page']
},
'images-app': {
2018-03-28 12:40:38 +00:00
files:[]
.concat(packageFile['mobile']['copy']['images-app'])
.concat(packageFile['mobile']['copy']['images-common'])
2016-03-11 00:48:53 +00:00
}
2017-01-25 16:30:08 +00:00
},
replace: {
writeVersion: {
src: ['<%= pkg.mobile.js.requirejs.options.out %>'],
overwrite: true,
replacements: [{
from: /\{\{PRODUCT_VERSION\}\}/,
to: packageFile.version
2017-01-25 16:30:08 +00:00
}]
2017-02-02 15:04:42 +00:00
},
fixResourceUrl: {
src: ['<%= pkg.mobile.js.requirejs.options.out %>',
'<%= pkg.mobile.css.ios.dist %>',
'<%= pkg.mobile.css.material.dist %>'],
overwrite: true,
replacements: [{
from: /(?:\.{2}\/){4}common\/mobile\/resources\/img/g,
to: '../img'
},{
from: /(?:\.{2}\/){2}common\/mobile/g,
to: '../mobile'
}]
2017-01-25 16:30:08 +00:00
}
2016-03-11 00:48:53 +00:00
}
});
2019-02-26 17:57:23 +00:00
var replace = grunt.config.get('replace');
2019-05-22 14:22:50 +00:00
replace.writeVersion.replacements.push(...jsreplacements);
2019-02-26 17:57:23 +00:00
grunt.config.set('replace', replace);
2016-03-11 00:48:53 +00:00
});
grunt.registerTask('embed-app-init', function() {
grunt.initConfig({
2017-01-25 16:30:08 +00:00
pkg: packageFile,
2016-03-11 00:48:53 +00:00
clean: {
options: {
force: true
},
2016-11-08 12:22:15 +00:00
postbuild: packageFile['embed']['clean']['postbuild'],
prebuild: packageFile['embed']['clean']['prebuild']
2016-03-11 00:48:53 +00:00
},
uglify: {
options: {
2017-01-13 15:35:56 +00:00
banner: copyright
2016-03-11 00:48:53 +00:00
},
build: {
src: packageFile['embed']['js']['src'],
dest: packageFile['embed']['js']['dist']
}
},
less: {
production: {
options: {
2016-11-08 12:22:15 +00:00
compress: true,
ieCompat: false
2016-03-11 00:48:53 +00:00
},
files: {
"<%= pkg.embed.less.files.dist %>": packageFile['embed']['less']['files']['src']
}
}
},
copy: {
localization: {
files: packageFile['embed']['copy']['localization']
},
2016-03-11 00:48:53 +00:00
'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;
2018-10-18 15:43:21 +00:00
packageFile.homepage = (process.env['PUBLISHER_URL'] || pkg.homepage);
2017-01-25 16:30:08 +00:00
packageFile.version = (process.env['PRODUCT_VERSION'] || pkg.version);
packageFile.build = (process.env['BUILD_NUMBER'] || pkg.build);
2016-03-11 00:48:53 +00:00
grunt.file.write(defaultConfig, JSON.stringify(pkg, null, 4));
});
//quick workaround for build desktop version
var copyTask = grunt.option('desktop')? "copy": "copy:script";
2016-03-11 00:48:53 +00:00
grunt.registerTask('deploy-api', ['api-init', 'clean', copyTask, 'replace:writeVersion']);
grunt.registerTask('deploy-sdk', ['sdk-init', 'clean', copyTask]);
2016-03-11 00:48:53 +00:00
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-jquery', ['jquery-init', 'clean', 'copy']);
grunt.registerTask('deploy-underscore', ['underscore-init', 'clean', 'copy']);
grunt.registerTask('deploy-iscroll', ['iscroll-init', 'clean', 'copy']);
2019-05-22 14:40:10 +00:00
grunt.registerTask('deploy-fetch', ['fetch-init', 'clean', 'copy']);
2016-03-11 00:48:53 +00:00
grunt.registerTask('deploy-bootstrap', ['bootstrap-init', 'clean', 'copy']);
grunt.registerTask('deploy-jszip', ['jszip-init', 'clean', 'copy']);
grunt.registerTask('deploy-jsziputils', ['jsziputils-init', 'clean', 'copy']);
grunt.registerTask('deploy-requirejs', ['requirejs-init', 'clean', 'uglify']);
grunt.registerTask('deploy-es6-promise', ['es6-promise-init', 'clean', 'copy']);
2016-03-11 00:48:53 +00:00
2017-07-17 11:57:12 +00:00
grunt.registerTask('deploy-app-main', ['main-app-init', 'clean:prebuild', 'imagemin', 'less', 'requirejs', 'concat',
2018-04-09 12:02:13 +00:00
'copy', 'svgmin', 'inline', 'json-minify',
'replace:writeVersion', 'replace:prepareHelp', 'clean:postbuild']);
2017-02-02 15:04:42 +00:00
grunt.registerTask('deploy-app-mobile', ['mobile-app-init', 'clean:deploy', 'cssmin', 'copy:template-backup',
'htmlmin', 'requirejs', 'concat', 'copy:template-restore',
'clean:template-backup', 'copy:localization', 'copy:index-page',
2018-04-09 12:02:13 +00:00
'copy:images-app', 'json-minify',
'replace:writeVersion', 'replace:fixResourceUrl']);
2017-02-02 15:04:42 +00:00
grunt.registerTask('deploy-app-embed', ['embed-app-init', 'clean:prebuild', 'uglify', 'less', 'copy',
'clean:postbuild']);
2016-03-11 00:48:53 +00:00
doRegisterInitializeAppTask('common', 'Common', 'common.json');
2016-03-11 00:48:53 +00:00
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-common-component', ['init-build-common', 'deploy-app']);
grunt.registerTask('deploy-documenteditor-component', ['init-build-documenteditor', 'deploy-app']);
grunt.registerTask('deploy-spreadsheeteditor-component', ['init-build-spreadsheeteditor', 'deploy-app']);
grunt.registerTask('deploy-presentationeditor-component', ['init-build-presentationeditor', 'deploy-app']);
// This task is called from the Makefile, don't delete it.
grunt.registerTask('deploy-documents-component', ['deploy-common-component']);
grunt.registerTask('deploy-documenteditor', ['deploy-common-component', 'deploy-documenteditor-component']);
grunt.registerTask('deploy-spreadsheeteditor', ['deploy-common-component', 'deploy-spreadsheeteditor-component']);
grunt.registerTask('deploy-presentationeditor', ['deploy-common-component', 'deploy-presentationeditor-component']);
grunt.registerTask('default', ['deploy-common-component',
'deploy-documenteditor-component',
'deploy-spreadsheeteditor-component',
'deploy-presentationeditor-component']);
};