Incorporacion del servidor legacy. Terminada funcionalidad basica

This commit is contained in:
Fernando 2019-05-02 17:04:06 -05:00
parent 23e9c9382d
commit 5fa3972c36
49 changed files with 2731 additions and 639 deletions

2
.gitignore vendored
View File

@ -23,3 +23,5 @@ yarn-error.log*
# Archivos de desarrollo del servidor # Archivos de desarrollo del servidor
/srv/*/**.js /srv/*/**.js
/srv/*/**.js.map /srv/*/**.js.map
deployarBackend.js
deployFrontEnd.js

34
app.js Normal file
View File

@ -0,0 +1,34 @@
const fun = require("./srv/index").fun;
const SPAhistory = require('connect-history-api-fallback');
let express = require('express');
const compresion = require('compression');
const bodyParser = require('body-parser');
let app = express();
// History: Middleware para el routing de la SPA en modo history
// Por alguna razon solo funciona si lo uso antes de establecer el directorio estatico dist ...
app.use(SPAhistory());
/* Compresion gzip */
app.use(compresion());
app.use(express.static('dist'));
app.use(express.urlencoded());
app.use(express.json());
app.use(bodyParser.json());
/* CORS para localhost y beta.pseudosubs.com */
app.all("*", (req, res, next) => {
res.header("Access-Control-Allow-Origin", "*");
res.header('Access-Control-Allow-Headers', 'Content-Type');
next();
});
app.get("/");
fun(app);
app.listen(8080, () => console.log("Iniciado en 8080"));

View File

@ -1,43 +1,55 @@
{ {
"name": "pseudosubs5", "name": "pseudosubs5",
"version": "0.1.0", "version": "0.1.0",
"private": true, "private": true,
"scripts": { "scripts": {
"serve": "vue-cli-service serve", "start": "node app.js",
"build": "vue-cli-service build", "serve": "vue-cli-service serve",
"express": "vue-cli-service express:watch", "build": "vue-cli-service build",
"express:run": "vue-cli-service express:run" "express": "vue-cli-service express:watch",
}, "express:run": "vue-cli-service express:run"
"dependencies": { },
"mysql": "^2.16.0", "dependencies": {
"register-service-worker": "^1.6.2", "compression": "^1.7.4",
"vue": "^2.6.6", "connect-history-api-fallback": "^1.6.0",
"vue-disqus": "^3.0.5", "express": "^4.16.4",
"vue-router": "^3.0.1", "mysql": "^2.17.1",
"vuex": "^3.0.1", "register-service-worker": "^1.6.2",
"yaml": "^1.4.0" "vue": "^2.6.6",
}, "vue-analytics": "^5.16.4",
"devDependencies": { "vue-disqus": "^3.0.5",
"@vue/cli-plugin-babel": "^3.0.5", "vue-google-signin-button": "^1.0.2",
"@vue/cli-plugin-pwa": "^3.0.5", "vue-router": "^3.0.1",
"@vue/cli-service": "^3.0.5", "vuex": "^3.0.1",
"coffee-loader": "^0.9.0", "web-push": "^3.3.3",
"coffeescript": "^2.3.2", "yaml": "^1.4.0"
"node-sass": "^4.9.0", },
"pug": "^2.0.3", "devDependencies": {
"pug-plain-loader": "^1.0.0", "@types/express": "^4.16.1",
"sass-loader": "^7.1.0", "@types/mysql": "^2.15.6",
"vue-cli-plugin-express": "^1.0.0", "@vue/cli-plugin-babel": "^3.0.5",
"vue-template-compiler": "^2.5.21" "@vue/cli-plugin-pwa": "^3.0.5",
}, "@vue/cli-service": "^3.0.5",
"postcss": { "body-parser": "^1.19.0",
"plugins": { "coffee-loader": "^0.9.0",
"autoprefixer": {} "coffeescript": "^2.3.2",
} "ftp-deploy": "^2.3.3",
}, "google-auth-library": "^3.1.2",
"browserslist": [ "node-sass": "^4.9.0",
"> 1%", "pug": "^2.0.3",
"last 2 versions", "pug-plain-loader": "^1.0.0",
"not ie <= 8" "sass-loader": "^7.1.0",
] "vue-cli-plugin-express": "^1.0.0",
"vue-template-compiler": "^2.5.21"
},
"postcss": {
"plugins": {
"autoprefixer": {}
}
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 8"
]
} }

14
public/.htaccess Normal file
View File

@ -0,0 +1,14 @@
<IfModule mod_headers.c>
<FilesMatch "index.html$">
Header set Cache-Control "max-age=600, public"
</FilesMatch>
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
</IfModule>

View File

@ -8,6 +8,8 @@
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" <link href="https://fonts.googleapis.com/icon?family=Material+Icons"
rel="stylesheet"> rel="stylesheet">
<title>PseudoSubs</title> <title>PseudoSubs</title>
<script>const url = new URL(window.location.href);if (url.hostname.search("pseudosubs") !== -1 && (url.protocol === "http:" || url.hostname.search("www") !== -1)) {window.location.replace("https://beta.pseudosubs.com");}</script>
<script src="https://apis.google.com/js/api:client.js"></script>
</head> </head>
<body> <body>
<noscript> <noscript>

View File

@ -1,20 +1,20 @@
{ {
"name": "pseudosubs5", "name": "pseudosubs5",
"short_name": "pseudosubs5", "short_name": "pseudosubs5",
"icons": [ "icons": [
{ {
"src": "./img/icons/android-chrome-192x192.png", "src": "./img/icons/android-chrome-192x192.png",
"sizes": "192x192", "sizes": "192x192",
"type": "image/png" "type": "image/png"
}, },
{ {
"src": "./img/icons/android-chrome-512x512.png", "src": "./img/icons/android-chrome-512x512.png",
"sizes": "512x512", "sizes": "512x512",
"type": "image/png" "type": "image/png"
} }
], ],
"start_url": "./index.html", "start_url": "./index.html",
"display": "standalone", "display": "standalone",
"background_color": "#000000", "background_color": "#ea486a",
"theme_color": "#4DBA87" "theme_color": "#009961"
} }

View File

@ -2,7 +2,7 @@
div#app div#app
div.fondo.fondo2 div.fondo.fondo2
barra-lateral barra-lateral
div.contenido(:class="$store.state.barraLateralOculta? 'contenido--barraOculta' : ''", :barra-oculta="$store.state.barraLateralOculta.toString()") div.contenido.contenido--barraOculta
router-view router-view
</template> </template>
@ -22,24 +22,21 @@
components: components:
'barra-lateral': barraLateral 'barra-lateral': barraLateral
created: -> created: ->
if @$store.state.animes[0]? store = @$store
# fetch("#{this.$store.state.servidor}/anime", {
else method: "POST"
store = @$store headers:
fetch("https://pseudosubs.com/anime", { "Content-Type": "application/x-www-form-urlencoded"
method: "POST" })
headers: .then (x) -> x.text()
"Content-Type": "application/x-www-form-urlencoded" .then (res) ->
}) # if DEV then console.log res
.then((x) -> x.text()) resultado = YAML.parse res
.then (res) ->
# if DEV then console.log res
resultado = YAML.parse res
if resultado.exito if resultado.exito
store.commit "establecerAnime", resultado.payload store.commit "establecerAnime", resultado.payload
else else
console.log "Error al obtener los animes.\n#{res}" console.log "Error al obtener los animes.\n#{res}"
# #
</script> </script>

View File

@ -0,0 +1,71 @@
<template lang="pug">
div
div.id {{ anime.anime_ID }}
div.nombre {{ anime.titulo }}
div.botones
span.boton op
span.boton ed
span.boton(@click="verVariantes") links
div(v-if="linksAbierto")
div(v-for="variante in variantes")
variante(:variante="variante")
//
</template>
<script lang="coffee">
import YAML from "yaml"
import variante from "./variante.vue"
export default
name: "anime"
props:
anime:
type: Object
required: true
data: ->
linksAbierto: false
variantes: []
components:
variante: variante
methods:
verVariantes: ->
if this.variantes.length == 0
res = await fetch "#{this.$store.state.servidor}/eps/variantes/#{this.anime.anime_ID}",
method: "POST"
headers:
"Content-Type": "application/x-www-form-urlencoded"
data = await res.text()
this.variantes = YAML.parse data
this.linksAbierto = !this.linksAbierto
#
</script>
<style scoped lang="sass">
@import "../../assets/sass/variables"
.id
float: left
width: 5%
.nombre
float: left
width: 20%
overflow: hidden
.botones
float: left
width: 75%
.boton
@extend %bordeRedondo-std
display: inline-block
padding: 10px 15px
background-color: $colorPrincipal
margin: 5px 15px
cursor: pointer
user-select: none
color: white
//
</style>

View File

@ -0,0 +1,37 @@
<template lang="pug">
div.lista
div
anime.row(v-for="anime in animes" :anime="anime")
//
</template>
<script lang="coffee">
import anime from "./anime.vue"
export default
name: "lista-animes"
components:
anime: anime
data: ->
animes: this.$store.state.animes
linksAbierto: false
#
</script>
<style scoped lang="sass">
@import "../../assets/sass/variables"
.row::after
content: ""
display: table
clear: both
.lista
margin: 50px
//
</style>

View File

@ -0,0 +1,107 @@
<template lang="pug">
div.variante
span.formato {{ variante.formato }}
span.res {{ variante.res }}
span.servidor {{ variante.servidor }}
span.boton(@click="abrirLinks") Abrir
div(v-if="linksAbiertos")
br
div.link
form(@submit="crearEp($event)")
input(placeholder="numEp" type="number" min="0" max="1000" name="numEp")
input(placeholder="peso" name="peso")
input(placeholder="link" name="link")
br
input(type="submit" value="Crear")
br
div.link(v-for="link in links")
span id: {{ link.ep_ID }} |
span Ep {{ link.num_ep }} |
span {{ link.visitas }} visitas |
span Peso: {{ link.peso }} |
span(style="word-wrap: break-word") link: {{ link.link }}
//
</template>
<script lang="coffee">
import YAML from "yaml"
export default
name: "variante"
props:
variante:
type: Object
required: true
data: ->
linksAbiertos: false
links: []
methods:
abrirLinks: ->
if this.links.length == 0
res = await fetch "#{this.$store.state.servidor}/eps/links/#{this.variante.opcion_ID}",
method: "POST"
headers:
"Content-Type": "application/x-www-form-urlencoded"
data = await res.text()
this.links = YAML.parse data
this.linksAbiertos = !this.linksAbiertos
crearEp: (ev) ->
elem = ev.target
ev.preventDefault()
res = await fetch "#{this.$store.state.servidor}/eps/links/",
method: "POST"
headers:
"Content-Type": "application/x-www-form-urlencoded"
body: "params=" + YAML.stringify {
opcion_ID: this.variante.opcion_ID
num_ep: elem.numEp.value
visitas: 0
link: elem.link.value
peso: elem.peso.value
}
data = JSON.parse(await res.text())
if data.error == false
console.log "Creado con exito"
this.links.push {
ep_ID: "?"
num_EP: elem.numEp.value
visitas: 0
peso: elem.peso.value
link: elem.link.value
}
#
</script>
<style scoped lang="sass">
@import "../../assets/sass/variables"
.variante
margin: 10px
.link
margin-left: 25px
.formato, .res, .servidor, .boton
display: inline-block
padding: 10px 15px
border-radius: 5px
margin: 10px 5px
cursor: none
color: white
.formato
background-color: #7b0000
.res
background-color: #000072
.servidor
background-color: #007200
.boton
background-color: $colorSecundario
cursor: pointer
//
</style>

View File

@ -19,9 +19,13 @@
div.temporada Temporada: {{ anime.temporada + " " + anime.anio }} div.temporada Temporada: {{ anime.temporada + " " + anime.anio }}
div.fuente Fuente: {{ anime.fuente }} div.fuente Fuente: {{ anime.fuente }}
div.generos Generos: {{ anime.generos }} div.generos Generos: {{ anime.generos }}
div.tarjeta.fondo1.op-ed ops y eds aqui. En construcción. op-ed(:anime_ID="anime.anime_ID" :color="anime.color")
br
div.tarjeta.aviso(:style="colorBackground") {{ aviso }}
br
panel-de-descarga(:animeid="anime.anime_ID" :color="anime.color"
:cambiar-aviso="cambiarAviso")
br br
panel-de-descarga(:animeid="anime.anime_ID" :color="anime.color")
div.tarjeta.background__disqus div.tarjeta.background__disqus
vue-disqus(shortname="www-pseudosubs-com" :identifier="nombreCortoAnime" vue-disqus(shortname="www-pseudosubs-com" :identifier="nombreCortoAnime"
:url="'https://pseudosubs.com/Anime/' + nombreCortoAnime") :url="'https://pseudosubs.com/Anime/' + nombreCortoAnime")
@ -31,33 +35,41 @@
<script lang="coffee"> <script lang="coffee">
import panelDescarga from "./panel-descarga.vue" import panelDescarga from "./panel-descarga.vue"
import opEd from "./op-ed.vue"
import YAML from "yaml"
export default export default
name: "Anime" name: "Anime"
components: components:
'panel-de-descarga': panelDescarga "panel-de-descarga": panelDescarga
"op-ed": opEd
data: -> data: ->
anime: {} anime: {}
# -1 no encontrado, 0 cargando y 1 encontrado # -1 no encontrado, 0 cargando y 1 encontrado
estadoAnime: 0 estadoAnime: 0
aviso: ""
computed: computed:
nombreCortoAnime: -> nombreCortoAnime: ->
@anime.link?.substr(7) @anime.link?.substr(7)
colorBackground: -> "background-color: #{@anime.color};"
methods:
cambiarAviso: (aviso) -> @aviso = aviso
created: -> created: ->
_ = this vm = this
animes = @$store.state.animes animes = @$store.state.animes
resultado = -1 resultado = -1
for anime in animes for anime in animes
if anime.link is "/Anime/" + @$route.params.nombre if anime.link is "/Anime/" + @$route.params.nombre
_.anime = anime vm.anime = anime
resultado = 1 resultado = 1
break break
@estadoAnime = resultado vm.estadoAnime = resultado
if resultado is 1 if resultado is 1
@$store.commit "cambiarTituloAnime", "#{anime.titulo}" @$store.commit "cambiarTituloAnime", "#{anime.titulo}"
@$store.commit "cambiarTxtAdicionalAnime", (if anime.comentario? then anime.comentario else "Sin comentarios.") @$store.commit "cambiarTxtAdicionalAnime", (if anime.comentario? then anime.comentario else "Sin comentarios.")
@$store.commit "cambiarEstadoImgAnime", true @$store.commit "cambiarEstadoImgAnime", true
@$store.commit "cambiarImgTituloAnime", @anime.titulo @$store.commit "cambiarImgTituloAnime", @anime.titulo
else else
@$store.commit "cambiarTxtAdicionalAnime", "?" @$store.commit "cambiarTxtAdicionalAnime", "?"
@ -67,6 +79,8 @@
{nombre: "_", ruta: "#"} {nombre: "_", ruta: "#"}
] ]
# #
</script> </script>
@ -78,6 +92,13 @@
background-color: #101010 background-color: #101010
padding: 15px padding: 15px
.aviso
text-align: center
color: white
font:
family: "Product Sans", "Open Sans", sans-serif
size: x-large
.contenedor .contenedor
margin: 0 50px margin: 0 50px

View File

@ -0,0 +1,111 @@
<template lang="pug">
div.tarjeta.fondo1.op-ed
div.op
p(v-if="estadoOp === 0") Cargando OPs...
p(v-else-if="estadoOp === -1") Error al obtener los ops.
template(v-else)
div.titulo OPs:
div.cont(v-for="op in ops")
span.nombre {{ op.nombre }}
span &nbsp;&nbsp;por&nbsp;&nbsp;
span.nombre {{ op.artista }}
br
span.eps Eps {{ op.eps }} |&nbsp;
a(:href="obtenerLinkY(op.nombre, op.artista)" target="_blank"
:style="'color: ' + color") YouTube
br
div.ed
p(v-if="estadoEd === 0") Cargando EDs...
p(v-else-if="estadoEd === -1") Error al obtener los ops.
template(v-else)
div.titulo EDs:
div.cont(v-for="ed in eds")
span.nombre {{ ed.nombre }}
span &nbsp;&nbsp;por&nbsp;&nbsp;
span.nombre {{ ed.artista }}
br
span.eps Eps {{ ed.eps }} |&nbsp;
a(:href="obtenerLinkY(ed.nombre, ed.artista)" target="_blank"
:style="'color: ' + color") YouTube
//
</template>
<script lang="coffee">
import YAML from "yaml"
export default
name: "op-ed"
data: ->
ops: []
eds: []
estadoOp: 0
estadoEd: 0
props:
anime_ID:
type: Number,
required: true
color:
type: String
required: true
methods:
obtenerLinkY: (nombre, artista) ->
"https://www.youtube.com/results?search_query=" + (encodeURIComponent "#{nombre} - #{artista}")
mounted: ->
vm = this
fetch "#{this.$store.state.servidor}/op/#{this.anime_ID}",
method: "POST"
headers:
"Content-Type": "application/x-www-form-urlencoded"
.then (res) ->
data = YAML.parse(await res.text())
vm.estadoOp =
if data.exito
vm.ops = data.payload
1
else
console.error data.error
-1
.catch (err) -> console.log "Error :c #{err}"
fetch "#{this.$store.state.servidor}/ed/#{this.anime_ID}",
method: "POST"
headers:
"Content-Type": "application/x-www-form-urlencoded"
.then (res) ->
data = YAML.parse(await res.text())
vm.estadoEd =
if data.exito
vm.eds = data.payload
1
else
console.error data.error
-1
.catch (err) -> console.log "Error :c #{err}"
#
</script>
<style scoped lang="sass">
@import "../../assets/sass/variables"
.titulo
font:
family: "Product Sans", "Open Sans", sans-serif
size: xx-large
.cont
padding-left: 10px
padding-bottom: 15px
a
color: $colorPrincipal
.nombre
font:
family: "Product Sans", "Open Sans", sans-serif
size: x-large
.eps
margin-left: 10px
//
</style>

View File

@ -1,206 +1,217 @@
<template> <template>
<div> <div>
<div class="panel" v-if="datosCorrectos"> <div class="panel tarjeta" v-if="datosCorrectos">
<div class="panel__titulo" :style="'background-color: ' + color"> <div class="panel__titulo" :style="'background-color: ' + color">
Descarga aquí.<br> Descarga aquí.<br>
<div class="panel__titulo__variantes"> <div class="panel__titulo__variantes">
<template v-for="(opcion, indice) in datos"> <template v-for="(opcion, indice) in datos">
<div class="panel__titulo__variantes__variante hoverable" <div class="panel__titulo__variantes__variante hoverable"
:style="indice === '1'? `background-color: ${opcion.color}` : ''" :style="indice === '1'? `background-color: ${opcion.color}` : ''"
v-on:click="cambiarDescripcionDescarga(indice)" :color-min="opcion.color" v-on:click="cambiarDescripcionDescarga(indice)" :color-min="opcion.color"
:id="`opcion${indice}`"> :id="`opcion${indice}`">
{{ opcion.formato }} {{ opcion.res }}<br>{{ opcion.servidor }} {{ opcion.formato }} {{ opcion.res }}<br>{{ opcion.servidor }}
</div>
</template>
</div>
</div>
<div class="panel__descripcion fondo1">
<template v-for="(opcion, indice) in datos">
<div :id="`tarjeta${indice}`" :style="indice !== '1'? 'display: none' : ''">
<div class="panel__descripcion__titulo" :style="'color: ' + balancearColor">
Links<br>
</div>
Todos los links se abren en una pestaña nueva.<br>
<span v-for="(ep, num) in opcion.eps" class="panel__descripcion__link">
<br>
Episodio {{ num }} ->
<a :href="ep.link" target="_blank" :style="'color: ' + balancearColor"
@mousedown.stop="incrementarContador(ep.ep_ID, $event)">
{{ ep.peso }}
</a>
</span>
</div>
</template>
</div> </div>
</template>
</div> </div>
</div> <div v-else>
<div class="panel__descripcion background__panel-descarga"> Recuperando los eps del servidor...
</div>
<template v-for="(opcion, indice) in datos">
<div :id="`tarjeta${indice}`" :style="indice !== '1'? 'display: none' : ''">
<div class="panel__descripcion__titulo" :style="'color: ' + balancearColor">
Links<br>
</div>
Todos los links se abren en una pestaña nueva.<br>
<span v-for="(ep, num) in opcion.eps" class="panel__descripcion__link">
<br>
Episodio {{ num }} ->
<a :href="ep.link" target="_blank" :style="'color: ' + balancearColor"
@mousedown.stop="incrementarContador(ep.ep_ID, $event)">
{{ ep.peso }}
</a>
</span>
</div>
</template>
</div>
</div> </div>
<div v-else>
Recuperando los eps del servidor...
</div>
</div>
</template> </template>
<script> <script>
import YAML from "yaml" import YAML from "yaml"
const esModoOscuro = false;
export default { const esModoOscuro = false;
name: "panelDeDescarga",
data: function () {
return {
posActual: '1',
datos: {},
datosCorrectos: false,
mostrarSpinnerParaCargaDeEps: true
}
},
props: {
animeid: {
type: Number,
required: true
},
color: {
type: String,
required: true
}
},
computed: {
balancearColor () {
const color = this.color;
const R = parseInt(color.substring(1,3), 16); export default {
const G = parseInt(color.substring(3,5), 16); name: "panelDeDescarga",
const B = parseInt(color.substring(5,7), 16); data: function () {
return {
posActual: '1',
datos: {},
datosCorrectos: false,
mostrarSpinnerParaCargaDeEps: false
}
},
props: {
animeid: {
type: Number,
required: true
},
color: {
type: String,
required: true
},
cambiarAviso: {
type: Function,
required: true
}
},
computed: {
balancearColor() {
const color = this.color;
const limiteOscuridad = 60; const R = parseInt(color.substring(1, 3), 16);
if (esModoOscuro && R<limiteOscuridad && G<limiteOscuridad && B<limiteOscuridad ) { const G = parseInt(color.substring(3, 5), 16);
return `#${(255-R).toString(16)}${(255-G).toString(16)}${(255-B).toString(16)}`; const B = parseInt(color.substring(5, 7), 16);
} else {
return color; const limiteOscuridad = 60;
if (esModoOscuro && R < limiteOscuridad && G < limiteOscuridad && B < limiteOscuridad) {
return `#${(255 - R).toString(16)}${(255 - G).toString(16)}${(255 - B).toString(16)}`;
} else {
return color;
}
}
},
methods: {
cambiarDescripcionDescarga(idDestino) {
const quitarClase = (nombre, nombreClase) => {
const posInicial = nombre.indexOf(nombreClase);
if (posInicial !== -1)
return nombre.substring(0, posInicial - 1);
else
return nombre
};
const elemAnterior = document.getElementById(`tarjeta${this.posActual}`);
const elemNuevo = document.getElementById(`tarjeta${idDestino}`);
const opcionAnterior = document.getElementById(`opcion${this.posActual}`);
const opcionNueva = document.getElementById(`opcion${idDestino}`);
if (elemNuevo && elemAnterior && opcionAnterior && opcionNueva) {
this.posActual = idDestino;
elemAnterior.style.display = "none";
opcionAnterior.style.backgroundColor = "transparent";
opcionAnterior.className = quitarClase(opcionNueva.className, "panel__titulo__variantes__variante--activa");
elemNuevo.style.display = "block";
opcionNueva.style.backgroundColor = opcionNueva.getAttribute("color-min");
opcionNueva.className += " panel__titulo__variantes__variante--activa";
} else {
console.log("Woah, elemNuevo && elemAnterior && opcionAnterior && opcionNueva no se cumple...\n" +
elemNuevo + " " + elemAnterior + " " + opcionAnterior + " " + opcionNueva);
}
},
incrementarContador(ep_ID, evento) {
const xhr = new XMLHttpRequest();
xhr.open("PUT", `${this.$store.state.servidor}/links`);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.onload = () => {
console.log(xhr.responseText);
};
xhr.send(`ep_ID=${ep_ID}`);
}
},
created() {
const xhr = new XMLHttpRequest();
const vm = this;
xhr.open("POST", `${this.$store.state.servidor}/links`);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.onload = () => {
try {
const data = YAML.parse(xhr.responseText);
if (data.exito) {
vm.datos = data.payload["opciones"];
vm.datosCorrectos = true;
vm.cambiarAviso(data.payload.aviso);
} else {
vm.mostrarSpinnerParaCargaDeEps = false;
console.log("Error al recibir los eps del anime. resp:\n" + xhr.responseText);
}
} catch (e) {
vm.mostrarSpinnerParaCargaDeEps = false;
console.log("Error al recibir los eps del anime:\n" + e + "\n" + xhr.responseText);
}
};
xhr.send(`animeID=${this.animeid}`);
} }
}
},
methods: {
cambiarDescripcionDescarga(idDestino) {
const quitarClase = (nombre, nombreClase) => {
const posInicial = nombre.indexOf(nombreClase);
if (posInicial !== -1)
return nombre.substring(0, posInicial-1);
else
return nombre
};
const elemAnterior = document.getElementById(`tarjeta${this.posActual}`);
const elemNuevo = document.getElementById(`tarjeta${idDestino}`);
const opcionAnterior = document.getElementById(`opcion${this.posActual}`);
const opcionNueva = document.getElementById(`opcion${idDestino}`);
if (elemNuevo && elemAnterior && opcionAnterior && opcionNueva) {
this.posActual = idDestino;
elemAnterior.style.display = "none";
opcionAnterior.style.backgroundColor = "transparent";
opcionAnterior.className = quitarClase(opcionNueva.className, "panel__titulo__variantes__variante--activa");
elemNuevo.style.display = "block";
opcionNueva.style.backgroundColor = opcionNueva.getAttribute("color-min");
opcionNueva.className += " panel__titulo__variantes__variante--activa";
} else {
console.log("Woah, elemNuevo && elemAnterior && opcionAnterior && opcionNueva no se cumple...\n" +
elemNuevo + " " + elemAnterior + " " + opcionAnterior + " " + opcionNueva);
}
},
incrementarContador(ep_ID, evento) {
const xhr = new XMLHttpRequest();
xhr.open("PUT", "/links");
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.onload = () => {
console.log(xhr.responseText);
};
xhr.send(`ep_ID=${ ep_ID }`);
}
},
created () {
const xhr = new XMLHttpRequest();
const vm = this;
xhr.open("POST","https://pseudosubs.com/links");
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.onload = () => {
try {
const data = YAML.parse(xhr.responseText);
if (data.opciones) {
vm.datos = data["opciones"];
vm.datosCorrectos = true;
} else {
vm.mostrarSpinnerParaCargaDeEps = false;
console.log("Error al recibir los eps del anime. resp:\n" + xhr.responseText);
}
} catch (e) {
vm.mostrarSpinnerParaCargaDeEps = false;
console.log("Error al recibir los eps del anime:\n" + e + "\n" + xhr.responseText);
}
};
console.log("Este es el query: " + `animeID=${ this.animeid }`);
xhr.send(`animeID=${ this.animeid }`);
} }
}
</script> </script>
<style scoped lang="sass"> <style scoped lang="sass">
@import "../../assets/sass/variables"
.icono-pequeno .aviso
font-size: 15px padding: 12px
padding: 0 5px
cursor: default
.panel__titulo .icono-pequeno
font: font-size: 15px
family: Muli, "Open Sans", sans-serif padding: 0 5px
size: xx-large cursor: default
weight: bold
color: white
text-align: center
.panel__titulo__variantes .panel__titulo
text-align: left border-radius: 10px 10px 0 0
font:
family: Muli, "Open Sans", sans-serif
size: xx-large
weight: bold
color: white
text-align: center
.panel__titulo__variantes__variante .panel__titulo__variantes
padding: 10px 40px text-align: left
user-select: none
cursor: pointer
display: inline-block
text-align: center
font:
size: large
weight: normal
.panel__titulo__variantes__variante--activa .panel__titulo__variantes__variante
font-weight: bold padding: 10px 40px
text-decoration: underline user-select: none
cursor: pointer
display: inline-block
text-align: center
font:
size: large
weight: normal
.panel__descripcion .panel__titulo__variantes__variante--activa
padding: 25px 15px font-weight: bold
// background-color: #f2f2f2 text-decoration: underline
.panel__descripcion__titulo .panel__descripcion
font: padding: 25px 15px
family: Muli, "Open Sans", sans-serif border-radius: 0 0 10px 10px
size: x-large
weight: bold
.panel__descripcion__link .panel__descripcion__titulo
a font:
font-weight: bold family: Muli, "Open Sans", sans-serif
size: x-large
weight: bold
.panel .panel__descripcion__link
border-radius: 3px a
font-weight: bold
.panel
border-radius: 3px
</style> </style>

View File

@ -19,6 +19,8 @@
</script> </script>
<style scoped lang="sass"> <style scoped lang="sass">
@import "../../assets/sass/variables"
.main .main
margin: 50px 0 margin: 50px 0
@ -39,5 +41,12 @@
family: Muli, "Open Sans", sans-serif family: Muli, "Open Sans", sans-serif
size: x-large size: x-large
@media only screen and (max-width: $movil)
.titulo
font-size: 2rem !important
.titulo__descr
font-size: large !important
// //
</style> </style>

View File

@ -69,9 +69,17 @@
font: font:
family: Muli, "Open Sans", sans-serif family: Muli, "Open Sans", sans-serif
size: 2.5rem size: 2.5rem
//
.descripcion .descripcion
padding: 50px 20px padding: 50px 20px
@media only screen and (max-width: $movil)
.caracsCont
padding: 0
.titulo
font-size: 2rem
//
</style> </style>

View File

@ -0,0 +1,78 @@
<template lang="pug">
div.fondo1.ntf
div.titulo.texto1 Notificaciones
br
p.descr.texto1.
Inicia sesión con Google y recibe notificaciones cuando salgan eps nuevos.
Solo los animes que decidas.<br>
<br>
Muy pronto...
br
div(:class="(NODE_ENV === 'production')? 'pronto': ''")
router-link.mas(to="/cuenta") Aprender más
boton-inicio-sesion
//
</template>
<script lang="coffee">
import botonInicioSesion from "../boton-inicio-sesion.vue"
export default
name: "notificaciones"
components:
"boton-inicio-sesion": botonInicioSesion
data: ->
gSignInParams:
client_id: "27783367584-1hms6h62heplhlvsaihl8vqs7ho3o2b7.apps.googleusercontent.com"
NODE_ENV: process.env.NODE_ENV
methods:
alIniciarSesion: (googleUser) ->
token = googleUser.getAuthResponse().id_token
xhr = new XMLHttpRequest()
xhr.open "POST", "#{this.$store.state.servidor}/u/validar"
xhr.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
xhr.onload = ->
console.log xhr.responseText
xhr.send "idToken=#{token}"
#
</script>
<style scoped lang="sass">
@import "../../assets/sass/variables"
.pronto
filter: opacity(15%)
.ntf
padding: 50px
.descr
font:
family: "Product Sans", "Open Sans", sans-serif
size: x-large
opacity: 0.75
.titulo
font:
size: 3rem
family: "Product Sans", "Open Sans", sans-serif
.mas
padding: 10px 20px
display: inline-block
border-radius: 3px
color: white
cursor: pointer
text-decoration: none
margin: 0 10px
font:
family: "Product Sans", "Open Sans", sans-serif
size: 1.3rem
background-color: $colorPrincipal
box-shadow: 0 3px 0 #00844c
//
</style>

View File

@ -1,164 +1,187 @@
<template lang="pug"> <template lang="pug">
div.texto2.fondo1.tarjeta div.texto2.fondo1.tarjeta
div.anime(v-if="!errorAnimesNoEncontrados") div.anime(v-if="!errorAnimesNoEncontrados")
div.fondo_1(:style="'background-color: ' + anime.color") div.fondo_1(:style="'background-color: ' + anime.color")
div.fondo_texto(:class="'fondo_texto--' + $store.state.modoColor") div.fondo_texto(:class="'fondo_texto--' + $store.state.modoColor")
div.cont div.cont
router-link(:to="anime.link") router-link(:to="anime.link")
div.titulo {{ anime.titulo }} div.titulo {{ anime.titulo }}
router-link(:to="anime.link") router-link(:to="anime.link")
img.imagen.tarjeta(:src="anime.imgUrl") div.imgCont
div.animeCont img.imagen.tarjeta(:src="anime.imgUrl")
div.descr {{ anime.descripcion }} div.animeCont
br div.descr {{ anime.descripcion }}
div.eps {{ anime.eps === 0? '?': anime.eps }} episodios. br
br div.eps {{ anime.eps === 0? '?': anime.eps }} episodios.
div.estudio Estudio: {{ anime.estudio }} br
br div.estudio Estudio: {{ anime.estudio }}
div.emision {{ anime.diaDeEmision? 'Nuevo ep los ' + anime.diaDeEmision : '' }} br
br div.emision {{ anime.diaDeEmision? 'Nuevo ep los ' + anime.diaDeEmision : '' }}
div.posActual br
span.boton.fondo1.texto1(@click="cambiarAnime('ant')") &larr; ant div.posActual
span.posicion {{ animeActual }} de {{ numAnimesRecientes }} span.boton.fondo1.texto1(@click="cambiarAnime('ant')") &larr; ant
span.boton.fondo1.texto1(@click="cambiarAnime('sig')") sig &rarr; span.posicion {{ animeActual }} de {{ numAnimesRecientes }}
div(v-else) Error. No hay animes que mostrar. Revisa tu conexión a internet. span.boton.fondo1.texto1(@click="cambiarAnime('sig')") sig &rarr;
// div(v-else) Error. No hay animes que mostrar. Revisa tu conexión a internet.
//
</template> </template>
<script lang="coffee"> <script lang="coffee">
DEV = process.env.NODE_ENV == "development" DEV = process.env.NODE_ENV == "development"
export default export default
name: "ultimos-eps" name: "ultimos-eps"
data: -> data: ->
numAnimesRecientes: 4 numAnimesRecientes: 5
animeActual: 0 animeActual: 0
anime: {} anime: {}
intervalo: {} intervalo: {}
cuentaAtrasCambio: {} cuentaAtrasCambio: {}
primeraCarga: true primeraCarga: true
computed: computed:
ultimosAnimes: -> ultimosAnimes: ->
animes = @$store.state.animes animes = @$store.state.animes
contador = 0 contador = 0
resultado = resultado =
for _anime in animes when contador < @numAnimesRecientes for _anime in animes when contador < @numAnimesRecientes
contador = contador + 1 contador = contador + 1
_anime _anime
errorAnimesNoEncontrados: -> errorAnimesNoEncontrados: ->
if @$store.state.animes[0]? if @$store.state.animes[0]?
if @primeraCarga if @primeraCarga
@anime = @obtenerSigAnime() @anime = @obtenerSigAnime()
@establecerIntervalo() @establecerIntervalo()
@primeraCarga = false @primeraCarga = false
false false
else else
true true
methods: methods:
obtenerSigAnime: -> obtenerSigAnime: ->
if @animeActual is @numAnimesRecientes if @animeActual is @numAnimesRecientes
@animeActual = 1 @animeActual = 1
else else
@animeActual++ @animeActual++
@ultimosAnimes[@animeActual - 1] @ultimosAnimes[@animeActual - 1]
obtenerAntAnime: -> obtenerAntAnime: ->
if @animeActual is 1 if @animeActual is 1
@animeActual = @numAnimesRecientes @animeActual = @numAnimesRecientes
else else
@animeActual-- @animeActual--
@ultimosAnimes[@animeActual - 1] @ultimosAnimes[@animeActual - 1]
cambiarAnime: (modo) -> cambiarAnime: (modo) ->
_ = this _ = this
clearInterval @intervalo clearInterval @intervalo
clearTimeout @cuentaAtrasCambio clearTimeout @cuentaAtrasCambio
@anime = @anime =
if modo is "sig" if modo is "sig"
@obtenerSigAnime() @obtenerSigAnime()
else else
@obtenerAntAnime() @obtenerAntAnime()
@cuentaAtrasCambio = setTimeout (() -> @cuentaAtrasCambio = setTimeout (() ->
_.establecerIntervalo() _.establecerIntervalo()
), 5000 ), 5000
establecerIntervalo: -> establecerIntervalo: ->
_ = this _ = this
@intervalo = setInterval (() -> @intervalo = setInterval (() ->
_.anime = _.obtenerSigAnime() _.anime = _.obtenerSigAnime()
), 5000 ), 5000
beforeDestroy: -> beforeDestroy: ->
clearInterval @intervalo clearInterval @intervalo
# #
</script> </script>
<style scoped lang="sass"> <style scoped lang="sass">
@import "../../assets/sass/variables" @import "../../assets/sass/variables"
.anime .anime
transition: background-color 250ms ease-out transition: background-color 250ms ease-out
height: 580px height: 580px
width: 100% width: 100%
position: relative position: relative
.titulo .titulo
font: font:
family: Muli, "Open Sans", sans-serif family: Muli, "Open Sans", sans-serif
size: xx-large size: xx-large
color: white color: white
padding-bottom: 10px padding-bottom: 10px
height: 54px height: 54px
// position: relative // position: relative
// width: 500px // width: 500px
overflow: visible overflow: visible
.fondo_1, .fondo_texto, .cont .fondo_1, .fondo_texto, .cont
position: absolute position: absolute
width: 100% width: 100%
height: 580px height: 580px
.fondo_1 .fondo_1
z-index: 1 z-index: 1
transition: background-color 500ms transition: background-color 500ms
.fondo_texto .fondo_texto
z-index: 3 z-index: 3
.fondo_texto--claro .fondo_texto--claro
background: linear-gradient(to right, transparent, rgba(255,255,255,0.8) 40%, $fondo2--claro 70%) background: linear-gradient(to right, transparent, rgba(255, 255, 255, 0.8) 40%, $fondo2--claro 70%)
.fondo_texto--oscuro .fondo_texto--oscuro
background: linear-gradient(to right, transparent, rgba(0,0,0,0.8) 40%, $fondo2--oscuro 70%) background: linear-gradient(to right, transparent, rgba(0, 0, 0, 0.8) 40%, $fondo2--oscuro 70%)
.animeCont .animeCont
max-height: 500px max-height: 500px
.posActual .posActual
position: absolute position: absolute
bottom: 15px bottom: 15px
left: 440px left: 440px
.boton
@extend %bordeRedondo-std
user-select: none
display: inline-block
padding: 5px 10px
margin: 0 10px
cursor: pointer
.cont .boton
padding: 10px 40px @extend %bordeRedondo-std
z-index: 4 user-select: none
a display: inline-block
text-decoration: none padding: 5px 10px
margin: 0 10px
cursor: pointer
.imagen .cont
@extend %bordeRedondo-std padding: 10px 40px
float: left z-index: 4
height: 500px
width: 360px
margin-right: 40px
// a
text-decoration: none
.imgCont
float: left
display: inline-block
text-align: center
.imagen
@extend %bordeRedondo-std
height: 500px
width: 360px
margin-right: 40px
@media only screen and (max-width: 900px)
.animeCont
display: none
.posActual
display: none
.imgCont
float: none
display: block
@media only screen and (max-width: 420px)
.imagen
height: auto
width: 100%
//
</style> </style>

View File

@ -0,0 +1,178 @@
<template lang="pug">
div
div.titulo Notificaciones (No disponible)
br
template(v-if="notf && serviceWorkers")
div.descr(v-if="estado === 0").
Registra tu navegador siguiendo estos pasos:
br
div.uno
span.num(:class="estadoNotificaciones === 'Permitido'? 'num--terminado': ''") 1
span.paso Permitir notificaciones
br
div.opc(v-if="estadoNotificaciones !== 'Permitido'")
p Estado de las notificaciones: {{ estadoNotificaciones }}
br
button.boton(v-if="estadoNotificaciones === 'No preguntado'"
@click="pedirNotificaciones()") Permitir notificaciones
div(v-if="estadoNotificaciones === 'Denegado'").
Tienes que permitir las notificaciones en los ajustes de tu navegador.
br
div.dos
span.num(:class="notificacionesProbadas? 'num--terminado': ''") 2
span.paso Probar notificaciones
br
div.opc(v-if="estadoNotificaciones === 'Permitido' && !notificacionesProbadas")
p.
Aceptaste las notificaciones, pero aun es posible que tu navegador no las
soporte. Haz click en el siguiente boton para probarlas:
br
button.boton(@click="probarNotificacion") Probar
br
br
span Ingresa el numero secreto:
input(type="number" min="0" max="100" v-model="numIngresado")
br
div.tres
span.num(:class="pushSuscrito? 'num--terminado': ''") 3
span.paso Suscribirse a las notificaciones
br
div.opc(v-if="estadoNotificaciones === 'Permitido' && notificacionesProbadas && !pushSuscrito")
button.boton(@click="suscribirse()") Suscribirse
div.fin(v-if="pushSuscrito")
p Tu navegador está listo.
template(v-else).
Lo sentimos, tu navegador no soporta notificaciones. Actualiza tu navegador.
//
</template>
<script lang="coffee">
publicVapidKey = "BPA_MfechJ8EwyMC_5-GZsWFtjPCD6f2qAzW5ouxnMs73mGTsgtD47of0pO1rKtpyWiWKE8yZVHHzTGhLHbfVRI"
urlBase64ToUint8Array = (base64String) ->
padding = '='.repeat((4 - base64String.length % 4) % 4);
base64 = (base64String + padding)
.replace(/-/g, '+')
.replace(/_/g, '/');
rawData = window.atob(base64);
outputArray = new Uint8Array(rawData.length);
`
for (let i = 0; i < rawData.length; ++i) {
outputArray[i] = rawData.charCodeAt(i)
}
`
outputArray
export default
name: "ajustes-notificaciones"
data: ->
estado: 0
estadoNotf: Notification.permission
notf: false
serviceWorkers: false
notificacionesProbadas: false
pushSuscrito: false
numAleatorio: Math.ceil Math.random() * 100
numIngresado: 0
watch:
numIngresado: (n, v) ->
if parseInt(n) is @numAleatorio
@notificacionesProbadas = true
computed:
estadoNotificaciones: ->
switch @estadoNotf
when "default" then "No preguntado"
when "granted" then "Permitido"
when "denied" then "Denegado"
methods:
pedirNotificaciones: ->
vm = this
Notification.requestPermission().then((res) ->
vm.estadoNotf = res
)
probarNotificacion: ->
vm = this
navigator.serviceWorker.getRegistration()
.then (reg) ->
reg?.showNotification "El numero secreto es #{vm.numAleatorio}"
suscribirse: ->
vm = this
navigator.serviceWorker.ready.then (reg) ->
try
subscripcion = await reg.pushManager.subscribe
userVisibleOnly: true
applicationServerKey: urlBase64ToUint8Array publicVapidKey
subsStr = JSON.stringify subscripcion
console.log subsStr
res = await fetch "#{vm.$store.state.servidor}/n/registrar", {
method: "POST"
body: "google_ID=#{vm.$store.state.usuarioActual.googleID}&subscripcion=#{subsStr}"
headers:
"Content-Type": "application/x-www-form-urlencoded"
}
jsonRespuesta = await res.json()
console.log jsonRespuesta
if res.ok
vm.pushSuscrito = true
catch e
console.error e
mounted: ->
@notf = window.Notification?
@serviceWorkers = navigator.serviceWorker?
#
</script>
<style scoped lang="sass">
@import "../../assets/sass/variables"
.titulo
font:
family: Muli, "Open Sans", sans-serif
size: 2rem
.num
font:
family: "Product Sans"
weight: bold
size: 1.5rem
display: inline-block
background-color: $colorSecundario
height: 34px
width: 34px
text-align: center
border-radius: 17px
.num--terminado
background-color: $colorPrincipal
.paso
margin-left: 10px
font-family: "Product Sans", Muli, "Open Sans", sans-serif
font-size: 1.5rem
.boton
padding: 10px 20px
display: inline-block
border: none
border-radius: 3px
color: white
cursor: pointer
text-decoration: none
font:
family: "Product Sans", "Open Sans", sans-serif
size: 1.3rem
background-color: $colorPrincipal
box-shadow: 0 3px 0 #00844c
.opc
margin-left: 45px
//
</style>

View File

@ -2,8 +2,8 @@
Barra Lateral. Responsivo hasta los 285px de ancho. --> Barra Lateral. Responsivo hasta los 285px de ancho. -->
<template lang="pug"> <template lang="pug">
div.barra div.barra
div.lateral.fondo2.ocultarEnMovil(:class="$store.state.barraLateralOculta? 'barraOculta': ''") div.lateral.fondo2.ocultarEnMovil.barraOculta
div.botonOcultar(@click="ocultarBarraLateral()" :style="'display: ' + (largoVentana < 1201? 'none': 'block')"). // div.botonOcultar(@click="ocultarBarraLateral()" :style="'display: ' + (largoVentana < 1201? 'none': 'block')").
{{ $store.state.barraLateralOculta? '>>': '<<' }} {{ $store.state.barraLateralOculta? '>>': '<<' }}
router-link.linkImg(to="/" title="Ir al inicio") router-link.linkImg(to="/" title="Ir al inicio")
@ -11,7 +11,6 @@
div.items.tarjeta.fondo1.texto2 div.items.tarjeta.fondo1.texto2
div.cambiarModo(@click="cambiarModoColor()") div.cambiarModo(@click="cambiarModoColor()")
span.ocultarEnTablet Cambiar a modo {{ modoSiguiente }}
i.material-icons.texto2.mostrarEnTablet. i.material-icons.texto2.mostrarEnTablet.
{{ modoSiguiente === 'oscuro'? 'brightness_3': 'brightness_5' }} {{ modoSiguiente === 'oscuro'? 'brightness_3': 'brightness_5' }}
br br
@ -19,28 +18,19 @@
br br
router-link(to="/") router-link(to="/")
span.ocultarEnTablet Nosotros i.material-icons.texto2.mostrarEnTablet(title="Nosotros") group
i.material-icons.texto2.mostrarEnTablet group
br.mostrarEnTablet br.mostrarEnTablet
router-link(to="/") router-link(to="/")
span.ocultarEnTablet Cambios i.material-icons.texto2.mostrarEnTablet(title="Ayuda") help
i.material-icons.texto2.mostrarEnTablet new_releases
br.mostrarEnTablet
router-link(to="/")
span.ocultarEnTablet Diseño
i.material-icons.texto2.mostrarEnTablet brush
br.mostrarEnTablet br.mostrarEnTablet
a(href="https://github.com/Araozu/PseudoSubs_" target="_blank" title="GitHub") a(href="https://github.com/Araozu/PseudoSubs_" target="_blank" title="GitHub")
span.ocultarEnTablet GitHub
img.imgGitHub.texto2.mostrarEnTablet( img.imgGitHub.texto2.mostrarEnTablet(
:src="modoSiguiente === 'oscuro'? '/img/github.svg': '/img/githubOsc.svg' ") :src="modoSiguiente === 'oscuro'? '/img/github.svg': '/img/githubOsc.svg' ")
br.mostrarEnTablet br.mostrarEnTablet
router-link(to="/cuenta") router-link(to="/cuenta")
span.ocultarEnTablet Ajustes
i.material-icons.texto2.mostrarEnTablet settings i.material-icons.texto2.mostrarEnTablet settings
div.ocultarEnTablet div.ocultarEnTablet
@ -97,11 +87,6 @@
"" ""
this.elemHtmlModoOscuro.innerHTML = resultado this.elemHtmlModoOscuro.innerHTML = resultado
ocultarBarraLateral: ->
estadoActual = @$store.state.barraLateralOculta
console.log "Anuma v: #{estadoActual}"
@$store.commit "cambiarBarraLateral"
created: -> created: ->
unless this.elemHtmlModoOscuro unless this.elemHtmlModoOscuro
nuevoElem = document.createElement "style" nuevoElem = document.createElement "style"
@ -114,8 +99,8 @@
if Storage? and localStorage.getItem "modoColor" if Storage? and localStorage.getItem "modoColor"
localStorage.getItem "modoColor" localStorage.getItem "modoColor"
else if Storage? else if Storage?
localStorage.setItem "modoColor", "oscuro" localStorage.setItem "modoColor", "claro"
"oscuro" "claro"
else else
console.log "No hay soporte para LocalStorage" console.log "No hay soporte para LocalStorage"
"claro" "claro"

View File

@ -0,0 +1,53 @@
<template lang="pug">
span
g-signin-button(:params="gSignInParams" @success="alIniciarSesion"
v-if="!$store.state.usuarioActual.googleID") Inicia sesión con Google
div.g-signin-button(v-else) Iniciaste sesión como {{ $store.state.usuarioActual.nombre }}
//
</template>
<script lang="coffee">
import YAML from "yaml"
export default
name: "boton-inicio-sesion"
data: ->
gSignInParams:
client_id: "27783367584-1hms6h62heplhlvsaihl8vqs7ho3o2b7.apps.googleusercontent.com"
methods:
alIniciarSesion: (googleUser) ->
vm = this
token = googleUser.getAuthResponse().id_token
xhr = new XMLHttpRequest()
xhr.open "POST", "#{this.$store.state.servidor}/u/validar"
xhr.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
xhr.onload = ->
res = YAML.parse xhr.responseText
if res.exito
vm.$store.commit "cambiarUsuarioActual", res.payload
else
console.log xhr.responseText
alert "Error al iniciar sesion."
xhr.send "idToken=#{token}"
#
</script>
<style scoped lang="sass">
.g-signin-button
padding: 10px 20px
display: inline-block
border-radius: 3px
color: white
cursor: pointer
text-decoration: none
font:
family: "Product Sans", "Open Sans", sans-serif
size: 1.3rem
background-color: #3c82f7
box-shadow: 0 3px 0 #0f69ff
//
</style>

View File

@ -4,9 +4,16 @@ import router from './router.coffee'
import store from './store.coffee' import store from './store.coffee'
import './registerServiceWorker' import './registerServiceWorker'
import VueDisqus from "vue-disqus" import VueDisqus from "vue-disqus"
import VueAnalytics from "vue-analytics"
import VueGSignIn from "vue-google-signin-button"
Vue.config.productionTip = false; Vue.config.productionTip = false;
Vue.use(VueDisqus); Vue.use(VueDisqus);
Vue.use(VueGSignIn);
Vue.use(VueAnalytics, {
id: 'UA-113477820-1',
router
});
new Vue({ new Vue({
router, router,

View File

@ -2,31 +2,48 @@
import { register } from 'register-service-worker' import { register } from 'register-service-worker'
/*
* Claves VAPID
* Publica: BPA_MfechJ8EwyMC_5-GZsWFtjPCD6f2qAzW5ouxnMs73mGTsgtD47of0pO1rKtpyWiWKE8yZVHHzTGhLHbfVRI
* Privada: 6dOp0WChG-fLFSo9hRnMUn5S1BVBm3KhK9r0m4L-GoA
* */
if (process.env.NODE_ENV === 'production') { if (process.env.NODE_ENV === 'production') {
register(`${process.env.BASE_URL}service-worker.js`, { register(`${process.env.BASE_URL}service-worker.js`, {
ready () { ready() {
console.log( console.log(
'App is being served from cache by a service worker.\n' + 'PseudoSubs está siendo servida desde un service worker.\n' +
'For more details, visit https://goo.gl/AFskqB' 'Para saber más visita https://goo.gl/AFskqB'
) )
}, },
registered () { registered(registration) {
console.log('Service worker has been registered.') console.log('Se ha registrado el Service worker.');
}, self.addEventListener("push", e => {
cached () { const data = e.data.json();
console.log('Content has been cached for offline use.') console.log("Recibi un push :D");
}, registration.showNotification(data.title, {
updatefound () { body: "Notificacion de prueba",
console.log('New content is downloading.') icon: "http://image.ibb.co/frYOFd/tmlogo.png"
}, });
updated () { });
console.log('New content is available; please refresh.') },
}, cached() {
offline () { console.log('Se ha cacheado el contenido para su uso sin internet.')
console.log('No internet connection found. App is running in offline mode.') },
}, updatefound() {
error (error) { console.log('Descargando nuevo contenido.')
console.error('Error during service worker registration:', error) },
} updated() {
}) console.log('Hay nuevo contenido disponible, recarga la página.');
// window.location.reload(true);
},
offline() {
console.log('No hay conexion a internet. ' +
'PseudoSubs se está ejecutando en modo sin internet.')
},
error(error) {
console.error('Error al registrar el service worker:', error)
}
});
} }

View File

@ -7,40 +7,45 @@ import AnimeList from "./views/AnimeList.vue"
import listaAnimes from "./components/AnimeList/lista-animes.vue" import listaAnimes from "./components/AnimeList/lista-animes.vue"
import Anime from "./components/Anime/Anime.vue" import Anime from "./components/Anime/Anime.vue"
import Error404 from "./views/Error404.vue" import Error404 from "./views/Error404.vue"
import Admin from "./views/Admin.vue"
Vue.use Router Vue.use Router
export default new Router export default new Router
mode: "history" mode: "history"
base: process.env.BASE_URL base: process.env.BASE_URL
routes: [ routes: [
path: "/" path: "/"
name: "Inicio" name: "Inicio"
component: Inicio component: Inicio
,
path: "/comparar"
name: "Comparar"
component: Comparar
,
path: "/Anime"
component: AnimeList
children: [
path: ":nombre"
component: Anime
, ,
path: "" path: "/comparar"
name: "Anime" name: "Comparar"
component: listaAnimes component: Comparar
,
path: "/Anime"
component: AnimeList
children: [
path: ":nombre"
component: Anime
,
path: ""
name: "Anime"
component: listaAnimes
]
,
path: "/cuenta"
name: "Usuario"
component: Usuario
,
path: "/admin"
name: "Admin"
component: Admin
,
path: "*"
name: "404"
component: Error404
] ]
, scrollBehavior: (to, from, savedPosition) ->
path: "/cuenta" x: 0
name: "Usuario" y: 0
component: Usuario
,
path: "*"
name: "404"
component: Error404
]
scrollBehavior: (to, from, savedPosition) ->
x: 0
y: 0

View File

@ -8,30 +8,34 @@ DEV = process.env.NODE_ENV == "development"
export default new Vuex.Store export default new Vuex.Store
state: state:
barraLateralOculta: servidor: unless DEV then "" else ""
(localStorage?.getItem "barraLateralOculta") == "true" ? true
animes: animes:
if localStorage? if localStorage?
YAML.parse ((localStorage.getItem "animes") ? "[]") YAML.parse ((localStorage.getItem "animes") ? "[]")
else else []
[]
modoColor: localStorage?.getItem "modoColor" ? "claro" modoColor: (localStorage?.getItem "modoColor") ? "claro"
tituloAnime: "Anime" tituloAnime: "Anime"
txtAdicionalAnime: "Comprimido sin perder 1 solo pixel." txtAdicionalAnime: "Comprimido sin perder 1 solo pixel."
mostrarImgAnime: false mostrarImgAnime: false
imgTituloAnime: "19_2_fruits_basket" imgTituloAnime: ""
rutaActual: [{nombre: "PseudoSubs", ruta: "/"}] rutaActual: [{nombre: "PseudoSubs", ruta: "/"}]
usuarioActual:
if localStorage?
YAML.parse ((localStorage.getItem "usuario") ? "{}" )
else {}
mutations: mutations:
cambiarBarraLateral: (state) ->
state.barraLateralOculta = !state.barraLateralOculta
localStorage?.setItem "barraLateralOculta", state.barraLateralOculta
establecerAnime: (state, animes) -> establecerAnime: (state, animes) ->
localStorage?.setItem "animes", YAML.stringify animes animesTxt = YAML.stringify animes
state.animes = animes animesLocal = localStorage?.getItem "animes"
unless animesTxt is animesLocal
localStorage?.setItem "animes", animesTxt
state.animes = animes
if DEV then console.log "Actualicé los animes"
else
if DEV then console.log "Ahorré tener que actualizar todo v:"
cambiarModoColor: (state, color) -> cambiarModoColor: (state, color) ->
state.modoColor = color state.modoColor = color
@ -51,4 +55,8 @@ export default new Vuex.Store
cambiarRutaActual: (state, valor) -> cambiarRutaActual: (state, valor) ->
state.rutaActual = valor state.rutaActual = valor
cambiarUsuarioActual: (state, valor) ->
state.usuarioActual = valor
if localStorage? then localStorage.setItem "usuario", YAML.stringify valor
actions: {} actions: {}

33
src/views/Admin.vue Normal file
View File

@ -0,0 +1,33 @@
<template lang="pug">
div.texto1
div.titulo.fondo1 Administracion
br
div Animes
lista-anime
//
</template>
<script lang="coffee">
import listaAnime from "../components/Admin/lista-animes.vue"
export default
name: "Admin"
components:
"lista-anime": listaAnime
created: ->
unless this.$route.query.p == "xsakah4b"
this.$router.push "/"
#
</script>
<style scoped lang="sass">
.titulo
padding: 50px
font:
family: "Product Sans", "Open Sans", sans-serif
size: 3rem
//
</style>

View File

@ -2,6 +2,7 @@
div.inicio div.inicio
ultimos-eps ultimos-eps
animes-novelas animes-novelas
notificaciones
br br
caracteristicas caracteristicas
y-notaras-la-diferencia y-notaras-la-diferencia
@ -13,6 +14,7 @@
import caracteristicas from "../components/Inicio/caracteristicas.vue" import caracteristicas from "../components/Inicio/caracteristicas.vue"
import yNotarasLaDiferencia from "../components/Inicio/y-notaras-la-diferencia.vue" import yNotarasLaDiferencia from "../components/Inicio/y-notaras-la-diferencia.vue"
import animesNovelas from "../components/Inicio/animes-novelas.vue" import animesNovelas from "../components/Inicio/animes-novelas.vue"
import notificaciones from "../components/Inicio/notificaciones.vue"
export default export default
name: "Inicio" name: "Inicio"
@ -21,6 +23,7 @@
'y-notaras-la-diferencia': yNotarasLaDiferencia 'y-notaras-la-diferencia': yNotarasLaDiferencia
'ultimos-eps': ultimosEps 'ultimos-eps': ultimosEps
'animes-novelas': animesNovelas 'animes-novelas': animesNovelas
notificaciones: notificaciones
created: -> created: ->
@$store.commit "cambiarRutaActual", [{nombre: "PseudoSubs", ruta: "/"}] @$store.commit "cambiarRutaActual", [{nombre: "PseudoSubs", ruta: "/"}]
# #

View File

@ -1,80 +1,105 @@
<template lang="pug"> <template lang="pug">
div.texto1 div.texto1
div.tarjeta.fondo1.tituloC div.tarjeta.fondo1.tituloC
div.titulo Ajustes div.titulo Ajustes
div.titulo__descr Configura la página a tu gusto. div.titulo__descr Configura la página a tu gusto.
br br
div.row div.row
div.usuario div.usuario
div.usuario__cont.tarjeta.fondo1 div.usuario__cont.tarjeta.fondo1
div.usuario__titulo Mis Datos div.usuario__titulo Mis Datos
br br
img.usuario__img template(v-if="$store.state.usuarioActual.googleID")
br div.contImg
div.usuario__nombre Nombre: img.usuario__img(:src="$store.state.usuarioActual.fotoPerfil")
div.usuario__correo Correo: div.usuario__nombre Nombre: {{ $store.state.usuarioActual.nombre }}
br div.usuario__correo Correo: {{ $store.state.usuarioActual.email }}
br br
div.usuario__info Estos son todos los datos que almacenamos de ti. div.usuario__info.
div.notificaciones Eso es todo. Puedes cambiar tu nombre y correo sin afectar tu cuenta de Google.
div.notificaciones__cont.tarjeta.fondo1 Notificaciones template(v-else)
// div.
Inicia sesión* para poder recibir notificaciones en todos tus dispositivos.
br
boton-inicio-sesion
br
br
p.
* No necesitas iniciar sesión para tener notificaciones, solo para controlar
tus dispositivos.<br>
* Aun no disponible.
div.notificaciones
div.notificaciones__cont.tarjeta.fondo1
ajustes-notificaciones
//
</template> </template>
<script lang="coffee"> <script lang="coffee">
import botonInicioSesion from "../components/boton-inicio-sesion.vue"
import ajustesNotificaciones from "../components/Usuario/ajustes-notificaciones.vue"
export default export default
name: "Usuario" name: "Usuario"
components:
"boton-inicio-sesion": botonInicioSesion
"ajustes-notificaciones": ajustesNotificaciones
#
</script> </script>
<style scoped lang="sass"> <style scoped lang="sass">
@import "../assets/sass/variables" @import "../assets/sass/variables"
.tituloC .tituloC
padding: 50px padding: 50px
.titulo .titulo
font: font:
family: "Product Sans", Muli, "Open Sans", sans-serif family: "Product Sans", Muli, "Open Sans", sans-serif
size: 4rem size: 4rem
weight: bold weight: bold
.titulo__descr .titulo__descr
opacity: 0.5 opacity: 0.5
font: font:
family: Muli, "Open Sans", sans-serif family: Muli, "Open Sans", sans-serif
size: x-large size: x-large
.row .row
margin: 0 40px margin: 0 40px
::after
content: ""
display: table
clear: both
.usuario, .notificaciones ::after
float: left content: ""
display: table
clear: both
.usuario .usuario, .notificaciones
width: 40% float: left
.usuario__titulo .usuario
font: width: 40%
family: Muli, "Open Sans", sans-serif
size: 2rem
.usuario__img .usuario__titulo
width: 200px font:
height: 200px family: Muli, "Open Sans", sans-serif
size: 2rem
.notificaciones .contImg
width: 60% text-align: center
.usuario__cont, .notificaciones__cont .usuario__img
@extend %bordeRedondo-std width: 200px
padding: 20px height: 200px
margin: 20px
// .notificaciones
width: 60%
.usuario__cont, .notificaciones__cont
@extend %bordeRedondo-std
padding: 20px
margin: 20px
//
</style> </style>

3
srv/.babelrc Normal file
View File

@ -0,0 +1,3 @@
{
"presets": ["@babel/preset-env"]
}

View File

@ -0,0 +1,41 @@
import {MysqlError} from "mysql";
interface Datos {
aviso: string,
sigEp: number,
anime_ID: number
}
import {con} from "../../index";
const cambiarMensaje = (req: any, res: any) => {
const YAML = require('yaml');
const datosStr = req.body.datos;
if (datosStr) {
const data: Datos = YAML.parse(datosStr);
const sql = `UPDATE links SET aviso=?, sigEp=? WHERE anime_ID=?`;
const datosSQL = [data.aviso, data.sigEp, data.anime_ID];
con.query(sql, datosSQL,(err: MysqlError) => {
if (!err) {
res.send(`exito: true`);
} else {
console.log(`Error al ejecutar query en /Admin/Eps/cambiarMensaje.ts:\n${err}\n${err.sql}`);
res.send(`exito: false\nerror: Error de consulta(0)..`);
}
});
} else {
console.log(`Error. Los datos no existen en /Admin/Eps/cambiarMensaje.ts`);
res.send(`exito: false\nerror: Los datos no existen.`);
}
};
module.exports.cambiarMensaje = cambiarMensaje;

View File

@ -0,0 +1,40 @@
interface formatoDataARecibir {
opcion_ID: number,
num_ep: number,
visitas: number,
link: string,
peso: string
}
import {con} from "../../index";
const crearLink = (req: any, res: any) => {
const YAML = require('yaml');
const parametros: formatoDataARecibir = YAML.parse(req.body.params);
if (parametros) {
const query = `INSERT INTO eps (opcion_ID, num_ep, visitas, link, peso) VALUES (${parametros.opcion_ID},
${parametros.num_ep}, ${parametros.visitas}, ${con.escape(parametros.link)}, ${con.escape(parametros.peso)} )`;
con.query(query, (err: Error) => {
if (!err) {
res.send("error: false");
} else {
console.log("Error al ejecutar query en /Admin/Eps/crearEp -> con.query (linea 20). Query y error:\n" + query + "\n" + parametros);
res.send("error: true");
}
});
} else {
console.log("Error. 'parametros' no existe en /Admin/Eps/crearEp -> con.connect (linea 16):\n" + parametros);
res.send("error: true");
}
};
module.exports.crearLink = crearLink;

View File

@ -0,0 +1,87 @@
import {MysqlError} from "mysql";
interface Datos {
num_opcion: number,
formato: string,
resolucion: string,
servidor: string,
anime_ID: number,
color: string
}
import {con} from "../../index";
const crearVariante = (req: any, res: any) => {
const YAML = require('yaml');
const mysql = require('mysql');
const datos: string = req.body.datos;
if (datos) {
const data: Datos = YAML.parse(datos);
const E = mysql.escape;
const crearEntrada = (respuesta: [{links_ID: number}]) => {
const links_ID = respuesta[0].links_ID;
const query = `INSERT INTO links_opciones (links_ID, num_opcion, formato, res, servidor, color)
VALUES(${links_ID}, ${data.num_opcion}, ${E(data.formato)}, ${E(data.resolucion)}, ${E(data.servidor)}, ${E(data.color)})`;
con.query(query,(err: MysqlError) => {
if (!err) {
res.send(`exito: true`);
} else {
console.log(`Error al ejecutar query en /Admin/Eps/crearVariante.ts\n:${err}\n${err.sql}`);
res.send(`exito: false\nerror: Consulta fallida(3).`);
}
});
};
con.query(
`SELECT links_ID FROM links WHERE anime_ID=${data.anime_ID}`,
(err: MysqlError, respuesta: [{links_ID: number}]) => {
// Ya existe el link en la base de datos
if (!err && respuesta[0]) {
crearEntrada(respuesta);
}
// No existe el link en la base de datos
else if (!err && !respuesta[0]) {
con.query(`INSERT INTO links (anime_ID, aviso, sigEp) VALUES (${data.anime_ID}, 'Patience from zhou', 0)`, (err: MysqlError) => {
if (!err) {
con.query(
`SELECT links_ID FROM links WHERE anime_ID=${data.anime_ID}`,
(err: MysqlError, respuesta: [{links_ID: number}]) => {
if (!err) {
crearEntrada(respuesta);
} else {
console.log(`Error al ejecutar query en /Admin/Eps/crearVariante.ts\n:${err}\n${err.sql}`);
res.send(`exito: false\nerror: Consulta fallida(2).`);
}
});
}
else {
console.log(`Error al ejecutar query en /Admin/Eps/crearVariante.ts\n:${err}\n${err.sql}`);
res.send(`exito: false\nerror: Consulta fallida(1).`);
}
});
}
else {
console.log(`Error al ejecutar query en /Admin/Eps/crearVariante.ts\n:${err}\n${err.sql}`);
res.send(`exito: false\nerror: Consulta fallida(0).`);
}
});
} else {
console.log(`Error. Los datos no existen en /Admin/Eps/crearVariante.ts`);
res.send(`exito: false\nerror: Los datos no existen.`);
}
};
module.exports.crearVariante = crearVariante;

View File

@ -0,0 +1,35 @@
import {Connection, MysqlError} from "mysql";
import * as core from "express-serve-static-core";
import {con} from "../../index";
const YAML = require('yaml');
interface respuesta {
peso: string
}
const estadisticas = (req: core.Request, res: core.Response) => {
con.query(`SELECT peso FROM eps`,(err: MysqlError, respuestas: respuesta[]) => {
if (!err) {
let totalMB = 0;
let cantidadEps = 0;
respuestas.forEach(data => {
totalMB += parseInt(data.peso);
cantidadEps++;
});
const respuesta: any = {
episodios: cantidadEps,
gigas: (totalMB/1024).toFixed(2)
};
res.send(YAML.stringify(respuesta));
}
});
};
module.exports.estadisticas = estadisticas;

View File

@ -0,0 +1,39 @@
interface epsRespuesta {
ep_ID: number,
opcion_ID: number,
num_ep: number,
visitas: number,
link: string,
peso: string
}
import {con} from "../../index";
const obtenerLinks = (req: any, res: any) => {
const YAML = require('yaml');
const opcion_ID = req.params.opcion_ID;
if (opcion_ID) {
const query = `SELECT * FROM eps WHERE opcion_ID=${opcion_ID}`;
con.query(query, (err: Error, response: epsRespuesta[]) => {
if (!err) {
res.send(YAML.stringify(response));
} else {
console.log("Error al ejecutar query en /Admin/Eps/obtenerEps con.query (linea 21). Query:\n" + query + "\nError: \n" + err);
res.send("error: true");
}
});
} else {
console.log("Error. opcion_ID no existe en /Admin/Eps/obtenerEps con.connect (linea 8)");
res.send("error: true");
}
};
module.exports.obtenerLinks = obtenerLinks;

View File

@ -0,0 +1,41 @@
interface respuestaLinks {
opcion_ID: number,
links_ID: number,
num_opcion: number,
formato: string,
res: string,
servidor: string,
color: string
}
import {con} from "../../index";
const obtenerVariantes = (req: any, res: any) => {
const YAML = require('yaml');
const anime_ID: string = req.params.anime_ID;
if (anime_ID) {
const query = `SELECT * FROM links_opciones WHERE links_ID=(SELECT links_ID FROM links WHERE anime_ID=${anime_ID})`;
con.query (query, (err: Error, response: respuestaLinks[]) => {
if (!err) {
res.send(YAML.stringify(response));
} else {
console.log("Error al ejecutar query sql. La query era:\n" + query + "\n y el error es:\n" + err);
res.send("error: true");
}
});
} else {
console.log("Error. anime_ID no existe en Admin/Eps/obtenerVariantes con.connect:\n" + anime_ID);
res.send("error: true");
}
};
module.exports.obtenerVariantes = obtenerVariantes;

View File

@ -1,22 +1,21 @@
import { con } from "../index" import {con} from "../index"
import YAML from "yaml" import YAML from "yaml"
export default (req, res) -> export default (req, res) ->
if req.params.id?
idAnime = req.params.id
if req.params.id? query = "SELECT * FROM animes WHERE anime_ID=?"
idAnime = req.params.id
query = "SELECT * FROM animes WHERE anime_ID=?" con.query query, [idAnime], (err, respuesta) ->
res.send do ->
con.query query, [idAnime], (err, respuesta) -> unless err
res.send do -> YAML.stringify
unless err exito: true
YAML.stringify payload: respuesta[0]
exito: true error: {}
payload: respuesta[0] else
error: {} """
else
"""
exito: false exito: false
payload: {} payload: {}
error: error:
@ -25,8 +24,8 @@ export default (req, res) ->
adicional: "Query: #{query}\nError:#{err}" adicional: "Query: #{query}\nError:#{err}"
""" """
else else
res.send """ res.send """
exito: false exito: false
payload: {} payload: {}
error: error:

View File

@ -1,18 +1,17 @@
import { con } from "../index" import {con} from "../index"
import YAML from "yaml" import YAML from "yaml"
export default (req, res) -> export default (req, res) ->
query = "SELECT * FROM animes ORDER BY anime_ID DESC "
query = "SELECT * FROM animes ORDER BY anime_ID DESC " con.query query, (err, respuesta) ->
con.query query, (err, respuesta) -> res.send do ->
res.send do -> unless err
unless err YAML.stringify
YAML.stringify exito: true
exito: true payload: respuesta
payload: respuesta error: {}
error: {} else
else """
"""
exito: false exito: false
payload: {} payload: {}
error: error:

View File

@ -0,0 +1,24 @@
class GestorDeTareas {
tareas: boolean[] = [];
alCompletar: (() => void);
constructor(alCompletar: (() => void)) {
this.alCompletar = alCompletar;
}
agregarTarea() {
return (this.tareas.push(false) - 1);
}
terminarTarea() {
this.tareas.pop();
this.verificarTareas();
}
verificarTareas() {
if (this.tareas.length === 0)
this.alCompletar();
}
}
module.exports.GestorDeTareas = GestorDeTareas;

View File

@ -0,0 +1,33 @@
import {con} from "../index"
import YAML from "yaml"
export fun = (req, res) ->
params = req.body.params
if params?
params = YAML.parse params
sql = "INSERT INTO eps (opcion_ID, num_ep, visitas, link, peso) VALUES (?, ?, ?, ?, ?)"
datos = [params.opcion_ID, params.num_ep, params.visitas, params.link, params.peso]
con.query sql, datos, (err) ->
unless err?
res.send YAML.stringify
exito: true
payload: {}
error: {}
else
res.send YAML.stringify
exito: false
payload: {}
error:
razon: "Error al ejecutar consulta a la base de datos."
ruta: "/Links/crearLinks"
adicional: "sql: \n#{err.sql}\nerr:\n#{err}"
else
res.send YAML.stringify
exito: false
payload: {}
error:
razon: "No se pasaron los params."
ruta: "/Links/crearLinks"
adicional: ""

View File

@ -0,0 +1,38 @@
import {con} from "../index";
const modificarLink = (req: any, res: any) => {
const ep_ID = req.body.ep_ID;
const sql1= `SELECT visitas FROM eps WHERE ep_ID=${ep_ID}`;
const sql = `UPDATE eps SET visitas = visitas + 1 WHERE ep_ID=${ep_ID}`;
con.query(
sql1,
(err: Error, respuesta: {visitas: number}[]) => {
if (!err) {
const nuevoNumVisitas = respuesta[0].visitas + 1;
const sql2 = `UPDATE eps SET visitas=${nuevoNumVisitas} WHERE ep_ID=${ep_ID}`;
con.query(sql2, (err: Error) => {
if (!err) {
res.send("Exito");
} else {
res.send("Error");
console.log(`Error al actualizar el contador de clicks del ep ${ep_ID} en \
LinksAnimes/modificarLinks:\n${err}\nSQL:\n${sql2}`);
}
});
} else {
console.log(`Error al actualizar el contador de clicks del ep ${ep_ID} en \
LinksAnimes/modificarLinks:\n${err}\nSQL:\n${sql1}`);
res.send("Error :c");
}
}
);
};
module.exports.modificarLinks = modificarLink;

View File

@ -0,0 +1,115 @@
YAML = require("yaml")
con = require("../index").con
class GestorDeTareas
constructor: (@alCompletar) ->
@tareas = []
agregarTarea: -> @tareas.push(false) - 1
terminarTarea: ->
@tareas.pop()
@verificarTareas()
verificarTareas: ->
if @tareas.length is 0 then @alCompletar()
export obtenerLinks = (req, res) ->
animeID = req.body.animeID
if animeID?
retorno =
aviso: ""
sigEp: ""
opciones: {}
sql = "SELECT * FROM links WHERE anime_ID=#{animeID}"
con.query sql, (err, response) ->
if not err? and response?.length isnt 0
link = response[0]
retorno.aviso = link.aviso
retorno.sigEp = link.sigEp
gestorOpciones = new GestorDeTareas () ->
res.send YAML.stringify
exito: true
payload: retorno
error: {}
sql2 = "SELECT * FROM links_opciones WHERE links_ID=#{link.links_ID}"
con.query sql2, (err, response2) ->
if not err? and response2?.length isnt 0
response2.forEach (opcion, pos) ->
gestorOpciones.agregarTarea()
retorno.opciones[opcion.num_opcion] =
formato: opcion.formato
res: opcion.res
servidor: opcion.res
color: opcion.color
eps: {}
sql3 = "SELECT * FROM eps WHERE opcion_ID=#{opcion.opcion_ID}"
con.query sql3, (err, response3) ->
if not err? and response3?.length isnt 0
response3.forEach (ep) ->
retorno.opciones[opcion.num_opcion].eps[ep.num_ep] =
ep_ID: ep.ep_ID
visitar: ep.visitas
peso: ep.peso
link: ep.link
else if response3?.length isnt 0
console.log "Error al consultar eps en /LinksAnimes/obtenerLinks.\n err: #{err}\n sql: #{sql3}"
gestorOpciones.terminarTarea()
else if response2?.length is 0
res.send YAML.stringify
exito: false
payload: {}
error: {
razon: "La consulta no dió ningún resultado."
ruta: "/LinksAnimes/obtenerLinks"
adicional: "(response2) SQL: #{sql2}\nanimeID: #{animeID}"
}
else
res.send YAML.stringify
exito: false
payload: {}
error: {
razon: "Error al ejecutar consulta."
ruta: "/LinksAnimes/obtenerLinks"
adicional: "(response2) sql: #{sql2}"
}
else if response.length is 0
res.send YAML.stringify
exito: false
payload: {}
error: {
razon: "La consulta no dió ningún resultado."
ruta: "/LinksAnimes/obtenerLinks"
adicional: "SQL: #{sql}\nanimeID: #{animeID}"
}
else
res.send YAML.stringify
exito: false
payload: {}
error: {
razon: "Error al ejecutar consulta."
ruta: "/LinksAnimes/obtenerLinks"
adicional: "sql: #{sql}"
}
else
res.send YAML.stringify
exito: false
payload: {}
error:
razon: "No se envió un animeID"
ruta: "/LinksAnimes/obtenerLinks"
adicional: "valor: #{animeID}"

View File

@ -0,0 +1,14 @@
con = require("../index").con
export fun = (req, res) ->
google_ID = req.body.google_ID
subscripcion = req.body.subscripcion
query = "INSERT INTO navegadores (google_ID, animesSuscritos, susbscripcion) VALUES (?, ?, ?); SELECT LAST_INSERT_ID()"
datos = [google_ID, subscripcion, "{}"]
con.query query, datos, (err, respuesta) ->
unless err?
res.status(201).json {exito: true, payload: idInsertado: respuesta[1][0]}
else
res.status(400).json {exito: false, razon: err}

View File

@ -0,0 +1,32 @@
import {con} from "../index"
import YAML from "yaml"
export fun = (req, res) ->
anime_ID = req.params.anime_ID
if anime_ID?
sql = "SELECT * FROM ed WHERE anime_ID=? ORDER BY num_ED ASC "
datos = [anime_ID]
con.query sql, datos, (err, respuesta) ->
unless err?
res.send YAML.stringify
exito: true
payload: respuesta
error: {}
else
res.send YAML.stringify
exito: false
payload: {}
error:
razon: "Error al ejecutar consulta a la base de datos."
ruta: "/Op-ED/obtenerED"
adicional: "Query: \n#{err.query}\nError: \n#{err}"
else
res.send YAML.stringify
exito: false
payload: {}
error:
razon: "No se envio ningun anime_ID. Actual: #{anime_ID}"
ruta: "/Op-ED/obtenerED"
adicional: {}
#

View File

@ -0,0 +1,32 @@
import {con} from "../index"
import YAML from "yaml"
export fun = (req, res) ->
anime_ID = req.params.anime_ID
if anime_ID?
sql = "SELECT * FROM op WHERE anime_ID=? ORDER BY num_OP ASC"
datos = [anime_ID]
con.query sql, datos, (err, respuesta) ->
unless err?
res.send YAML.stringify
exito: true
payload: respuesta
error: {}
else
res.send YAML.stringify
exito: false
payload: {}
error:
razon: "Error al ejecutar consulta a la base de datos."
ruta: "/Op-ED/obtenerOP"
adicional: "Query: \n#{err.query}\nError: \n#{err}"
else
res.send YAML.stringify
exito: false
payload: {}
error:
razon: "No se envio ningun anime_ID. Actual: #{anime_ID}"
ruta: "/Op-ED/obtenerOP"
adicional: {}
#

View File

@ -0,0 +1,84 @@
CLIENT_ID = "27783367584-1hms6h62heplhlvsaihl8vqs7ho3o2b7.apps.googleusercontent.com"
OAuth2Client = require("google-auth-library").OAuth2Client
cliente = new OAuth2Client CLIENT_ID
YAML = require("yaml")
con = require("../index").con
verificar = (token) ->
new Promise (resolve, reject) ->
cliente.verifyIdToken
idToken: token
audience: CLIENT_ID
.then (ticket) ->
ticket.getPayload()
.then (res) -> resolve res
.catch (err) -> reject err
export fun = (req, res) ->
idToken = req.body.idToken
if idToken?
verificar idToken
.then (payload) ->
sql1 = "SELECT * FROM usuarios WHERE google_ID=?"
datos = [payload.sub]
con.query sql1, datos, (err, resultadoQ) ->
unless err?
if resultadoQ[0]?
usuario = resultadoQ[0]
res.send YAML.stringify
exito: true
payload:
user_ID: usuario.user_ID
nombre: usuario.nombre
email: usuario.email
fotoPerfil: usuario.fotoPerfil
googleID: usuario.google_ID
error: {}
else
sql = "INSERT INTO usuarios (google_ID, email, fotoPerfil, nombre) VALUES (?, ?, ?, ?)"
datos2 = [payload.sub, payload.email, payload.picture, payload.name]
con.query sql, datos2, (err) ->
unless err?
res.send YAML.stringify
exito: true
payload:
nombre: payload.nombre
email: payload.email
fotoPerfil: payload.picture
googleID: payload.sub
error: {}
else
res.send YAML.stringify
exito: false
payload: {}
error:
razon: "Error al ejecutar consulta a la base de datos.\n#{err}"
ruta: "/Usuarios/ValidarUsuario"
adicional: "query: #{err.sql}\ntoken Verificado: #{JSON.stringify payload}"
else
res.send YAML.stringify
exito: false
payload: {}
error:
razon: "Error al ejecutar consulta a la base de datos.\n#{err}"
ruta: "/Usuarios/ValidarUsuario"
adicional: "query: #{err.sql}"
.catch (err) ->
res.send YAML.stringify
exito: false
payload: {}
error:
razon: err
ruta: "/Usuarios/ValidarUsuario"
adicional: ""
else
res.send YAML.stringify
exito: false
payload: {}
error:
razon: "No se envió el token: #{idToken}"
ruta: "/Usuarios/ValidarUsuario"
adicional: ""
#

View File

@ -1,27 +1,70 @@
import express from 'express'; "use strict";
import mysql from "mysql"; Object.defineProperty(exports, "__esModule", { value: true });
var mysql = require("mysql");
import obtenerAnimes from "./Anime/obtenerAnime" var obtenerAnime_1 = require("./Anime/obtenerAnime");
import obtenerTodosAnimes from "./Anime/obtenerTodosAnimes" var obtenerTodosAnimes_1 = require("./Anime/obtenerTodosAnimes");
var webPush = require("web-push");
export const con = mysql.createConnection({ exports.con = mysql.createConnection({
host: "127.0.0.1", host: "127.0.0.1",
user: "pseubntq_araozu", user: "pseubntq_araozu",
password: "@Xsakah4b", password: "@Xsakah4b",
database: "pseubntq_pseudosubs" database: "pseubntq_pseudosubs",
multipleStatements: true
}); });
con.connect(err => { exports.con.connect(function (err) {
if (err) { if (err) {
console.log("Error al conectarse a la base de datos :c\n" + err); console.error("Error al conectarse a la base de datos :c\n" + err);
} else { }
else {
console.log("Exito al conectarse a la base de datos :D"); console.log("Exito al conectarse a la base de datos :D");
} }
}); });
exports.fun = function (app) {
var bodyParser = require("body-parser");
export default (app, http) => { app.use(bodyParser.urlencoded({ extended: true }));
// app.use(bodyParser.json);
app.get("/anime/:id", obtenerAnimes); webPush.setVapidDetails("mailto:tbyuyfcjjll@gmail.com", "BPA_MfechJ8EwyMC_5-GZsWFtjPCD6f2qAzW5ouxnMs73mGTsgtD47of0pO1rKtpyWiWKE8yZVHHzTGhLHbfVRI", "6dOp0WChG-fLFSo9hRnMUn5S1BVBm3KhK9r0m4L-GoA");
app.get("/anime", obtenerTodosAnimes); app.post("/anime/:id", obtenerAnime_1.default);
app.post("/anime", obtenerTodosAnimes_1.default);
} app.post("/u/validar", require("./Usuarios/ValidarUsuario").fun);
app.post("/n/registrar", require("./Notificaciones/RegistrarSubcripcion").fun);
app.post("/op/:anime_ID", require("./OP-ED/obtenerOP").fun);
app.post("/ed/:anime_ID", require("./OP-ED/obtenerED").fun);
app.post("/eps/links/", require("./Links/crearLinks").fun);
/**
* Rutas Legacy :c */
app.post('/links', require('./LinksAnimes/obtenerLinks').obtenerLinks);
app.put('/links', require('./LinksAnimes/modificarLink').modificarLinks);
app.post('/eps/variantes/:anime_ID', require('./Admin/Eps/obtenerVariantes').obtenerVariantes);
app.put('/eps/variantes/', require('./Admin/Eps/crearVariante').crearVariante);
app.put('/eps/mensaje/', require('./Admin/Eps/cambiarMensaje').cambiarMensaje);
app.post('/eps/links/:opcion_ID', require('./Admin/Eps/obtenerLinks').obtenerLinks);
app.post('/estadisticas', require('./Admin/Eps/estadisticas').estadisticas);
// Fin
/*
* Claves VAPID
* Publica: BPA_MfechJ8EwyMC_5-GZsWFtjPCD6f2qAzW5ouxnMs73mGTsgtD47of0pO1rKtpyWiWKE8yZVHHzTGhLHbfVRI
* Privada: 6dOp0WChG-fLFSo9hRnMUn5S1BVBm3KhK9r0m4L-GoA
* */
app.get("/n/test", function (req, res) {
console.log("Deberia enviar push...");
var payload = JSON.stringify({
title: "Push de ejemplo :3"
});
var subscripcion = { "endpoint": "https://fcm.googleapis.com/fcm/send/e-n6_jndfTw:APA91bGQrFOYgICLRm-diDHwJnI4909TiQB_FqnffBd6PnyyoiB2rDqehn41KxXMyw5Upa0IqqDnlr58-n3B9w6WCN6xY-sluDk8fpya928S_NPgJyAvbhFERN3Gqqy36s4J4OVDz6qL", "expirationTime": null, "keys": { "p256dh": "BGNpJIqpEkJPjVZcccV42TdXQi-G3nt6gVWXIMkRs69fWyQeLN7K-sEBs7ffyCiosJm4ApwY9_ol2Q57Zv5fg08", "auth": "DzzSWijI-WfBPWrI6eGcuw" } };
webPush.sendNotification(subscripcion, payload)
.then(function (response) {
console.log(JSON.stringify(response));
res.status(200);
res.send("Exito :D");
})
.catch(function (err) {
console.log(JSON.stringify(err));
res.status(400);
res.send("Error al enviar push :c\n" + err);
});
});
};
exports.default = (function (app, http) {
exports.fun(app);
});

94
srv/index.ts Normal file
View File

@ -0,0 +1,94 @@
const mysql = require("mysql");
import obtenerAnimes from "./Anime/obtenerAnime"
import obtenerTodosAnimes from "./Anime/obtenerTodosAnimes"
const webPush = require("web-push");
export const con = mysql.createConnection({
host: "127.0.0.1",
user: "pseubntq_araozu",
password: "@Xsakah4b",
database: "pseubntq_pseudosubs",
multipleStatements: true
});
con.connect(err => {
if (err) {
console.error("Error al conectarse a la base de datos :c\n" + err);
} else {
console.log("Exito al conectarse a la base de datos :D");
}
});
export const fun = app => {
const bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({ extended: true }));
// app.use(bodyParser.json);
webPush.setVapidDetails(
"mailto:tbyuyfcjjll@gmail.com",
"BPA_MfechJ8EwyMC_5-GZsWFtjPCD6f2qAzW5ouxnMs73mGTsgtD47of0pO1rKtpyWiWKE8yZVHHzTGhLHbfVRI",
"6dOp0WChG-fLFSo9hRnMUn5S1BVBm3KhK9r0m4L-GoA"
);
app.post("/anime/:id", obtenerAnimes);
app.post("/anime", obtenerTodosAnimes);
app.post("/u/validar", require("./Usuarios/ValidarUsuario").fun);
app.post("/n/registrar", require("./Notificaciones/RegistrarSubcripcion").fun);
app.post("/op/:anime_ID", require("./OP-ED/obtenerOP").fun);
app.post("/ed/:anime_ID", require("./OP-ED/obtenerED").fun);
app.post("/eps/links/", require("./Links/crearLinks").fun);
/**
* Rutas Legacy :c */
app.post('/links', require('./LinksAnimes/obtenerLinks').obtenerLinks);
app.put('/links', require('./LinksAnimes/modificarLink').modificarLinks);
app.post('/eps/variantes/:anime_ID', require('./Admin/Eps/obtenerVariantes').obtenerVariantes);
app.put('/eps/variantes/', require('./Admin/Eps/crearVariante').crearVariante);
app.put('/eps/mensaje/', require('./Admin/Eps/cambiarMensaje').cambiarMensaje);
app.post('/eps/links/:opcion_ID', require('./Admin/Eps/obtenerLinks').obtenerLinks);
app.post('/estadisticas', require('./Admin/Eps/estadisticas').estadisticas);
// Fin
/*
* Claves VAPID
* Publica: BPA_MfechJ8EwyMC_5-GZsWFtjPCD6f2qAzW5ouxnMs73mGTsgtD47of0pO1rKtpyWiWKE8yZVHHzTGhLHbfVRI
* Privada: 6dOp0WChG-fLFSo9hRnMUn5S1BVBm3KhK9r0m4L-GoA
* */
app.get("/n/test", (req, res) => {
console.log("Deberia enviar push...");
const payload = JSON.stringify({
title: "Push de ejemplo :3"
});
const subscripcion = {"endpoint":"https://fcm.googleapis.com/fcm/send/e-n6_jndfTw:APA91bGQrFOYgICLRm-diDHwJnI4909TiQB_FqnffBd6PnyyoiB2rDqehn41KxXMyw5Upa0IqqDnlr58-n3B9w6WCN6xY-sluDk8fpya928S_NPgJyAvbhFERN3Gqqy36s4J4OVDz6qL","expirationTime":null,"keys":{"p256dh":"BGNpJIqpEkJPjVZcccV42TdXQi-G3nt6gVWXIMkRs69fWyQeLN7K-sEBs7ffyCiosJm4ApwY9_ol2Q57Zv5fg08","auth":"DzzSWijI-WfBPWrI6eGcuw"}};
webPush.sendNotification(subscripcion, payload)
.then(response => {
console.log(JSON.stringify(response));
res.status(200);
res.send("Exito :D");
})
.catch(err => {
console.log(JSON.stringify(err));
res.status(400);
res.send(`Error al enviar push :c\n${err}`);
});
});
};
export default (app, http) => {
fun(app);
}

43
srv/tsconfig.json Normal file
View File

@ -0,0 +1,43 @@
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"strict": true,
"jsx": "preserve",
"importHelpers": true,
"moduleResolution": "node",
"experimentalDecorators": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"sourceMap": false,
"baseUrl": ".",
"removeComments": true,
"types": [
"webpack-env"
],
"paths": {
"@/*": [
"src/*"
]
},
"lib": [
"esnext",
"dom",
"dom.iterable",
"scripthost"
]
},
"include": [
"src/**/*.ts",
"src/**/*.tsx",
"src/**/*.vue",
"tests/**/*.ts",
"tests/**/*.tsx"
],
"exclude": [
"node_modules",
"dist",
"build",
"node.d.ts"
]
}

View File

@ -1,24 +1,30 @@
module.exports = { module.exports = {
configureWebpack: { configureWebpack: {
module: { module: {
rules: [ rules: [
{ test: /\.coffee$/, loader: "coffee-loader" } {test: /\.coffee$/, loader: "coffee-loader"}
] ]
} }
}, },
pluginOptions: { pluginOptions: {
express: { express: {
shouldServeApp: true, shouldServeApp: true,
serverDir: './srv' serverDir: './srv'
} }
}, },
baseUrl: undefined, baseUrl: undefined,
outputDir: undefined, outputDir: undefined,
assetsDir: undefined, assetsDir: undefined,
runtimeCompiler: undefined, runtimeCompiler: undefined,
productionSourceMap: false, productionSourceMap: false,
parallel: undefined, parallel: undefined,
css: undefined css: undefined,
pwa: {
workboxOptions: {
skipWaiting: true
}
}
}; };

439
yarn.lock
View File

@ -669,6 +669,14 @@
lodash "^4.17.11" lodash "^4.17.11"
to-fast-properties "^2.0.0" to-fast-properties "^2.0.0"
"@icetee/ftp@^0.3.15":
version "0.3.15"
resolved "https://registry.yarnpkg.com/@icetee/ftp/-/ftp-0.3.15.tgz#d32efd91ab7585f0a3b6cbed9ceffe2763b04ec6"
integrity sha512-RxSa9VjcDWgWCYsaLdZItdCnJj7p4LxggaEk+Y3MP0dHKoxez8ioG07DVekVbZZqccsrL+oPB/N9AzVPxj4blg==
dependencies:
readable-stream "1.1.x"
xregexp "2.0.0"
"@intervolga/optimize-cssnano-plugin@^1.0.5": "@intervolga/optimize-cssnano-plugin@^1.0.5":
version "1.0.6" version "1.0.6"
resolved "https://registry.yarnpkg.com/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz#be7c7846128b88f6a9b1d1261a0ad06eb5c0fdf8" resolved "https://registry.yarnpkg.com/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz#be7c7846128b88f6a9b1d1261a0ad06eb5c0fdf8"
@ -712,11 +720,43 @@
dependencies: dependencies:
"@types/babel-types" "*" "@types/babel-types" "*"
"@types/body-parser@*":
version "1.17.0"
resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c"
integrity sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==
dependencies:
"@types/connect" "*"
"@types/node" "*"
"@types/connect@*":
version "3.4.32"
resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28"
integrity sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==
dependencies:
"@types/node" "*"
"@types/events@*": "@types/events@*":
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7"
integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==
"@types/express-serve-static-core@*":
version "4.16.4"
resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.4.tgz#56bb8be4559401d68af4a3624ae9dd3166103e60"
integrity sha512-x/8h6FHm14rPWnW2HP5likD/rsqJ3t/77OWx2PLxym0hXbeBWQmcPyHmwX+CtCQpjIfgrUdEoDFcLPwPZWiqzQ==
dependencies:
"@types/node" "*"
"@types/range-parser" "*"
"@types/express@^4.16.1":
version "4.16.1"
resolved "https://registry.yarnpkg.com/@types/express/-/express-4.16.1.tgz#d756bd1a85c34d87eaf44c888bad27ba8a4b7cf0"
integrity sha512-V0clmJow23WeyblmACoxbHBu2JKlE5TiIme6Lem14FnPW9gsttyHtk6wq7njcdIWH1njAaFgR8gW09lgY98gQg==
dependencies:
"@types/body-parser" "*"
"@types/express-serve-static-core" "*"
"@types/serve-static" "*"
"@types/glob@^7.1.1": "@types/glob@^7.1.1":
version "7.1.1" version "7.1.1"
resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575"
@ -726,11 +766,23 @@
"@types/minimatch" "*" "@types/minimatch" "*"
"@types/node" "*" "@types/node" "*"
"@types/mime@*":
version "2.0.1"
resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d"
integrity sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==
"@types/minimatch@*": "@types/minimatch@*":
version "3.0.3" version "3.0.3"
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
"@types/mysql@^2.15.6":
version "2.15.6"
resolved "https://registry.yarnpkg.com/@types/mysql/-/mysql-2.15.6.tgz#8718a66e362a4cfde73fe731792bdf453ef3a541"
integrity sha512-PJBY2R3jGJwGrmFgGAJ+1nj4S/PLkF6nT+HvUygniq9ZcVht0mTH1TLAjjyfIXf9FfrELs8mbqOrWa/Tn89NCA==
dependencies:
"@types/node" "*"
"@types/node@*": "@types/node@*":
version "11.11.8" version "11.11.8"
resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.8.tgz#ff5e4e7896549e5725cf88d711e8c003984b2413" resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.8.tgz#ff5e4e7896549e5725cf88d711e8c003984b2413"
@ -741,6 +793,19 @@
resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8"
integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==
"@types/range-parser@*":
version "1.2.3"
resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c"
integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==
"@types/serve-static@*":
version "1.13.2"
resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48"
integrity sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==
dependencies:
"@types/express-serve-static-core" "*"
"@types/mime" "*"
"@vue/babel-helper-vue-jsx-merge-props@^1.0.0-beta.3": "@vue/babel-helper-vue-jsx-merge-props@^1.0.0-beta.3":
version "1.0.0-beta.3" version "1.0.0-beta.3"
resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.0.0-beta.3.tgz#e4c2e7125b3e0d2a9d493e457850b2abb0fd3cad" resolved "https://registry.yarnpkg.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.0.0-beta.3.tgz#e4c2e7125b3e0d2a9d493e457850b2abb0fd3cad"
@ -1107,6 +1172,13 @@ abbrev@1:
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
abort-controller@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==
dependencies:
event-target-shim "^5.0.0"
accepts@~1.3.4, accepts@~1.3.5: accepts@~1.3.4, accepts@~1.3.5:
version "1.3.5" version "1.3.5"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2"
@ -1159,6 +1231,13 @@ address@^1.0.3:
resolved "https://registry.yarnpkg.com/address/-/address-1.0.3.tgz#b5f50631f8d6cec8bd20c963963afb55e06cbce9" resolved "https://registry.yarnpkg.com/address/-/address-1.0.3.tgz#b5f50631f8d6cec8bd20c963963afb55e06cbce9"
integrity sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg== integrity sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg==
agent-base@^4.1.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9"
integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==
dependencies:
es6-promisify "^5.0.0"
ajv-errors@^1.0.0: ajv-errors@^1.0.0:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d"
@ -1356,6 +1435,15 @@ asn1.js@^4.0.0:
inherits "^2.0.1" inherits "^2.0.1"
minimalistic-assert "^1.0.0" minimalistic-assert "^1.0.0"
asn1.js@^5.0.0:
version "5.0.1"
resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.0.1.tgz#7668b56416953f0ce3421adbb3893ace59c96f59"
integrity sha512-aO8EaEgbgqq77IEw+1jfx5c9zTbzvkfuRBuZsSsPnTHMkmd5AI4J6OtITLZFa381jReeaQL67J0GBTUu0+ZTVw==
dependencies:
bn.js "^4.0.0"
inherits "^2.0.1"
minimalistic-assert "^1.0.0"
asn1@~0.2.3: asn1@~0.2.3:
version "0.2.4" version "0.2.4"
resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
@ -1506,7 +1594,7 @@ balanced-match@^1.0.0:
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
base64-js@^1.0.2: base64-js@^1.0.2, base64-js@^1.3.0:
version "1.3.0" version "1.3.0"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==
@ -1556,10 +1644,10 @@ big.js@^5.2.2:
resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
bignumber.js@4.1.0: bignumber.js@7.2.1, bignumber.js@^7.0.0:
version "4.1.0" version "7.2.1"
resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-4.1.0.tgz#db6f14067c140bd46624815a7916c92d9b6c24b1" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f"
integrity sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA== integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==
binary-extensions@^1.0.0: binary-extensions@^1.0.0:
version "1.13.0" version "1.13.0"
@ -1573,6 +1661,11 @@ block-stream@*:
dependencies: dependencies:
inherits "~2.0.0" inherits "~2.0.0"
bluebird@2.x:
version "2.11.0"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1"
integrity sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=
bluebird@^3.1.1, bluebird@^3.5.1, bluebird@^3.5.3: bluebird@^3.1.1, bluebird@^3.5.1, bluebird@^3.5.3:
version "3.5.3" version "3.5.3"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7"
@ -1599,6 +1692,22 @@ body-parser@1.18.3:
raw-body "2.3.3" raw-body "2.3.3"
type-is "~1.6.16" type-is "~1.6.16"
body-parser@^1.19.0:
version "1.19.0"
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
dependencies:
bytes "3.1.0"
content-type "~1.0.4"
debug "2.6.9"
depd "~1.1.2"
http-errors "1.7.2"
iconv-lite "0.4.24"
on-finished "~2.3.0"
qs "6.7.0"
raw-body "2.4.0"
type-is "~1.6.17"
bonjour@^3.5.0: bonjour@^3.5.0:
version "3.5.0" version "3.5.0"
resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5"
@ -1726,6 +1835,11 @@ browserslist@^4.0.0, browserslist@^4.4.2, browserslist@^4.5.1:
electron-to-chromium "^1.3.116" electron-to-chromium "^1.3.116"
node-releases "^1.1.11" node-releases "^1.1.11"
buffer-equal-constant-time@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=
buffer-from@^1.0.0, buffer-from@^1.1.0: buffer-from@^1.0.0, buffer-from@^1.1.0:
version "1.1.1" version "1.1.1"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
@ -1760,6 +1874,11 @@ bytes@3.0.0:
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=
bytes@3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
cacache@^10.0.4: cacache@^10.0.4:
version "10.0.4" version "10.0.4"
resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460"
@ -2206,7 +2325,7 @@ compressible@~2.0.16:
dependencies: dependencies:
mime-db ">= 1.38.0 < 2" mime-db ">= 1.38.0 < 2"
compression@^1.5.2: compression@^1.5.2, compression@^1.7.4:
version "1.7.4" version "1.7.4"
resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f"
integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==
@ -2246,7 +2365,7 @@ configstore@^3.0.0:
write-file-atomic "^2.0.0" write-file-atomic "^2.0.0"
xdg-basedir "^3.0.0" xdg-basedir "^3.0.0"
connect-history-api-fallback@^1.3.0, connect-history-api-fallback@^1.5.0: connect-history-api-fallback@^1.3.0, connect-history-api-fallback@^1.5.0, connect-history-api-fallback@^1.6.0:
version "1.6.0" version "1.6.0"
resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc"
integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==
@ -2982,6 +3101,13 @@ ecc-jsbn@~0.1.1:
jsbn "~0.1.0" jsbn "~0.1.0"
safer-buffer "^2.1.0" safer-buffer "^2.1.0"
ecdsa-sig-formatter@1.0.11:
version "1.0.11"
resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf"
integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==
dependencies:
safe-buffer "^5.0.1"
ee-first@1.1.1: ee-first@1.1.1:
version "1.1.1" version "1.1.1"
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
@ -3083,6 +3209,18 @@ es-to-primitive@^1.2.0:
is-date-object "^1.0.1" is-date-object "^1.0.1"
is-symbol "^1.0.2" is-symbol "^1.0.2"
es6-promise@^4.0.3:
version "4.2.6"
resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.6.tgz#b685edd8258886365ea62b57d30de28fadcd974f"
integrity sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==
es6-promisify@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=
dependencies:
es6-promise "^4.0.3"
escape-html@~1.0.3: escape-html@~1.0.3:
version "1.0.3" version "1.0.3"
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
@ -3138,6 +3276,11 @@ event-pubsub@4.3.0:
resolved "https://registry.yarnpkg.com/event-pubsub/-/event-pubsub-4.3.0.tgz#f68d816bc29f1ec02c539dc58c8dd40ce72cb36e" resolved "https://registry.yarnpkg.com/event-pubsub/-/event-pubsub-4.3.0.tgz#f68d816bc29f1ec02c539dc58c8dd40ce72cb36e"
integrity sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ== integrity sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ==
event-target-shim@^5.0.0:
version "5.0.1"
resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
eventemitter3@^3.0.0: eventemitter3@^3.0.0:
version "3.1.0" version "3.1.0"
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163"
@ -3220,7 +3363,7 @@ express-list-endpoints@^3.0.1:
resolved "https://registry.yarnpkg.com/express-list-endpoints/-/express-list-endpoints-3.0.1.tgz#d304fe9457ad14b8cf8692759398e3eea21abcb2" resolved "https://registry.yarnpkg.com/express-list-endpoints/-/express-list-endpoints-3.0.1.tgz#d304fe9457ad14b8cf8692759398e3eea21abcb2"
integrity sha512-Ul3OY7r7Lc84R4z/xI5Jx6wbMzxg61SQh4BhVNDIPPtim6vHPjrKY+QhYYM8FdOswjHZstGK7J0I6HYf8FKtVA== integrity sha512-Ul3OY7r7Lc84R4z/xI5Jx6wbMzxg61SQh4BhVNDIPPtim6vHPjrKY+QhYYM8FdOswjHZstGK7J0I6HYf8FKtVA==
express@^4.16.2, express@^4.16.3: express@^4.16.2, express@^4.16.3, express@^4.16.4:
version "4.16.4" version "4.16.4"
resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e"
integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==
@ -3271,7 +3414,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2:
assign-symbols "^1.0.0" assign-symbols "^1.0.0"
is-extendable "^1.0.1" is-extendable "^1.0.1"
extend@~3.0.2: extend@^3.0.2, extend@~3.0.2:
version "3.0.2" version "3.0.2"
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
@ -3322,6 +3465,11 @@ fast-json-stable-stringify@^2.0.0:
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I=
fast-text-encoding@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fast-text-encoding/-/fast-text-encoding-1.0.0.tgz#3e5ce8293409cfaa7177a71b9ca84e1b1e6f25ef"
integrity sha512-R9bHCvweUxxwkDwhjav5vxpFvdPGlVngtqmx4pIZfSUhM/Q4NiIUHB456BAf+Q1Nwu3HEZYONtu+Rya+af4jiQ==
fastparse@^1.1.1: fastparse@^1.1.1:
version "1.1.2" version "1.1.2"
resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9"
@ -3551,6 +3699,17 @@ fstream@^1.0.0, fstream@^1.0.2:
mkdirp ">=0.5 0" mkdirp ">=0.5 0"
rimraf "2" rimraf "2"
ftp-deploy@^2.3.3:
version "2.3.3"
resolved "https://registry.yarnpkg.com/ftp-deploy/-/ftp-deploy-2.3.3.tgz#ea1c3be19533bae49fd27d3983b8d7b7e2a4e812"
integrity sha512-JUpl90GX33q0QGfr8183EKhG00B+XI7HpdGrUPoV4izIxFUo7tQWeqmC7UyQZ3SrTSeO/+v47A8IlgolhSjSEQ==
dependencies:
bluebird "^3.5.1"
minimatch "3.0.4"
promise-ftp "^1.3.5"
read "^1.0.7"
upath "^1.0.5"
function-bind@^1.0.2, function-bind@^1.1.1: function-bind@^1.0.2, function-bind@^1.1.1:
version "1.1.1" version "1.1.1"
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
@ -3570,6 +3729,16 @@ gauge@~2.7.3:
strip-ansi "^3.0.1" strip-ansi "^3.0.1"
wide-align "^1.1.0" wide-align "^1.1.0"
gaxios@^1.0.2, gaxios@^1.0.4, gaxios@^1.2.1:
version "1.8.4"
resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-1.8.4.tgz#e08c34fe93c0a9b67a52b7b9e7a64e6435f9a339"
integrity sha512-BoENMnu1Gav18HcpV9IleMPZ9exM+AvUjrAOV4Mzs/vfz2Lu/ABv451iEXByKiMPn2M140uul1txXCg83sAENw==
dependencies:
abort-controller "^3.0.0"
extend "^3.0.2"
https-proxy-agent "^2.2.1"
node-fetch "^2.3.0"
gaze@^1.0.0: gaze@^1.0.0:
version "1.1.3" version "1.1.3"
resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a"
@ -3577,6 +3746,14 @@ gaze@^1.0.0:
dependencies: dependencies:
globule "^1.0.0" globule "^1.0.0"
gcp-metadata@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-1.0.0.tgz#5212440229fa099fc2f7c2a5cdcb95575e9b2ca6"
integrity sha512-Q6HrgfrCQeEircnNP3rCcEgiDv7eF9+1B+1MMgpE190+/+0mjQR8PxeOaRgxZWmdDAF9EIryHB9g1moPiw1SbQ==
dependencies:
gaxios "^1.0.2"
json-bigint "^0.3.0"
get-caller-file@^1.0.1: get-caller-file@^1.0.1:
version "1.0.3" version "1.0.3"
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
@ -3699,6 +3876,29 @@ globule@^1.0.0:
lodash "~4.17.10" lodash "~4.17.10"
minimatch "~3.0.2" minimatch "~3.0.2"
google-auth-library@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-3.1.2.tgz#ff2f88cd5cd2118a57bd3d5ad3c093c8837fc350"
integrity sha512-cDQMzTotwyWMrg5jRO7q0A4TL/3GWBgO7I7q5xGKNiiFf9SmGY/OJ1YsLMgI2MVHHsEGyrqYnbnmV1AE+Z6DnQ==
dependencies:
base64-js "^1.3.0"
fast-text-encoding "^1.0.0"
gaxios "^1.2.1"
gcp-metadata "^1.0.0"
gtoken "^2.3.2"
https-proxy-agent "^2.2.1"
jws "^3.1.5"
lru-cache "^5.0.0"
semver "^5.5.0"
google-p12-pem@^1.0.0:
version "1.0.4"
resolved "https://registry.yarnpkg.com/google-p12-pem/-/google-p12-pem-1.0.4.tgz#b77fb833a2eb9f7f3c689e2e54f095276f777605"
integrity sha512-SwLAUJqUfTB2iS+wFfSS/G9p7bt4eWcc2LyfvmUXe7cWp6p3mpxDo6LLI29MXdU6wvPcQ/up298X7GMC5ylAlA==
dependencies:
node-forge "^0.8.0"
pify "^4.0.0"
got@^6.7.1: got@^6.7.1:
version "6.7.1" version "6.7.1"
resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0"
@ -3721,6 +3921,17 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==
gtoken@^2.3.2:
version "2.3.3"
resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-2.3.3.tgz#8a7fe155c5ce0c4b71c886cfb282a9060d94a641"
integrity sha512-EaB49bu/TCoNeQjhCYKI/CurooBKkGxIqFHsWABW0b25fobBYVTMe84A8EBVVZhl8emiUdNypil9huMOTmyAnw==
dependencies:
gaxios "^1.0.4"
google-p12-pem "^1.0.0"
jws "^3.1.5"
mime "^2.2.0"
pify "^4.0.0"
gzip-size@^5.0.0: gzip-size@^5.0.0:
version "5.0.0" version "5.0.0"
resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.0.0.tgz#a55ecd99222f4c48fd8c01c625ce3b349d0a0e80" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.0.0.tgz#a55ecd99222f4c48fd8c01c625ce3b349d0a0e80"
@ -3955,6 +4166,17 @@ http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3:
setprototypeof "1.1.0" setprototypeof "1.1.0"
statuses ">= 1.4.0 < 2" statuses ">= 1.4.0 < 2"
http-errors@1.7.2:
version "1.7.2"
resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
dependencies:
depd "~1.1.2"
inherits "2.0.3"
setprototypeof "1.1.1"
statuses ">= 1.5.0 < 2"
toidentifier "1.0.0"
http-parser-js@>=0.4.0: http-parser-js@>=0.4.0:
version "0.5.0" version "0.5.0"
resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.0.tgz#d65edbede84349d0dc30320815a15d39cc3cbbd8" resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.0.tgz#d65edbede84349d0dc30320815a15d39cc3cbbd8"
@ -3988,11 +4210,26 @@ http-signature@~1.2.0:
jsprim "^1.2.2" jsprim "^1.2.2"
sshpk "^1.7.0" sshpk "^1.7.0"
http_ece@1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/http_ece/-/http_ece-1.0.5.tgz#b60660faaf14215102d1493ea720dcd92b53372f"
integrity sha1-tgZg+q8UIVEC0Uk+pyDc2StTNy8=
dependencies:
urlsafe-base64 "~1.0.0"
https-browserify@^1.0.0: https-browserify@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
https-proxy-agent@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0"
integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==
dependencies:
agent-base "^4.1.0"
debug "^3.1.0"
iconv-lite@0.4.23: iconv-lite@0.4.23:
version "0.4.23" version "0.4.23"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
@ -4000,7 +4237,7 @@ iconv-lite@0.4.23:
dependencies: dependencies:
safer-buffer ">= 2.1.2 < 3" safer-buffer ">= 2.1.2 < 3"
iconv-lite@^0.4.4: iconv-lite@0.4.24, iconv-lite@^0.4.4:
version "0.4.24" version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@ -4468,6 +4705,11 @@ is-wsl@^1.1.0:
resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=
isarray@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
@ -4585,6 +4827,13 @@ jsesc@~0.5.0:
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
json-bigint@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/json-bigint/-/json-bigint-0.3.0.tgz#0ccd912c4b8270d05f056fbd13814b53d3825b1e"
integrity sha1-DM2RLEuCcNBfBW+9E4FLU9OCWx4=
dependencies:
bignumber.js "^7.0.0"
json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
@ -4666,6 +4915,23 @@ jstransformer@1.0.0:
is-promise "^2.0.0" is-promise "^2.0.0"
promise "^7.0.1" promise "^7.0.1"
jwa@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a"
integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==
dependencies:
buffer-equal-constant-time "1.0.1"
ecdsa-sig-formatter "1.0.11"
safe-buffer "^5.0.1"
jws@^3.1.3, jws@^3.1.5:
version "3.2.2"
resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304"
integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==
dependencies:
jwa "^1.4.1"
safe-buffer "^5.0.1"
killable@^1.0.0: killable@^1.0.0:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892"
@ -4912,7 +5178,7 @@ lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2:
pseudomap "^1.0.2" pseudomap "^1.0.2"
yallist "^2.1.2" yallist "^2.1.2"
lru-cache@^5.1.1: lru-cache@^5.0.0, lru-cache@^5.1.1:
version "5.1.1" version "5.1.1"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
@ -5064,6 +5330,11 @@ miller-rabin@^4.0.0:
bn.js "^4.0.0" bn.js "^4.0.0"
brorand "^1.0.1" brorand "^1.0.1"
mime-db@1.40.0:
version "1.40.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.40.0.tgz#a65057e998db090f732a68f6c276d387d4126c32"
integrity sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==
"mime-db@>= 1.38.0 < 2", mime-db@~1.38.0: "mime-db@>= 1.38.0 < 2", mime-db@~1.38.0:
version "1.38.0" version "1.38.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad"
@ -5076,6 +5347,13 @@ mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.19:
dependencies: dependencies:
mime-db "~1.38.0" mime-db "~1.38.0"
mime-types@~2.1.24:
version "2.1.24"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.24.tgz#b6f8d0b3e951efb77dedeca194cff6d16f676f81"
integrity sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==
dependencies:
mime-db "1.40.0"
mime@1.4.1: mime@1.4.1:
version "1.4.1" version "1.4.1"
resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
@ -5086,6 +5364,11 @@ mime@^2.0.3, mime@^2.3.1:
resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.0.tgz#e051fd881358585f3279df333fe694da0bcffdd6" resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.0.tgz#e051fd881358585f3279df333fe694da0bcffdd6"
integrity sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w== integrity sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==
mime@^2.2.0:
version "2.4.2"
resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.2.tgz#ce5229a5e99ffc313abac806b482c10e7ba6ac78"
integrity sha512-zJBfZDkwRu+j3Pdd2aHsR5GfH2jIWhmL1ZzBoc+X+3JEti2hbArWcyJ+1laC1D2/U/W1a/+Cegj0/OnEU2ybjg==
mimic-fn@^1.0.0: mimic-fn@^1.0.0:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
@ -5115,7 +5398,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
minimatch@^3.0.4, minimatch@~3.0.2: minimatch@3.0.4, minimatch@^3.0.4, minimatch@~3.0.2:
version "3.0.4" version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
@ -5237,12 +5520,17 @@ multicast-dns@^6.0.1:
dns-packet "^1.3.1" dns-packet "^1.3.1"
thunky "^1.0.2" thunky "^1.0.2"
mysql@^2.16.0: mute-stream@~0.0.4:
version "2.16.0" version "0.0.8"
resolved "https://registry.yarnpkg.com/mysql/-/mysql-2.16.0.tgz#b23b22ab5de44fc2d5d32bd4f5af6653fc45e2ba" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
integrity sha512-dPbN2LHonQp7D5ja5DJXNbCLe/HRdu+f3v61aguzNRQIrmZLOeRoymBYyeThrR6ug+FqzDL95Gc9maqZUJS+Gw== integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
mysql@^2.17.1:
version "2.17.1"
resolved "https://registry.yarnpkg.com/mysql/-/mysql-2.17.1.tgz#62bba4a039a9b2f73638cd1652ce50fc6f682899"
integrity sha512-7vMqHQ673SAk5C8fOzTG2LpPcf3bNt0oL3sFpxPEEFp1mdlDcrLK0On7z8ZYKaaHrHwNcQ/MTUz7/oobZ2OyyA==
dependencies: dependencies:
bignumber.js "4.1.0" bignumber.js "7.2.1"
readable-stream "2.3.6" readable-stream "2.3.6"
safe-buffer "5.1.2" safe-buffer "5.1.2"
sqlstring "2.3.1" sqlstring "2.3.1"
@ -5300,11 +5588,21 @@ no-case@^2.2.0:
dependencies: dependencies:
lower-case "^1.1.1" lower-case "^1.1.1"
node-fetch@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.3.0.tgz#1a1d940bbfb916a1d3e0219f037e89e71f8c5fa5"
integrity sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==
node-forge@0.7.5: node-forge@0.7.5:
version "0.7.5" version "0.7.5"
resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df"
integrity sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ== integrity sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==
node-forge@^0.8.0:
version "0.8.2"
resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.8.2.tgz#b4bcc59fb12ce77a8825fc6a783dfe3182499c5a"
integrity sha512-mXQ9GBq1N3uDCyV1pdSzgIguwgtVpM7f5/5J4ipz12PKWElmPpVWLDuWl8iXmhysr21+WmX/OJ5UKx82wjomgg==
node-gyp@^3.8.0: node-gyp@^3.8.0:
version "3.8.0" version "3.8.0"
resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c"
@ -5913,7 +6211,7 @@ pify@^3.0.0:
resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
pify@^4.0.1: pify@^4.0.0, pify@^4.0.1:
version "4.0.1" version "4.0.1"
resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
@ -6334,6 +6632,20 @@ process@^0.11.10:
resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
promise-ftp-common@^1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/promise-ftp-common/-/promise-ftp-common-1.1.5.tgz#b4f8082a74035647703506763edb14230d9865da"
integrity sha1-tPgIKnQDVkdwNQZ2PtsUIw2YZdo=
promise-ftp@^1.3.5:
version "1.3.5"
resolved "https://registry.yarnpkg.com/promise-ftp/-/promise-ftp-1.3.5.tgz#ecfa4a5e5b779a6bfdd4dd3096957b58286f5104"
integrity sha512-v368jPSqzmjjKDIyggulC+dRFcpAOEX7aFdEWkFYQp8Ao3P2N4Y6XnFFdKgK7PtkylwvGQkZR/65HZuzmq0V7A==
dependencies:
"@icetee/ftp" "^0.3.15"
bluebird "2.x"
promise-ftp-common "^1.1.5"
promise-inflight@^1.0.1: promise-inflight@^1.0.1:
version "1.0.1" version "1.0.1"
resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
@ -6548,6 +6860,11 @@ qs@6.5.2, qs@~6.5.2:
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
qs@6.7.0:
version "6.7.0"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
querystring-es3@^0.2.0: querystring-es3@^0.2.0:
version "0.2.1" version "0.2.1"
resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
@ -6593,6 +6910,16 @@ raw-body@2.3.3:
iconv-lite "0.4.23" iconv-lite "0.4.23"
unpipe "1.0.0" unpipe "1.0.0"
raw-body@2.4.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
dependencies:
bytes "3.1.0"
http-errors "1.7.2"
iconv-lite "0.4.24"
unpipe "1.0.0"
rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: rc@^1.0.1, rc@^1.1.6, rc@^1.2.7:
version "1.2.8" version "1.2.8"
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
@ -6629,6 +6956,13 @@ read-pkg@^4.0.1:
parse-json "^4.0.0" parse-json "^4.0.0"
pify "^3.0.0" pify "^3.0.0"
read@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4"
integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=
dependencies:
mute-stream "~0.0.4"
"readable-stream@1 || 2", readable-stream@2.3.6, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: "readable-stream@1 || 2", readable-stream@2.3.6, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6:
version "2.3.6" version "2.3.6"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
@ -6642,6 +6976,16 @@ read-pkg@^4.0.1:
string_decoder "~1.1.1" string_decoder "~1.1.1"
util-deprecate "~1.0.1" util-deprecate "~1.0.1"
readable-stream@1.1.x:
version "1.1.14"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk=
dependencies:
core-util-is "~1.0.0"
inherits "~2.0.1"
isarray "0.0.1"
string_decoder "~0.10.x"
readable-stream@^3.0.6, readable-stream@^3.1.1: readable-stream@^3.0.6, readable-stream@^3.1.1:
version "3.2.0" version "3.2.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.2.0.tgz#de17f229864c120a9f56945756e4f32c4045245d" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.2.0.tgz#de17f229864c120a9f56945756e4f32c4045245d"
@ -7131,6 +7475,11 @@ setprototypeof@1.1.0:
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
setprototypeof@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
sha.js@^2.4.0, sha.js@^2.4.8: sha.js@^2.4.0, sha.js@^2.4.8:
version "2.4.11" version "2.4.11"
resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
@ -7401,7 +7750,7 @@ static-extend@^0.1.1:
define-property "^0.2.5" define-property "^0.2.5"
object-copy "^0.1.0" object-copy "^0.1.0"
"statuses@>= 1.4.0 < 2": "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2":
version "1.5.0" version "1.5.0"
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
@ -7497,6 +7846,11 @@ string_decoder@^1.0.0, string_decoder@^1.1.1:
dependencies: dependencies:
safe-buffer "~5.1.0" safe-buffer "~5.1.0"
string_decoder@~0.10.x:
version "0.10.31"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
string_decoder@~1.1.1: string_decoder@~1.1.1:
version "1.1.1" version "1.1.1"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
@ -7760,6 +8114,11 @@ to-regex@^3.0.1, to-regex@^3.0.2:
regex-not "^1.0.2" regex-not "^1.0.2"
safe-regex "^1.1.0" safe-regex "^1.1.0"
toidentifier@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
token-stream@0.0.1: token-stream@0.0.1:
version "0.0.1" version "0.0.1"
resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-0.0.1.tgz#ceeefc717a76c4316f126d0b9dbaa55d7e7df01a" resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-0.0.1.tgz#ceeefc717a76c4316f126d0b9dbaa55d7e7df01a"
@ -7873,6 +8232,14 @@ type-is@~1.6.16:
media-typer "0.3.0" media-typer "0.3.0"
mime-types "~2.1.18" mime-types "~2.1.18"
type-is@~1.6.17:
version "1.6.18"
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
dependencies:
media-typer "0.3.0"
mime-types "~2.1.24"
typedarray@^0.0.6: typedarray@^0.0.6:
version "0.0.6" version "0.0.6"
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
@ -8000,7 +8367,7 @@ unzip-response@^2.0.1:
resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97"
integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=
upath@^1.1.1: upath@^1.0.5, upath@^1.1.1:
version "1.1.2" version "1.1.2"
resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068"
integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==
@ -8070,6 +8437,11 @@ url@^0.11.0:
punycode "1.3.2" punycode "1.3.2"
querystring "0.2.0" querystring "0.2.0"
urlsafe-base64@^1.0.0, urlsafe-base64@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/urlsafe-base64/-/urlsafe-base64-1.0.0.tgz#23f89069a6c62f46cf3a1d3b00169cefb90be0c6"
integrity sha1-I/iQaabGL0bPOh07ABac77kL4MY=
use@^3.1.0: use@^3.1.0:
version "3.1.1" version "3.1.1"
resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
@ -8156,6 +8528,11 @@ void-elements@^2.0.1:
resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec"
integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=
vue-analytics@^5.16.4:
version "5.16.4"
resolved "https://registry.yarnpkg.com/vue-analytics/-/vue-analytics-5.16.4.tgz#7f9e197cbc64afac96884a05214b17efaf8e9d09"
integrity sha512-M67cUqpPeyk2rftrvlx2uU+BQ/C4E8SkF2Ct9LizOYUoTccZtCCJwhMJfQ3XL8xep6p3K8KYz58FzRWvx5zlPw==
vue-cli-plugin-express@^1.0.0: vue-cli-plugin-express@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.yarnpkg.com/vue-cli-plugin-express/-/vue-cli-plugin-express-1.0.0.tgz#6d016e979daca646c20039139d2e5bbbb984b7a9" resolved "https://registry.yarnpkg.com/vue-cli-plugin-express/-/vue-cli-plugin-express-1.0.0.tgz#6d016e979daca646c20039139d2e5bbbb984b7a9"
@ -8176,6 +8553,11 @@ vue-disqus@^3.0.5:
resolved "https://registry.yarnpkg.com/vue-disqus/-/vue-disqus-3.0.5.tgz#8d0dd5cabdba7c47f82d129d2907a64366842fa8" resolved "https://registry.yarnpkg.com/vue-disqus/-/vue-disqus-3.0.5.tgz#8d0dd5cabdba7c47f82d129d2907a64366842fa8"
integrity sha512-T3Y68lXf5W2lYt6j4Y3kZ4opLPH0EAzqriy11MS4D4Q2+UN0tFuUXeYP1MxfvdyaCEboXSM6CUswxsULuNV70Q== integrity sha512-T3Y68lXf5W2lYt6j4Y3kZ4opLPH0EAzqriy11MS4D4Q2+UN0tFuUXeYP1MxfvdyaCEboXSM6CUswxsULuNV70Q==
vue-google-signin-button@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/vue-google-signin-button/-/vue-google-signin-button-1.0.2.tgz#71389a1233ece20c06aace0870acf54794b3af3c"
integrity sha1-cTiaEjPs4gwGqs4IcKz1R5Szrzw=
vue-hot-reload-api@^2.3.0: vue-hot-reload-api@^2.3.0:
version "2.3.3" version "2.3.3"
resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.3.tgz#2756f46cb3258054c5f4723de8ae7e87302a1ccf" resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.3.tgz#2756f46cb3258054c5f4723de8ae7e87302a1ccf"
@ -8251,6 +8633,18 @@ wcwidth@^1.0.1:
dependencies: dependencies:
defaults "^1.0.3" defaults "^1.0.3"
web-push@^3.3.3:
version "3.3.3"
resolved "https://registry.yarnpkg.com/web-push/-/web-push-3.3.3.tgz#8dc7c578dd1243ceb5a8377389424e87ea9b15cc"
integrity sha512-Om4CNZpyzHP3AtGZpbBavCO7I9oCS9CFY2VDfTj/cFx2gm+mAtyK2OlKd6qu9pwCdZTyYanUiyhT0JSrs0ypHQ==
dependencies:
asn1.js "^5.0.0"
http_ece "1.0.5"
https-proxy-agent "^2.2.1"
jws "^3.1.3"
minimist "^1.2.0"
urlsafe-base64 "^1.0.0"
webpack-bundle-analyzer@^3.0.4: webpack-bundle-analyzer@^3.0.4:
version "3.1.0" version "3.1.0"
resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.1.0.tgz#2f19cbb87bb6d4f3cb4e59cb67c837bd9436e89d" resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.1.0.tgz#2f19cbb87bb6d4f3cb4e59cb67c837bd9436e89d"
@ -8607,6 +9001,11 @@ xdg-basedir@^3.0.0:
resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=
xregexp@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943"
integrity sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=
xregexp@4.0.0: xregexp@4.0.0:
version "4.0.0" version "4.0.0"
resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020"