mirror of
https://github.com/jc21/nginx-proxy-manager.git
synced 2024-08-30 18:22:48 +00:00
Removed v1 cruft
This commit is contained in:
parent
d04f5a619a
commit
5dd723a864
@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
"presets": [
|
|
||||||
["env", {
|
|
||||||
"targets": {
|
|
||||||
"browsers": ["Chrome >= 65"]
|
|
||||||
},
|
|
||||||
"debug": false,
|
|
||||||
"modules": false,
|
|
||||||
"useBuiltIns": "usage"
|
|
||||||
}]
|
|
||||||
]
|
|
||||||
}
|
|
@ -1,172 +0,0 @@
|
|||||||
/*jshint node:true */
|
|
||||||
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
const path = require('path');
|
|
||||||
const gulp = require('gulp');
|
|
||||||
const gutil = require('gulp-util');
|
|
||||||
const concat = require('gulp-concat-util');
|
|
||||||
const runSequence = require('run-sequence');
|
|
||||||
const webpack = require('webpack');
|
|
||||||
const webpackStream = require('webpack-stream');
|
|
||||||
const imagemin = require('gulp-imagemin');
|
|
||||||
const del = require('del');
|
|
||||||
const bump = require('gulp-bump');
|
|
||||||
const sass = require('gulp-sass');
|
|
||||||
const ejs = require('gulp-ejs');
|
|
||||||
const PACKAGE = require('./package.json');
|
|
||||||
|
|
||||||
const assets = {
|
|
||||||
views: {
|
|
||||||
watch: 'src/frontend/views/**/*.ejs',
|
|
||||||
src: 'src/frontend/views/*.ejs',
|
|
||||||
dest: 'dist/'
|
|
||||||
},
|
|
||||||
fonts: {
|
|
||||||
watch: 'src/frontend/fonts/**/*.{ttf,woff,woff2,eof,eot,svg,otf}',
|
|
||||||
dest: 'dist/fonts'
|
|
||||||
},
|
|
||||||
images: {
|
|
||||||
watch: 'src/frontend/images/**/*.{png,jpg,gif}',
|
|
||||||
dest: 'dist/images'
|
|
||||||
},
|
|
||||||
scss: {
|
|
||||||
watch: 'src/frontend/scss/**/*.scss',
|
|
||||||
loadPath: 'src/frontend/scss',
|
|
||||||
src: 'src/frontend/scss/styles.scss',
|
|
||||||
dest: 'dist/css'
|
|
||||||
},
|
|
||||||
js: {
|
|
||||||
watch: 'src/frontend/js/**/*',
|
|
||||||
src: 'src/frontend/js/main.js',
|
|
||||||
dest: 'dist/js/'
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param color
|
|
||||||
* @param label
|
|
||||||
* @returns {Function}
|
|
||||||
*/
|
|
||||||
function logger (color, label) {
|
|
||||||
return function () {
|
|
||||||
let args = Array.prototype.slice.call(arguments);
|
|
||||||
args.unshift(gutil.colors[color].bold(label.toUpperCase() + ':'));
|
|
||||||
gutil.log.apply(null, args);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
gutil.error = logger('red', 'error');
|
|
||||||
gutil.warn = logger('yellow', 'warn');
|
|
||||||
gutil.notice = logger('white', 'notice');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param err
|
|
||||||
*/
|
|
||||||
function handleError (err) {
|
|
||||||
gutil.error(err.stack);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************
|
|
||||||
TASKS
|
|
||||||
******************************/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* clean
|
|
||||||
*/
|
|
||||||
gulp.task('clean', function (cb) {
|
|
||||||
del(['./dist/*'])
|
|
||||||
.then(function () {
|
|
||||||
cb();
|
|
||||||
})
|
|
||||||
.catch(handleError);
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* images
|
|
||||||
*/
|
|
||||||
gulp.task('images', function () {
|
|
||||||
if (process.arch !== 'arm') {
|
|
||||||
return gulp.src(assets.images.watch)
|
|
||||||
.pipe(imagemin({
|
|
||||||
optimizationLevel: 7
|
|
||||||
}))
|
|
||||||
.pipe(gulp.dest(assets.images.dest))
|
|
||||||
.on('error', handleError);
|
|
||||||
} else {
|
|
||||||
return gulp.src(assets.images.watch)
|
|
||||||
.pipe(gulp.dest(assets.images.dest))
|
|
||||||
.on('error', handleError);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* fonts
|
|
||||||
*/
|
|
||||||
gulp.task('fonts', function () {
|
|
||||||
return gulp.src(assets.fonts.watch)
|
|
||||||
.pipe(gulp.dest(assets.fonts.dest))
|
|
||||||
.on('error', handleError);
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* scss
|
|
||||||
*/
|
|
||||||
gulp.task('scss', function () {
|
|
||||||
return gulp.src(assets.scss.src)
|
|
||||||
.pipe(sass().on('error', sass.logError))
|
|
||||||
.pipe(concat.header('@import url(\'https://fonts.googleapis.com/css?family=Open+Sans+Condensed:300,700\');@import url(\'https://fonts.googleapis.com/css?family=Roboto:100,200,300,400,500,600,700|Roboto+Condensed:300,400,700\');'))
|
|
||||||
.pipe(gulp.dest(path.resolve(assets.scss.dest)));
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* js
|
|
||||||
*/
|
|
||||||
gulp.task('js', function () {
|
|
||||||
return gulp.src(assets.js.src)
|
|
||||||
.pipe(webpackStream(require('./webpack.config.js'), webpack))
|
|
||||||
.pipe(gulp.dest(assets.js.dest))
|
|
||||||
.on('error', handleError);
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* views
|
|
||||||
*/
|
|
||||||
gulp.task('views', function () {
|
|
||||||
return gulp.src(assets.views.src)
|
|
||||||
.pipe(ejs({
|
|
||||||
version: PACKAGE.version
|
|
||||||
}, {}, {
|
|
||||||
ext: '.html'
|
|
||||||
}))
|
|
||||||
.on('error', handleError)
|
|
||||||
.pipe(gulp.dest(assets.views.dest));
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* bump
|
|
||||||
*/
|
|
||||||
gulp.task('bump', function () {
|
|
||||||
gulp.src('./package.json')
|
|
||||||
.pipe(bump({type: 'version'}))
|
|
||||||
.pipe(gulp.dest('./'));
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* build
|
|
||||||
*/
|
|
||||||
gulp.task('build', function (cb) {
|
|
||||||
runSequence('clean', ['images', 'fonts', 'scss', 'js', 'views'], cb);
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
* default
|
|
||||||
*/
|
|
||||||
gulp.task('default', ['build'], function () {
|
|
||||||
gulp.watch(assets.scss.watch, ['scss']);
|
|
||||||
gulp.watch(assets.images.watch, ['images']);
|
|
||||||
gulp.watch(assets.fonts.watch, ['fonts']);
|
|
||||||
gulp.watch(assets.js.watch, ['js']);
|
|
||||||
gulp.watch(assets.views.watch, ['views']);
|
|
||||||
gulp.watch('./webpack.config.js', ['js']);
|
|
||||||
});
|
|
@ -1,60 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "nginx-proxy-manager",
|
|
||||||
"version": "1.1.2",
|
|
||||||
"description": "Nginx proxt with built in Web based management",
|
|
||||||
"main": "src/backend/index.js",
|
|
||||||
"dependencies": {
|
|
||||||
"ajv": "^5.5.1",
|
|
||||||
"batchflow": "^0.4.0",
|
|
||||||
"body-parser": "^1.18.2",
|
|
||||||
"compression": "^1.7.1",
|
|
||||||
"diskdb": "^0.1.17",
|
|
||||||
"ejs": "^2.5.7",
|
|
||||||
"express": "^4.16.2",
|
|
||||||
"express-winston": "^2.4.0",
|
|
||||||
"json-schema-ref-parser": "^4.0.4",
|
|
||||||
"lodash": "^4.17.4",
|
|
||||||
"path": "^0.12.7",
|
|
||||||
"unix-timestamp": "^0.2.0",
|
|
||||||
"winston": "^2.4.0"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"babel-core": "^6.26.3",
|
|
||||||
"babel-loader": "^7.1.4",
|
|
||||||
"babel-minify-webpack-plugin": "^0.3.1",
|
|
||||||
"babel-preset-env": "^1.7.0",
|
|
||||||
"backbone": "1.3.3",
|
|
||||||
"backbone-virtual-collection": "^0.6.15",
|
|
||||||
"backbone.marionette": "3.4.1",
|
|
||||||
"backbone.radio": "2.0.0",
|
|
||||||
"bootstrap": "^3.3.7",
|
|
||||||
"del": "^3.0.0",
|
|
||||||
"ejs-loader": "^0.3.0",
|
|
||||||
"es6-promise": "^4.1.1",
|
|
||||||
"font-awesome": "^4.7.0",
|
|
||||||
"form-serializer": "^2.5.0",
|
|
||||||
"gulp": "^3.9.1",
|
|
||||||
"gulp-bump": "^2.7.0",
|
|
||||||
"gulp-concat-util": "^0.5.5",
|
|
||||||
"gulp-ejs": "^3.0.1",
|
|
||||||
"gulp-imagemin": "^3.3.0",
|
|
||||||
"gulp-sass": "^4.0.1",
|
|
||||||
"gulp-util": "^3.0.8",
|
|
||||||
"image-size": "^0.6.1",
|
|
||||||
"jquery": "^3.2.1",
|
|
||||||
"jquery-serializejson": "^2.8.1",
|
|
||||||
"normalize-css": "^2.3.1",
|
|
||||||
"prepack-webpack-plugin": "^1.1.0",
|
|
||||||
"run-sequence": "^2.2.0",
|
|
||||||
"underscore": "^1.8.3",
|
|
||||||
"webpack": "^4.12.0",
|
|
||||||
"webpack-cli": "^3.0.8",
|
|
||||||
"webpack-stream": "^4.0.0",
|
|
||||||
"webpack-visualizer-plugin": "^0.1.11"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
|
||||||
},
|
|
||||||
"author": "Jamie Curnow <jc@jc21.com>",
|
|
||||||
"license": "MIT"
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const Mn = require('backbone.marionette');
|
|
||||||
const template = require('./empty.ejs');
|
|
||||||
const AccessModel = require('../../models/access');
|
|
||||||
const Controller = require('../controller');
|
|
||||||
|
|
||||||
module.exports = Mn.View.extend({
|
|
||||||
template: template,
|
|
||||||
tagName: 'tr',
|
|
||||||
|
|
||||||
ui: {
|
|
||||||
create: 'button'
|
|
||||||
},
|
|
||||||
|
|
||||||
events: {
|
|
||||||
'click @ui.create': function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
Controller.showAccessListForm(new AccessModel.Model);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
@ -1,61 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const Mn = require('backbone.marionette');
|
|
||||||
const Api = require('../api');
|
|
||||||
const template = require('./main.ejs');
|
|
||||||
const Controller = require('../controller');
|
|
||||||
const RowView = require('./row');
|
|
||||||
const AccessListModel = require('../../models/access');
|
|
||||||
const EmptyView = require('./empty');
|
|
||||||
|
|
||||||
const TableBody = Mn.CollectionView.extend({
|
|
||||||
tagName: 'tbody',
|
|
||||||
childView: RowView
|
|
||||||
});
|
|
||||||
|
|
||||||
module.exports = Mn.View.extend({
|
|
||||||
template: template,
|
|
||||||
id: 'access',
|
|
||||||
|
|
||||||
regions: {
|
|
||||||
list_region: {
|
|
||||||
el: 'tbody',
|
|
||||||
replaceElement: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
ui: {
|
|
||||||
'create': 'th button'
|
|
||||||
},
|
|
||||||
|
|
||||||
events: {
|
|
||||||
'click @ui.create': function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
Controller.showAccessListForm(new AccessListModel.Model);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
onRender: function () {
|
|
||||||
let view = this;
|
|
||||||
|
|
||||||
Api.Access.getAll()
|
|
||||||
.then(response => {
|
|
||||||
if (!view.isDestroyed()) {
|
|
||||||
if (response && response.length) {
|
|
||||||
view.showChildView('list_region', new TableBody({
|
|
||||||
collection: new AccessListModel.Collection(response)
|
|
||||||
}));
|
|
||||||
} else {
|
|
||||||
view.showChildView('list_region', new EmptyView());
|
|
||||||
}
|
|
||||||
|
|
||||||
view.trigger('loaded');
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
Controller.showError(err, 'Could not fetch Access Lists');
|
|
||||||
view.trigger('loaded');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const Mn = require('backbone.marionette');
|
|
||||||
const template = require('./row.ejs');
|
|
||||||
const Controller = require('../controller');
|
|
||||||
|
|
||||||
module.exports = Mn.View.extend({
|
|
||||||
template: template,
|
|
||||||
tagName: 'tr',
|
|
||||||
|
|
||||||
ui: {
|
|
||||||
edit: 'button.edit',
|
|
||||||
delete: 'button.delete'
|
|
||||||
},
|
|
||||||
|
|
||||||
events: {
|
|
||||||
'click @ui.edit': function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
Controller.showAccessListForm(this.model);
|
|
||||||
},
|
|
||||||
|
|
||||||
'click @ui.delete': function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
Controller.showDeleteAccessList(this.model);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
initialize: function () {
|
|
||||||
this.listenTo(this.model, 'change', this.render);
|
|
||||||
}
|
|
||||||
});
|
|
@ -1,34 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const Mn = require('backbone.marionette');
|
|
||||||
const template = require('./delete.ejs');
|
|
||||||
const Controller = require('../controller');
|
|
||||||
const Api = require('../api');
|
|
||||||
const App = require('../main');
|
|
||||||
|
|
||||||
module.exports = Mn.View.extend({
|
|
||||||
template: template,
|
|
||||||
|
|
||||||
ui: {
|
|
||||||
buttons: 'form button',
|
|
||||||
delete: 'button.delete'
|
|
||||||
},
|
|
||||||
|
|
||||||
events: {
|
|
||||||
'click @ui.delete': function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
|
|
||||||
this.ui.buttons.prop('disabled', true).addClass('btn-disabled');
|
|
||||||
|
|
||||||
Api.Access.delete(this.model.get('_id'))
|
|
||||||
.then((/*result*/) => {
|
|
||||||
App.UI.closeModal();
|
|
||||||
Controller.showAccess();
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
alert(err.message);
|
|
||||||
this.ui.buttons.prop('disabled', false).removeClass('btn-disabled');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
@ -1,8 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const Mn = require('backbone.marionette');
|
|
||||||
const template = require('./item.ejs');
|
|
||||||
|
|
||||||
module.exports = Mn.View.extend({
|
|
||||||
template: template
|
|
||||||
});
|
|
@ -1,160 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const $ = require('jquery');
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {String} message
|
|
||||||
* @param {*} debug
|
|
||||||
* @param {Number} code
|
|
||||||
* @constructor
|
|
||||||
*/
|
|
||||||
const ApiError = function (message, debug, code) {
|
|
||||||
let temp = Error.call(this, message);
|
|
||||||
temp.name = this.name = 'ApiError';
|
|
||||||
|
|
||||||
this.stack = temp.stack;
|
|
||||||
this.message = temp.message;
|
|
||||||
this.debug = debug;
|
|
||||||
this.code = code;
|
|
||||||
};
|
|
||||||
|
|
||||||
ApiError.prototype = Object.create(Error.prototype, {
|
|
||||||
constructor: {
|
|
||||||
value: ApiError,
|
|
||||||
writable: true,
|
|
||||||
configurable: true
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param {String} verb
|
|
||||||
* @param {String} path
|
|
||||||
* @param {Object} [data]
|
|
||||||
* @param {Object} [options]
|
|
||||||
* @returns {Promise}
|
|
||||||
*/
|
|
||||||
function fetch (verb, path, data, options) {
|
|
||||||
options = options || {};
|
|
||||||
|
|
||||||
return new Promise(function (resolve, reject) {
|
|
||||||
let api_url = '/api/';
|
|
||||||
let url = api_url + path;
|
|
||||||
|
|
||||||
$.ajax({
|
|
||||||
url: url,
|
|
||||||
data: typeof data === 'object' && data !== null ? JSON.stringify(data) : data,
|
|
||||||
type: verb,
|
|
||||||
dataType: 'json',
|
|
||||||
contentType: 'application/json; charset=UTF-8',
|
|
||||||
crossDomain: true,
|
|
||||||
timeout: (options.timeout ? options.timeout : 30000),
|
|
||||||
xhrFields: {
|
|
||||||
withCredentials: true
|
|
||||||
},
|
|
||||||
|
|
||||||
success: function (data, textStatus, response) {
|
|
||||||
resolve(response);
|
|
||||||
},
|
|
||||||
|
|
||||||
error: function (xhr, status, error_thrown) {
|
|
||||||
let code = 400;
|
|
||||||
|
|
||||||
if (typeof xhr.responseJSON !== 'undefined' && typeof xhr.responseJSON.error !== 'undefined' && typeof xhr.responseJSON.error.message !== 'undefined') {
|
|
||||||
error_thrown = xhr.responseJSON.error.message;
|
|
||||||
code = xhr.responseJSON.error.code || 500;
|
|
||||||
}
|
|
||||||
|
|
||||||
reject(new ApiError(error_thrown, xhr.responseText, code));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
status: function () {
|
|
||||||
return fetch('get', '');
|
|
||||||
},
|
|
||||||
|
|
||||||
Hosts: {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @returns {Promise}
|
|
||||||
*/
|
|
||||||
getAll: function () {
|
|
||||||
return fetch('get', 'hosts');
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {Object} data
|
|
||||||
* @returns {Promise}
|
|
||||||
*/
|
|
||||||
create: function (data) {
|
|
||||||
return fetch('post', 'hosts', data);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {Object} data
|
|
||||||
* @param {String} data._id
|
|
||||||
* @returns {Promise}
|
|
||||||
*/
|
|
||||||
update: function (data) {
|
|
||||||
let _id = data._id;
|
|
||||||
delete data._id;
|
|
||||||
return fetch('put', 'hosts/' + _id, data);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {String} _id
|
|
||||||
* @returns {Promise}
|
|
||||||
*/
|
|
||||||
delete: function (_id) {
|
|
||||||
return fetch('delete', 'hosts/' + _id);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {String} _id
|
|
||||||
* @returns {Promise}
|
|
||||||
*/
|
|
||||||
reconfigure: function (_id) {
|
|
||||||
return fetch('post', 'hosts/' + _id + '/reconfigure');
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
Access: {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @returns {Promise}
|
|
||||||
*/
|
|
||||||
getAll: function () {
|
|
||||||
return fetch('get', 'access');
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {Object} data
|
|
||||||
* @returns {Promise}
|
|
||||||
*/
|
|
||||||
create: function (data) {
|
|
||||||
return fetch('post', 'access', data);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {Object} data
|
|
||||||
* @param {String} data._id
|
|
||||||
* @returns {Promise}
|
|
||||||
*/
|
|
||||||
update: function (data) {
|
|
||||||
let _id = data._id;
|
|
||||||
delete data._id;
|
|
||||||
return fetch('put', 'access/' + _id, data);
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {String} _id
|
|
||||||
* @returns {Promise}
|
|
||||||
*/
|
|
||||||
delete: function (_id) {
|
|
||||||
return fetch('delete', 'access/' + _id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
@ -1,171 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const Backbone = require('backbone');
|
|
||||||
const Cache = require('./cache');
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {String} route
|
|
||||||
* @param {Object} [options]
|
|
||||||
* @returns {Boolean}
|
|
||||||
*/
|
|
||||||
navigate: function (route, options) {
|
|
||||||
options = options || {};
|
|
||||||
Backbone.history.navigate(route.toString(), options);
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Dashboard
|
|
||||||
*/
|
|
||||||
showDashboard: function () {
|
|
||||||
let controller = this;
|
|
||||||
require(['./main', './dashboard/main'], (App, View) => {
|
|
||||||
controller.navigate('/');
|
|
||||||
App.UI.showMainLoading();
|
|
||||||
|
|
||||||
let view = new View();
|
|
||||||
|
|
||||||
view.on('loaded', function () {
|
|
||||||
App.UI.hideMainLoading();
|
|
||||||
});
|
|
||||||
|
|
||||||
App.UI.showChildView('main_region', view);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Access
|
|
||||||
*/
|
|
||||||
showAccess: function () {
|
|
||||||
let controller = this;
|
|
||||||
require(['./main', './access/main'], (App, View) => {
|
|
||||||
controller.navigate('/access');
|
|
||||||
App.UI.showMainLoading();
|
|
||||||
|
|
||||||
let view = new View();
|
|
||||||
|
|
||||||
view.on('loaded', function () {
|
|
||||||
App.UI.hideMainLoading();
|
|
||||||
});
|
|
||||||
|
|
||||||
App.UI.showChildView('main_region', view);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Show Proxy Host Form
|
|
||||||
*
|
|
||||||
* @param model
|
|
||||||
*/
|
|
||||||
showProxyHostForm: function (model) {
|
|
||||||
require(['./main', './host/proxy_form'], function (App, View) {
|
|
||||||
App.UI.showModalDialog(new View({model: model}));
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Show Redirection Host Form
|
|
||||||
*
|
|
||||||
* @param model
|
|
||||||
*/
|
|
||||||
showRedirectionHostForm: function (model) {
|
|
||||||
require(['./main', './host/redirection_form'], function (App, View) {
|
|
||||||
App.UI.showModalDialog(new View({model: model}));
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Show 404 Host Form
|
|
||||||
*
|
|
||||||
* @param model
|
|
||||||
*/
|
|
||||||
show404HostForm: function (model) {
|
|
||||||
require(['./main', './host/404_form'], function (App, View) {
|
|
||||||
App.UI.showModalDialog(new View({model: model}));
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Show Stream Host Form
|
|
||||||
*
|
|
||||||
* @param model
|
|
||||||
*/
|
|
||||||
showStreamHostForm: function (model) {
|
|
||||||
require(['./main', './host/stream_form'], function (App, View) {
|
|
||||||
App.UI.showModalDialog(new View({model: model}));
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Show Delete Host Confirmation
|
|
||||||
*
|
|
||||||
* @param model
|
|
||||||
*/
|
|
||||||
showDeleteHost: function (model) {
|
|
||||||
require(['./main', './host/delete'], function (App, View) {
|
|
||||||
App.UI.showModalDialog(new View({model: model}));
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Show Reconfigure Host
|
|
||||||
*
|
|
||||||
* @param model
|
|
||||||
*/
|
|
||||||
showReconfigureHost: function (model) {
|
|
||||||
require(['./main', './host/reconfigure'], function (App, View) {
|
|
||||||
App.UI.showModalDialog(new View({model: model}));
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Show Advanced Host
|
|
||||||
*
|
|
||||||
* @param model
|
|
||||||
*/
|
|
||||||
showAdvancedHost: function (model) {
|
|
||||||
require(['./main', './host/advanced'], function (App, View) {
|
|
||||||
App.UI.showModalDialog(new View({model: model}));
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Show Access List Form
|
|
||||||
*
|
|
||||||
* @param model
|
|
||||||
*/
|
|
||||||
showAccessListForm: function (model) {
|
|
||||||
require(['./main', './access_list/form'], function (App, View) {
|
|
||||||
App.UI.showModalDialog(new View({model: model}));
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Show Delete Access List Confirmation
|
|
||||||
*
|
|
||||||
* @param model
|
|
||||||
*/
|
|
||||||
showDeleteAccessList: function (model) {
|
|
||||||
require(['./main', './access_list/delete'], function (App, View) {
|
|
||||||
App.UI.showModalDialog(new View({model: model}));
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Error
|
|
||||||
*
|
|
||||||
* @param {Error} err
|
|
||||||
* @param {String} nice_msg
|
|
||||||
*/
|
|
||||||
showError: function (err, nice_msg) {
|
|
||||||
require(['./main', './error/main'], (App, View) => {
|
|
||||||
App.UI.showChildView('main_region', new View({
|
|
||||||
err: err,
|
|
||||||
nice_msg: nice_msg
|
|
||||||
}));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
@ -1,34 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const Mn = require('backbone.marionette');
|
|
||||||
const template = require('./empty.ejs');
|
|
||||||
const HostModel = require('../../models/host');
|
|
||||||
const Controller = require('../controller');
|
|
||||||
|
|
||||||
module.exports = Mn.View.extend({
|
|
||||||
template: template,
|
|
||||||
tagName: 'tr',
|
|
||||||
|
|
||||||
ui: {
|
|
||||||
proxy: 'button.proxy',
|
|
||||||
redirection: 'button.redirection',
|
|
||||||
'404': 'button.404'
|
|
||||||
},
|
|
||||||
|
|
||||||
events: {
|
|
||||||
'click @ui.proxy': function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
Controller.showProxyHostForm(new HostModel.Model);
|
|
||||||
},
|
|
||||||
|
|
||||||
'click @ui.redirection': function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
Controller.showRedirectionHostForm(new HostModel.Model);
|
|
||||||
},
|
|
||||||
|
|
||||||
'click @ui.404': function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
Controller.show404HostForm(new HostModel.Model);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
@ -1,80 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const Mn = require('backbone.marionette');
|
|
||||||
const Api = require('../api');
|
|
||||||
const template = require('./main.ejs');
|
|
||||||
const Controller = require('../controller');
|
|
||||||
const RowView = require('./row');
|
|
||||||
const HostModel = require('../../models/host');
|
|
||||||
const EmptyView = require('./empty');
|
|
||||||
|
|
||||||
const TableBody = Mn.CollectionView.extend({
|
|
||||||
tagName: 'tbody',
|
|
||||||
childView: RowView
|
|
||||||
});
|
|
||||||
|
|
||||||
module.exports = Mn.View.extend({
|
|
||||||
template: template,
|
|
||||||
id: 'dashboard',
|
|
||||||
|
|
||||||
regions: {
|
|
||||||
list_region: {
|
|
||||||
el: 'tbody',
|
|
||||||
replaceElement: true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
ui: {
|
|
||||||
new_proxy: 'th .new-proxy',
|
|
||||||
new_redirection: 'th .new-redirection',
|
|
||||||
new_404: 'th .new-404',
|
|
||||||
new_stream: 'th .new-stream'
|
|
||||||
},
|
|
||||||
|
|
||||||
events: {
|
|
||||||
'click @ui.new_proxy': function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
Controller.showProxyHostForm(new HostModel.Model);
|
|
||||||
},
|
|
||||||
|
|
||||||
'click @ui.new_redirection': function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
Controller.showRedirectionHostForm(new HostModel.Model);
|
|
||||||
},
|
|
||||||
|
|
||||||
'click @ui.new_404': function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
Controller.show404HostForm(new HostModel.Model);
|
|
||||||
},
|
|
||||||
|
|
||||||
'click @ui.new_stream': function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
Controller.showStreamHostForm(new HostModel.Model);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
onRender: function () {
|
|
||||||
let view = this;
|
|
||||||
|
|
||||||
Api.Hosts.getAll()
|
|
||||||
.then(response => {
|
|
||||||
if (!view.isDestroyed()) {
|
|
||||||
if (response && response.length) {
|
|
||||||
|
|
||||||
view.showChildView('list_region', new TableBody({
|
|
||||||
collection: new HostModel.Collection(response)
|
|
||||||
}));
|
|
||||||
} else {
|
|
||||||
view.showChildView('list_region', new EmptyView());
|
|
||||||
}
|
|
||||||
|
|
||||||
view.trigger('loaded');
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
Controller.showError(err, 'Could not fetch Hosts');
|
|
||||||
view.trigger('loaded');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
@ -1,63 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const Mn = require('backbone.marionette');
|
|
||||||
const template = require('./row.ejs');
|
|
||||||
const Controller = require('../controller');
|
|
||||||
const AccessListModel = require('../../models/access');
|
|
||||||
|
|
||||||
module.exports = Mn.View.extend({
|
|
||||||
template: template,
|
|
||||||
tagName: 'tr',
|
|
||||||
|
|
||||||
ui: {
|
|
||||||
edit: 'button.edit',
|
|
||||||
delete: 'button.delete',
|
|
||||||
access_list: 'a.access_list',
|
|
||||||
reconfigure: 'button.reconfigure',
|
|
||||||
advanced: 'button.advanced'
|
|
||||||
},
|
|
||||||
|
|
||||||
events: {
|
|
||||||
'click @ui.edit': function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
switch (this.model.get('type')) {
|
|
||||||
case 'proxy':
|
|
||||||
Controller.showProxyHostForm(this.model);
|
|
||||||
break;
|
|
||||||
case 'redirection':
|
|
||||||
Controller.showRedirectionHostForm(this.model);
|
|
||||||
break;
|
|
||||||
case '404':
|
|
||||||
Controller.show404HostForm(this.model);
|
|
||||||
break;
|
|
||||||
case 'stream':
|
|
||||||
Controller.showStreamHostForm(this.model);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
'click @ui.delete': function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
Controller.showDeleteHost(this.model);
|
|
||||||
},
|
|
||||||
|
|
||||||
'click @ui.access_list': function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
Controller.showAccessListForm(new AccessListModel.Model(this.model.get('access_list')));
|
|
||||||
},
|
|
||||||
|
|
||||||
'click @ui.reconfigure': function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
Controller.showReconfigureHost(this.model);
|
|
||||||
},
|
|
||||||
|
|
||||||
'click @ui.advanced': function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
Controller.showAdvancedHost(this.model);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
initialize: function () {
|
|
||||||
this.listenTo(this.model, 'change', this.render);
|
|
||||||
}
|
|
||||||
});
|
|
@ -1,32 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const Mn = require('backbone.marionette');
|
|
||||||
const template = require('./main.ejs');
|
|
||||||
|
|
||||||
module.exports = Mn.View.extend({
|
|
||||||
id: 'error',
|
|
||||||
template: template,
|
|
||||||
|
|
||||||
options: {
|
|
||||||
err: null,
|
|
||||||
nice_msg: 'Unknown error'
|
|
||||||
},
|
|
||||||
|
|
||||||
templateContext: function () {
|
|
||||||
let view = this;
|
|
||||||
return {
|
|
||||||
getNiceMessage: function () {
|
|
||||||
return view.options.nice_msg;
|
|
||||||
},
|
|
||||||
|
|
||||||
getErrorMessage: function () {
|
|
||||||
return view.options.err ? view.options.err.message : '';
|
|
||||||
}
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
initialize: function () {
|
|
||||||
console.error(this.options.err);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
@ -1,77 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const Mn = require('backbone.marionette');
|
|
||||||
const _ = require('lodash');
|
|
||||||
const template = require('./404_form.ejs');
|
|
||||||
const Controller = require('../controller');
|
|
||||||
const Api = require('../api');
|
|
||||||
const App = require('../main');
|
|
||||||
|
|
||||||
require('jquery-serializejson');
|
|
||||||
|
|
||||||
module.exports = Mn.View.extend({
|
|
||||||
template: template,
|
|
||||||
|
|
||||||
ui: {
|
|
||||||
form: 'form',
|
|
||||||
buttons: 'form button',
|
|
||||||
ssl_options: '.ssl_options',
|
|
||||||
ssl: 'input[name="ssl"]',
|
|
||||||
letsencrypt_email: 'input[name="letsencrypt_email"]',
|
|
||||||
accept_tos: 'input[name="accept_tos"]'
|
|
||||||
},
|
|
||||||
|
|
||||||
events: {
|
|
||||||
'change @ui.ssl': function (e) {
|
|
||||||
let inputs = this.ui.letsencrypt_email.add(this.ui.accept_tos);
|
|
||||||
if (this.ui.ssl.prop('checked')) {
|
|
||||||
this.ui.ssl_options.show();
|
|
||||||
inputs.prop('required', true);
|
|
||||||
} else {
|
|
||||||
this.ui.ssl_options.hide();
|
|
||||||
inputs.prop('required', false);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
'submit @ui.form': function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
let data = _.extend({}, this.ui.form.serializeJSON());
|
|
||||||
|
|
||||||
// Change text true's to bools
|
|
||||||
_.map(data, function (val, key) {
|
|
||||||
if (val === 'true') {
|
|
||||||
data[key] = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// This is a 404 host
|
|
||||||
data.type = '404';
|
|
||||||
|
|
||||||
// accept_tos is not required for backend
|
|
||||||
delete data.accept_tos;
|
|
||||||
|
|
||||||
if (!data.ssl) {
|
|
||||||
delete data.letsencrypt_email;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.ui.buttons.prop('disabled', true).addClass('btn-disabled');
|
|
||||||
let method = Api.Hosts.create;
|
|
||||||
|
|
||||||
if (this.model.get('_id')) {
|
|
||||||
// edit
|
|
||||||
method = Api.Hosts.update;
|
|
||||||
data._id = this.model.get('_id');
|
|
||||||
}
|
|
||||||
|
|
||||||
method(data)
|
|
||||||
.then((/*result*/) => {
|
|
||||||
App.UI.closeModal();
|
|
||||||
Controller.showDashboard();
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
alert(err.message);
|
|
||||||
this.ui.buttons.prop('disabled', false).removeClass('btn-disabled');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
@ -1,38 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const Mn = require('backbone.marionette');
|
|
||||||
const template = require('./advanced.ejs');
|
|
||||||
const Controller = require('../controller');
|
|
||||||
const Api = require('../api');
|
|
||||||
const App = require('../main');
|
|
||||||
|
|
||||||
require('jquery-serializejson');
|
|
||||||
|
|
||||||
module.exports = Mn.View.extend({
|
|
||||||
template: template,
|
|
||||||
|
|
||||||
ui: {
|
|
||||||
form: 'form',
|
|
||||||
buttons: 'form button'
|
|
||||||
},
|
|
||||||
|
|
||||||
events: {
|
|
||||||
'submit @ui.form': function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
let data = this.ui.form.serializeJSON();
|
|
||||||
data._id = this.model.get('_id');
|
|
||||||
|
|
||||||
this.ui.buttons.prop('disabled', true).addClass('btn-disabled');
|
|
||||||
|
|
||||||
Api.Hosts.update(data)
|
|
||||||
.then((/*result*/) => {
|
|
||||||
App.UI.closeModal();
|
|
||||||
Controller.showDashboard();
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
alert(err.message);
|
|
||||||
this.ui.buttons.prop('disabled', false).removeClass('btn-disabled');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
@ -1,34 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const Mn = require('backbone.marionette');
|
|
||||||
const template = require('./delete.ejs');
|
|
||||||
const Controller = require('../controller');
|
|
||||||
const Api = require('../api');
|
|
||||||
const App = require('../main');
|
|
||||||
|
|
||||||
module.exports = Mn.View.extend({
|
|
||||||
template: template,
|
|
||||||
|
|
||||||
ui: {
|
|
||||||
buttons: 'form button',
|
|
||||||
delete: 'button.delete'
|
|
||||||
},
|
|
||||||
|
|
||||||
events: {
|
|
||||||
'click @ui.delete': function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
|
|
||||||
this.ui.buttons.prop('disabled', true).addClass('btn-disabled');
|
|
||||||
|
|
||||||
Api.Hosts.delete(this.model.get('_id'))
|
|
||||||
.then((/*result*/) => {
|
|
||||||
App.UI.closeModal();
|
|
||||||
Controller.showDashboard();
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
alert(err.message);
|
|
||||||
this.ui.buttons.prop('disabled', false).removeClass('btn-disabled');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
@ -1,107 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const Mn = require('backbone.marionette');
|
|
||||||
const _ = require('lodash');
|
|
||||||
const template = require('./proxy_form.ejs');
|
|
||||||
const Controller = require('../controller');
|
|
||||||
const Api = require('../api');
|
|
||||||
const App = require('../main');
|
|
||||||
|
|
||||||
require('jquery-serializejson');
|
|
||||||
|
|
||||||
module.exports = Mn.View.extend({
|
|
||||||
template: template,
|
|
||||||
|
|
||||||
ui: {
|
|
||||||
form: 'form',
|
|
||||||
buttons: 'form button',
|
|
||||||
ssl_options: '.ssl_options',
|
|
||||||
ssl: 'input[name="ssl"]',
|
|
||||||
letsencrypt_email: 'input[name="letsencrypt_email"]',
|
|
||||||
accept_tos: 'input[name="accept_tos"]',
|
|
||||||
access_list_id: 'select[name="access_list_id"]'
|
|
||||||
},
|
|
||||||
|
|
||||||
events: {
|
|
||||||
'change @ui.ssl': function (e) {
|
|
||||||
let inputs = this.ui.letsencrypt_email.add(this.ui.accept_tos);
|
|
||||||
if (this.ui.ssl.prop('checked')) {
|
|
||||||
this.ui.ssl_options.show();
|
|
||||||
inputs.prop('required', true);
|
|
||||||
} else {
|
|
||||||
this.ui.ssl_options.hide();
|
|
||||||
inputs.prop('required', false);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
'submit @ui.form': function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
let data = _.extend({}, this.ui.form.serializeJSON());
|
|
||||||
|
|
||||||
// Change text true's to bools
|
|
||||||
_.map(data, function (val, key) {
|
|
||||||
if (val === 'true') {
|
|
||||||
data[key] = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
data.type = 'proxy';
|
|
||||||
|
|
||||||
// Port is integer
|
|
||||||
data.forward_port = parseInt(data.forward_port, 10);
|
|
||||||
|
|
||||||
// accept_tos is not required for backend
|
|
||||||
delete data.accept_tos;
|
|
||||||
delete data.access_list;
|
|
||||||
|
|
||||||
if (!data.ssl) {
|
|
||||||
delete data.letsencrypt_email;
|
|
||||||
delete data.force_ssl;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.ui.buttons.prop('disabled', true).addClass('btn-disabled');
|
|
||||||
let method = Api.Hosts.create;
|
|
||||||
|
|
||||||
if (this.model.get('_id')) {
|
|
||||||
// edit
|
|
||||||
method = Api.Hosts.update;
|
|
||||||
data._id = this.model.get('_id');
|
|
||||||
}
|
|
||||||
|
|
||||||
method(data)
|
|
||||||
.then((/*result*/) => {
|
|
||||||
App.UI.closeModal();
|
|
||||||
Controller.showDashboard();
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
alert(err.message);
|
|
||||||
this.ui.buttons.prop('disabled', false).removeClass('btn-disabled');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
onRender: function () {
|
|
||||||
let view = this;
|
|
||||||
|
|
||||||
Api.Access.getAll()
|
|
||||||
.then(response => {
|
|
||||||
if (!view.isDestroyed()) {
|
|
||||||
view.ui.access_list_id.empty().append($('<option>').val('').text('None (Publicly Accessible)'));
|
|
||||||
|
|
||||||
if (response && response.length) {
|
|
||||||
_.map(response, access => {
|
|
||||||
view.ui.access_list_id.append($('<option>').val(access._id).text(access.name));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.model.get('access_list_id')) {
|
|
||||||
view.ui.access_list_id.val(this.model.get('access_list_id'));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
alert("Error loading Access Lists!\n\n" + err.message);
|
|
||||||
App.UI.closeModal();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
@ -1,32 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const Mn = require('backbone.marionette');
|
|
||||||
const template = require('./reconfigure.ejs');
|
|
||||||
const Api = require('../api');
|
|
||||||
const App = require('../main');
|
|
||||||
|
|
||||||
module.exports = Mn.View.extend({
|
|
||||||
template: template,
|
|
||||||
|
|
||||||
ui: {
|
|
||||||
buttons: 'form button',
|
|
||||||
reconfigure: 'button.reconfigure'
|
|
||||||
},
|
|
||||||
|
|
||||||
events: {
|
|
||||||
'click @ui.reconfigure': function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
|
|
||||||
this.ui.buttons.prop('disabled', true).addClass('btn-disabled');
|
|
||||||
|
|
||||||
Api.Hosts.reconfigure(this.model.get('_id'))
|
|
||||||
.then((/*result*/) => {
|
|
||||||
App.UI.closeModal();
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
alert(err.message);
|
|
||||||
this.ui.buttons.prop('disabled', false).removeClass('btn-disabled');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
@ -1,77 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const Mn = require('backbone.marionette');
|
|
||||||
const _ = require('lodash');
|
|
||||||
const template = require('./redirection_form.ejs');
|
|
||||||
const Controller = require('../controller');
|
|
||||||
const Api = require('../api');
|
|
||||||
const App = require('../main');
|
|
||||||
|
|
||||||
require('jquery-serializejson');
|
|
||||||
|
|
||||||
module.exports = Mn.View.extend({
|
|
||||||
template: template,
|
|
||||||
|
|
||||||
ui: {
|
|
||||||
form: 'form',
|
|
||||||
buttons: 'form button',
|
|
||||||
ssl_options: '.ssl_options',
|
|
||||||
ssl: 'input[name="ssl"]',
|
|
||||||
letsencrypt_email: 'input[name="letsencrypt_email"]',
|
|
||||||
accept_tos: 'input[name="accept_tos"]'
|
|
||||||
},
|
|
||||||
|
|
||||||
events: {
|
|
||||||
'change @ui.ssl': function (e) {
|
|
||||||
let inputs = this.ui.letsencrypt_email.add(this.ui.accept_tos);
|
|
||||||
if (this.ui.ssl.prop('checked')) {
|
|
||||||
this.ui.ssl_options.show();
|
|
||||||
inputs.prop('required', true);
|
|
||||||
} else {
|
|
||||||
this.ui.ssl_options.hide();
|
|
||||||
inputs.prop('required', false);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
'submit @ui.form': function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
let data = _.extend({}, this.ui.form.serializeJSON());
|
|
||||||
|
|
||||||
// Change text true's to bools
|
|
||||||
_.map(data, function (val, key) {
|
|
||||||
if (val === 'true') {
|
|
||||||
data[key] = true;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
data.type = 'redirection';
|
|
||||||
|
|
||||||
// accept_tos is not required for backend
|
|
||||||
delete data.accept_tos;
|
|
||||||
|
|
||||||
if (!data.ssl) {
|
|
||||||
delete data.letsencrypt_email;
|
|
||||||
delete data.force_ssl;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.ui.buttons.prop('disabled', true).addClass('btn-disabled');
|
|
||||||
let method = Api.Hosts.create;
|
|
||||||
|
|
||||||
if (this.model.get('_id')) {
|
|
||||||
// edit
|
|
||||||
method = Api.Hosts.update;
|
|
||||||
data._id = this.model.get('_id');
|
|
||||||
}
|
|
||||||
|
|
||||||
method(data)
|
|
||||||
.then((/*result*/) => {
|
|
||||||
App.UI.closeModal();
|
|
||||||
Controller.showDashboard();
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
alert(err.message);
|
|
||||||
this.ui.buttons.prop('disabled', false).removeClass('btn-disabled');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
@ -1,62 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const Mn = require('backbone.marionette');
|
|
||||||
const _ = require('lodash');
|
|
||||||
const template = require('./stream_form.ejs');
|
|
||||||
const Controller = require('../controller');
|
|
||||||
const Api = require('../api');
|
|
||||||
const App = require('../main');
|
|
||||||
|
|
||||||
require('jquery-serializejson');
|
|
||||||
|
|
||||||
module.exports = Mn.View.extend({
|
|
||||||
template: template,
|
|
||||||
|
|
||||||
ui: {
|
|
||||||
form: 'form',
|
|
||||||
buttons: 'form button'
|
|
||||||
},
|
|
||||||
|
|
||||||
events: {
|
|
||||||
'submit @ui.form': function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
let data = _.extend({}, this.ui.form.serializeJSON());
|
|
||||||
|
|
||||||
data.type = 'stream';
|
|
||||||
|
|
||||||
// Ports are integers
|
|
||||||
data.incoming_port = parseInt(data.incoming_port, 10);
|
|
||||||
data.forward_port = parseInt(data.forward_port, 10);
|
|
||||||
|
|
||||||
if (typeof data.protocols === 'undefined' || !data.protocols.length) {
|
|
||||||
alert('You must select one or more Protocols');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.ui.buttons.prop('disabled', true).addClass('btn-disabled');
|
|
||||||
let method = Api.Hosts.create;
|
|
||||||
|
|
||||||
if (this.model.get('_id')) {
|
|
||||||
// edit
|
|
||||||
method = Api.Hosts.update;
|
|
||||||
data._id = this.model.get('_id');
|
|
||||||
}
|
|
||||||
|
|
||||||
method(data)
|
|
||||||
.then((/*result*/) => {
|
|
||||||
App.UI.closeModal();
|
|
||||||
Controller.showDashboard();
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
alert(err.message);
|
|
||||||
this.ui.buttons.prop('disabled', false).removeClass('btn-disabled');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
templateContext: {
|
|
||||||
hasStreamProtocol: function (protocol) {
|
|
||||||
return this.protocols.indexOf(protocol) !== -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
@ -1,119 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const $ = require('jquery');
|
|
||||||
const _ = require('underscore');
|
|
||||||
const Backbone = require('backbone');
|
|
||||||
const Mn = require('../lib/marionette');
|
|
||||||
const Cache = require('./cache');
|
|
||||||
const Controller = require('./controller');
|
|
||||||
const Router = require('./router');
|
|
||||||
const UI = require('./ui/main');
|
|
||||||
const Api = require('./api');
|
|
||||||
|
|
||||||
const App = Mn.Application.extend({
|
|
||||||
|
|
||||||
region: '#app',
|
|
||||||
Cache: Cache,
|
|
||||||
Api: Api,
|
|
||||||
UI: null,
|
|
||||||
Controller: Controller,
|
|
||||||
version: null,
|
|
||||||
|
|
||||||
onStart: function (app, options) {
|
|
||||||
console.log('Welcome to Nginx Proxy Manager');
|
|
||||||
|
|
||||||
let myapp = this;
|
|
||||||
|
|
||||||
Api.status()
|
|
||||||
.then(result => {
|
|
||||||
this.version = [result.version.major, result.version.minor, result.version.revision].join('.');
|
|
||||||
})
|
|
||||||
.then(Api.Bootstrap)
|
|
||||||
.then(() => {
|
|
||||||
this.bootstrapTimer();
|
|
||||||
|
|
||||||
this.UI = new UI();
|
|
||||||
this.UI.on('render', () => {
|
|
||||||
// If successful, start the history and routing
|
|
||||||
new Router(options);
|
|
||||||
Backbone.history.start({});
|
|
||||||
|
|
||||||
// Remove loading class
|
|
||||||
$('#app').removeClass('loading');
|
|
||||||
});
|
|
||||||
|
|
||||||
this.getRegion().show(this.UI);
|
|
||||||
})
|
|
||||||
.catch(function (err) {
|
|
||||||
console.info('Not logged in: ', err.message);
|
|
||||||
myapp.trigger('after:start');
|
|
||||||
myapp.UI = new UI();
|
|
||||||
myapp.UI.on('render', () => {
|
|
||||||
// Remove loading class
|
|
||||||
myapp.UI.reset();
|
|
||||||
Controller.showLogin();
|
|
||||||
});
|
|
||||||
myapp.getRegion().show(myapp.UI);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
History: {
|
|
||||||
replace: function (data) {
|
|
||||||
window.history.replaceState(_.extend(window.history.state || {}, data), document.title);
|
|
||||||
},
|
|
||||||
|
|
||||||
get: function (attr) {
|
|
||||||
return window.history.state ? window.history.state[attr] : undefined;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
Error: function (code, message, debug) {
|
|
||||||
let temp = Error.call(this, message);
|
|
||||||
temp.name = this.name = 'AppError';
|
|
||||||
this.stack = temp.stack;
|
|
||||||
this.message = temp.message;
|
|
||||||
this.code = code;
|
|
||||||
this.debug = debug;
|
|
||||||
},
|
|
||||||
|
|
||||||
showError: function () {
|
|
||||||
let ErrorView = Mn.View.extend({
|
|
||||||
tagName: 'section',
|
|
||||||
id: 'error',
|
|
||||||
template: _.template('Error loading stuff. Please reload the app.')
|
|
||||||
});
|
|
||||||
|
|
||||||
this.getRegion().show(new ErrorView());
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Bootstraps the user from time to time
|
|
||||||
*/
|
|
||||||
bootstrapTimer: function () {
|
|
||||||
setTimeout(() => {
|
|
||||||
Api.status()
|
|
||||||
.then(result => {
|
|
||||||
let version = [result.version.major, result.version.minor, result.version.revision].join('.');
|
|
||||||
if (version !== this.version) {
|
|
||||||
document.location.reload();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.then(Api.Bootstrap)
|
|
||||||
.then(() => {
|
|
||||||
this.bootstrapTimer();
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
if (err.message !== 'timeout' && err.code && err.code !== 400) {
|
|
||||||
console.log(err);
|
|
||||||
console.error(err.message);
|
|
||||||
document.location.reload();
|
|
||||||
} else {
|
|
||||||
this.bootstrapTimer();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}, 30 * 1000);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const app = new App();
|
|
||||||
module.exports = app;
|
|
@ -1,36 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const Mn = require('backbone.marionette');
|
|
||||||
const template = require('./main.ejs');
|
|
||||||
const Controller = require('../../controller');
|
|
||||||
|
|
||||||
module.exports = Mn.View.extend({
|
|
||||||
template: template,
|
|
||||||
|
|
||||||
ui: {
|
|
||||||
logo: '.navbar-brand',
|
|
||||||
links: 'a[href^="#"]'
|
|
||||||
},
|
|
||||||
|
|
||||||
events: {
|
|
||||||
'click @ui.links': function (e) {
|
|
||||||
e.preventDefault();
|
|
||||||
|
|
||||||
let href = e.target.href.replace(/[^#]*#/g, '');
|
|
||||||
|
|
||||||
switch (href) {
|
|
||||||
case 'dashboard':
|
|
||||||
Controller.showDashboard();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'access':
|
|
||||||
Controller.showAccess();
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
Controller.showDashboard();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
@ -1,100 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const Mn = require('backbone.marionette');
|
|
||||||
const template = require('./main.ejs');
|
|
||||||
const HeaderView = require('./header/main');
|
|
||||||
const Cache = require('../cache');
|
|
||||||
|
|
||||||
require('bootstrap');
|
|
||||||
|
|
||||||
module.exports = Mn.View.extend({
|
|
||||||
template: template,
|
|
||||||
|
|
||||||
modal: null,
|
|
||||||
|
|
||||||
ui: {
|
|
||||||
header_region: '#header',
|
|
||||||
main_region: '#main',
|
|
||||||
modal_region: '#modal-dialog',
|
|
||||||
main_loader_region: '#main-loader'
|
|
||||||
},
|
|
||||||
|
|
||||||
regions: {
|
|
||||||
header_region: '@ui.header_region',
|
|
||||||
main_region: '@ui.main_region',
|
|
||||||
modal_region: '@ui.modal_region',
|
|
||||||
main_loader_region: '@ui.main_loader_region'
|
|
||||||
},
|
|
||||||
|
|
||||||
showMainLoading: function () {
|
|
||||||
this.ui.main_loader_region.show();
|
|
||||||
},
|
|
||||||
|
|
||||||
hideMainLoading: function () {
|
|
||||||
this.ui.main_loader_region.hide();
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param view
|
|
||||||
* @param [show_callback]
|
|
||||||
* @param [shown_callback]
|
|
||||||
*/
|
|
||||||
showModalDialog: function (view, show_callback, shown_callback) {
|
|
||||||
this.showChildView('modal_region', view);
|
|
||||||
this.modal.modal('show');
|
|
||||||
|
|
||||||
let ui = this;
|
|
||||||
|
|
||||||
this.modal.on('hidden.bs.modal', function (/*e*/) {
|
|
||||||
if (show_callback) {
|
|
||||||
ui.modal.off('show.bs.modal', show_callback);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (shown_callback) {
|
|
||||||
ui.modal.off('shown.bs.modal', shown_callback);
|
|
||||||
}
|
|
||||||
|
|
||||||
ui.modal.off('hidden.bs.modal');
|
|
||||||
view.destroy();
|
|
||||||
});
|
|
||||||
|
|
||||||
if (show_callback) {
|
|
||||||
this.modal.on('show.bs.modal', show_callback);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (shown_callback) {
|
|
||||||
this.modal.on('shown.bs.modal', shown_callback);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param [hidden_callback]
|
|
||||||
*/
|
|
||||||
closeModal: function (hidden_callback) {
|
|
||||||
this.modal.modal('hide');
|
|
||||||
|
|
||||||
if (hidden_callback) {
|
|
||||||
this.modal.on('hidden.bs.modal', hidden_callback);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
onRender: function () {
|
|
||||||
this.showChildView('header_region', new HeaderView({
|
|
||||||
model: Cache.User
|
|
||||||
}));
|
|
||||||
|
|
||||||
if (this.modal === null) {
|
|
||||||
this.modal = $('#modal-dialog');
|
|
||||||
this.modal.modal({
|
|
||||||
show: false
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
reset: function () {
|
|
||||||
this.getRegion('header_region').reset();
|
|
||||||
this.getRegion('modal_region').reset();
|
|
||||||
}
|
|
||||||
});
|
|
@ -1,32 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const numeral = require('numeral');
|
|
||||||
const moment = require('moment');
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {Integer} number
|
|
||||||
* @returns {String}
|
|
||||||
*/
|
|
||||||
niceNumber: function (number) {
|
|
||||||
return numeral(number).format('0,0');
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {String} date
|
|
||||||
* @returns {String}
|
|
||||||
*/
|
|
||||||
shortTime: function (date) {
|
|
||||||
let shorttime = '';
|
|
||||||
|
|
||||||
if (typeof date === 'number') {
|
|
||||||
shorttime = moment.unix(date).format('H:mm A');
|
|
||||||
} else {
|
|
||||||
shorttime = moment(date).format('H:mm A');
|
|
||||||
}
|
|
||||||
|
|
||||||
return shorttime;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
@ -1,46 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const _ = require('underscore');
|
|
||||||
const Mn = require('backbone.marionette');
|
|
||||||
|
|
||||||
let render = Mn.Renderer.render;
|
|
||||||
Mn.Renderer.render = function (template, data, view) {
|
|
||||||
data = _.clone(data);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {String} string
|
|
||||||
* @returns {String}
|
|
||||||
*/
|
|
||||||
data.escape = function (string) {
|
|
||||||
let entityMap = {
|
|
||||||
'&': '&',
|
|
||||||
'<': '<',
|
|
||||||
'>': '>',
|
|
||||||
'"': '"',
|
|
||||||
'\'': ''',
|
|
||||||
'/': '/'
|
|
||||||
};
|
|
||||||
|
|
||||||
return String(string).replace(/[&<>"'\/]/g, function (s) {
|
|
||||||
return entityMap[s];
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {String} string
|
|
||||||
* @param {Integer} length
|
|
||||||
* @returns {String}
|
|
||||||
*/
|
|
||||||
data.trim = function (string, length) {
|
|
||||||
if (string.length > length) {
|
|
||||||
let trimmedString = string.substr(0, length);
|
|
||||||
return trimmedString.substr(0, Math.min(trimmedString.length, trimmedString.lastIndexOf(' '))) + '...';
|
|
||||||
}
|
|
||||||
|
|
||||||
return string;
|
|
||||||
};
|
|
||||||
|
|
||||||
return render.call(this, template, data, view);
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = Mn;
|
|
@ -1,22 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const promise = require('es6-promise');
|
|
||||||
const $ = require('jquery');
|
|
||||||
|
|
||||||
global.jQuery = $;
|
|
||||||
global.$ = $;
|
|
||||||
|
|
||||||
const App = require('./app/main');
|
|
||||||
|
|
||||||
// es6-promise nukes the Native Promise impl - restore it if this happens.
|
|
||||||
// See also https://github.com/jakearchibald/es6-promise/issues/140
|
|
||||||
const NativePromise = window.Promise;
|
|
||||||
if (NativePromise) {
|
|
||||||
window.Promise = NativePromise;
|
|
||||||
} else {
|
|
||||||
promise.polyfill();
|
|
||||||
}
|
|
||||||
|
|
||||||
$(document).ready(() => {
|
|
||||||
App.start();
|
|
||||||
});
|
|
@ -1,22 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const Backbone = require('backbone');
|
|
||||||
|
|
||||||
const model = Backbone.Model.extend({
|
|
||||||
idAttribute: 'username',
|
|
||||||
|
|
||||||
defaults: function () {
|
|
||||||
return {
|
|
||||||
username: '',
|
|
||||||
password: '',
|
|
||||||
hint: ''
|
|
||||||
};
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
Model: model,
|
|
||||||
Collection: Backbone.Collection.extend({
|
|
||||||
model: model
|
|
||||||
})
|
|
||||||
};
|
|
@ -1,35 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const Backbone = require('backbone');
|
|
||||||
|
|
||||||
const model = Backbone.Model.extend({
|
|
||||||
idAttribute: '_id',
|
|
||||||
|
|
||||||
defaults: function () {
|
|
||||||
return {
|
|
||||||
type: 'proxy',
|
|
||||||
hostname: '',
|
|
||||||
forward_server: '',
|
|
||||||
forward_host: '',
|
|
||||||
forward_port: 80,
|
|
||||||
asset_caching: false,
|
|
||||||
block_exploits: true,
|
|
||||||
ssl: false,
|
|
||||||
ssl_expires: 0,
|
|
||||||
force_ssl: false,
|
|
||||||
letsencrypt_email: '',
|
|
||||||
accept_tos: false,
|
|
||||||
access_list_id: '',
|
|
||||||
advanced: '',
|
|
||||||
incoming_port: 0,
|
|
||||||
protocols: []
|
|
||||||
};
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
Model: model,
|
|
||||||
Collection: Backbone.Collection.extend({
|
|
||||||
model: model
|
|
||||||
})
|
|
||||||
};
|
|
@ -1,95 +0,0 @@
|
|||||||
const path = require('path');
|
|
||||||
const webpack = require('webpack');
|
|
||||||
const Visualizer = require('webpack-visualizer-plugin');
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
entry: {
|
|
||||||
main: './src/frontend/js/main.js',
|
|
||||||
},
|
|
||||||
output: {
|
|
||||||
path: path.resolve(__dirname, 'dist'),
|
|
||||||
filename: '[name].js',
|
|
||||||
publicPath: '/'
|
|
||||||
},
|
|
||||||
|
|
||||||
module: {
|
|
||||||
rules: [
|
|
||||||
{
|
|
||||||
test: /\.js$/,
|
|
||||||
exclude: /node_modules/,
|
|
||||||
use: {
|
|
||||||
loader: 'babel-loader'
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
test: /\.ejs$/,
|
|
||||||
loader: 'ejs-loader'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
/*
|
|
||||||
context: __dirname + '/src/frontend/js',
|
|
||||||
entry: './main.js',
|
|
||||||
output: {
|
|
||||||
filename: 'main.js',
|
|
||||||
path: __dirname + '/dist/js',
|
|
||||||
publicPath: '/js/',
|
|
||||||
sourceMapFilename: 'dnBOUAwY76qx3MmZxtHn.map'
|
|
||||||
},
|
|
||||||
module: {
|
|
||||||
loaders: [
|
|
||||||
{
|
|
||||||
test: /\.js$/,
|
|
||||||
exclude: /(node_modules|bower_components)/,
|
|
||||||
loader: 'babel-loader'//,
|
|
||||||
query: {
|
|
||||||
presets: ['@babel/es2015']
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
test: /\.ejs$/,
|
|
||||||
loader: 'ejs-loader'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
*/
|
|
||||||
plugins: [
|
|
||||||
new webpack.ProvidePlugin({
|
|
||||||
$: 'jquery',
|
|
||||||
jQuery: 'jquery',
|
|
||||||
_: 'underscore'
|
|
||||||
}),
|
|
||||||
new Visualizer({
|
|
||||||
filename: '../webpack_stats.html'
|
|
||||||
}),
|
|
||||||
new webpack.optimize.LimitChunkCountPlugin({
|
|
||||||
maxChunks: 1, // Must be greater than or equal to one
|
|
||||||
minChunkSize: 999999999
|
|
||||||
})
|
|
||||||
]
|
|
||||||
/*
|
|
||||||
plugins: [
|
|
||||||
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
|
|
||||||
new webpack.optimize.LimitChunkCountPlugin({
|
|
||||||
maxChunks: 1
|
|
||||||
}),
|
|
||||||
new webpack.ProvidePlugin({
|
|
||||||
$: 'jquery',
|
|
||||||
jQuery: 'jquery',
|
|
||||||
_: 'underscore'
|
|
||||||
}),
|
|
||||||
new Visualizer({
|
|
||||||
filename: '../../webpack_stats.html'
|
|
||||||
}),
|
|
||||||
new webpack.optimize.UglifyJsPlugin({
|
|
||||||
compress: {
|
|
||||||
unsafe: true,
|
|
||||||
drop_console: false,
|
|
||||||
drop_debugger: true,
|
|
||||||
screw_ie8: true,
|
|
||||||
warnings: false
|
|
||||||
}
|
|
||||||
})
|
|
||||||
]
|
|
||||||
*/
|
|
||||||
};
|
|
Loading…
Reference in New Issue
Block a user