Start on Mobile view and add Web Build option

This commit is contained in:
Preston 2020-03-24 09:22:29 -04:00
parent cfbcee32a7
commit 2533161667
41 changed files with 910 additions and 249 deletions

View File

@ -20,11 +20,11 @@ const config = {
copyright: 'Copyleft ©2020 freetubeapp@protonmail.com',
// asar: false,
// compression: 'store',
// productName,
productName,
directories: {
output: './build/',
},
files: ['_icons/icon.*', './dist/**/*'],
files: ['_icons/icon.*', './dist/**/*', '!./dist/web/**/*'],
dmg: {
contents: [
{

View File

@ -15,7 +15,7 @@ const whiteListedModules = []
const config = {
name: 'main',
mode: process.env.NODE_ENV,
devtool: isDevMode ? 'eval' : false,
devtool: isDevMode ? '#cheap-module-eval-source-map' : false,
entry: {
main: path.join(__dirname, '../src/main/index.js'),
},
@ -57,7 +57,13 @@ const config = {
target: 'electron-main',
}
if (!isDevMode) {
if (isDevMode) {
config.plugins.push(
new webpack.DefinePlugin({
__static: `"${path.join(__dirname, '../static').replace(/\\/g, '\\\\')}"`,
})
)
} else {
config.plugins.push(
new CopyWebpackPlugin([
{
@ -67,8 +73,12 @@ if (!isDevMode) {
{
from: path.join(__dirname, '../static'),
to: path.join(__dirname, '../dist/static'),
ignore: ['.*'],
},
])
]),
new webpack.LoaderOptionsPlugin({
minimize: true,
})
)
}

View File

@ -18,7 +18,7 @@ const whiteListedModules = ['vue']
const config = {
name: 'renderer',
mode: process.env.NODE_ENV,
devtool: isDevMode ? 'eval' : false,
devtool: isDevMode ? '#cheap-module-eval-source-map' : false,
entry: {
renderer: path.join(__dirname, '../src/renderer/main.js'),
},
@ -42,21 +42,10 @@ const config = {
{
test: /\.vue$/,
loader: 'vue-loader',
// use: {
// loader: 'vue-loader',
// options: {
// loaders: {
// sass: 'vue-style-loader!css-loader!sass-loader?indentedSyntax',
// },
// },
// },
},
{
test: /\.s(c|a)ss$/,
use: [
// {
// loader: 'vue-style-loader',
// },
{
loader: MiniCssExtractPlugin.loader,
options: {
@ -84,7 +73,6 @@ const config = {
hmr: isDevMode,
},
},
// 'style-loader',
'css-loader',
],
},
@ -92,7 +80,8 @@ const config = {
test: /\.(png|jpe?g|gif|tif?f|bmp|webp|svg)(\?.*)?$/,
use: {
loader: 'url-loader',
query: {
options: {
esModule: false,
limit: 10000,
name: 'imgs/[name]--[folder].[ext]',
},
@ -102,7 +91,8 @@ const config = {
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
use: {
loader: 'url-loader',
query: {
options: {
esModule: false,
limit: 10000,
name: 'fonts/[name]--[folder].[ext]',
},
@ -150,15 +140,24 @@ const config = {
*/
if (isDevMode) {
// any dev only config
config.plugins.push(new webpack.HotModuleReplacementPlugin())
config.plugins.push(
new webpack.HotModuleReplacementPlugin(),
new webpack.DefinePlugin({
__static: `"${path.join(__dirname, '../static').replace(/\\/g, '\\\\')}"`,
})
)
} else {
config.plugins.push(
new CopyWebpackPlugin([
{
from: path.join(__dirname, '../static'),
to: path.join(__dirname, '../dist/static'),
ignore: ['.*'],
},
])
]),
new webpack.LoaderOptionsPlugin({
minimize: true,
})
)
}

View File

@ -0,0 +1,165 @@
const path = require('path')
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const VueLoaderPlugin = require('vue-loader/lib/plugin')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const { productName } = require('../package.json')
const isDevMode = process.env.NODE_ENV === 'development'
const config = {
name: 'web',
mode: process.env.NODE_ENV,
devtool: isDevMode ? '#cheap-module-eval-source-map' : false,
entry: {
web: path.join(__dirname, '../src/renderer/main.js'),
},
output: {
path: path.join(__dirname, '../dist/web'),
filename: '[name].js',
},
module: {
rules: [
{
test: /\.(j|t)s$/,
use: 'babel-loader',
exclude: /node_modules/,
},
{
test: /\.vue$/,
use: {
loader: 'vue-loader',
options: {
extractCSS: true,
loaders: {
sass: 'vue-style-loader!css-loader!sass-loader?indentedSyntax=1',
scss: 'vue-style-loader!css-loader!sass-loader',
less: 'vue-style-loader!css-loader!less-loader',
},
},
},
},
{
test: /\.s(c|a)ss$/,
use: [
{
loader: MiniCssExtractPlugin.loader,
options: {
hmr: isDevMode,
},
},
{
loader: 'css-loader',
},
],
},
{
test: /\.css$/,
use: [
{
loader: MiniCssExtractPlugin.loader,
options: {
hmr: isDevMode,
},
},
'css-loader',
],
},
{
test: /\.html$/,
use: 'vue-html-loader',
},
{
test: /\.(png|jpe?g|gif|tif?f|bmp|webp|svg)(\?.*)?$/,
use: {
loader: 'url-loader',
options: {
esModule: false,
limit: 10000,
name: 'imgs/[name]--[folder].[ext]',
},
},
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
use: {
loader: 'url-loader',
options: {
esModule: false,
limit: 10000,
name: 'fonts/[name]--[folder].[ext]',
},
},
},
],
},
node: {
__dirname: isDevMode,
__filename: isDevMode,
fs: 'empty',
net: 'empty',
tls: 'empty',
},
plugins: [
// new WriteFilePlugin(),
new HtmlWebpackPlugin({
excludeChunks: ['processTaskWorker'],
filename: 'index.html',
template: path.resolve(__dirname, '../src/index.ejs'),
nodeModules: false,
}),
new VueLoaderPlugin(),
new webpack.DefinePlugin({
'process.env.PRODUCT_NAME': JSON.stringify(productName),
}),
new MiniCssExtractPlugin({
filename: '[name].css',
chunkFilename: '[id].css',
}),
],
resolve: {
alias: {
'@': path.join(__dirname, '../src/renderer'),
vue$: 'vue/dist/vue.esm.js',
src: path.join(__dirname, '../src/'),
icons: path.join(__dirname, '../_icons/'),
},
extensions: ['.js', '.vue', '.json', '.css'],
},
target: 'web',
}
/**
* Adjust web for production settings
*/
if (isDevMode) {
// any dev only config
config.plugins.push(
new webpack.HotModuleReplacementPlugin(),
new webpack.DefinePlugin({
__static: `"${path.join(__dirname, '../static').replace(/\\/g, '\\\\')}"`,
})
)
} else {
config.plugins.push(
new CopyWebpackPlugin([
{
from: path.join(__dirname, '../static'),
to: path.join(__dirname, '../dist/web/static'),
ignore: ['.*'],
},
{
from: path.join(__dirname, '../__icons'),
to: path.join(__dirname, '../dist/web/icons'),
ignore: ['.*'],
},
]),
new webpack.LoaderOptionsPlugin({
minimize: true,
})
)
}
module.exports = config

View File

@ -13,7 +13,7 @@ const isDevMode = process.env.NODE_ENV === 'development'
const config = {
name: 'workers',
mode: process.env.NODE_ENV,
devtool: isDevMode ? 'eval' : false,
devtool: isDevMode ? '#cheap-module-eval-source-map' : false,
entry: {
workerSample: path.join(__dirname, '../src/utilities/workerSample.ts'),
},
@ -62,6 +62,12 @@ const config = {
if (isDevMode) {
// any dev only config
config.plugins.push(new webpack.HotModuleReplacementPlugin())
} else {
config.plugins.push(
new webpack.LoaderOptionsPlugin({
minimize: true,
})
)
}
module.exports = config

366
package-lock.json generated
View File

@ -2511,9 +2511,9 @@
}
},
"@electron/get": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/@electron/get/-/get-1.8.0.tgz",
"integrity": "sha512-p9q2KNfN12lhLzcSJwjOKbHHZcPCP+DMHXWLE/nFzJfyFDiPFAvOgLdKwz8WvGfzn2Y8YtYk1BhqvaNRow78ag==",
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/@electron/get/-/get-1.9.0.tgz",
"integrity": "sha512-OBIKtF6ttIJotDXe4KJMUyTBO4xMii+mFjlA8R4CORuD4HvCUaCK3lPjhdTRCvuEv6gzWNbAvd9DNBv0v780lw==",
"dev": true,
"requires": {
"debug": "^4.1.1",
@ -2522,6 +2522,7 @@
"global-agent": "^2.0.2",
"global-tunnel-ng": "^2.7.1",
"got": "^9.6.0",
"progress": "^2.0.3",
"sanitize-filename": "^1.6.2",
"sumchecker": "^3.0.1"
},
@ -3459,12 +3460,12 @@
"dev": true
},
"@typescript-eslint/eslint-plugin": {
"version": "2.22.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.22.0.tgz",
"integrity": "sha512-BvxRLaTDVQ3N+Qq8BivLiE9akQLAOUfxNHIEhedOcg8B2+jY8Rc4/D+iVprvuMX1AdezFYautuGDwr9QxqSxBQ==",
"version": "2.24.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.24.0.tgz",
"integrity": "sha512-wJRBeaMeT7RLQ27UQkDFOu25MqFOBus8PtOa9KaT5ZuxC1kAsd7JEHqWt4YXuY9eancX0GK9C68i5OROnlIzBA==",
"dev": true,
"requires": {
"@typescript-eslint/experimental-utils": "2.22.0",
"@typescript-eslint/experimental-utils": "2.24.0",
"eslint-utils": "^1.4.3",
"functional-red-black-tree": "^1.0.1",
"regexpp": "^3.0.0",
@ -3480,32 +3481,32 @@
}
},
"@typescript-eslint/experimental-utils": {
"version": "2.22.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.22.0.tgz",
"integrity": "sha512-sJt1GYBe6yC0dWOQzXlp+tiuGglNhJC9eXZeC8GBVH98Zv9jtatccuhz0OF5kC/DwChqsNfghHx7OlIDQjNYAQ==",
"version": "2.24.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.24.0.tgz",
"integrity": "sha512-DXrwuXTdVh3ycNCMYmWhUzn/gfqu9N0VzNnahjiDJvcyhfBy4gb59ncVZVxdp5XzBC77dCncu0daQgOkbvPwBw==",
"dev": true,
"requires": {
"@types/json-schema": "^7.0.3",
"@typescript-eslint/typescript-estree": "2.22.0",
"@typescript-eslint/typescript-estree": "2.24.0",
"eslint-scope": "^5.0.0"
}
},
"@typescript-eslint/parser": {
"version": "2.22.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.22.0.tgz",
"integrity": "sha512-FaZKC1X+nvD7qMPqKFUYHz3H0TAioSVFGvG29f796Nc5tBluoqfHgLbSFKsh7mKjRoeTm8J9WX2Wo9EyZWjG7w==",
"version": "2.24.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.24.0.tgz",
"integrity": "sha512-H2Y7uacwSSg8IbVxdYExSI3T7uM1DzmOn2COGtCahCC3g8YtM1xYAPi2MAHyfPs61VKxP/J/UiSctcRgw4G8aw==",
"dev": true,
"requires": {
"@types/eslint-visitor-keys": "^1.0.0",
"@typescript-eslint/experimental-utils": "2.22.0",
"@typescript-eslint/typescript-estree": "2.22.0",
"@typescript-eslint/experimental-utils": "2.24.0",
"@typescript-eslint/typescript-estree": "2.24.0",
"eslint-visitor-keys": "^1.1.0"
}
},
"@typescript-eslint/typescript-estree": {
"version": "2.22.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.22.0.tgz",
"integrity": "sha512-2HFZW2FQc4MhIBB8WhDm9lVFaBDy6h9jGrJ4V2Uzxe/ON29HCHBTj3GkgcsgMWfsl2U5as+pTOr30Nibaw7qRQ==",
"version": "2.24.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.24.0.tgz",
"integrity": "sha512-RJ0yMe5owMSix55qX7Mi9V6z2FDuuDpN6eR5fzRJrp+8in9UF41IGNQHbg5aMK4/PjVaEQksLvz0IA8n+Mr/FA==",
"dev": true,
"requires": {
"debug": "^4.1.1",
@ -3600,11 +3601,27 @@
"vue-template-es2015-compiler": "^1.9.0"
},
"dependencies": {
"lru-cache": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
"integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
"dev": true,
"requires": {
"pseudomap": "^1.0.2",
"yallist": "^2.1.2"
}
},
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
},
"yallist": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
"dev": true
}
}
},
@ -3979,27 +3996,27 @@
}
},
"app-builder-bin": {
"version": "3.5.4",
"resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.5.4.tgz",
"integrity": "sha512-Bta3I+OU64ePwvSdhpYyCj11XcR8VGdlPSINM87LPg0apCbprLu03zvnmnHRw/RvZB2RGAQ93Z8NO3JT3DbXdA==",
"version": "3.5.5",
"resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.5.5.tgz",
"integrity": "sha512-ZcHzJ9Xl+azPqdKzXZKdRZmkNmbxHHZyl4cbobNf8qMQpoPChpcov8riVrZSbu/0cT/JqJ8LOwJjy1OAwbChaQ==",
"dev": true
},
"app-builder-lib": {
"version": "22.3.6",
"resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-22.3.6.tgz",
"integrity": "sha512-9TANMAFL7cFNuRB3cMc1BS5dBQzqY5RVEUD4VMZ0MYhFY/DM9+v2BvfY3Ef+7XSOzirA6p4TljAVz5ydIEdZFw==",
"version": "22.4.1",
"resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-22.4.1.tgz",
"integrity": "sha512-epwUzIM+2pcdy/If9koTP74CKx4v7xGPj75a2Z5cM4rrGN9yVZ3eDUBbfF0e0qE4Qmcv5pd0BAZJ26bGm8NWsQ==",
"dev": true,
"requires": {
"7zip-bin": "~5.0.3",
"@develar/schema-utils": "~2.1.0",
"async-exit-hook": "^2.0.1",
"bluebird-lst": "^1.0.9",
"builder-util": "22.3.6",
"builder-util-runtime": "8.6.1",
"builder-util": "22.4.1",
"builder-util-runtime": "8.6.2",
"chromium-pickle-js": "^0.2.0",
"debug": "^4.1.1",
"ejs": "^3.0.1",
"electron-publish": "22.3.6",
"electron-publish": "22.4.1",
"fs-extra": "^8.1.0",
"hosted-git-info": "^3.0.4",
"is-ci": "^2.0.0",
@ -5155,17 +5172,17 @@
"dev": true
},
"builder-util": {
"version": "22.3.6",
"resolved": "https://registry.npmjs.org/builder-util/-/builder-util-22.3.6.tgz",
"integrity": "sha512-1fMRRouGzggUcPcy/ZR2NV8KZejwXPYNRD4vr/Ws/KvGQFNMTHA9VFscT7tGfOseQCLaLsa5C2gU5MOAiFx7AA==",
"version": "22.4.1",
"resolved": "https://registry.npmjs.org/builder-util/-/builder-util-22.4.1.tgz",
"integrity": "sha512-+ysLc7cC4w6P7rBxmZ5X2aU3QvcwFoWCl1us+mcUKdsGmJAtFUMPJqueeptdxjyPrPShIUOKHzA8uk5A3d1fHg==",
"dev": true,
"requires": {
"7zip-bin": "~5.0.3",
"@types/debug": "^4.1.5",
"@types/fs-extra": "^8.1.0",
"app-builder-bin": "3.5.4",
"app-builder-bin": "3.5.5",
"bluebird-lst": "^1.0.9",
"builder-util-runtime": "8.6.1",
"builder-util-runtime": "8.6.2",
"chalk": "^3.0.0",
"debug": "^4.1.1",
"fs-extra": "^8.1.0",
@ -5244,9 +5261,9 @@
}
},
"builder-util-runtime": {
"version": "8.6.1",
"resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.6.1.tgz",
"integrity": "sha512-gwIUtMaICmc+e2EC3u3byXcwCyfhtG40LJRNnGfs8AYqacKl4ZLP50ab+uDttn7QAXe0LfMAuKz9v8bCODV0yg==",
"version": "8.6.2",
"resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.6.2.tgz",
"integrity": "sha512-9QnIBISfhgQ2BxtRLidVqf/v5HD73vSKZDllpUmGd2L6VORGQk7cZAPmPtw4HQM3gPBelyVJ5yIjMNZ8xjmd1A==",
"dev": true,
"requires": {
"debug": "^4.1.1",
@ -6816,14 +6833,14 @@
}
},
"dmg-builder": {
"version": "22.3.6",
"resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-22.3.6.tgz",
"integrity": "sha512-pUrvvzkSZfaCIXofqNH+YJ0ajgi4DDe/ZjMiL/T1yKrRXK3v7sfmnbSzHY8V/WtimSgzsK1izFg/SBsfwFsZWw==",
"version": "22.4.1",
"resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-22.4.1.tgz",
"integrity": "sha512-hEemh7n0zoVt7zPPwvn7iOttP03oENjJ4ApttPmt8oDnX8T4q42MjGWyDlLkPMplMJfoTxkkNqmm296f0OYM8Q==",
"dev": true,
"requires": {
"app-builder-lib": "~22.3.6",
"app-builder-lib": "~22.4.1",
"bluebird-lst": "^1.0.9",
"builder-util": "~22.3.6",
"builder-util": "~22.4.1",
"fs-extra": "^8.1.0",
"iconv-lite": "^0.5.1",
"js-yaml": "^3.13.1",
@ -7029,9 +7046,9 @@
"dev": true
},
"electron": {
"version": "8.0.3",
"resolved": "https://registry.npmjs.org/electron/-/electron-8.0.3.tgz",
"integrity": "sha512-lr/tTr9cBzocREmL8r/P3WKnGqpKeaMFZjNVXDGd3npxwnJVUd7SHQW7LZIhZ1W2XoU3uBwTYbyH43iCIElsqw==",
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/electron/-/electron-8.1.1.tgz",
"integrity": "sha512-t+5zzFo7VOgckJc9YpImHJkpqeWxwpmEjywWbAa4IT5MULS7h1XU52H9gMswK/y8xc5lBNwxLhJSty/15+gi1A==",
"dev": true,
"requires": {
"@electron/get": "^1.0.1",
@ -7040,18 +7057,18 @@
}
},
"electron-builder": {
"version": "22.3.6",
"resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-22.3.6.tgz",
"integrity": "sha512-W1fMEtAT7WOqetwTR2uCesMIqmnr8DHR9ZKYlHMxGxQt0jGaBX/gQHPf6+R8d2SQq2Bup6e1eE0xoeX3ixCfTw==",
"version": "22.4.1",
"resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-22.4.1.tgz",
"integrity": "sha512-13CjZcGeJS+c3EKRwFT/Oty5Niif5g1FwDioBLEbjkPCPQgxdtDsr+rJtCu9qxkiKDYpAoPS+t/clNk0efONvQ==",
"dev": true,
"requires": {
"@types/yargs": "^15.0.4",
"app-builder-lib": "22.3.6",
"app-builder-lib": "22.4.1",
"bluebird-lst": "^1.0.9",
"builder-util": "22.3.6",
"builder-util-runtime": "8.6.1",
"builder-util": "22.4.1",
"builder-util-runtime": "8.6.2",
"chalk": "^3.0.0",
"dmg-builder": "22.3.6",
"dmg-builder": "22.4.1",
"fs-extra": "^8.1.0",
"is-ci": "^2.0.0",
"lazy-val": "^1.0.4",
@ -7167,15 +7184,15 @@
}
},
"electron-publish": {
"version": "22.3.6",
"resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-22.3.6.tgz",
"integrity": "sha512-u4PW4ec4rPcdFUVMvL5OrqoYX8WLJHab8DtPkh/oZ2HPzGGX3eWnUvulIIJ4SUnesSYkbUcZd1RDYtfV52Q72w==",
"version": "22.4.1",
"resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-22.4.1.tgz",
"integrity": "sha512-nwKNum3KXm+01rtWX2pc1jhazdzDy2zYnQx+zmXphZchjd6UOMX3ZN0xyZUCKugw5ZliflT6LkgbrcBXBtYD3A==",
"dev": true,
"requires": {
"@types/fs-extra": "^8.1.0",
"bluebird-lst": "^1.0.9",
"builder-util": "~22.3.6",
"builder-util-runtime": "8.6.1",
"builder-util": "~22.4.1",
"builder-util-runtime": "8.6.2",
"chalk": "^3.0.0",
"fs-extra": "^8.1.0",
"lazy-val": "^1.0.4",
@ -7235,9 +7252,9 @@
}
},
"electron-rebuild": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/electron-rebuild/-/electron-rebuild-1.10.0.tgz",
"integrity": "sha512-n10i30GJg7JH8yZL3ZY3x80YtKmSYuuN8cl+3Feljm+sQDU4rUW1jbnYGu0eUHlK3kPOiNWPtW7srGcwZ9p1zQ==",
"version": "1.10.1",
"resolved": "https://registry.npmjs.org/electron-rebuild/-/electron-rebuild-1.10.1.tgz",
"integrity": "sha512-KSqp0Xiu7CCvKL2aEdPp/vNe2Rr11vaO8eM/wq9gQJTY02UjtAJ3l7WLV7Mf8oR+UJReJO8SWOWs/FozqK8ggA==",
"dev": true,
"requires": {
"colors": "^1.3.3",
@ -7315,9 +7332,9 @@
}
},
"yargs": {
"version": "14.2.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.2.tgz",
"integrity": "sha512-/4ld+4VV5RnrynMhPZJ/ZpOCGSCeghMykZ3BhdFBDa9Wy/RH6uEGNWDJog+aUlq+9OM1CFTgtYRW5Is1Po9NOA==",
"version": "14.2.3",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz",
"integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==",
"dev": true,
"requires": {
"cliui": "^5.0.0",
@ -7330,13 +7347,13 @@
"string-width": "^3.0.0",
"which-module": "^2.0.0",
"y18n": "^4.0.0",
"yargs-parser": "^15.0.0"
"yargs-parser": "^15.0.1"
}
},
"yargs-parser": {
"version": "15.0.0",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.0.tgz",
"integrity": "sha512-xLTUnCMc4JhxrPEPUYD5IBR1mWCK/aT6+RJ/K29JY2y1vD+FhtgKK0AXRWvI262q3QSffAQuTouFIKUuHX89wQ==",
"version": "15.0.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz",
"integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==",
"dev": true,
"requires": {
"camelcase": "^5.0.0",
@ -7857,9 +7874,9 @@
"dev": true
},
"eslint-plugin-vue": {
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-6.2.1.tgz",
"integrity": "sha512-MiIDOotoWseIfLIfGeDzF6sDvHkVvGd2JgkvjyHtN3q4RoxdAXrAMuI3SXTOKatljgacKwpNAYShmcKZa4yZzw==",
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-6.2.2.tgz",
"integrity": "sha512-Nhc+oVAHm0uz/PkJAWscwIT4ijTrK5fqNqz9QB1D35SbbuMG1uB6Yr5AJpvPSWg+WOw7nYNswerYh0kOk64gqQ==",
"dev": true,
"requires": {
"natural-compare": "^1.4.0",
@ -8469,13 +8486,13 @@
}
},
"file-loader": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/file-loader/-/file-loader-5.1.0.tgz",
"integrity": "sha512-u/VkLGskw3Ue59nyOwUwXI/6nuBCo7KBkniB/l7ICwr/7cPNGsL1WCXUp3GB0qgOOKU1TiP49bv4DZF/LJqprg==",
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.0.0.tgz",
"integrity": "sha512-/aMOAYEFXDdjG0wytpTL5YQLfZnnTmLNjn+AIrJ/6HVnTfDqLsVKUUwkDf4I4kgex36BvjuXEn/TX9B/1ESyqQ==",
"dev": true,
"requires": {
"loader-utils": "^1.4.0",
"schema-utils": "^2.5.0"
"loader-utils": "^2.0.0",
"schema-utils": "^2.6.5"
},
"dependencies": {
"ajv": {
@ -8515,38 +8532,38 @@
"dev": true
},
"json5": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz",
"integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==",
"dev": true,
"requires": {
"minimist": "^1.2.0"
"minimist": "^1.2.5"
}
},
"loader-utils": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
"integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
"dev": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^1.0.1"
"json5": "^2.1.2"
}
},
"minimist": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true
},
"schema-utils": {
"version": "2.6.4",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz",
"integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==",
"version": "2.6.5",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz",
"integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==",
"dev": true,
"requires": {
"ajv": "^6.10.2",
"ajv": "^6.12.0",
"ajv-keywords": "^3.4.1"
}
}
@ -8959,7 +8976,8 @@
"console-control-strings": {
"version": "1.1.0",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"core-util-is": {
"version": "1.0.2",
@ -9076,7 +9094,8 @@
"inherits": {
"version": "2.0.3",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"ini": {
"version": "1.3.5",
@ -9118,6 +9137,7 @@
"version": "2.3.5",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"safe-buffer": "^5.1.2",
"yallist": "^3.0.0"
@ -9136,6 +9156,7 @@
"version": "0.5.1",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"minimist": "0.0.8"
}
@ -9229,6 +9250,7 @@
"version": "1.4.0",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"wrappy": "1"
}
@ -9314,7 +9336,8 @@
"safe-buffer": {
"version": "5.1.2",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"safer-buffer": {
"version": "2.1.2",
@ -9350,6 +9373,7 @@
"version": "1.0.2",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
@ -9413,12 +9437,14 @@
"wrappy": {
"version": "1.0.2",
"bundled": true,
"dev": true
"dev": true,
"optional": true
},
"yallist": {
"version": "3.0.3",
"bundled": true,
"dev": true
"dev": true,
"optional": true
}
}
},
@ -9870,17 +9896,6 @@
"dev": true,
"requires": {
"lru-cache": "^5.1.1"
},
"dependencies": {
"lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
"dev": true,
"requires": {
"yallist": "^3.0.2"
}
}
}
},
"hpack.js": {
@ -10728,9 +10743,9 @@
"dev": true
},
"isbinaryfile": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.4.tgz",
"integrity": "sha512-pEutbN134CzcjlLS1myKX/uxNjwU5eBVSprvkpv3+3dqhBHUZLIWJQowC40w5c0Zf19vBY8mrZl88y5J4RAPbQ==",
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.5.tgz",
"integrity": "sha512-Jvz0gpTh1AILHMCBUyqq7xv1ZOQrxTDwyp1/QUq1xFpOBvp4AH5uEobPePJht8KnBGqQIH7We6OR73mXsjG0cA==",
"dev": true
},
"isemail": {
@ -12965,21 +12980,12 @@
"dev": true
},
"lru-cache": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
"integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
"dev": true,
"requires": {
"pseudomap": "^1.0.2",
"yallist": "^2.1.2"
},
"dependencies": {
"yallist": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
"dev": true
}
"yallist": "^3.0.2"
}
},
"m3u8-parser": {
@ -13097,9 +13103,9 @@
"dev": true
},
"mediaelement": {
"version": "4.2.14",
"resolved": "https://registry.npmjs.org/mediaelement/-/mediaelement-4.2.14.tgz",
"integrity": "sha512-mUs01DCJzE1A3mYBUqswqINkqaxy2G/pbWveE04OLM5AqvJAL0v5K3vIGBdBfo5MbfQuaZknVFMfi+bpxyiz3w==",
"version": "4.2.16",
"resolved": "https://registry.npmjs.org/mediaelement/-/mediaelement-4.2.16.tgz",
"integrity": "sha512-5GinxsRpVA36w6tAD6nTqVSiZ0LzIhqUrzD8wzOAtZPPM7NOwOBtz6Oa85VemS+3Jvoo38jM1RvNqwKYJBBxtQ==",
"requires": {
"global": "^4.3.1"
}
@ -13583,9 +13589,9 @@
}
},
"node-abi": {
"version": "2.14.0",
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.14.0.tgz",
"integrity": "sha512-y54KGgEOHnRHlGQi7E5UiryRkH8bmksmQLj/9iLAjoje743YS+KaKB/sDYXgqtT0J16JT3c3AYJZNI98aU/kYg==",
"version": "2.15.0",
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.15.0.tgz",
"integrity": "sha512-FeLpTS0F39U7hHZU1srAK4Vx+5AHNVOTP+hxBNQknR/54laTHSFIJkDWDqiquY1LeLUgTfPN7sLPhMubx0PLAg==",
"dev": true,
"requires": {
"semver": "^5.4.1"
@ -13770,9 +13776,9 @@
}
},
"nopt": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
"integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
"integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
"dev": true,
"requires": {
"abbrev": "1",
@ -15149,9 +15155,9 @@
},
"dependencies": {
"minimist": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true
}
}
@ -15965,9 +15971,9 @@
}
},
"sass": {
"version": "1.26.2",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.26.2.tgz",
"integrity": "sha512-9TRp1d1NH0mWH8rqaR/jCS05f/TFD1ykPF2zSYviprMhLb0EmXVqtKMUHsvDt3YIT/jbSK6qAvUlfCW/HJkdCw==",
"version": "1.26.3",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.26.3.tgz",
"integrity": "sha512-5NMHI1+YFYw4sN3yfKjpLuV9B5l7MqQ6FlkTcC4FT+oHbBRUZoSjHrrt/mE0nFXJyY2kQtU9ou9HxvFVjLFuuw==",
"dev": true,
"requires": {
"chokidar": ">=2.0.0 <4.0.0"
@ -17848,23 +17854,23 @@
}
},
"url-loader": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/url-loader/-/url-loader-3.0.0.tgz",
"integrity": "sha512-a84JJbIA5xTFTWyjjcPdnsu+41o/SNE8SpXMdUvXs6Q+LuhCD9E2+0VCiuDWqgo3GGXVlFHzArDmBpj9PgWn4A==",
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.0.0.tgz",
"integrity": "sha512-sPsoBs8NkSJt9k/2zLUMDAf0rYaG00EtrFQpHRIphKrR6stGsO92LUJf/uUeQNKEoxqoJ4R4qDLqHl+AOEqolA==",
"dev": true,
"requires": {
"loader-utils": "^1.2.3",
"mime": "^2.4.4",
"schema-utils": "^2.5.0"
"loader-utils": "^2.0.0",
"mime-types": "^2.1.26",
"schema-utils": "^2.6.5"
},
"dependencies": {
"ajv": {
"version": "6.10.2",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
"integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
"version": "6.12.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz",
"integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==",
"dev": true,
"requires": {
"fast-deep-equal": "^2.0.1",
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
@ -17882,45 +17888,51 @@
"integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
"dev": true
},
"emojis-list": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
"integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
"dev": true
},
"fast-deep-equal": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
"integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==",
"dev": true
},
"json5": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz",
"integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==",
"dev": true,
"requires": {
"minimist": "^1.2.0"
"minimist": "^1.2.5"
}
},
"loader-utils": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
"integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
"dev": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^2.0.0",
"json5": "^1.0.1"
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
},
"mime": {
"version": "2.4.4",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz",
"integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==",
"dev": true
},
"minimist": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true
},
"schema-utils": {
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.1.tgz",
"integrity": "sha512-0WXHDs1VDJyo+Zqs9TKLKyD/h7yDpHUhEFsM2CzkICFdoX1av+GBq/J2xRTFfsQO5kBfhZzANf2VcIm84jqDbg==",
"version": "2.6.5",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz",
"integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==",
"dev": true,
"requires": {
"ajv": "^6.10.2",
"ajv": "^6.12.0",
"ajv-keywords": "^3.4.1"
}
}
@ -18281,9 +18293,9 @@
"dev": true
},
"vue-loader": {
"version": "15.9.0",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.0.tgz",
"integrity": "sha512-FeDHvTSpwyLeF7LIV1PYkvqUQgTJ8UmOxhSlCyRSxaXCKk+M6NF4tDQsLsPPNeDPyR7TfRQ8MLg6v+8PsDV9xQ==",
"version": "15.9.1",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.1.tgz",
"integrity": "sha512-IaPU2KOPjs/QjMlxFs/TiTtQUSbftQ7lsAvoxe21rtcQohsMhx+1AltXCNhZIpIn46PtODiAgz+o8RbMpKtmJw==",
"dev": true,
"requires": {
"@vue/component-compiler-utils": "^3.1.0",
@ -18325,9 +18337,9 @@
"dev": true
},
"vuex": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/vuex/-/vuex-3.1.2.tgz",
"integrity": "sha512-ha3jNLJqNhhrAemDXcmMJMKf1Zu4sybMPr9KxJIuOpVcsDQlTBYLLladav2U+g1AvdYDG5Gs0xBTb0M5pXXYFQ=="
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/vuex/-/vuex-3.1.3.tgz",
"integrity": "sha512-k8vZqNMSNMgKelVZAPYw5MNb2xWSmVgCKtYKAptvm9YtZiOXnRXFWu//Y9zQNORTrm3dNj1n/WaZZI26tIX6Mw=="
},
"w3c-hr-time": {
"version": "1.0.1",
@ -19392,9 +19404,9 @@
}
},
"ytsr": {
"version": "0.1.10",
"resolved": "https://registry.npmjs.org/ytsr/-/ytsr-0.1.10.tgz",
"integrity": "sha512-9wq0TiFejj6T5t9WXx/7Uw7Pix6vtXq3nd7BbPvz3BwUjJ4rdW4maylj1/sW+AUaSNgZgVbVngH/Y1a7V1kzsA==",
"version": "0.1.11",
"resolved": "https://registry.npmjs.org/ytsr/-/ytsr-0.1.11.tgz",
"integrity": "sha512-f7RILud27ufqsw3+Zi0J5itQ7qOt7BzN2EhqQARFhZq9HdxrlSfwvymiO/wvzFALCR2bgyxfz/cJhWyjUlokCA==",
"requires": {
"html-entities": "^1.1.3"
}

View File

@ -19,7 +19,7 @@
"jquery": "^3.4.1",
"lodash.isequal": "^4.5.0",
"material-design-icons": "^3.0.1",
"mediaelement": "^4.2.14",
"mediaelement": "^4.2.16",
"nedb": "^1.8.0",
"opml-to-json": "0.0.3",
"video.js": "^7.6.6",
@ -31,7 +31,7 @@
"vue": "^2.6.11",
"vue-electron": "^1.0.6",
"vue-router": "^3.1.6",
"vuex": "^3.1.2",
"vuex": "^3.1.3",
"xml2json": "^0.12.0",
"youtube-chat": "^1.0.2",
"youtube-comments-fetch": "^1.0.1",
@ -40,7 +40,7 @@
"yt-xml2vtt": "^1.0.1",
"ytdl-core": "^2.0.0",
"ytpl": "^0.1.20",
"ytsr": "^0.1.10"
"ytsr": "^0.1.11"
},
"description": "A private YouTube client",
"devDependencies": {
@ -49,18 +49,18 @@
"@babel/plugin-proposal-object-rest-spread": "^7.8.3",
"@babel/preset-env": "^7.8.7",
"@babel/preset-typescript": "^7.8.3",
"@typescript-eslint/eslint-plugin": "^2.22.0",
"@typescript-eslint/parser": "^2.22.0",
"@typescript-eslint/eslint-plugin": "^2.24.0",
"@typescript-eslint/parser": "^2.24.0",
"acorn": "^7.1.1",
"babel-eslint": "^10.1.0",
"babel-loader": "^8.0.6",
"copy-webpack-plugin": "^5.1.1",
"css-loader": "^3.4.2",
"devtron": "^1.4.0",
"electron": "^8.0.3",
"electron-builder": "^22.3.6",
"electron": "^8.1.1",
"electron-builder": "^22.4.1",
"electron-debug": "^3.0.1",
"electron-rebuild": "^1.10.0",
"electron-rebuild": "^1.10.1",
"eslint": "^6.8.0",
"eslint-config-prettier": "^6.10.0",
"eslint-config-standard": "^14.1.0",
@ -69,24 +69,24 @@
"eslint-plugin-prettier": "^3.1.2",
"eslint-plugin-promise": "^4.2.1",
"eslint-plugin-standard": "^4.0.1",
"eslint-plugin-vue": "^6.2.1",
"eslint-plugin-vue": "^6.2.2",
"fast-glob": "^3.2.2",
"file-loader": "^5.1.0",
"file-loader": "^6.0.0",
"html-webpack-plugin": "^3.2.0",
"jest": "^25.1.0",
"mini-css-extract-plugin": "^0.9.0",
"node-loader": "^0.6.0",
"npm-run-all": "^4.1.5",
"prettier": "^1.19.1",
"sass": "^1.26.2",
"sass": "^1.26.3",
"sass-loader": "^8.0.2",
"style-loader": "^1.1.3",
"tree-kill": "1.2.2",
"typescript": "^3.8.3",
"url-loader": "^3.0.0",
"url-loader": "^4.0.0",
"vue-devtools": "^5.1.3",
"vue-eslint-parser": "^7.0.0",
"vue-loader": "^15.9.0",
"vue-loader": "^15.9.1",
"vue-style-loader": "^4.1.2",
"vue-template-compiler": "^2.6.11",
"webpack": "^4.42.0",
@ -115,9 +115,10 @@
"jest:coverage": "jest --collect-coverage",
"jest:watch": "jest --watch",
"lint": "eslint --fix --ext .js,.ts,.vue ./",
"pack": "run-p pack:main pack:renderer pack:workers",
"pack": "run-p pack:main pack:renderer pack:web pack:workers",
"pack:main": "webpack --mode=production --env.NODE_ENV=production --hide-modules --config _scripts/webpack.main.config.js",
"pack:renderer": "webpack --mode=production --env.NODE_ENV=production --hide-modules --config _scripts/webpack.renderer.config.js",
"pack:web": "webpack --mode=production --env.NODE_ENV=production --hide-modules --config _scripts/webpack.web.config.js",
"pack:workers": "webpack --mode=production --env.NODE_ENV=production --hide-modules --config _scripts/webpack.workers.config.js",
"postinstall": "electron-rebuild",
"prettier": "prettier --write \"{src,_scripts}/**/*.{js,ts,vue}\"",

View File

@ -19,10 +19,12 @@
<div id="app"></div>
<!-- Set `__static` path to static files in production -->
<script>
try {
if (process.env.NODE_ENV !== 'development')
window.__static = require('path')
.join(__dirname, '/static')
.replace(/\\/g, '\\\\')
} catch {}
</script>
<!-- webpack builds are automatically injected -->
</body>

View File

@ -22,3 +22,10 @@ body {
.expand {
margin-left: 80px;
}
@media only screen and (max-width: 680px) {
.expand, .routerView {
margin-left: 0px;
margin-bottom: 80px;
}
}

View File

@ -2,7 +2,17 @@ import Vue from 'vue'
import TopNav from './components/top-nav/top-nav.vue'
import SideNav from './components/side-nav/side-nav.vue'
import $ from 'jquery'
import { shell } from 'electron'
let useElectron
let shell
if (window && window.process && window.process.type === 'renderer') {
/* eslint-disable-next-line */
shell = require('electron').shell
useElectron = true
} else {
useElectron = false
}
export default Vue.extend({
name: 'App',
@ -42,9 +52,12 @@ export default Vue.extend({
this.updateTheme(theme)
console.log(useElectron)
// Open links externally by default
$(document).on('click', 'a[href^="http"]', (event) => {
const el = event.currentTarget
console.log(useElectron)
console.log(el)
if (typeof (shell) !== 'undefined') {
event.preventDefault()

View File

@ -2,6 +2,8 @@
background-color: var(--card-bg-color);
padding: 20px;
padding-bottom: 70px;
max-height: 400px;
overflow-y: auto;
box-shadow: 0 1px 2px rgba(0,0,0,.1);
}
@ -18,3 +20,9 @@
max-width: 1000px;
margin: 0 auto;
}
@media only screen and (max-width: 600px) {
.searchRadio {
border-right: 0px;
}
}

View File

@ -7,3 +7,15 @@
margin: 0 auto;
margin-bottom: 10px;
}
@media only screen and (max-width: 680px) {
.card {
width: 90%;
}
}
@media only screen and (max-width: 460px) {
.generalSettingsFlexBox {
justify-content: flex-start;
}
}

View File

@ -6,7 +6,7 @@
>
{{ title }}
</h3>
<ft-flex-box>
<ft-flex-box class="generalSettingsFlexBox">
<ft-toggle-switch
label="Fallback to Non-Preferred Backend on Failure"
:default-value="backendFallback"

View File

@ -7,3 +7,15 @@
margin: 0 auto;
margin-bottom: 10px;
}
@media only screen and (max-width: 680px) {
.card {
width: 90%;
}
}
@media only screen and (max-width: 460px) {
.playerSettingsFlexBox {
justify-content: flex-start;
}
}

View File

@ -6,7 +6,7 @@
>
{{ title }}
</h3>
<ft-flex-box>
<ft-flex-box class="playerSettingsFlexBox">
<ft-toggle-switch
label="Remember History"
:default-value="rememberHistory"

View File

@ -1,6 +1,6 @@
import Vue from 'vue'
import FtListDropdown from '../ft-list-dropdown/ft-list-dropdown.vue'
import { shell } from 'electron'
// import { shell } from 'electron'
export default Vue.extend({
name: 'FtElementList',
@ -75,13 +75,13 @@ export default Vue.extend({
navigator.clipboard.writeText(youtubeUrl)
break
case 'openYoutube':
shell.openExternal(youtubeUrl)
// shell.openExternal(youtubeUrl)
break
case 'copyInvidious':
navigator.clipboard.writeText(invidiousUrl)
break
case 'openInvidious':
shell.openExternal(invidiousUrl)
// shell.openExternal(invidiousUrl)
break
}
}

View File

@ -0,0 +1,76 @@
.sideNavMoreOptions {
display: none;
}
.navOption {
position: relative;
padding: 5px;
cursor: pointer;
}
.navOption:hover {
background-color: var(--side-nav-hover-color);
-moz-transition: background 0.2s ease-in;
-o-transition: background 0.2s ease-in;
transition: background 0.2s ease-in;
}
.navOption:active {
background-color: var(--side-nav-active-color);
-moz-transition: background 0.2s ease-in;
-o-transition: background 0.2s ease-in;
transition: background 0.2s ease-in;
}
.moreOptionContainer {
position: fixed;
background-color: var(--side-nav-color);
bottom: 60px;
width: 70px;
z-index: 0;
-webkit-box-shadow: 3px -3px 5px 0px rgba(0,0,0,0.2);
-moz-box-shadow: 3px -3px 5px 0px rgba(0,0,0,0.2);
box-shadow: 3px -3px 5px 0px rgba(0,0,0,0.2);
}
@media only screen and (max-width: 680px) {
.sideNavMoreOptions {
display: block;
}
.sideNav, .closed {
margin-top: 0px;
height: 60px;
width: 100%;
bottom: 0px;
top: auto;
overflow-y: inherit;
}
.navOption, .closed .navOption {
width: 70px;
height: 40px;
padding: 0px;
padding-top: 10px;
padding-bottom: 10px;
}
.navLabel {
margin-left: 0px;
width: 100%;
text-align: center;
left: 0px;
font-size: 11px;
}
.navIcon {
margin-left: 0px;
width: 100%;
display: block;
margin-bottom: 0px;
}
.moreOption {
display: block;
}
}

View File

@ -0,0 +1,16 @@
import Vue from 'vue'
export default Vue.extend({
name: 'SideNav',
data: function () {
return {
openMoreOptions: false
}
},
methods: {
navigate: function (route) {
this.openMoreOptions = false
this.$emit('navigate', route)
}
}
})

View File

@ -0,0 +1,97 @@
<template>
<div class="sideNavMoreOptions">
<div
class="navOption moreOptionNav"
@click="openMoreOptions = !openMoreOptions"
>
<font-awesome-icon
icon="ellipsis-h"
class="navIcon"
/>
<p class="navLabel">
More
</p>
</div>
<div
v-if="openMoreOptions"
class="moreOptionContainer"
>
<div
class="navOption"
@click="navigate('trending')"
>
<font-awesome-icon
icon="fire"
class="navIcon"
/>
<p class="navLabel">
Trending
</p>
</div>
<div
class="navOption"
@click="navigate('popular')"
>
<font-awesome-icon
icon="users"
class="navIcon"
/>
<p class="navLabel">
Most Popular
</p>
</div>
<div
class="navOption"
@click="navigate('about')"
>
<font-awesome-icon
icon="info-circle"
class="navIcon"
/>
<p class="navLabel">
About
</p>
</div>
</div>
<div
class="navOption mobileShow"
@click="navigate('history')"
>
<font-awesome-icon
icon="history"
class="navIcon"
/>
<p class="navLabel">
History
</p>
</div>
<hr>
<div
class="navOption mobileShow"
@click="navigate('settings')"
>
<font-awesome-icon
icon="sliders-h"
class="navIcon"
/>
<p class="navLabel">
Settings
</p>
</div>
<div
class="navOption mobileHidden"
@click="navigate('about')"
>
<font-awesome-icon
icon="info-circle"
class="navIcon"
/>
<p class="navLabel">
About
</p>
</div>
</div>
</template>
<script src="./side-nav-more-options.js" />
<style scoped src="./side-nav-more-options.css" />

View File

@ -1,4 +1,5 @@
.sideNav {
display: block;
height: calc(100vh - 60px);
width: 200px;
overflow-y: auto;
@ -24,6 +25,10 @@
cursor: pointer;
}
.moreOption {
display: none;
}
.navOption:hover {
background-color: var(--side-nav-hover-color);
-moz-transition: background 0.2s ease-in;
@ -90,3 +95,55 @@
left: 0px;
font-size: 11px;
}
@media only screen and (max-width: 680px) {
hr, .mobileHidden, .refreshIcon {
display: none;
}
.sideNav {
display: flex;
}
.topNavOption {
margin-top: 0px;
padding-left: 10px;
padding-right: 10px;
}
.sideNav, .closed {
margin-top: 0px;
height: 60px;
width: 100%;
bottom: 0px;
top: auto;
overflow-y: inherit;
}
.navOption, .closed .navOption {
width: 70px;
height: 40px;
padding: 0px;
padding-top: 10px;
padding-bottom: 10px;
}
.navLabel {
margin-left: 0px;
width: 100%;
text-align: center;
left: 0px;
font-size: 11px;
}
.navIcon {
margin-left: 0px;
width: 100%;
display: block;
margin-bottom: 0px;
}
.moreOption {
display: block;
}
}

View File

@ -1,8 +1,14 @@
import Vue from 'vue'
import FtFlexBox from '../ft-flex-box/ft-flex-box.vue'
import SideNavMoreOptions from '../side-nav-more-options/side-nav-more-options.vue'
import router from '../../router/index.js'
export default Vue.extend({
name: 'SideNav',
components: {
'ft-flex-box': FtFlexBox,
'side-nav-more-options': SideNavMoreOptions
},
computed: {
isOpen: function () {
return this.$store.getters.getIsSideNavOpen

View File

@ -1,11 +1,11 @@
<template>
<div
<ft-flex-box
ref="sideNav"
class="sideNav"
:class="{closed: !isOpen}"
>
<div
class="navOption topNavOption"
class="navOption topNavOption mobileShow"
@click="navigate('subscriptions')"
>
<font-awesome-icon
@ -21,7 +21,7 @@
/>
</div>
<div
class="navOption"
class="navOption mobileHidden"
@click="navigate('trending')"
>
<font-awesome-icon
@ -33,7 +33,7 @@
</p>
</div>
<div
class="navOption"
class="navOption mobileHidden"
@click="navigate('popular')"
>
<font-awesome-icon
@ -45,7 +45,7 @@
</p>
</div>
<div
class="navOption"
class="navOption mobileShow"
@click="navigate('userplaylists')"
>
<font-awesome-icon
@ -56,8 +56,11 @@
Playlists
</p>
</div>
<side-nav-more-options
@navigate="navigate"
/>
<div
class="navOption"
class="navOption mobileShow"
@click="navigate('history')"
>
<font-awesome-icon
@ -70,7 +73,7 @@
</div>
<hr>
<div
class="navOption"
class="navOption mobileShow"
@click="navigate('settings')"
>
<font-awesome-icon
@ -82,7 +85,7 @@
</p>
</div>
<div
class="navOption"
class="navOption mobileHidden"
@click="navigate('about')"
>
<font-awesome-icon
@ -94,7 +97,7 @@
</p>
</div>
<hr>
</div>
</ft-flex-box>
</template>
<script src="./side-nav.js" />

View File

@ -7,3 +7,15 @@
margin: 0 auto;
margin-bottom: 10px;
}
@media only screen and (max-width: 680px) {
.card {
width: 90%;
}
}
@media only screen and (max-width: 500px) {
.subscriptionSettingsFlexBox {
justify-content: flex-start;
}
}

View File

@ -6,7 +6,7 @@
>
{{ title }}
</h3>
<ft-flex-box>
<ft-flex-box class="subscriptionSettingsFlexBox">
<ft-toggle-switch
label="Hide Videos When Watched"
/>

View File

@ -7,3 +7,9 @@
margin: 0 auto;
margin-bottom: 10px;
}
@media only screen and (max-width: 680px) {
.card {
width: 90%;
}
}

View File

@ -71,6 +71,12 @@
left: 85px;
}
.navSearchIcon {
position: absolute;
top: 10px;
display: none;
}
.logoIcon {
background-image: var(--logo-icon);
background-repeat: no-repeat;
@ -132,3 +138,57 @@
.expand {
margin-left: 100px;
}
@media only screen and (max-width: 680px) {
.menuIcon {
display: none;
}
.navBackIcon {
left: 45px;
}
.navForwardIcon {
left: 80px;
}
.navSearchIcon {
display: block;
left: 120px;
}
.logoIcon {
left: 10px;
}
.logoText {
display: none;
}
.searchContainer {
position: fixed;
display: none;
width: 100%;
top: 60px;
background-color: var(--side-nav-color);
}
.topNavBarColor .searchContainer {
background-color: var(--primary-color-hover);
}
.searchInput {
width: 80%;
margin: 0 auto;
}
.navFilterIcon {
right: 0px;
}
.searchFilters {
margin-top: 130px;
margin-left: 10px;
margin-right: 10px;
}
}

View File

@ -1,6 +1,7 @@
import Vue from 'vue'
import FtInput from '../ft-input/ft-input.vue'
import FtSearchFilters from '../ft-search-filters/ft-search-filters.vue'
import $ from 'jquery'
import router from '../../router/index.js'
export default Vue.extend({
@ -28,10 +29,29 @@ export default Vue.extend({
return this.$store.getters.getBarColor
}
},
mounted: function () {
window.addEventListener('resize', function(event) {
const width = event.srcElement.innerWidth
const searchContainer = $('.searchContainer').get(0)
if (width > 680) {
searchContainer.style.display = 'block'
} else {
searchContainer.style.display = 'none'
}
})
},
methods: {
goToSearch: function (query) {
console.log(this)
this.showFilters = false
const appWidth = $(window).width()
if (appWidth <= 680) {
const searchContainer = $('.searchContainer').get(0)
searchContainer.style.display = 'none'
}
router.push(
{
path: `/search/${query}`,
@ -45,6 +65,18 @@ export default Vue.extend({
)
},
toggleSearchContainer: function () {
const searchContainer = $('.searchContainer').get(0)
if (searchContainer.style.display === 'none' || searchContainer.style.display === '') {
searchContainer.style.display = 'block'
} else {
searchContainer.style.display = 'none'
}
this.showFilters = false
},
historyBack: function () {
window.history.back()
},

View File

@ -18,6 +18,11 @@
icon="arrow-right"
@click="historyForward"
/>
<font-awesome-icon
class="navSearchIcon navIcon"
icon="search"
@click="toggleSearchContainer"
/>
<div
class="logoIcon"
:class="{ logoIconBarColor: barColor }"

View File

@ -3,7 +3,7 @@ import FtCard from '../ft-card/ft-card.vue'
import FtButton from '../ft-button/ft-button.vue'
import FtListDropdown from '../ft-list-dropdown/ft-list-dropdown.vue'
import FtFlexBox from '../ft-flex-box/ft-flex-box.vue'
import { shell } from 'electron'
// import { shell } from 'electron'
export default Vue.extend({
name: 'WatchVideoInfo',
@ -147,19 +147,19 @@ export default Vue.extend({
navigator.clipboard.writeText(this.youtubeUrl)
break
case 'openYoutube':
shell.openExternal(this.youtubeUrl)
// shell.openExternal(this.youtubeUrl)
break
case 'copyYoutubeEmbed':
navigator.clipboard.writeText(this.youtubeEmbedUrl)
break
case 'openYoutubeEmbed':
shell.openExternal(this.youtubeEmbedUrl)
// shell.openExternal(this.youtubeEmbedUrl)
break
case 'copyInvidious':
navigator.clipboard.writeText(this.invidiousUrl)
break
case 'openInvidious':
shell.openExternal(this.invidiousUrl)
// shell.openExternal(this.invidiousUrl)
break
}
}

View File

@ -1,5 +1,4 @@
// import the styles
import { ipcRenderer } from 'electron'
import Vue from 'vue'
import App from './App.vue'
import router from './router/index'
@ -26,9 +25,14 @@ new Vue({
render: h => h(App)
})
// handle menu event updates from main script
ipcRenderer.on('change-view', (event, data) => {
// to avoild accesing electorn api from web app build
if (window && window.process && window.process.type === 'renderer') {
const { ipcRenderer } = require('electron')
// handle menu event updates from main script
ipcRenderer.on('change-view', (event, data) => {
if (data.route) {
router.push(data.route)
}
})
})
}

View File

@ -1,6 +1,5 @@
import electron from 'electron'
import Datastore from 'nedb'
const localDataStorage = electron.remote.app.getPath('userData')
const localDataStorage = '/db'
const settingsDb = new Datastore({
filename: localDataStorage + '/settings.db',

View File

@ -1,6 +1,5 @@
import electron from 'electron'
import Datastore from 'nedb'
const localDataStorage = electron.remote.app.getPath('userData')
const localDataStorage = '/db'
const subDb = new Datastore({
filename: localDataStorage + '/subscriptions.db',

View File

@ -114,8 +114,7 @@ const actions = {
})
},
/* eslint-disable-next-line */
ytGetPlaylistInfo ({}, playlistId) {
ytGetPlaylistInfo (_, playlistId) {
return new Promise((resolve, reject) => {
console.log(playlistId)
console.log('Getting playlist info please wait...')

View File

@ -5,7 +5,8 @@
}
.logo {
max-width: 500px;
width: 500px;
max-width: 100%;
}
.center {
@ -15,3 +16,9 @@
.leftAlign {
text-align: left;
}
@media only screen and (max-width: 680px) {
.card {
width: 90%;
}
}

View File

@ -5,7 +5,7 @@
About
</h3>
<img
src="/_icons/logoColor.png"
src="_icons/logoColor.png"
class="logo"
>
<h1>

View File

@ -3,3 +3,9 @@
margin: 0 auto;
margin-bottom: 60px;
}
@media only screen and (max-width: 680px) {
.card {
width: 90%;
}
}

View File

@ -3,3 +3,9 @@
margin: 0 auto;
margin-bottom: 60px;
}
@media only screen and (max-width: 680px) {
.card {
width: 90%;
}
}

View File

@ -12,3 +12,9 @@
margin: 0 auto;
margin-bottom: 60px;
}
@media only screen and (max-width: 680px) {
.card {
width: 90%;
}
}

View File

@ -3,3 +3,9 @@
margin: 0 auto;
margin-bottom: 60px;
}
@media only screen and (max-width: 680px) {
.card {
width: 90%;
}
}

View File

@ -3,3 +3,9 @@
margin: 0 auto;
margin-bottom: 60px;
}
@media only screen and (max-width: 680px) {
.card {
width: 90%;
}
}

View File

@ -3,3 +3,9 @@
margin: 0 auto;
margin-bottom: 60px;
}
@media only screen and (max-width: 680px) {
.card {
width: 90%;
}
}