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
/srv/*/**.js
/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

@ -3,26 +3,38 @@
"version": "0.1.0",
"private": true,
"scripts": {
"start": "node app.js",
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"express": "vue-cli-service express:watch",
"express:run": "vue-cli-service express:run"
},
"dependencies": {
"mysql": "^2.16.0",
"compression": "^1.7.4",
"connect-history-api-fallback": "^1.6.0",
"express": "^4.16.4",
"mysql": "^2.17.1",
"register-service-worker": "^1.6.2",
"vue": "^2.6.6",
"vue-analytics": "^5.16.4",
"vue-disqus": "^3.0.5",
"vue-google-signin-button": "^1.0.2",
"vue-router": "^3.0.1",
"vuex": "^3.0.1",
"web-push": "^3.3.3",
"yaml": "^1.4.0"
},
"devDependencies": {
"@types/express": "^4.16.1",
"@types/mysql": "^2.15.6",
"@vue/cli-plugin-babel": "^3.0.5",
"@vue/cli-plugin-pwa": "^3.0.5",
"@vue/cli-service": "^3.0.5",
"body-parser": "^1.19.0",
"coffee-loader": "^0.9.0",
"coffeescript": "^2.3.2",
"ftp-deploy": "^2.3.3",
"google-auth-library": "^3.1.2",
"node-sass": "^4.9.0",
"pug": "^2.0.3",
"pug-plain-loader": "^1.0.0",

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"
rel="stylesheet">
<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>
<body>
<noscript>

View File

@ -15,6 +15,6 @@
],
"start_url": "./index.html",
"display": "standalone",
"background_color": "#000000",
"theme_color": "#4DBA87"
"background_color": "#ea486a",
"theme_color": "#009961"
}

View File

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

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.fuente Fuente: {{ anime.fuente }}
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
panel-de-descarga(:animeid="anime.anime_ID" :color="anime.color")
div.tarjeta.background__disqus
vue-disqus(shortname="www-pseudosubs-com" :identifier="nombreCortoAnime"
:url="'https://pseudosubs.com/Anime/' + nombreCortoAnime")
@ -31,33 +35,41 @@
<script lang="coffee">
import panelDescarga from "./panel-descarga.vue"
import opEd from "./op-ed.vue"
import YAML from "yaml"
export default
name: "Anime"
components:
'panel-de-descarga': panelDescarga
"panel-de-descarga": panelDescarga
"op-ed": opEd
data: ->
anime: {}
# -1 no encontrado, 0 cargando y 1 encontrado
estadoAnime: 0
aviso: ""
computed:
nombreCortoAnime: ->
@anime.link?.substr(7)
colorBackground: -> "background-color: #{@anime.color};"
methods:
cambiarAviso: (aviso) -> @aviso = aviso
created: ->
_ = this
vm = this
animes = @$store.state.animes
resultado = -1
for anime in animes
if anime.link is "/Anime/" + @$route.params.nombre
_.anime = anime
vm.anime = anime
resultado = 1
break
@estadoAnime = resultado
vm.estadoAnime = resultado
if resultado is 1
@$store.commit "cambiarTituloAnime", "#{anime.titulo}"
@$store.commit "cambiarTxtAdicionalAnime", (if anime.comentario? then anime.comentario else "Sin comentarios.")
@$store.commit "cambiarEstadoImgAnime", true
@$store.commit "cambiarImgTituloAnime", @anime.titulo
else
@$store.commit "cambiarTxtAdicionalAnime", "?"
@ -67,6 +79,8 @@
{nombre: "_", ruta: "#"}
]
#
</script>
@ -78,6 +92,13 @@
background-color: #101010
padding: 15px
.aviso
text-align: center
color: white
font:
family: "Product Sans", "Open Sans", sans-serif
size: x-large
.contenedor
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,6 +1,6 @@
<template>
<div>
<div class="panel" v-if="datosCorrectos">
<div class="panel tarjeta" v-if="datosCorrectos">
<div class="panel__titulo" :style="'background-color: ' + color">
Descarga aquí.<br>
<div class="panel__titulo__variantes">
@ -14,7 +14,7 @@
</template>
</div>
</div>
<div class="panel__descripcion background__panel-descarga">
<div class="panel__descripcion fondo1">
<template v-for="(opcion, indice) in datos">
<div :id="`tarjeta${indice}`" :style="indice !== '1'? 'display: none' : ''">
@ -43,6 +43,7 @@
<script>
import YAML from "yaml"
const esModoOscuro = false;
export default {
@ -52,7 +53,7 @@
posActual: '1',
datos: {},
datosCorrectos: false,
mostrarSpinnerParaCargaDeEps: true
mostrarSpinnerParaCargaDeEps: false
}
},
props: {
@ -63,6 +64,10 @@
color: {
type: String,
required: true
},
cambiarAviso: {
type: Function,
required: true
}
},
computed: {
@ -117,7 +122,7 @@
incrementarContador(ep_ID, evento) {
const xhr = new XMLHttpRequest();
xhr.open("PUT", "/links");
xhr.open("PUT", `${this.$store.state.servidor}/links`);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.onload = () => {
console.log(xhr.responseText);
@ -130,14 +135,15 @@
const xhr = new XMLHttpRequest();
const vm = this;
xhr.open("POST","https://pseudosubs.com/links");
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.opciones) {
vm.datos = data["opciones"];
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);
@ -149,13 +155,17 @@
};
console.log("Este es el query: " + `animeID=${ this.animeid }`);
xhr.send(`animeID=${this.animeid}`);
}
}
</script>
<style scoped lang="sass">
@import "../../assets/sass/variables"
.aviso
padding: 12px
.icono-pequeno
font-size: 15px
@ -163,6 +173,7 @@
cursor: default
.panel__titulo
border-radius: 10px 10px 0 0
font:
family: Muli, "Open Sans", sans-serif
size: xx-large
@ -189,7 +200,7 @@
.panel__descripcion
padding: 25px 15px
// background-color: #f2f2f2
border-radius: 0 0 10px 10px
.panel__descripcion__titulo
font:

View File

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

View File

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

@ -8,6 +8,7 @@
div.titulo {{ anime.titulo }}
router-link(:to="anime.link")
div.imgCont
img.imagen.tarjeta(:src="anime.imgUrl")
div.animeCont
div.descr {{ anime.descripcion }}
@ -34,7 +35,7 @@
export default
name: "ultimos-eps"
data: ->
numAnimesRecientes: 4
numAnimesRecientes: 5
animeActual: 0
anime: {}
intervalo: {}
@ -139,6 +140,7 @@
position: absolute
bottom: 15px
left: 440px
.boton
@extend %bordeRedondo-std
user-select: none
@ -150,15 +152,36 @@
.cont
padding: 10px 40px
z-index: 4
a
text-decoration: none
.imgCont
float: left
display: inline-block
text-align: center
.imagen
@extend %bordeRedondo-std
float: left
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>

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. -->
<template lang="pug">
div.barra
div.lateral.fondo2.ocultarEnMovil(:class="$store.state.barraLateralOculta? 'barraOculta': ''")
div.botonOcultar(@click="ocultarBarraLateral()" :style="'display: ' + (largoVentana < 1201? 'none': 'block')").
div.lateral.fondo2.ocultarEnMovil.barraOculta
// div.botonOcultar(@click="ocultarBarraLateral()" :style="'display: ' + (largoVentana < 1201? 'none': 'block')").
{{ $store.state.barraLateralOculta? '>>': '<<' }}
router-link.linkImg(to="/" title="Ir al inicio")
@ -11,7 +11,6 @@
div.items.tarjeta.fondo1.texto2
div.cambiarModo(@click="cambiarModoColor()")
span.ocultarEnTablet Cambiar a modo {{ modoSiguiente }}
i.material-icons.texto2.mostrarEnTablet.
{{ modoSiguiente === 'oscuro'? 'brightness_3': 'brightness_5' }}
br
@ -19,28 +18,19 @@
br
router-link(to="/")
span.ocultarEnTablet Nosotros
i.material-icons.texto2.mostrarEnTablet group
i.material-icons.texto2.mostrarEnTablet(title="Nosotros") group
br.mostrarEnTablet
router-link(to="/")
span.ocultarEnTablet Cambios
i.material-icons.texto2.mostrarEnTablet new_releases
br.mostrarEnTablet
router-link(to="/")
span.ocultarEnTablet Diseño
i.material-icons.texto2.mostrarEnTablet brush
i.material-icons.texto2.mostrarEnTablet(title="Ayuda") help
br.mostrarEnTablet
a(href="https://github.com/Araozu/PseudoSubs_" target="_blank" title="GitHub")
span.ocultarEnTablet GitHub
img.imgGitHub.texto2.mostrarEnTablet(
:src="modoSiguiente === 'oscuro'? '/img/github.svg': '/img/githubOsc.svg' ")
br.mostrarEnTablet
router-link(to="/cuenta")
span.ocultarEnTablet Ajustes
i.material-icons.texto2.mostrarEnTablet settings
div.ocultarEnTablet
@ -97,11 +87,6 @@
""
this.elemHtmlModoOscuro.innerHTML = resultado
ocultarBarraLateral: ->
estadoActual = @$store.state.barraLateralOculta
console.log "Anuma v: #{estadoActual}"
@$store.commit "cambiarBarraLateral"
created: ->
unless this.elemHtmlModoOscuro
nuevoElem = document.createElement "style"
@ -114,8 +99,8 @@
if Storage? and localStorage.getItem "modoColor"
localStorage.getItem "modoColor"
else if Storage?
localStorage.setItem "modoColor", "oscuro"
"oscuro"
localStorage.setItem "modoColor", "claro"
"claro"
else
console.log "No hay soporte para LocalStorage"
"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 './registerServiceWorker'
import VueDisqus from "vue-disqus"
import VueAnalytics from "vue-analytics"
import VueGSignIn from "vue-google-signin-button"
Vue.config.productionTip = false;
Vue.use(VueDisqus);
Vue.use(VueGSignIn);
Vue.use(VueAnalytics, {
id: 'UA-113477820-1',
router
});
new Vue({
router,

View File

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

View File

@ -7,6 +7,7 @@ import AnimeList from "./views/AnimeList.vue"
import listaAnimes from "./components/AnimeList/lista-animes.vue"
import Anime from "./components/Anime/Anime.vue"
import Error404 from "./views/Error404.vue"
import Admin from "./views/Admin.vue"
Vue.use Router
@ -36,6 +37,10 @@ export default new Router
path: "/cuenta"
name: "Usuario"
component: Usuario
,
path: "/admin"
name: "Admin"
component: Admin
,
path: "*"
name: "404"

View File

@ -8,30 +8,34 @@ DEV = process.env.NODE_ENV == "development"
export default new Vuex.Store
state:
barraLateralOculta:
(localStorage?.getItem "barraLateralOculta") == "true" ? true
servidor: unless DEV then "" else ""
animes:
if localStorage?
YAML.parse ((localStorage.getItem "animes") ? "[]")
else
[]
else []
modoColor: localStorage?.getItem "modoColor" ? "claro"
modoColor: (localStorage?.getItem "modoColor") ? "claro"
tituloAnime: "Anime"
txtAdicionalAnime: "Comprimido sin perder 1 solo pixel."
mostrarImgAnime: false
imgTituloAnime: "19_2_fruits_basket"
imgTituloAnime: ""
rutaActual: [{nombre: "PseudoSubs", ruta: "/"}]
usuarioActual:
if localStorage?
YAML.parse ((localStorage.getItem "usuario") ? "{}" )
else {}
mutations:
cambiarBarraLateral: (state) ->
state.barraLateralOculta = !state.barraLateralOculta
localStorage?.setItem "barraLateralOculta", state.barraLateralOculta
establecerAnime: (state, animes) ->
localStorage?.setItem "animes", YAML.stringify animes
animesTxt = YAML.stringify 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) ->
state.modoColor = color
@ -51,4 +55,8 @@ export default new Vuex.Store
cambiarRutaActual: (state, valor) ->
state.rutaActual = valor
cambiarUsuarioActual: (state, valor) ->
state.usuarioActual = valor
if localStorage? then localStorage.setItem "usuario", YAML.stringify valor
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
ultimos-eps
animes-novelas
notificaciones
br
caracteristicas
y-notaras-la-diferencia
@ -13,6 +14,7 @@
import caracteristicas from "../components/Inicio/caracteristicas.vue"
import yNotarasLaDiferencia from "../components/Inicio/y-notaras-la-diferencia.vue"
import animesNovelas from "../components/Inicio/animes-novelas.vue"
import notificaciones from "../components/Inicio/notificaciones.vue"
export default
name: "Inicio"
@ -21,6 +23,7 @@
'y-notaras-la-diferencia': yNotarasLaDiferencia
'ultimos-eps': ultimosEps
'animes-novelas': animesNovelas
notificaciones: notificaciones
created: ->
@$store.commit "cambiarRutaActual", [{nombre: "PseudoSubs", ruta: "/"}]
#

View File

@ -9,22 +9,41 @@
div.usuario__cont.tarjeta.fondo1
div.usuario__titulo Mis Datos
br
img.usuario__img
template(v-if="$store.state.usuarioActual.googleID")
div.contImg
img.usuario__img(:src="$store.state.usuarioActual.fotoPerfil")
div.usuario__nombre Nombre: {{ $store.state.usuarioActual.nombre }}
div.usuario__correo Correo: {{ $store.state.usuarioActual.email }}
br
div.usuario__nombre Nombre:
div.usuario__correo Correo:
div.usuario__info.
Eso es todo. Puedes cambiar tu nombre y correo sin afectar tu cuenta de Google.
template(v-else)
div.
Inicia sesión* para poder recibir notificaciones en todos tus dispositivos.
br
boton-inicio-sesion
br
br
div.usuario__info Estos son todos los datos que almacenamos de ti.
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 Notificaciones
div.notificaciones__cont.tarjeta.fondo1
ajustes-notificaciones
//
</template>
<script lang="coffee">
import botonInicioSesion from "../components/boton-inicio-sesion.vue"
import ajustesNotificaciones from "../components/Usuario/ajustes-notificaciones.vue"
export default
name: "Usuario"
components:
"boton-inicio-sesion": botonInicioSesion
"ajustes-notificaciones": ajustesNotificaciones
#
</script>
@ -48,6 +67,7 @@
.row
margin: 0 40px
::after
content: ""
display: table
@ -64,6 +84,9 @@
family: Muli, "Open Sans", sans-serif
size: 2rem
.contImg
text-align: center
.usuario__img
width: 200px
height: 200px
@ -76,5 +99,7 @@
padding: 20px
margin: 20px
//
</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

@ -2,7 +2,6 @@ import { con } from "../index"
import YAML from "yaml"
export default (req, res) ->
if req.params.id?
idAnime = req.params.id

View File

@ -2,7 +2,6 @@ import { con } from "../index"
import YAML from "yaml"
export default (req, res) ->
query = "SELECT * FROM animes ORDER BY anime_ID DESC "
con.query query, (err, respuesta) ->
res.send do ->

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';
import mysql from "mysql";
import obtenerAnimes from "./Anime/obtenerAnime"
import obtenerTodosAnimes from "./Anime/obtenerTodosAnimes"
export const con = mysql.createConnection({
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var mysql = require("mysql");
var obtenerAnime_1 = require("./Anime/obtenerAnime");
var obtenerTodosAnimes_1 = require("./Anime/obtenerTodosAnimes");
var webPush = require("web-push");
exports.con = mysql.createConnection({
host: "127.0.0.1",
user: "pseubntq_araozu",
password: "@Xsakah4b",
database: "pseubntq_pseudosubs"
database: "pseubntq_pseudosubs",
multipleStatements: true
});
con.connect(err => {
exports.con.connect(function (err) {
if (err) {
console.log("Error al conectarse a la base de datos :c\n" + err);
} else {
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 default (app, http) => {
app.get("/anime/:id", obtenerAnimes);
app.get("/anime", obtenerTodosAnimes);
}
exports.fun = function (app) {
var 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", 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

@ -20,5 +20,11 @@ module.exports = {
runtimeCompiler: undefined,
productionSourceMap: false,
parallel: undefined,
css: undefined
css: undefined,
pwa: {
workboxOptions: {
skipWaiting: true
}
}
};

439
yarn.lock
View File

@ -669,6 +669,14 @@
lodash "^4.17.11"
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":
version "1.0.6"
resolved "https://registry.yarnpkg.com/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz#be7c7846128b88f6a9b1d1261a0ad06eb5c0fdf8"
@ -712,11 +720,43 @@
dependencies:
"@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@*":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7"
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":
version "7.1.1"
resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575"
@ -726,11 +766,23 @@
"@types/minimatch" "*"
"@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@*":
version "3.0.3"
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
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@*":
version "11.11.8"
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"
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":
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"
@ -1107,6 +1172,13 @@ abbrev@1:
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
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:
version "1.3.5"
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"
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:
version "1.0.1"
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"
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:
version "0.2.4"
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"
integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
base64-js@^1.0.2:
base64-js@^1.0.2, base64-js@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
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"
integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
bignumber.js@4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-4.1.0.tgz#db6f14067c140bd46624815a7916c92d9b6c24b1"
integrity sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA==
bignumber.js@7.2.1, bignumber.js@^7.0.0:
version "7.2.1"
resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f"
integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==
binary-extensions@^1.0.0:
version "1.13.0"
@ -1573,6 +1661,11 @@ block-stream@*:
dependencies:
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:
version "3.5.3"
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"
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:
version "3.5.0"
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"
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:
version "1.1.1"
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"
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:
version "10.0.4"
resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460"
@ -2206,7 +2325,7 @@ compressible@~2.0.16:
dependencies:
mime-db ">= 1.38.0 < 2"
compression@^1.5.2:
compression@^1.5.2, compression@^1.7.4:
version "1.7.4"
resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f"
integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==
@ -2246,7 +2365,7 @@ configstore@^3.0.0:
write-file-atomic "^2.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"
resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc"
integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==
@ -2982,6 +3101,13 @@ ecc-jsbn@~0.1.1:
jsbn "~0.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:
version "1.1.1"
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-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:
version "1.0.3"
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"
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:
version "3.1.0"
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"
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"
resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e"
integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==
@ -3271,7 +3414,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2:
assign-symbols "^1.0.0"
is-extendable "^1.0.1"
extend@~3.0.2:
extend@^3.0.2, extend@~3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
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"
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:
version "1.1.2"
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"
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:
version "1.1.1"
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"
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:
version "1.1.3"
resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a"
@ -3577,6 +3746,14 @@ gaze@^1.0.0:
dependencies:
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:
version "1.0.3"
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"
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:
version "6.7.1"
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"
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:
version "5.0.0"
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"
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:
version "0.5.0"
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"
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:
version "1.0.0"
resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
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:
version "0.4.23"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
@ -4000,7 +4237,7 @@ iconv-lite@0.4.23:
dependencies:
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"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
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"
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:
version "1.0.0"
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"
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:
version "1.0.2"
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"
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:
version "1.0.1"
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"
yallist "^2.1.2"
lru-cache@^5.1.1:
lru-cache@^5.0.0, lru-cache@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
@ -5064,6 +5330,11 @@ miller-rabin@^4.0.0:
bn.js "^4.0.0"
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:
version "1.38.0"
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:
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:
version "1.4.1"
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"
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:
version "1.2.0"
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"
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"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
@ -5237,12 +5520,17 @@ multicast-dns@^6.0.1:
dns-packet "^1.3.1"
thunky "^1.0.2"
mysql@^2.16.0:
version "2.16.0"
resolved "https://registry.yarnpkg.com/mysql/-/mysql-2.16.0.tgz#b23b22ab5de44fc2d5d32bd4f5af6653fc45e2ba"
integrity sha512-dPbN2LHonQp7D5ja5DJXNbCLe/HRdu+f3v61aguzNRQIrmZLOeRoymBYyeThrR6ug+FqzDL95Gc9maqZUJS+Gw==
mute-stream@~0.0.4:
version "0.0.8"
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
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:
bignumber.js "4.1.0"
bignumber.js "7.2.1"
readable-stream "2.3.6"
safe-buffer "5.1.2"
sqlstring "2.3.1"
@ -5300,11 +5588,21 @@ no-case@^2.2.0:
dependencies:
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:
version "0.7.5"
resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df"
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:
version "3.8.0"
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"
integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
pify@^4.0.1:
pify@^4.0.0, pify@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
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"
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:
version "1.0.1"
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"
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:
version "0.2.1"
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"
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:
version "1.2.8"
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"
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:
version "2.3.6"
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"
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:
version "3.2.0"
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"
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:
version "2.4.11"
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"
object-copy "^0.1.0"
"statuses@>= 1.4.0 < 2":
"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2":
version "1.5.0"
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
@ -7497,6 +7846,11 @@ string_decoder@^1.0.0, string_decoder@^1.1.1:
dependencies:
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:
version "1.1.1"
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"
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:
version "0.0.1"
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"
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:
version "0.0.6"
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"
integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=
upath@^1.1.1:
upath@^1.0.5, upath@^1.1.1:
version "1.1.2"
resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068"
integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==
@ -8070,6 +8437,11 @@ url@^0.11.0:
punycode "1.3.2"
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:
version "3.1.1"
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"
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:
version "1.0.0"
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"
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:
version "2.3.3"
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:
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:
version "3.1.0"
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"
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:
version "4.0.0"
resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020"