Minify Javascript and add automated syntax check on the CI
This commit is contained in:
parent
eee53dd589
commit
bc503d49cd
@ -12,5 +12,7 @@ composer.json
|
||||
composer.lock
|
||||
CONTRIBUTORS.md
|
||||
docker-compose.yml
|
||||
node_modules
|
||||
package.json
|
||||
Makefile
|
||||
README.markdown
|
||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -17,6 +17,7 @@ Thumbs.db
|
||||
*.sublime-workspace
|
||||
.nbproject
|
||||
nbproject
|
||||
node_modules
|
||||
config.php
|
||||
!app/helpers/*
|
||||
!app/models/*
|
||||
|
@ -20,8 +20,10 @@ install:
|
||||
|
||||
before_script:
|
||||
- ./tests/ci/install.sh
|
||||
- npm install
|
||||
|
||||
script:
|
||||
- ./node_modules/.bin/jshint assets/js/src/*.js
|
||||
- ./vendor/bin/phpunit -c tests/phpunit.unit.sqlite.xml
|
||||
- ./vendor/bin/phpunit -c tests/phpunit.unit.postgres.xml
|
||||
- ./vendor/bin/phpunit -c tests/phpunit.functional.sqlite.xml
|
||||
|
@ -18,6 +18,7 @@ Version 1.2.0 (unreleased)
|
||||
* Add Docker compose file
|
||||
* Add functional tests (Json-RPC API and Fever API)
|
||||
* Add unit tests
|
||||
* Minify Javascript and add automated syntax check on the CI
|
||||
|
||||
Migration procedure from 1.1.x to 1.2.0:
|
||||
|
||||
|
17
Makefile
17
Makefile
@ -9,7 +9,7 @@
|
||||
.PHONY: sync-locales
|
||||
.PHONY: find-locales
|
||||
|
||||
JS_FILE = assets/js/all.js
|
||||
JS_FILE = assets/js/app.min.js
|
||||
CONTAINER = miniflux
|
||||
IMAGE = miniflux/miniflux
|
||||
TAG = latest
|
||||
@ -28,13 +28,14 @@ docker-run:
|
||||
|
||||
js: $(JS_FILE)
|
||||
|
||||
$(JS_FILE): assets/js/app.js \
|
||||
assets/js/feed.js \
|
||||
assets/js/item.js \
|
||||
assets/js/event.js \
|
||||
assets/js/nav.js
|
||||
@ echo "/* AUTO GENERATED FILE, DO NOT MODIFY THIS FILE, USE 'make js' */" > $@
|
||||
@ cat $^ >> $@
|
||||
$(JS_FILE): assets/js/src/app.js \
|
||||
assets/js/src/feed.js \
|
||||
assets/js/src/item.js \
|
||||
assets/js/src/event.js \
|
||||
assets/js/src/nav.js
|
||||
@ yarn install || npm install
|
||||
@ ./node_modules/.bin/jshint assets/js/src/*.js
|
||||
@ cat $^ | node_modules/.bin/uglifyjs - > $@
|
||||
@ echo "Miniflux.App.Run();" >> $@
|
||||
|
||||
# Build a new archive: make archive version=1.2.3 dst=/tmp
|
||||
|
@ -22,7 +22,7 @@
|
||||
<link rel="apple-touch-icon" sizes="144x144" href="assets/img/touch-icon-ipad-retina.png">
|
||||
|
||||
<link href="<?php echo Miniflux\Helper\css() ?>" rel="stylesheet" media="screen">
|
||||
<script type="text/javascript" src="assets/js/all.js?<?php echo filemtime('assets/js/all.js') ?>" defer></script>
|
||||
<script type="text/javascript" src="assets/js/app.min.js?<?php echo filemtime('assets/js/app.min.js') ?>" defer></script>
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
|
2
assets/js/app.min.js
vendored
Normal file
2
assets/js/app.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@ -22,10 +22,10 @@ Miniflux.App = (function() {
|
||||
request.onload = function() {
|
||||
var response = JSON.parse(this.responseText);
|
||||
|
||||
if (response['frontend_updatecheck_interval'] > 0) {
|
||||
Miniflux.App.Log('Frontend updatecheck interval in minutes: ' + response['frontend_updatecheck_interval']);
|
||||
if (response.frontend_updatecheck_interval > 0) {
|
||||
Miniflux.App.Log('Frontend updatecheck interval in minutes: ' + response.frontend_updatecheck_interval);
|
||||
Miniflux.Item.CheckForUpdates();
|
||||
setInterval(function(){ Miniflux.Item.CheckForUpdates(); }, response['frontend_updatecheck_interval']*60*1000);
|
||||
setInterval(function(){ Miniflux.Item.CheckForUpdates(); }, response.frontend_updatecheck_interval * 60 * 1000);
|
||||
}
|
||||
else {
|
||||
Miniflux.App.Log('Frontend updatecheck disabled');
|
@ -10,7 +10,7 @@ Miniflux.Event = (function() {
|
||||
|
||||
// Do not handle events when there is a focus in form fields
|
||||
var target = e.target || e.srcElement;
|
||||
return !!(target.tagName === 'INPUT' || target.tagName === 'TEXTAREA');
|
||||
return target.tagName === 'INPUT' || target.tagName === 'TEXTAREA';
|
||||
}
|
||||
|
||||
return {
|
||||
@ -58,22 +58,34 @@ Miniflux.Event = (function() {
|
||||
Miniflux.Feed.UpdateAll(e.target.getAttribute("data-concurrent-requests"));
|
||||
break;
|
||||
case 'refresh-feed':
|
||||
currentItem && Miniflux.Feed.Update(currentItem);
|
||||
if (currentItem) {
|
||||
Miniflux.Feed.Update(currentItem);
|
||||
}
|
||||
break;
|
||||
case 'mark-read':
|
||||
currentItem && Miniflux.Item.MarkAsRead(currentItem);
|
||||
if (currentItem) {
|
||||
Miniflux.Item.MarkAsRead(currentItem);
|
||||
}
|
||||
break;
|
||||
case 'mark-unread':
|
||||
currentItem && Miniflux.Item.MarkAsUnread(currentItem);
|
||||
if (currentItem) {
|
||||
Miniflux.Item.MarkAsUnread(currentItem);
|
||||
}
|
||||
break;
|
||||
case 'mark-removed':
|
||||
currentItem && Miniflux.Item.MarkAsRemoved(currentItem);
|
||||
if (currentItem) {
|
||||
Miniflux.Item.MarkAsRemoved(currentItem);
|
||||
}
|
||||
break;
|
||||
case 'bookmark':
|
||||
currentItem && Miniflux.Item.SwitchBookmark(currentItem);
|
||||
if (currentItem) {
|
||||
Miniflux.Item.SwitchBookmark(currentItem);
|
||||
}
|
||||
break;
|
||||
case 'download-item':
|
||||
currentItem && Miniflux.Item.DownloadContent(currentItem);
|
||||
if (currentItem) {
|
||||
Miniflux.Item.DownloadContent(currentItem);
|
||||
}
|
||||
break;
|
||||
case 'mark-feed-read':
|
||||
var feed_id = document.getElementById('listing').getAttribute('data-feed-id');
|
||||
@ -150,7 +162,9 @@ Miniflux.Event = (function() {
|
||||
switch (e.key || e.which) {
|
||||
case 'd':
|
||||
case 100:
|
||||
currentItem && Miniflux.Item.DownloadContent(currentItem);
|
||||
if (currentItem) {
|
||||
Miniflux.Item.DownloadContent(currentItem);
|
||||
}
|
||||
break;
|
||||
case 'p':
|
||||
case 112:
|
||||
@ -166,19 +180,27 @@ Miniflux.Event = (function() {
|
||||
break;
|
||||
case 'v':
|
||||
case 118:
|
||||
currentItem && Miniflux.Item.OpenOriginal(currentItem);
|
||||
if (currentItem) {
|
||||
Miniflux.Item.OpenOriginal(currentItem);
|
||||
}
|
||||
break;
|
||||
case 'o':
|
||||
case 111:
|
||||
currentItem && Miniflux.Item.Show(currentItem);
|
||||
if (currentItem) {
|
||||
Miniflux.Item.Show(currentItem);
|
||||
}
|
||||
break;
|
||||
case 'm':
|
||||
case 109:
|
||||
currentItem && Miniflux.Item.SwitchStatus(currentItem);
|
||||
if (currentItem) {
|
||||
Miniflux.Item.SwitchStatus(currentItem);
|
||||
}
|
||||
break;
|
||||
case 'f':
|
||||
case 102:
|
||||
currentItem && Miniflux.Item.SwitchBookmark(currentItem);
|
||||
if (currentItem) {
|
||||
Miniflux.Item.SwitchBookmark(currentItem);
|
||||
}
|
||||
break;
|
||||
case 'h':
|
||||
case 104:
|
||||
@ -261,8 +283,10 @@ Miniflux.Event = (function() {
|
||||
ListenTouchEvents: function() {
|
||||
var touches = null;
|
||||
var resetTouch = function () {
|
||||
touches && touches.element && (touches.element.style.opacity = 1);
|
||||
touches && touches.element && (touches.element.style.transform = "");
|
||||
if (touches && touches.element) {
|
||||
touches.element.style.opacity = 1;
|
||||
touches.element.style.transform = "";
|
||||
}
|
||||
touches = {
|
||||
"touchstart": {"x":-1, "y":-1},
|
||||
"touchmove" : {"x":-1, "y":-1},
|
||||
@ -274,7 +298,7 @@ Miniflux.Event = (function() {
|
||||
};
|
||||
var horizontalSwipe = function () {
|
||||
if((touches.touchstart.x > -1 && touches.touchmove.x > -1 &&
|
||||
((touches.touchmove.x - touches.touchstart.x) > 30 | touches.swipestarted) &&
|
||||
((touches.touchmove.x - touches.touchstart.x) > 30 || touches.swipestarted) &&
|
||||
Math.abs(touches.touchmove.y - touches.touchstart.y) < 75)) {
|
||||
touches.swipestarted = true;
|
||||
return touches.touchmove.x - touches.touchstart.x;
|
||||
@ -334,7 +358,9 @@ Miniflux.Event = (function() {
|
||||
element = getTouchElement();
|
||||
swipedistance = horizontalSwipe();
|
||||
if(swipedistance > 75) {
|
||||
element && Miniflux.Item.MarkAsRead(element);
|
||||
if (element) {
|
||||
Miniflux.Item.MarkAsRead(element);
|
||||
}
|
||||
if(!element.getAttribute("data-hide")){
|
||||
resetTouch();
|
||||
}
|
@ -6,6 +6,8 @@ Miniflux.Feed = (function() {
|
||||
// Number of concurrent requests when updating all feeds
|
||||
var queue_length = 5;
|
||||
|
||||
var updateInterval = null;
|
||||
|
||||
return {
|
||||
Update: function(feed, callback) {
|
||||
var itemsCounter = feed.querySelector("span.items-count");
|
||||
@ -25,8 +27,8 @@ Miniflux.Feed = (function() {
|
||||
if (lastChecked) lastChecked.innerHTML = lastChecked.getAttribute("data-after-update");
|
||||
|
||||
var response = JSON.parse(this.responseText);
|
||||
if (response['result']) {
|
||||
itemsCounter.innerHTML = response['items_count']['items_unread'] + "/" + response['items_count']['items_total'];
|
||||
if (response.result) {
|
||||
itemsCounter.innerHTML = response.items_count.items_unread + "/" + response.items_count.items_total;
|
||||
} else {
|
||||
feed.setAttribute("data-feed-error", "1");
|
||||
}
|
||||
@ -50,22 +52,22 @@ Miniflux.Feed = (function() {
|
||||
queue_length = nb_concurrent_requests;
|
||||
}
|
||||
|
||||
var interval = setInterval(function() {
|
||||
updateInterval = setInterval(function() {
|
||||
while (feeds.length > 0 && queue.length < queue_length) {
|
||||
var feed = feeds.shift();
|
||||
queue.push(parseInt(feed.getAttribute('data-feed-id'), 10));
|
||||
|
||||
Miniflux.Feed.Update(feed, function(response) {
|
||||
var index = queue.indexOf(response['feed_id']);
|
||||
Miniflux.Feed.Update(feed, Miniflux.Feed.OnFeedUpdated);
|
||||
}
|
||||
}, 100);
|
||||
},
|
||||
OnFeedUpdated: function(response) {
|
||||
var index = queue.indexOf(response.feed_id);
|
||||
if (index >= 0) queue.splice(index, 1);
|
||||
|
||||
if (feeds.length === 0 && queue.length === 0) {
|
||||
clearInterval(interval);
|
||||
clearInterval(updateInterval);
|
||||
Miniflux.Item.CheckForUpdates();
|
||||
}
|
||||
});
|
||||
}
|
||||
}, 100);
|
||||
}
|
||||
};
|
||||
})();
|
@ -284,7 +284,9 @@ Miniflux.Item = (function() {
|
||||
},
|
||||
OpenOriginal: function(item) {
|
||||
var link = item.querySelector("a.original");
|
||||
if (link) simulateMouseClick(link)
|
||||
if (link) {
|
||||
simulateMouseClick(link);
|
||||
}
|
||||
},
|
||||
DownloadContent: function(item) {
|
||||
var container = document.getElementById("download-item");
|
||||
@ -299,9 +301,9 @@ Miniflux.Item = (function() {
|
||||
var response = JSON.parse(request.responseText);
|
||||
container.className = "";
|
||||
|
||||
if (response['result']) {
|
||||
if (response.result) {
|
||||
var content = document.getElementById("item-content");
|
||||
if (content) content.innerHTML = response['content'];
|
||||
if (content) content.innerHTML = response.content;
|
||||
|
||||
container.innerHTML = container.getAttribute("data-after-message");
|
||||
}
|
||||
@ -344,7 +346,7 @@ Miniflux.Item = (function() {
|
||||
var tag = document.querySelector(tags[i]);
|
||||
|
||||
if (tag) {
|
||||
tag.dir = tag.dir == "" ? "rtl" : "";
|
||||
tag.dir = tag.dir === "" ? "rtl" : "";
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -359,10 +361,10 @@ Miniflux.Item = (function() {
|
||||
|
||||
var request = new XMLHttpRequest();
|
||||
request.onload = function() {
|
||||
var first_run = (latest_feeds_items.length === 0);
|
||||
var first_run = latest_feeds_items.length === 0;
|
||||
var current_unread = false;
|
||||
var response = JSON.parse(this.responseText);
|
||||
var last_items_timestamps = response['last_items_timestamps'];
|
||||
var last_items_timestamps = response.last_items_timestamps;
|
||||
|
||||
for (var i = 0; i < last_items_timestamps.length; i++) {
|
||||
var current_feed = last_items_timestamps[i];
|
||||
@ -374,12 +376,12 @@ Miniflux.Item = (function() {
|
||||
}
|
||||
}
|
||||
|
||||
Miniflux.App.Log('first_run: ' + first_run + ', current_unread: ' + current_unread + ', response.nbUnread: ' + response['nbUnread'] + ', nbUnreadItems: ' + nbUnreadItems);
|
||||
Miniflux.App.Log('first_run: ' + first_run + ', current_unread: ' + current_unread + ', response.nbUnread: ' + response.nbUnread + ', nbUnreadItems: ' + nbUnreadItems);
|
||||
|
||||
if (! document.hidden && (response['nb_unread_items'] !== nbUnreadItems || unreadItems)) {
|
||||
if (! document.hidden && (response.nb_unread_items !== nbUnreadItems || unreadItems)) {
|
||||
Miniflux.App.Log('Counter changed! Updating unread counter.');
|
||||
unreadItems = false;
|
||||
nbUnreadItems = response['nb_unread_items'];
|
||||
nbUnreadItems = response.nb_unread_items;
|
||||
updateCounters();
|
||||
}
|
||||
else if (document.hidden && ! first_run && current_unread) {
|
@ -114,9 +114,12 @@ Miniflux.Nav = (function() {
|
||||
},
|
||||
ToggleMenuMore: function () {
|
||||
var menu = document.getElementById("menu-more");
|
||||
menu.hasAttribute("class")
|
||||
? menu.removeAttribute("class")
|
||||
: menu.setAttribute("class", "hide");
|
||||
|
||||
if (menu.hasAttribute("class")) {
|
||||
menu.removeAttribute("class");
|
||||
} else {
|
||||
menu.setAttribute("class", "hide");
|
||||
}
|
||||
},
|
||||
IsListing: isListing
|
||||
};
|
6
package.json
Normal file
6
package.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"jshint": "^2.9.4",
|
||||
"uglify-js": "^2.7.5"
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user