New: Cleanup UI tooling, Update to Webpack 4, Gulp 4 (#655)
* New: Webpack 4 * New: Gulp 4 * New: Transpile UI for old browsers Co-Authored-By: Mark McDowall <markus101@users.noreply.github.com>pull/661/head
parent
fe3761fc2e
commit
0a6f552d5b
@ -0,0 +1,35 @@
|
|||||||
|
const loose = true;
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
plugins: [
|
||||||
|
// Stage 1
|
||||||
|
'@babel/plugin-proposal-export-default-from',
|
||||||
|
['@babel/plugin-proposal-optional-chaining', { loose }],
|
||||||
|
['@babel/plugin-proposal-nullish-coalescing-operator', { loose }],
|
||||||
|
|
||||||
|
// Stage 2
|
||||||
|
'@babel/plugin-proposal-export-namespace-from',
|
||||||
|
|
||||||
|
// Stage 3
|
||||||
|
['@babel/plugin-proposal-class-properties', { loose }],
|
||||||
|
'@babel/plugin-syntax-dynamic-import'
|
||||||
|
],
|
||||||
|
env: {
|
||||||
|
development: {
|
||||||
|
presets: [
|
||||||
|
['@babel/preset-react', { development: true }]
|
||||||
|
],
|
||||||
|
plugins: [
|
||||||
|
'babel-plugin-inline-classnames'
|
||||||
|
]
|
||||||
|
},
|
||||||
|
production: {
|
||||||
|
presets: [
|
||||||
|
'@babel/preset-react'
|
||||||
|
],
|
||||||
|
plugins: [
|
||||||
|
'babel-plugin-transform-react-remove-prop-types'
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
@ -0,0 +1,6 @@
|
|||||||
|
module.exports = [
|
||||||
|
'>0.25%',
|
||||||
|
'not ie 11',
|
||||||
|
'not op_mini all',
|
||||||
|
'not chrome < 60'
|
||||||
|
];
|
@ -1,15 +1,17 @@
|
|||||||
const gulp = require('gulp');
|
const gulp = require('gulp');
|
||||||
const runSequence = require('run-sequence');
|
|
||||||
|
|
||||||
require('./clean');
|
require('./clean');
|
||||||
require('./copy');
|
require('./copy');
|
||||||
|
require('./webpack');
|
||||||
|
|
||||||
gulp.task('build', () => {
|
gulp.task('build',
|
||||||
return runSequence('clean', [
|
gulp.series('clean',
|
||||||
'webpack',
|
gulp.parallel(
|
||||||
'copyHtml',
|
'webpack',
|
||||||
'copyFonts',
|
'copyHtml',
|
||||||
'copyImages',
|
'copyFonts',
|
||||||
'copyJs'
|
'copyImages',
|
||||||
]);
|
'copyJs'
|
||||||
});
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
@ -1,8 +1,5 @@
|
|||||||
require('./build.js');
|
require('./build.js');
|
||||||
require('./clean.js');
|
require('./clean.js');
|
||||||
require('./copy.js');
|
require('./copy.js');
|
||||||
require('./imageMin.js');
|
|
||||||
require('./start.js');
|
|
||||||
require('./stripBom.js');
|
|
||||||
require('./watch.js');
|
require('./watch.js');
|
||||||
require('./webpack.js');
|
require('./webpack.js');
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
const gulpUtil = require('gulp-util');
|
const colors = require('ansi-colors');
|
||||||
|
|
||||||
module.exports = function errorHandler(error) {
|
module.exports = function errorHandler(error) {
|
||||||
gulpUtil.log(gulpUtil.colors.red(`Error (${error.plugin}): ${error.message}`));
|
console.log(colors.red(`Error (${error.plugin}): ${error.message}`));
|
||||||
this.emit('end');
|
this.emit('end');
|
||||||
};
|
};
|
||||||
|
@ -1,15 +0,0 @@
|
|||||||
const path = require('path');
|
|
||||||
const rootPath = path.resolve(__dirname + '/../../src/');
|
|
||||||
module.exports = function(source) {
|
|
||||||
if (this.cacheable) {
|
|
||||||
this.cacheable();
|
|
||||||
}
|
|
||||||
|
|
||||||
const resourcePath = this.resourcePath.replace(rootPath, '');
|
|
||||||
const wrappedSource =`
|
|
||||||
<!-- begin ${resourcePath} -->
|
|
||||||
${source}
|
|
||||||
<!-- end ${resourcePath} -->`;
|
|
||||||
|
|
||||||
return wrappedSource;
|
|
||||||
};
|
|
@ -1,15 +0,0 @@
|
|||||||
var gulp = require('gulp');
|
|
||||||
var print = require('gulp-print').default;
|
|
||||||
var paths = require('./helpers/paths.js');
|
|
||||||
|
|
||||||
gulp.task('imageMin', () => {
|
|
||||||
var imagemin = require('gulp-imagemin');
|
|
||||||
return gulp.src(paths.src.images)
|
|
||||||
.pipe(imagemin({
|
|
||||||
progressive: false,
|
|
||||||
optimizationLevel: 4,
|
|
||||||
svgoPlugins: [{ removeViewBox: false }]
|
|
||||||
}))
|
|
||||||
.pipe(print())
|
|
||||||
.pipe(gulp.dest(paths.src.content + 'Images/'));
|
|
||||||
});
|
|
@ -1,104 +0,0 @@
|
|||||||
// will download and run lidarr (server) in a non-windows enviroment
|
|
||||||
// you can use this if you don't care about the server code and just want to work
|
|
||||||
// with the web code.
|
|
||||||
|
|
||||||
var http = require('http');
|
|
||||||
var gulp = require('gulp');
|
|
||||||
var fs = require('fs');
|
|
||||||
var targz = require('tar.gz');
|
|
||||||
var del = require('del');
|
|
||||||
var spawn = require('child_process').spawn;
|
|
||||||
|
|
||||||
function download(url, dest, cb) {
|
|
||||||
console.log('Downloading ' + url + ' to ' + dest);
|
|
||||||
var file = fs.createWriteStream(dest);
|
|
||||||
http.get(url, function(response) {
|
|
||||||
response.pipe(file);
|
|
||||||
file.on('finish', function() {
|
|
||||||
console.log('Download completed');
|
|
||||||
file.close(cb);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function getLatest(cb) {
|
|
||||||
var branch = 'develop';
|
|
||||||
process.argv.forEach(function(val) {
|
|
||||||
var branchMatch = /branch=([\S]*)/.exec(val);
|
|
||||||
if (branchMatch && branchMatch.length > 1) {
|
|
||||||
branch = branchMatch[1];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
var url = 'http://services.lidarr.audio/v1/update/' + branch + '?os=osx';
|
|
||||||
|
|
||||||
console.log('Checking for latest version:', url);
|
|
||||||
|
|
||||||
http.get(url, function(res) {
|
|
||||||
var data = '';
|
|
||||||
|
|
||||||
res.on('data', function(chunk) {
|
|
||||||
data += chunk;
|
|
||||||
});
|
|
||||||
|
|
||||||
res.on('end', function() {
|
|
||||||
var updatePackage = JSON.parse(data).updatePackage;
|
|
||||||
console.log('Latest version available: ' + updatePackage.version + ' Release Date: ' + updatePackage.releaseDate);
|
|
||||||
cb(updatePackage);
|
|
||||||
});
|
|
||||||
}).on('error', function(e) {
|
|
||||||
console.log('problem with request: ' + e.message);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function extract(source, dest, cb) {
|
|
||||||
console.log('extracting download page to ' + dest);
|
|
||||||
new targz().extract(source, dest, function(err) {
|
|
||||||
if (err) {
|
|
||||||
console.log(err);
|
|
||||||
}
|
|
||||||
console.log('Update package extracted.');
|
|
||||||
cb();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
gulp.task('getSonarr', function() {
|
|
||||||
try {
|
|
||||||
fs.mkdirSync('./_start/');
|
|
||||||
} catch (e) {
|
|
||||||
if (e.code !== 'EEXIST') {
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
getLatest(function(updatePackage) {
|
|
||||||
var packagePath = './_start/' + updatePackage.filename;
|
|
||||||
var dirName = './_start/' + updatePackage.version;
|
|
||||||
download(updatePackage.url, packagePath, function() {
|
|
||||||
extract(packagePath, dirName, function() {
|
|
||||||
// clean old binaries
|
|
||||||
console.log('Cleaning old binaries');
|
|
||||||
del.sync(['./_output/*', '!./_output/UI/']);
|
|
||||||
console.log('copying binaries to target');
|
|
||||||
gulp.src(dirName + '/Lidarr/*.*')
|
|
||||||
.pipe(gulp.dest('./_output/'));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('startSonarr', function() {
|
|
||||||
var ls = spawn('mono', ['--debug', './_output/Lidarr.exe']);
|
|
||||||
|
|
||||||
ls.stdout.on('data', function(data) {
|
|
||||||
process.stdout.write(data);
|
|
||||||
});
|
|
||||||
|
|
||||||
ls.stderr.on('data', function(data) {
|
|
||||||
process.stdout.write(data);
|
|
||||||
});
|
|
||||||
|
|
||||||
ls.on('close', function(code) {
|
|
||||||
console.log('child process exited with code ' + code);
|
|
||||||
});
|
|
||||||
});
|
|
@ -1,13 +0,0 @@
|
|||||||
const gulp = require('gulp');
|
|
||||||
const paths = require('./helpers/paths.js');
|
|
||||||
const stripbom = require('gulp-stripbom');
|
|
||||||
|
|
||||||
function stripBom(dest) {
|
|
||||||
gulp.src([paths.src.scripts, paths.src.exclude.libs])
|
|
||||||
.pipe(stripbom({ showLog: false }))
|
|
||||||
.pipe(gulp.dest(dest));
|
|
||||||
}
|
|
||||||
|
|
||||||
gulp.task('stripBom', () => {
|
|
||||||
stripBom(paths.src.root);
|
|
||||||
});
|
|
@ -1,27 +1,18 @@
|
|||||||
const gulp = require('gulp');
|
const gulp = require('gulp');
|
||||||
const livereload = require('gulp-livereload');
|
const livereload = require('gulp-livereload');
|
||||||
const watch = require('gulp-watch');
|
const gulpWatch = require('gulp-watch');
|
||||||
const paths = require('./helpers/paths.js');
|
const paths = require('./helpers/paths.js');
|
||||||
|
|
||||||
require('./copy.js');
|
require('./copy.js');
|
||||||
require('./webpack.js');
|
require('./webpack.js');
|
||||||
|
|
||||||
function watchTask(glob, task) {
|
function watch() {
|
||||||
const options = {
|
|
||||||
name: `watch: ${task}`,
|
|
||||||
verbose: true
|
|
||||||
};
|
|
||||||
return watch(glob, options, () => {
|
|
||||||
gulp.start(task);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
gulp.task('watch', ['copyHtml', 'copyFonts', 'copyImages', 'copyJs'], () => {
|
|
||||||
livereload.listen({ start: true });
|
livereload.listen({ start: true });
|
||||||
|
|
||||||
gulp.start('webpackWatch');
|
gulp.task('webpackWatch')();
|
||||||
|
gulpWatch(paths.src.html, gulp.series('copyHtml'));
|
||||||
|
gulpWatch(`${paths.src.fonts}**/*.*`, gulp.series('copyFonts'));
|
||||||
|
gulpWatch(`${paths.src.images}**/*.*`, gulp.series('copyImages'));
|
||||||
|
}
|
||||||
|
|
||||||
watchTask(paths.src.html, 'copyHtml');
|
gulp.task('watch', gulp.series('build', watch));
|
||||||
watchTask(`${paths.src.fonts}**/*.*`, 'copyFonts');
|
|
||||||
watchTask(`${paths.src.images}**/*.*`, 'copyImages');
|
|
||||||
});
|
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
.language,
|
.language,
|
||||||
.quality {
|
.quality {
|
||||||
composes: cell from 'Components/Table/Cells/TableRowCell.css';
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
|
||||||
width: 100px;
|
width: 100px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.indexer {
|
.indexer {
|
||||||
composes: cell from 'Components/Table/Cells/TableRowCell.css';
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
|
||||||
width: 80px;
|
width: 80px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.actions {
|
.actions {
|
||||||
composes: cell from 'Components/Table/Cells/TableRowCell.css';
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
|
||||||
width: 70px;
|
width: 70px;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
.description {
|
.description {
|
||||||
composes: title from 'Components/DescriptionList/DescriptionListItemDescription.css';
|
composes: title from '~Components/DescriptionList/DescriptionListItemDescription.css';
|
||||||
|
|
||||||
overflow-wrap: break-word;
|
overflow-wrap: break-word;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
.markAsFailedButton {
|
.markAsFailedButton {
|
||||||
composes: button from 'Components/Link/Button.css';
|
composes: button from '~Components/Link/Button.css';
|
||||||
|
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
}
|
}
|
||||||
|
@ -1,23 +1,23 @@
|
|||||||
.downloadClient {
|
.downloadClient {
|
||||||
composes: cell from 'Components/Table/Cells/TableRowCell.css';
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
|
||||||
width: 120px;
|
width: 120px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.indexer {
|
.indexer {
|
||||||
composes: cell from 'Components/Table/Cells/TableRowCell.css';
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
|
||||||
width: 80px;
|
width: 80px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.releaseGroup {
|
.releaseGroup {
|
||||||
composes: cell from 'Components/Table/Cells/TableRowCell.css';
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
|
||||||
width: 110px;
|
width: 110px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.details {
|
.details {
|
||||||
composes: cell from 'Components/Table/Cells/TableRowCell.css';
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
|
||||||
width: 30px;
|
width: 30px;
|
||||||
}
|
}
|
||||||
|
@ -1,23 +1,23 @@
|
|||||||
.quality {
|
.quality {
|
||||||
composes: cell from 'Components/Table/Cells/TableRowCell.css';
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
|
||||||
width: 150px;
|
width: 150px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.protocol {
|
.protocol {
|
||||||
composes: cell from 'Components/Table/Cells/TableRowCell.css';
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
|
||||||
width: 100px;
|
width: 100px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.progress {
|
.progress {
|
||||||
composes: cell from 'Components/Table/Cells/TableRowCell.css';
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
|
||||||
width: 150px;
|
width: 150px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.actions {
|
.actions {
|
||||||
composes: cell from 'Components/Table/Cells/TableRowCell.css';
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
|
||||||
width: 90px;
|
width: 90px;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
.status {
|
.status {
|
||||||
composes: cell from 'Components/Table/Cells/TableRowCell.css';
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
|
||||||
width: 30px;
|
width: 30px;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
.timeleft {
|
.timeleft {
|
||||||
composes: cell from 'Components/Table/Cells/TableRowCell.css';
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
|
||||||
width: 100px;
|
width: 100px;
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
.input {
|
.input {
|
||||||
composes: input from 'Components/Form/CheckInput.css';
|
composes: input from '~Components/Form/CheckInput.css';
|
||||||
}
|
}
|
||||||
|
@ -1,17 +1,17 @@
|
|||||||
.descriptionList {
|
.descriptionList {
|
||||||
composes: descriptionList from 'Components/DescriptionList/DescriptionList.css';
|
composes: descriptionList from '~Components/DescriptionList/DescriptionList.css';
|
||||||
|
|
||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.title {
|
.title {
|
||||||
composes: title from 'Components/DescriptionList/DescriptionListItemTitle.css';
|
composes: title from '~Components/DescriptionList/DescriptionListItemTitle.css';
|
||||||
|
|
||||||
width: 80px;
|
width: 80px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.description {
|
.description {
|
||||||
composes: title from 'Components/DescriptionList/DescriptionListItemDescription.css';
|
composes: title from '~Components/DescriptionList/DescriptionListItemDescription.css';
|
||||||
|
|
||||||
margin-left: 100px;
|
margin-left: 100px;
|
||||||
}
|
}
|
||||||
|
@ -1,17 +1,17 @@
|
|||||||
.title {
|
.title {
|
||||||
composes: cell from 'Components/Table/Cells/TableRowCell.css';
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.monitored {
|
.monitored {
|
||||||
composes: cell from 'Components/Table/Cells/TableRowCell.css';
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
|
||||||
width: 42px;
|
width: 42px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.status {
|
.status {
|
||||||
composes: cell from 'Components/Table/Cells/TableRowCell.css';
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
|
||||||
width: 100px;
|
width: 100px;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
.deleteButton {
|
.deleteButton {
|
||||||
composes: button from 'Components/Link/Button.css';
|
composes: button from '~Components/Link/Button.css';
|
||||||
|
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
.albumFolder {
|
.albumFolder {
|
||||||
composes: cell from 'Components/Table/Cells/TableRowCell.css';
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
|
||||||
width: 150px;
|
width: 150px;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
.details,
|
.details,
|
||||||
.actions {
|
.actions {
|
||||||
composes: cell from 'Components/Table/Cells/TableRowCell.css';
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
|
||||||
width: 65px;
|
width: 65px;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
.tableContainer {
|
.tableContainer {
|
||||||
composes: tableContainer from 'Components/Table/VirtualTable.css';
|
composes: tableContainer from '~Components/Table/VirtualTable.css';
|
||||||
|
|
||||||
flex: 1 0 auto;
|
flex: 1 0 auto;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
.doNotMoveButton {
|
.doNotMoveButton {
|
||||||
composes: button from 'Components/Link/Button.css';
|
composes: button from '~Components/Link/Button.css';
|
||||||
|
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
.modal {
|
.modal {
|
||||||
composes: modal from 'Components/Modal/Modal.css';
|
composes: modal from '~Components/Modal/Modal.css';
|
||||||
|
|
||||||
height: 600px;
|
height: 600px;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
.type {
|
.type {
|
||||||
composes: cell from 'Components/Table/Cells/TableRowCell.css';
|
composes: cell from '~Components/Table/Cells/TableRowCell.css';
|
||||||
|
|
||||||
width: 32px;
|
width: 32px;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
.input {
|
.input {
|
||||||
composes: input from 'Components/Form/TextInput.css';
|
composes: input from '~Components/Form/TextInput.css';
|
||||||
|
|
||||||
font-family: $passwordFamily;
|
font-family: $passwordFamily;
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue