change rollup.config.js to scan for all installed apps, and run rollup as part of install-cli.php automatic

This commit is contained in:
Ralf Becker 2021-07-02 15:24:12 +02:00
parent 1423a4c6e0
commit 96dff06453
3 changed files with 42 additions and 310 deletions

View File

@ -4,7 +4,7 @@
* @link http://www.egroupware.org * @link http://www.egroupware.org
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @author Ralf Becker <rb@egroupware.org> * @author Ralf Becker <rb@egroupware.org>
* @copyright (c) 2016 by Ralf Becker <rb@egroupware.org> * @copyright (c) 2016-21 by Ralf Becker <rb@egroupware.org>
*/ */
/** /**
@ -16,290 +16,21 @@
* To generate the now existing package.json: * To generate the now existing package.json:
* npm init * npm init
* npm install grunt --save-dev * npm install grunt --save-dev
* npm install grunt-terser --save-dev
* npm install grunt-newer --save-dev * npm install grunt-newer --save-dev
* npm install grunt-contrib-cssmin --save-dev * npm install grunt-contrib-cssmin --save-dev
* *
* Building happens by running in your EGroupware directory: * Building happens by running in your EGroupware directory:
* *
* grunt # runs uglify and cssmin for all targets with changed files * grunt # runs cssmin for all targets with changed files
* or
* grunt [newer:]terser:<target> # targets: api, et2, pixelegg, mobile, mail, calendar, ...
* or * or
* grunt [newer:]cssmin:<target> # targets: pixelegg, jdots * grunt [newer:]cssmin:<target> # targets: pixelegg, jdots
* *
* app.js files can be added like mail target or, if you want automatic dependencies,
* you need to add them in egw_framework::$bundle2minurl and egw_framework::get_bundles().
*
* To update files in Gruntfile after adding new js files you need to run:
*
* updateGruntfile.php
*
* Please use only double quotes, as we parse this file as json to update it! * Please use only double quotes, as we parse this file as json to update it!
* *
* @param {object} grunt * @param {object} grunt
*/ */
module.exports = function (grunt) { module.exports = function (grunt) {
grunt.initConfig({ grunt.initConfig({
terser: {
options: {
mangle: false,
sourceMap: true,
output: {
preamble: "/*!\n * EGroupware (http://www.egroupware.org/) minified Javascript\n *\n * full sources are available under https://github.com/EGroupware/egroupware/\n *\n * build <%= grunt.template.today() %>\n */\n"
}
},
api: {
files: {
"api/js/jsapi.min.js": [
"vendor/bower-asset/jquery/dist/jquery.js",
"api/js/jquery/jquery.noconflict.js",
"vendor/bower-asset/jquery-ui/jquery-ui.js",
"api/js/jsapi/jsapi.js",
"api/js/egw_json.js",
"api/js/jsapi/egw_core.js",
"api/js/jsapi/egw_debug.js",
"api/js/jsapi/egw_preferences.js",
"api/js/jsapi/egw_utils.js",
"api/js/jsapi/egw_ready.js",
"api/js/jsapi/egw_files.js",
"api/js/jsapi/egw_lang.js",
"api/js/jsapi/egw_links.js",
"api/js/jsapi/egw_open.js",
"api/js/jsapi/egw_user.js",
"api/js/jsapi/egw_config.js",
"api/js/jsapi/egw_images.js",
"api/js/jsapi/egw_jsonq.js",
"api/js/jsapi/egw_json.js",
"api/js/jsapi/egw_store.js",
"api/js/jsapi/egw_tooltip.js",
"api/js/jsapi/egw_css.js",
"api/js/jquery/jquery-ui-timepicker-addon.js",
"api/js/jsapi/egw_calendar.js",
"api/js/jsapi/egw_data.js",
"api/js/jsapi/egw_tail.js",
"api/js/jsapi/egw_inheritance.js",
"api/js/jsapi/egw_message.js",
"api/js/jsapi/egw_notification.js",
"api/js/es6-promise.min.js",
"api/js/jsapi/app_base.js",
"api/js/jsapi/egw_app.js",
"api/js/dhtmlxtree/codebase/dhtmlxcommon.js",
"api/js/dhtmlxtree/sources/dhtmlxtree.js",
"api/js/dhtmlxtree/sources/ext/dhtmlxtree_json.js",
"api/js/egw_action/egw_action_common.js",
"api/js/egw_action/egw_action.js",
"api/js/egw_action/egw_keymanager.js",
"api/js/egw_action/egw_menu.js",
"api/js/jquery/jquery-tap-and-hold/jquery.tapandhold.js",
"api/js/egw_action/egw_action_popup.js",
"api/js/egw_action/egw_action_dragdrop.js",
"api/js/egw_action/egw_dragdrop_dhtmlx_tree.js",
"api/js/dhtmlxMenu/sources/dhtmlxmenu.js",
"api/js/dhtmlxMenu/sources/ext/dhtmlxmenu_ext.js",
"api/js/egw_action/egw_menu_dhtmlx.js",
"api/js/jquery/chosen/chosen.jquery.js"
]
}
},
et2: {
files: {
"api/js/etemplate/etemplate2.min.js": [
"api/js/etemplate/et2_core_xml.js",
"api/js/etemplate/et2_core_interfaces.js",
"api/js/etemplate/et2_core_common.js",
"api/js/etemplate/et2_core_inheritance.js",
"api/js/etemplate/et2_core_phpExpressionCompiler.js",
"api/js/etemplate/et2_core_arrayMgr.js",
"api/js/etemplate/et2_core_widget.js",
"api/js/etemplate/et2_core_DOMWidget.js",
"api/js/etemplate/et2_widget_template.js",
"api/js/etemplate/et2_widget_grid.js",
"api/js/etemplate/et2_core_baseWidget.js",
"api/js/etemplate/et2_widget_box.js",
"api/js/etemplate/et2_widget_hbox.js",
"api/js/etemplate/et2_widget_groupbox.js",
"api/js/jquery/splitter.js",
"api/js/etemplate/et2_widget_split.js",
"api/js/etemplate/et2_widget_button.js",
"api/js/etemplate/et2_core_valueWidget.js",
"api/js/etemplate/et2_core_inputWidget.js",
"api/js/etemplate/et2_widget_color.js",
"api/js/jquery/blueimp/js/blueimp-gallery.min.js",
"api/js/etemplate/expose.js",
"api/js/etemplate/et2_widget_description.js",
"api/js/etemplate/et2_widget_entry.js",
"api/js/etemplate/et2_widget_textbox.js",
"api/js/etemplate/et2_widget_number.js",
"api/js/etemplate/et2_widget_password.js",
"api/js/jquery/jquery.base64.js",
"api/js/etemplate/et2_widget_url.js",
"api/js/etemplate/et2_widget_selectbox.js",
"api/js/etemplate/et2_widget_checkbox.js",
"api/js/etemplate/et2_widget_radiobox.js",
"api/js/etemplate/lib/date.js",
"api/js/etemplate/et2_widget_date.js",
"api/js/etemplate/et2_widget_dialog.js",
"vendor/bower-asset/diff2html/dist/diff2html.min.js",
"api/js/etemplate/et2_widget_diff.js",
"api/js/etemplate/et2_widget_dropdown_button.js",
"api/js/etemplate/et2_widget_styles.js",
"api/js/etemplate/et2_widget_link.js",
"api/js/etemplate/et2_widget_selectAccount.js",
"vendor/egroupware/magicsuggest/magicsuggest.js",
"api/js/etemplate/et2_widget_taglist.js",
"api/js/etemplate/et2_extension_customfields.js",
"api/js/etemplate/et2_dataview_view_rowProvider.js",
"api/js/etemplate/et2_extension_nextmatch_rowProvider.js",
"api/js/etemplate/et2_dataview_view_container.js",
"api/js/etemplate/et2_dataview_view_row.js",
"api/js/etemplate/et2_dataview_interfaces.js",
"vendor/bower-asset/jquery-touchswipe/jquery.touchSwipe.js",
"api/js/etemplate/et2_dataview_view_aoi.js",
"api/js/etemplate/et2_dataview_controller_selection.js",
"api/js/etemplate/et2_dataview_view_tile.js",
"api/js/etemplate/et2_dataview_controller.js",
"api/js/etemplate/et2_extension_nextmatch_actions.js",
"api/js/etemplate/et2_extension_nextmatch_controller.js",
"api/js/etemplate/et2_widget_dynheight.js",
"api/js/etemplate/et2_dataview_model_columns.js",
"api/js/etemplate/et2_dataview_view_spacer.js",
"api/js/etemplate/et2_dataview_view_grid.js",
"api/js/etemplate/et2_dataview_view_resizeable.js",
"api/js/etemplate/et2_dataview.js",
"api/js/etemplate/et2_extension_nextmatch.js",
"api/js/etemplate/et2_widget_favorites.js",
"api/js/etemplate/et2_widget_html.js",
"api/js/etemplate/et2_core_editableWidget.js",
"api/js/etemplate/et2_widget_htmlarea.js",
"api/js/etemplate/et2_widget_tabs.js",
"api/js/etemplate/et2_widget_timestamper.js",
"api/js/etemplate/et2_widget_toolbar.js",
"api/js/etemplate/et2_widget_tree.js",
"api/js/etemplate/et2_widget_historylog.js",
"api/js/etemplate/et2_widget_hrule.js",
"vendor/bower-asset/cropper/dist/cropper.min.js",
"api/js/etemplate/et2_widget_image.js",
"api/js/etemplate/et2_widget_iframe.js",
"api/js/Resumable/resumable.js",
"api/js/etemplate/et2_widget_file.js",
"api/js/etemplate/et2_widget_progress.js",
"api/js/etemplate/et2_widget_portlet.js",
"api/js/etemplate/et2_widget_ajaxSelect.js",
"api/js/etemplate/vfsSelectUI.js",
"api/js/etemplate/et2_widget_vfs.js",
"api/js/etemplate/et2_widget_video.js",
"api/js/etemplate/et2_widget_audio.js",
"api/js/jquery/barcode/jquery-barcode.min.js",
"api/js/etemplate/et2_widget_barcode.js",
"api/js/etemplate/et2_extension_itempicker_actions.js",
"api/js/etemplate/et2_widget_itempicker.js",
"api/js/etemplate/et2_widget_script.js",
"api/js/etemplate/et2_widget_countdown.js",
"api/js/etemplate/et2_core_legacyJSFunctions.js",
"api/js/etemplate/etemplate2.js"
]
}
},
mail: {
files: {
"mail/js/app.min.js": [
"mail/js/app.js"
]
}
},
calendar: {
files: {
"calendar/js/app.min.js": [
"calendar/js/View.js",
"calendar/js/et2_widget_owner.js",
"calendar/js/et2_widget_view.js",
"calendar/js/et2_widget_timegrid.js",
"calendar/js/et2_widget_event.js",
"calendar/js/et2_widget_daycol.js",
"calendar/js/et2_widget_planner_row.js",
"calendar/js/et2_widget_planner.js",
"calendar/js/app.js"
]
}
},
jdots: {
files: {
"jdots/js/fw_jdots.min.js": [
"api/js/framework/fw_base.js",
"api/js/framework/fw_browser.js",
"api/js/jquery/mousewheel/mousewheel.js",
"api/js/framework/fw_ui.js",
"api/js/framework/fw_classes.js",
"api/js/framework/fw_desktop.js",
"jdots/js/fw_jdots.js"
]
}
},
mobile: {
files: {
"pixelegg/js/fw_mobile.min.js": [
"vendor/bower-asset/fastclick/lib/fastclick.js",
"api/js/framework/fw_base.js",
"api/js/framework/fw_browser.js",
"api/js/jquery/mousewheel/mousewheel.js",
"api/js/framework/fw_ui.js",
"api/js/framework/fw_classes.js",
"pixelegg/js/fw_mobile.js"
]
}
},
notifications: {
files: {
"notifications/js/notificationajaxpopup.min.js": [
"notifications/js/notificationajaxpopup.js"
]
}
},
pixelegg: {
files: {
"pixelegg/js/fw_pixelegg.min.js": [
"api/js/framework/fw_base.js",
"api/js/framework/fw_browser.js",
"api/js/jquery/mousewheel/mousewheel.js",
"api/js/framework/fw_ui.js",
"api/js/framework/fw_classes.js",
"api/js/framework/fw_desktop.js",
"pixelegg/js/slider.js",
"pixelegg/js/fw_pixelegg.js"
]
}
},
projectmanager: {
files: {
"projectmanager/js/app.min.js": [
"vendor/npm-asset/dhtmlx-gantt/codebase/dhtmlxgantt.js",
"vendor/npm-asset/dhtmlx-gantt/codebase/ext/dhtmlxgantt_marker.js",
"projectmanager/js/et2_widget_gantt.js",
"projectmanager/js/app.js"
]
}
},
smallpart: {
files: {
"smallpart/js/app.min.js": [
"smallpart/js/et2_widget_videobar.js",
"smallpart/js/et2_videooverlay_interface.js",
"smallpart/js/overlay_plugins/et2_smallpart_overlay_html.js",
"smallpart/js/overlay_plugins/et2_smallpart_question_multiplechoice.js",
"smallpart/js/overlay_plugins/et2_smallpart_question_singlechoice.js",
"smallpart/js/overlay_plugins/et2_smallpart_question_text.js",
"smallpart/js/et2_widget_videooverlay.js",
"smallpart/js/et2_widget_videooverlay_slider_controller.js",
"smallpart/js/et2_widget_videotime.js",
"smallpart/js/et2_widget_comment.js",
"smallpart/js/et2_widget_color_radiobox.js",
"smallpart/js/et2_widget_filter_participants.js",
"smallpart/js/app.js"
]
}
}
},
cssmin: { cssmin: {
options: { options: {
shorthandCompacting: false, shorthandCompacting: false,
@ -474,9 +205,6 @@ module.exports = function (grunt) {
} }
} }
}); });
// Load the plugin that provides the "uglify" task.
grunt.loadNpmTasks("grunt-terser");
// Load plugin for css minificaton // Load plugin for css minificaton
grunt.loadNpmTasks("grunt-contrib-cssmin"); grunt.loadNpmTasks("grunt-contrib-cssmin");

View File

@ -275,12 +275,14 @@ foreach(scandir(__DIR__) as $dir)
$cmd = $composer.' install '.implode(' ', $composer_args); $cmd = $composer.' install '.implode(' ', $composer_args);
run_cmd($cmd, 'composer'); run_cmd($cmd, 'composer');
// update npm dependencies and run grunt to minify javascript and css // update npm dependencies, run grunt to minify css and rollup to build javascript
if ($npm && $grunt) if ($npm && $grunt)
{ {
run_cmd($npm.' install', 'npm'); run_cmd($npm.' install', 'npm install');
run_cmd($grunt, 'grunt'); run_cmd($grunt, 'grunt');
run_cmd($npm .' run build', 'rollup (npm run build)');
} }
echo "\n$succieded tasks successful run". echo "\n$succieded tasks successful run".

View File

@ -14,6 +14,7 @@ import babel from '@babel/core';
import { readFileSync } from "fs"; import { readFileSync } from "fs";
import rimraf from 'rimraf'; import rimraf from 'rimraf';
import { minify } from 'terser'; import { minify } from 'terser';
import { readdir,stat } from 'fs/promises';
// Best practice: use this // Best practice: use this
//rimraf.sync('./dist/'); //rimraf.sync('./dist/');
@ -22,7 +23,7 @@ rimraf.sync('./chunks/');
// Turn on minification // Turn on minification
const do_minify = false; const do_minify = false;
export default { const config = {
treeshake: false, treeshake: false,
input: { input: {
// Output : Input // Output : Input
@ -32,35 +33,8 @@ export default {
"api/js/etemplate/etemplate2.min":"api/js/etemplate/etemplate2.ts", "api/js/etemplate/etemplate2.min":"api/js/etemplate/etemplate2.ts",
"api/js/egw_action/egw_dragdrop_dhtmlx_tree.min":"api/js/egw_action/egw_dragdrop_dhtmlx_tree.js", "api/js/egw_action/egw_dragdrop_dhtmlx_tree.min":"api/js/egw_action/egw_dragdrop_dhtmlx_tree.js",
"api/js/jsapi/egw.min": "api/js/jsapi/egw_modules.js", "api/js/jsapi/egw.min": "api/js/jsapi/egw_modules.js",
"api/js/jsapi.min": 'api/js/jsapi/jsapi.js',
// Should be just built-in apps, but until rollup supports multi-level we need them all // app.ts/js are added automatic by addAppsConfig() below
"addressbook/js/app": "addressbook/js/app.ts",
"admin/js/app": "admin/js/app.ts",
"bookmarks/js/app": "bookmarks/js/app.ts",
"calendar/js/app" : "calendar/js/app.ts",
"collabora/js/app": "collabora/js/app.ts",
"filemanager/js/app": "filemanager/js/app.ts",
//"home/js/app": "home/js/app.js",
"importexport/js/app": "importexport/js/app.ts",
"infolog/js/app": "infolog/js/app.ts",
"mail/js/app.min": "mail/js/app.js",
"news_admin/js/app": "news_admin/js/app.ts",
"notifications/js/notificationajaxpopup.min": "notifications/js/notificationajaxpopup.js",
"preferences/js/app": "preferences/js/app.ts",
"projectmanager/js/app": "projectmanager/js/app.ts",
"resources/js/app": "resources/js/app.ts",
"rocketchat/js/app.min": "rocketchat/js/app.js",
"smallpart/js/app": "smallpart/js/app.ts",
"status/js/app": "status/js/app.ts",
"timesheet/js/app": "timesheet/js/app.ts",
"tracker/js/app": "tracker/js/app.ts",
// EPL
"esyncpro/js/app": "esyncpro/js/app.ts",
"kanban/js/app": "kanban/js/app.ts",
"policy/js/app": "policy/js/app.ts",
"stylite/js/app": "stylite/js/app.ts",
"webauthn/js/app": "webauthn/js/app.ts",
}, },
external: function(id,parentId,isResolved) { external: function(id,parentId,isResolved) {
if(!isResolved) if(!isResolved)
@ -140,7 +114,7 @@ export default {
mangle: false, mangle: false,
output: { output: {
preamble: `/*! preamble: `/*!
* EGroupware (http://www.egroupware.org/) minified Javascript * EGroupware (https://www.egroupware.org/) minified Javascript
* *
* full sources are available under https://github.com/EGroupware/egroupware/ * full sources are available under https://github.com/EGroupware/egroupware/
* *
@ -151,11 +125,39 @@ export default {
}); });
} }
}], }],
// Custom warning handler to give more information about circular dependencies // Custom warning handler to give more information about circular dependencies
onwarn: function(warning,warn) { onwarn: function(warning,warn) {
console.warn(warning); console.warn(warning.message || warning);
} }
}; };
/**
* Add existing app.ts/js endpoints to config.input and return it
*
* @return Promise<object>
*/
export default async function addAppsConfig()
{
const conf = config;
const files = await readdir('.', { withFileTypes: true});
for (const file of files)
{
if (file.isDirectory())
{
try {
await stat(file.name + '/js/app.ts');
config.input[file.name + '/js/app'] = file.name + '/js/app.ts';
}
catch (e) {
try {
await stat(file.name + '/js/app.js');
config.input[file.name + '/js/app.min'] = file.name + '/js/app.js';
}
catch (e) {
}
}
}
}
return conf;
}