move frontend routing to frontend instead of symfony

This commit is contained in:
Kacper Donat 2020-11-02 22:04:40 +01:00
parent 65a9819b1b
commit b71ca34dd3
23 changed files with 579 additions and 241 deletions

View File

@ -13,7 +13,7 @@ nelmio_api_doc:
areas:
path_patterns:
- ^/[^\/]+/api(?!/doc$) # Accepts routes under /api except /api/doc
- /api(?!/doc$) # Accepts routes under /api except /api/doc

View File

@ -1,9 +1,16 @@
api_v1:
resource: ../src/Controller/Api/v1
type: annotation
prefix: /{provider}/api/v1
prefix: /api/v1/{provider}
api_v1_providers:
path: /api/v1/providers
methods: ["GET"]
defaults:
_controller: '\App\Controller\Api\v1\ProviderController::index'
api_v1_providers_one:
path: /api/v1/providers/{id}
methods: ["GET"]
defaults:
_controller: '\App\Controller\Api\v1\ProviderController::one'

View File

@ -5,19 +5,10 @@ namespace App\Controller\Api\v1;
use App\Controller\Controller;
use App\Service\Converter;
use App\Service\ProviderResolver;
use Swagger\Annotations as SWG;
use Symfony\Component\Routing\Annotation\Route;
use function Kadet\Functional\ref;
/**
* @Route("/providers")
* @SWG\Tag(name="Providers")
*/
class ProviderController extends Controller
{
/**
* @Route("/", methods={"GET"})
*/
public function index(ProviderResolver $resolver, Converter $converter)
{
$providers = $resolver
@ -28,4 +19,11 @@ class ProviderController extends Controller
;
return $this->json($providers);
}
public function one(ProviderResolver $resolver, Converter $converter, $id)
{
$provider = $resolver->resolve($id);
return $this->json($converter->convert($provider));
}
}

View File

@ -9,11 +9,8 @@ use App\Model\Track;
use App\Modifier\IdFilter;
use App\Modifier\RelatedFilter;
use App\Provider\TrackRepository;
use App\Service\IterableUtils;
use Nelmio\ApiDocBundle\Annotation\Model;
use Swagger\Annotations as SWG;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\Routing\Annotation\Route;
use function App\Functions\encapsulate;
use function Kadet\Functional\ref;
@ -41,6 +38,10 @@ class TracksController extends Controller
/**
* @Route("/stops", methods={"GET"})
* @Route("/{track}/stops", methods={"GET"})
*
* @SWG\Tag(name="Tracks")
*
* @SWG\Response(response=200, description="Stops related to specified query.")
*/
public function stops(Request $request, TrackRepository $repository)
{

View File

@ -4,145 +4,6 @@
{% block body %}
<main id="app" class="container not-ready">
<div class="row">
<div class="col-md-8 order-md-last">
<section class="section messages" v-show="messages.count > 0">
<header class="section__title flex">
<h2>
<ui-icon icon="messages" fixed-width class="mr-2"></ui-icon>
Komunikaty <span class="ml-2 badge badge-pill badge-dark">{{ '{{ messages.count }}' }}</span>
</h2>
<button class="btn btn-action flex-space-left" ref="settings-messages" @click="visibility.messages = !visibility.messages">
<tooltip>ustawienia</tooltip>
<ui-icon icon="settings" fixed-width></ui-icon>
</button>
<button class="btn btn-action" @click="updateMessages" ref="btn-messages-refresh">
<tooltip>odśwież</tooltip>
<ui-icon icon="refresh" :spin="messages.state === 'fetching'" fixed-width></ui-icon>
</button>
<button class="btn btn-action" @click="sections.messages = !sections.messages">
<tooltip>
{{ '{{ ' }} sections.messages ? 'zwiń' : 'rozwiń' {{ '}}' }}
<span class="sr-only">sekcję komunikatów</span>
</tooltip>
<ui-icon :icon="sections.messages ? 'chevron-up' : 'chevron-down'" fixed-width></ui-icon>
</button>
<portal to="popups">
<ui-dialog reference="settings-messages" v-if="visibility.messages" arrow placement="left-start" @leave="visibility.messages = false">
<settings-messages></settings-messages>
</ui-dialog>
</portal>
</header>
<fold :visible="sections.messages">
<messages></messages>
</fold>
</section>
<section class="section">
<header class="section__title flex">
<h2>
<ui-icon icon="timetable" fixed-width></ui-icon>
<span class="text">Odjazdy</span>
</h2>
<button class="btn btn-action flex-space-left" ref="settings-departures" @click="visibility.departures = !visibility.departures">
<tooltip>ustawienia</tooltip>
<ui-icon icon="settings" fixed-width></ui-icon>
</button>
<button class="btn btn-action" @click="updateDepartures({ stops })">
<tooltip>odśwież</tooltip>
<ui-icon icon="refresh" :spin="departures.state === 'fetching'" fixed-width></ui-icon>
</button>
<portal to="popups">
<ui-dialog reference="settings-departures" v-if="visibility.departures" @leave="visibility.departures = false" arrow placement="left-start">
<settings-departures></settings-departures>
</ui-dialog>
</portal>
</header>
<departures :stops="stops" v-if="stops.length > 0"></departures>
<div class="alert alert-info" v-else>
<ui-icon icon="info"></ui-icon>
Wybierz przystanki korzystając z wyszukiwarki poniżej, aby zobaczyć listę odjazdów.
</div>
{% if provider.attribution %}
<div class="attribution">
<ui-icon icon="info"></ui-icon>
Pochodzenie danych: {{ provider.attribution|raw }}
</div>
{% endif %}
</section>
</div>
<div class="col-md-4 order-md-first">
<section class="section picker" v-if="stops.length > 0">
<header class="section__title flex">
<h2>
<ui-icon icon="stop" fixed-width></ui-icon>
<span class="text">Przystanki</span>
</h2>
<button class="btn btn-action flex-space-left" @click="clear">
<tooltip>usuń wszystkie</tooltip>
<ui-icon icon="delete" fixed-width></ui-icon>
</button>
</header>
<ul class="picker__stops list-underlined">
<li v-for="stop in stops" :key="stop.id" class="picker__stop">
<picker-stop :stop="stop">
<template v-slot:primary-action>
<button @click="remove(stop)" class="btn btn-action">
<tooltip>usuń przystanek</tooltip>
<ui-icon icon="remove-stop"></ui-icon>
</button>
</template>
</picker-stop>
</li>
</ul>
<div class="d-flex mt-2">
<button class="btn btn-action btn-sm flex-space-left" @click="visibility.save = true" ref="save">
<ui-icon icon="favourite" fixed-width></ui-icon>
zapisz jako...
</button>
</div>
<ui-dialog reference="save" v-if="visibility.save" arrow placement="bottom-end" @leave="visibility.save = false" title="Dodaj do ulubionych">
<favourites-adder @saved="visibility.save = false"/>
</ui-dialog>
</section>
<section class="section picker">
<header class="section__title flex">
<template v-if="visibility.picker === 'search'">
<h2 class="flex-grow-1">
<ui-icon icon="search" fixed-width class="mr-1"></ui-icon>
Wybierz przystanki
</h2>
<button class="btn btn-action" @click="visibility.picker = 'favourites'">
<tooltip>Zapisane</tooltip>
<ui-icon icon="favourite" fixed-witdth></ui-icon>
</button>
</template>
<template v-else>
<h2 class="flex-grow-1">
<ui-icon icon="favourite" fixed-width class="mr-1"></ui-icon>
Zapisane
</h2>
<button class="btn btn-action" @click="visibility.picker = 'search'">
<tooltip>Wybierz przystanki</tooltip>
<ui-icon icon="search" fixed-witdth></ui-icon>
</button>
</template>
</header>
<div class="transition-box">
<transition name="fade">
<stop-finder @select="add" :blacklist="stops" v-if="visibility.picker === 'search'"></stop-finder>
<favourites v-else-if="visibility.picker === 'favourites'"></favourites>
</transition>
</div>
</section>
</div>
</div>
<portal-target name="popups" multiple></portal-target>
</main>
{% endblock %}

View File

@ -5,5 +5,5 @@
{% block stylesheets %}
{{ parent() }}
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:400,700|Source+Code+Pro:300,600|Titillium+Web:400,600,700">
<link rel="stylesheet" href="dist/api.css" />
<link rel="stylesheet" href="/dist/api.css" />
{% endblock stylesheets %}

View File

@ -2,18 +2,20 @@ server {
root /var/www/front/public/;
server_name cojedzie.localhost;
index index.php;
index dist/index.html;
location ~ \.(js|css)$ {
expires 1y;
location /api/ {
root /var/www/api/public/;
try_files $uri $uri/ index.php$is_args$args;
}
location /bundles/ {
root /var/www/api/public/;
try_files $uri $uri/;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
location = / {
root /var/www/api/public/;
try_files $uri $uri/ /dist/index.html =404;
}
location ~ (.+).php(/|$) {

View File

@ -40,6 +40,7 @@
"@types/workbox-window": "^4.3.3",
"clean-webpack-plugin": "^3.0.0",
"copy-webpack-plugin": "^4.5.2",
"html-webpack-plugin": "^4.5.0",
"imagemin-webpack-plugin": "^2.3.0",
"mapbox-gl": "^1.6.1",
"mapbox-gl-leaflet": "^0.0.11",
@ -49,6 +50,7 @@
"vue-fragment": "^1.5.1",
"vue-moment": "^4.1.0",
"vue-removed-hook-mixin": "^0.1.1",
"vue-router": "^3.4.8",
"vue2-leaflet": "^1.0.2",
"vuex": "^3.0.1",
"vuex-class": "^0.3.1",

View File

@ -0,0 +1,48 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="stylesheet" href="dist/main.css"/>
<link rel="manifest" href="manifest.json"/>
<!-- icons -->
<link rel="icon" href="images/favicon.png" sizes="16x16"/>
<link rel="icon" href="images/favicon-2x.png" sizes="32x32"/>
<link rel="icon" href="images/favicon.ico"/>
<!-- Apple shit -->
<link rel="apple-touch-icon" href="images/ios.png" sizes="512x512">
<link rel="apple-touch-icon" href="images/ios-80.png" sizes="80x80">
<link rel="apple-touch-icon" href="images/ios-192.png" sizes="192x192">
<meta name="apple-mobile-web-app-title" content="Co Jedzie?">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="theme-color" content="white"/>
<title>Co Jedzie?</title>
</head>
<body>
<noscript>
<div class="container">
<div class="alert alert-danger">
Aplikacja wymaga do działania obsługi JavaScriptu.
</div>
</div>
</noscript>
<main id="root" class="container not-ready">
</main>
<footer class="container">
<span>
<img src="images/logo.png" alt="co jedzie logo"/>
v.<%= htmlWebpackPlugin.options.version %> &bullet;
<a href="/api/doc">API</a>
</span>
<span class="copyright flex flex-space-left justify-content-end">
<a href="https://kadet.net"><img src="images/kadet-net-logo.png" alt="kadet.net logo" class="mx-1"/></a>
&copy; <%= htmlWebpackPlugin.options.year %>
</span>
</footer>
</body>
</html>

View File

@ -18,6 +18,7 @@ import { Component } from "vue-property-decorator";
import * as VueMoment from "vue-moment";
import * as moment from 'moment';
import 'moment/locale/pl'
import VueRouter from "vue-router";
window['$'] = window['jQuery'] = $;
window['Popper'] = Popper;
@ -27,6 +28,7 @@ Vue.use(PortalVue);
Vue.use(VueDragscroll);
Vue.use(VueFragment);
Vue.use(VueMoment, { moment });
Vue.use(VueRouter);
declare module 'vue/types/vue' {
interface Vue {
@ -55,20 +57,7 @@ Component.registerHooks(['removed']);
import('bootstrap'),
] as const);
const appRoot = document.getElementById('app');
store.replaceState({
...store.state,
provider: window['data']?.provider,
});
// here goes "public" API
window['app'] = Object.assign({
state: {}
}, window['app'], {
components,
application: appRoot ? new components.Application({ el: '#app' }) : new components.PageProviderList({ el: '#provider-picker' }),
});
const application = new components.Application().$mount("#root")
if ('serviceWorker' in navigator) {
const wb = new Workbox("/service-worker.js");

View File

@ -0,0 +1,20 @@
import Vue from "vue";
import Component from "vue-class-component";
import VueRouter, { RouteConfig } from "vue-router";
import { Main, ProviderChooser } from "@/components";
import store from "@/store";
const routes: RouteConfig[] = [
{ path: "/:provider", component: Main },
{ path: "/", component: ProviderChooser },
]
export const router = new VueRouter({
routes,
mode: 'history',
});
@Component({ template: require("@templates/app.html"), router, store })
export class Application extends Vue {
}

View File

@ -6,12 +6,13 @@ export * from './departures'
export * from './stop'
export * from './messages'
export * from './map'
export * from './app'
export * from './main'
export * from './favourites'
export * from './trip'
export * from './ui'
export * from './settings'
export * from "./page"
export * from "./provider-chooser"
export * from "./application"
export { Departures } from "../store";
export { Messages } from "../store";

View File

@ -1,13 +1,12 @@
import Vue from 'vue'
import store from '../store'
import { Component, Watch } from "vue-property-decorator";
import { Action, Mutation } from 'vuex-class'
import { Stop } from "@/model";
import { Action, Mutation, State } from 'vuex-class'
import { Provider, Stop } from "@/model";
import { DeparturesSettingsState } from "@/store/settings/departures";
import { MessagesSettingsState } from "@/store/settings/messages";
@Component({ store })
export class Application extends Vue {
@Component({ template: require("@templates/main.html") })
export class Main extends Vue {
private sections = {
messages: true
};
@ -21,6 +20,8 @@ export class Application extends Vue {
private intervals = { messages: null, departures: null };
@State private provider: Provider;
get messages() {
return {
count: this.$store.getters['messages/count'],
@ -47,9 +48,10 @@ export class Application extends Vue {
this.$el.classList.remove('not-ready');
}
created() {
async created() {
await this.$store.dispatch('loadProvider', { provider: this.$route.params.provider });
this.$store.dispatch('messages/update');
this.$store.dispatch('load', window['app'].state);
this.$store.dispatch('load', { });
this.initDeparturesRefreshInterval();
this.initMessagesRefreshInterval();

View File

@ -1 +0,0 @@
export * from "./providers"

View File

@ -7,7 +7,7 @@ import * as moment from 'moment';
@Component({
template: require('@templates/page/providers.html'),
})
export class PageProviderList extends Vue {
export class ProviderChooser extends Vue {
private providers: Provider[] = [];
async created() {
@ -23,4 +23,4 @@ export class PageProviderList extends Vue {
}
}
Vue.component('PageProviderList', PageProviderList);
Vue.component('ProviderChooser', ProviderChooser);

View File

@ -3,7 +3,7 @@ import Component from "vue-class-component";
import { Prop, Watch } from "vue-property-decorator";
type Events = {
[evnet: string]: (...any) => void,
[event: string]: (...any) => void,
}
type Trigger = "hover" | "focus" | "long-press";

View File

@ -13,6 +13,10 @@ export interface SavedState {
stops: string[],
}
export interface LoadProviderActionPayload {
provider: string;
}
export const state: RootState = {
stops: [],
provider: null,
@ -23,9 +27,17 @@ export const mutations: MutationTree<RootState> = {
replace: (state, stops) => state.stops = stops,
remove: (state, stop) => state.stops = state.stops.filter(s => s != stop),
clear: (state) => state.stops = [],
setProvider: (state, provider) => state.provider = provider,
};
export const actions: ActionTree<RootState, undefined> = {
async loadProvider({ commit }, { provider }) {
const response = await fetch(urls.prepare(urls.providers.get, { provider }));
if (response.ok) {
commit('setProvider', await response.json());
}
},
async load({ commit }, { stops }: SavedState) {
if (stops.length > 0) {
const response = await fetch(urls.prepare(urls.stops.all, { id: stops }));

View File

@ -51,7 +51,7 @@ export function prepare(url: string, params: UrlParams = { }) {
return Object.keys(params).length > 0 ? `${url}?${query(params)}` : url;
}
const base = '/{provider}/api/v1';
const base = '/api/v1/{provider}';
export default {
departures: `${base}/departures`,
@ -62,6 +62,9 @@ export default {
get: `${base}/stops/{id}`,
tracks: `${base}/stops/{id}/tracks`
},
providers: {
get: `/api/v1/providers/{provider}`,
},
trip: `${base}/trips/{id}`,
prepare: (url: string, params: UrlParams = { }) => prepare(url, Object.assign({}, { provider: store.state.provider }, params))
prepare: (url: string, params: UrlParams = { }) => prepare(url, Object.assign({}, { provider: store.state.provider?.id }, params))
}

5
front/templates/app.html Normal file
View File

@ -0,0 +1,5 @@
<main class="d-flex">
<router-view />
<portal-target name="popups" multiple />
</main>

142
front/templates/main.html Normal file
View File

@ -0,0 +1,142 @@
<div class="container" id="app">
<div class="row">
<div class="col-md-8 order-md-last">
<section class="section messages" v-show="messages.count > 0">
<header class="section__title flex">
<h2>
<ui-icon icon="messages" fixed-width class="mr-2"></ui-icon>
Komunikaty <span class="ml-2 badge badge-pill badge-dark">{{ messages.count }}</span>
</h2>
<button class="btn btn-action flex-space-left" ref="settings-messages"
@click="visibility.messages = !visibility.messages">
<tooltip>ustawienia</tooltip>
<ui-icon icon="settings" fixed-width></ui-icon>
</button>
<button class="btn btn-action" @click="updateMessages" ref="btn-messages-refresh">
<tooltip>odśwież</tooltip>
<ui-icon icon="refresh" :spin="messages.state === 'fetching'" fixed-width></ui-icon>
</button>
<button class="btn btn-action" @click="sections.messages = !sections.messages">
<tooltip>
{{ sections.messages ? 'zwiń' : 'rozwiń' }}
<span class="sr-only">sekcję komunikatów</span>
</tooltip>
<ui-icon :icon="sections.messages ? 'chevron-up' : 'chevron-down'" fixed-width></ui-icon>
</button>
<portal to="popups">
<ui-dialog reference="settings-messages" v-if="visibility.messages" arrow placement="left-start"
@leave="visibility.messages = false">
<settings-messages></settings-messages>
</ui-dialog>
</portal>
</header>
<fold :visible="sections.messages">
<messages></messages>
</fold>
</section>
<section class="section">
<header class="section__title flex">
<h2>
<ui-icon icon="timetable" fixed-width></ui-icon>
<span class="text">Odjazdy</span>
</h2>
<button class="btn btn-action flex-space-left" ref="settings-departures"
@click="visibility.departures = !visibility.departures">
<tooltip>ustawienia</tooltip>
<ui-icon icon="settings" fixed-width></ui-icon>
</button>
<button class="btn btn-action" @click="updateDepartures({ stops })">
<tooltip>odśwież</tooltip>
<ui-icon icon="refresh" :spin="departures.state === 'fetching'" fixed-width></ui-icon>
</button>
<portal to="popups">
<ui-dialog reference="settings-departures" v-if="visibility.departures"
@leave="visibility.departures = false" arrow placement="left-start">
<settings-departures></settings-departures>
</ui-dialog>
</portal>
</header>
<departures :stops="stops" v-if="stops.length > 0"></departures>
<div class="alert alert-info" v-else>
<ui-icon icon="info"></ui-icon>
Wybierz przystanki korzystając z wyszukiwarki poniżej, aby zobaczyć listę odjazdów.
</div>
<div class="attribution" v-if="provider && provider.attribution">
<ui-icon icon="info"></ui-icon>
Pochodzenie danych: <span class="attribution__attribution" v-html="provider.attribution"></span>
</div>
</section>
</div>
<div class="col-md-4 order-md-first">
<section class="section picker" v-if="stops.length > 0">
<header class="section__title flex">
<h2>
<ui-icon icon="stop" fixed-width></ui-icon>
<span class="text">Przystanki</span>
</h2>
<button class="btn btn-action flex-space-left" @click="clear">
<tooltip>usuń wszystkie</tooltip>
<ui-icon icon="delete" fixed-width></ui-icon>
</button>
</header>
<ul class="picker__stops list-underlined">
<li v-for="stop in stops" :key="stop.id" class="picker__stop">
<picker-stop :stop="stop">
<template v-slot:primary-action>
<button @click="remove(stop)" class="btn btn-action">
<tooltip>usuń przystanek</tooltip>
<ui-icon icon="remove-stop"></ui-icon>
</button>
</template>
</picker-stop>
</li>
</ul>
<div class="d-flex mt-2">
<button class="btn btn-action btn-sm flex-space-left" @click="visibility.save = true" ref="save">
<ui-icon icon="favourite" fixed-width></ui-icon>
zapisz jako...
</button>
</div>
<ui-dialog reference="save" v-if="visibility.save" arrow placement="bottom-end"
@leave="visibility.save = false" title="Dodaj do ulubionych">
<favourites-adder @saved="visibility.save = false"/>
</ui-dialog>
</section>
<section class="section picker">
<header class="section__title flex">
<template v-if="visibility.picker === 'search'">
<h2 class="flex-grow-1">
<ui-icon icon="search" fixed-width class="mr-1"></ui-icon>
Wybierz przystanki
</h2>
<button class="btn btn-action" @click="visibility.picker = 'favourites'">
<tooltip>Zapisane</tooltip>
<ui-icon icon="favourite" fixed-witdth></ui-icon>
</button>
</template>
<template v-else>
<h2 class="flex-grow-1">
<ui-icon icon="favourite" fixed-width class="mr-1"></ui-icon>
Zapisane
</h2>
<button class="btn btn-action" @click="visibility.picker = 'search'">
<tooltip>Wybierz przystanki</tooltip>
<ui-icon icon="search" fixed-witdth></ui-icon>
</button>
</template>
</header>
<div class="transition-box">
<transition name="fade">
<stop-finder @select="add" :blacklist="stops" v-if="visibility.picker === 'search'"></stop-finder>
<favourites v-else-if="visibility.picker === 'favourites'"></favourites>
</transition>
</div>
</section>
</div>
</div>
</div>

View File

@ -1,42 +1,38 @@
<main class="d-flex">
<div style="width: 100%">
<l-map :center="{ lat: 52.0194, lon: 19.1451 }" :zoom=7 :options="{ zoomControl: false }" class="map">
<l-vector-layer url="https://api.maptiler.com/maps/bright/style.json?key=8GX5FRUNgk4lB83GZT8Q"
token="not-needed"
attribution='<a href="https://www.maptiler.com/copyright/" target="_blank">© MapTiler</a> <a href="https://www.openstreetmap.org/copyright" target="_blank">© OpenStreetMap contributors</a>'
/>
<div style="width: 100%">
<l-map :center="{ lat: 52.0194, lon: 19.1451 }" :zoom=7 :options="{ zoomControl: false }" class="map">
<l-vector-layer url="https://api.maptiler.com/maps/bright/style.json?key=8GX5FRUNgk4lB83GZT8Q"
token="not-needed"
attribution='<a href="https://www.maptiler.com/copyright/" target="_blank">© MapTiler</a> <a href="https://www.openstreetmap.org/copyright" target="_blank">© OpenStreetMap contributors</a>'
/>
<div class="provider-picker">
<h2 class="provider-picker__heading">Wybierz lokalizację</h2>
<ul class="provider-picker__providers">
<li v-for="provider in providers" :key="provider.id" class="provider-picker__provider">
<a :href="`/${provider.id}`" class="provider">
<ui-icon icon="line-bus" size="2x" />
<div>
<div class="provider__short-name">{{ provider.shortName }}</div>
<div class="provider__name">{{ provider.name }}</div>
</div>
<tooltip v-if="provider.lastUpdate != null">Ostatnia akutalizacja: {{ provider.lastUpdate|moment('YYYY-MM-DD HH:mm') }}</tooltip>
</a>
</li>
</ul>
</div>
<div class="provider-picker">
<h2 class="provider-picker__heading">Wybierz lokalizację</h2>
<ul class="provider-picker__providers">
<li v-for="provider in providers" :key="provider.id" class="provider-picker__provider">
<a :href="`/${provider.id}`" class="provider">
<ui-icon icon="line-bus" size="2x" />
<div>
<div class="provider__short-name">{{ provider.shortName }}</div>
<div class="provider__name">{{ provider.name }}</div>
</div>
<tooltip v-if="provider.lastUpdate != null">Ostatnia akutalizacja: {{ provider.lastUpdate|moment('YYYY-MM-DD HH:mm') }}</tooltip>
</a>
</li>
</ul>
</div>
<l-marker :lat-lng="provider.location" v-for="provider in providers" :options="{ keyboard: false }" :key="provider.id">
<l-icon>
<div class="map__label-box" tabindex="0">
<a :href="`/${provider.id}`" class="provider">
<ui-icon icon="line-bus" class="map__icon" />
<div>
<div class="provider__short-name">{{ provider.shortName }}</div>
<div class="provider__name">{{ provider.name }}</div>
</div>
</a>
</div>
</l-icon>
</l-marker>
</l-map>
</div>
<portal-target name="popups" multiple/>
</main>
<l-marker :lat-lng="provider.location" v-for="provider in providers" :options="{ keyboard: false }" :key="provider.id">
<l-icon>
<div class="map__label-box" tabindex="0">
<a :href="`/${provider.id}`" class="provider">
<ui-icon icon="line-bus" class="map__icon" />
<div>
<div class="provider__short-name">{{ provider.shortName }}</div>
<div class="provider__name">{{ provider.name }}</div>
</div>
</a>
</div>
</l-icon>
</l-marker>
</l-map>
</div>

View File

@ -4,6 +4,7 @@ const CopyWebpackPlugin = require('copy-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const ImageminPlugin = require('imagemin-webpack-plugin').default;
const { GenerateSW } = require('workbox-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const config = {
entry: {
@ -59,11 +60,13 @@ const config = {
use: 'file-loader'
}, {
test: /\.html?$/,
use: 'raw-loader'
use: 'raw-loader',
exclude: [
path.resolve('./resources/index.html')
]
}]
},
plugins: [
new CleanWebpackPlugin(),
new MiniCssExtractPlugin({ filename: '[name].css' }),
new CopyWebpackPlugin([{ from: './resources/images/', to: '../images/', ignore: ['*.ai'] }]),
new ImageminPlugin({ test: /\.(jpe?g|png|gif|svg)$/i }),
@ -77,7 +80,7 @@ const config = {
handler: 'CacheFirst',
}],
swDest: '../service-worker.js'
})
}),
]
};
@ -86,5 +89,14 @@ module.exports = (env, argv) => {
config.devtool = 'inline-source-map';
}
config.plugins.push(
new HtmlWebpackPlugin({
template: path.resolve(__dirname, "./resources/index.html"),
chunks: ['main'],
year: new Date().getFullYear(),
version: process.env.CZYDOJADE_VERSION || (argv.mode === 'development' ? '2020.11-dev' : '2020.11'),
})
)
return config;
};

View File

@ -188,6 +188,11 @@
"@types/minimatch" "*"
"@types/node" "*"
"@types/html-minifier-terser@^5.0.0":
version "5.1.1"
resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#3c9ee980f1a10d6021ae6632ca3e79ca2ec4fb50"
integrity sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==
"@types/imagemin-gifsicle@^5.2.0":
version "5.2.0"
resolved "https://registry.yarnpkg.com/@types/imagemin-gifsicle/-/imagemin-gifsicle-5.2.0.tgz#349160f17412e26de8d5794e70aad504781ea7d8"
@ -294,6 +299,11 @@
resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.5.tgz#9adbc12950582aa65ead76bffdf39fe0c27a3c02"
integrity sha512-/gG2M/Imw7cQFp8PGvz/SwocNrmKFjFsm5Pb8HdbHkZ1K8pmuPzOX4VeVoiEecFCVf4CsN1r3/BRvx+6sNqwtQ==
"@types/tapable@^1.0.5":
version "1.0.6"
resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.6.tgz#a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74"
integrity sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==
"@types/uglify-js@*":
version "3.0.4"
resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.0.4.tgz#96beae23df6f561862a830b4288a49e86baac082"
@ -335,6 +345,18 @@
"@types/webpack-sources" "*"
source-map "^0.6.0"
"@types/webpack@^4.41.8":
version "4.41.24"
resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.24.tgz#75b664abe3d5bcfe54e64313ca3b43e498550422"
integrity sha512-1A0MXPwZiMOD3DPMuOKUKcpkdPo8Lq33UGggZ7xio6wJ/jV1dAu5cXDrOfGDnldUroPIRLsr/DT43/GqOA4RFQ==
dependencies:
"@types/anymatch" "*"
"@types/node" "*"
"@types/tapable" "*"
"@types/uglify-js" "*"
"@types/webpack-sources" "*"
source-map "^0.6.0"
"@types/workbox-window@^4.3.3":
version "4.3.3"
resolved "https://registry.yarnpkg.com/@types/workbox-window/-/workbox-window-4.3.3.tgz#47f91df7ce7eea5c151a6beb3e8398c7db8ee538"
@ -1102,6 +1124,14 @@ call-me-maybe@^1.0.1:
resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
integrity sha1-JtII6onje1y95gJQoV8DHBak1ms=
camel-case@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.1.tgz#1fc41c854f00e2f7d0139dfeba1542d6896fe547"
integrity sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==
dependencies:
pascal-case "^3.1.1"
tslib "^1.10.0"
camelcase-keys@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
@ -1217,6 +1247,13 @@ class-utils@^0.3.5:
isobject "^3.0.0"
static-extend "^0.1.1"
clean-css@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78"
integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==
dependencies:
source-map "~0.6.0"
clean-webpack-plugin@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz#a99d8ec34c1c628a4541567aa7b457446460c62b"
@ -1305,6 +1342,11 @@ commander@^2.20.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
commander@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
commander@~2.8.1:
version "2.8.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.8.1.tgz#06be367febfda0c330aa1e2a072d3dc9762425d4"
@ -1517,6 +1559,16 @@ css-select-base-adapter@^0.1.1:
resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7"
integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==
css-select@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=
dependencies:
boolbase "~1.0.0"
css-what "2.1"
domutils "1.5.1"
nth-check "~1.0.1"
css-select@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef"
@ -1544,6 +1596,11 @@ css-tree@1.0.0-alpha.37:
mdn-data "2.0.4"
source-map "^0.6.1"
css-what@2.1:
version "2.1.3"
resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2"
integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==
css-what@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1"
@ -1751,6 +1808,13 @@ dir-glob@^2.0.0:
dependencies:
path-type "^3.0.0"
dom-converter@^0.2:
version "0.2.0"
resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768"
integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==
dependencies:
utila "~0.4"
dom-serializer@0:
version "0.2.2"
resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51"
@ -1764,7 +1828,7 @@ domain-browser@^1.1.1:
resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==
domelementtype@1:
domelementtype@1, domelementtype@^1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
@ -1774,7 +1838,22 @@ domelementtype@^2.0.1:
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d"
integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==
domutils@^1.7.0:
domhandler@^2.3.0:
version "2.4.2"
resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==
dependencies:
domelementtype "1"
domutils@1.5.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=
dependencies:
dom-serializer "0"
domelementtype "1"
domutils@^1.5.1, domutils@^1.7.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
@ -1782,6 +1861,14 @@ domutils@^1.7.0:
dom-serializer "0"
domelementtype "1"
dot-case@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.3.tgz#21d3b52efaaba2ea5fda875bb1aa8124521cf4aa"
integrity sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==
dependencies:
no-case "^3.0.3"
tslib "^1.10.0"
download@^6.2.2:
version "6.2.5"
resolved "https://registry.yarnpkg.com/download/-/download-6.2.5.tgz#acd6a542e4cd0bb42ca70cfc98c9e43b07039714"
@ -1893,6 +1980,11 @@ enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0:
memory-fs "^0.5.0"
tapable "^1.0.0"
entities@^1.1.1:
version "1.1.2"
resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
entities@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4"
@ -2762,6 +2854,11 @@ hash.js@^1.0.0, hash.js@^1.0.3:
inherits "^2.0.3"
minimalistic-assert "^1.0.1"
he@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
hmac-drbg@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
@ -2788,6 +2885,46 @@ html-comment-regex@^1.1.0:
resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7"
integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==
html-minifier-terser@^5.0.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054"
integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==
dependencies:
camel-case "^4.1.1"
clean-css "^4.2.3"
commander "^4.1.1"
he "^1.2.0"
param-case "^3.0.3"
relateurl "^0.2.7"
terser "^4.6.3"
html-webpack-plugin@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.0.tgz#625097650886b97ea5dae331c320e3238f6c121c"
integrity sha512-MouoXEYSjTzCrjIxWwg8gxL5fE2X2WZJLmBYXlaJhQUH5K/b5OrqmV7T4dB7iu0xkmJ6JlUuV6fFVtnqbPopZw==
dependencies:
"@types/html-minifier-terser" "^5.0.0"
"@types/tapable" "^1.0.5"
"@types/webpack" "^4.41.8"
html-minifier-terser "^5.0.1"
loader-utils "^1.2.3"
lodash "^4.17.15"
pretty-error "^2.1.1"
tapable "^1.1.3"
util.promisify "1.0.0"
htmlparser2@^3.3.0:
version "3.10.1"
resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"
integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==
dependencies:
domelementtype "^1.3.1"
domhandler "^2.3.0"
domutils "^1.5.1"
entities "^1.1.1"
inherits "^2.0.1"
readable-stream "^3.1.1"
http-cache-semantics@3.8.1:
version "3.8.1"
resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2"
@ -3517,6 +3654,11 @@ lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.15, lodash@~4.17.10:
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
lodash@^4.17.20:
version "4.17.20"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
logalot@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/logalot/-/logalot-2.1.0.tgz#5f8e8c90d304edf12530951a5554abb8c5e3f552"
@ -3538,6 +3680,13 @@ loud-rejection@^1.0.0:
currently-unhandled "^0.4.1"
signal-exit "^3.0.0"
lower-case@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.1.tgz#39eeb36e396115cc05e29422eaea9e692c9408c7"
integrity sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==
dependencies:
tslib "^1.10.0"
lowercase-keys@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306"
@ -3907,6 +4056,14 @@ nice-try@^1.0.4:
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
no-case@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.3.tgz#c21b434c1ffe48b39087e86cfb4d2582e9df18f8"
integrity sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==
dependencies:
lower-case "^2.0.1"
tslib "^1.10.0"
node-gyp@^3.8.0:
version "3.8.0"
resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c"
@ -4040,7 +4197,7 @@ npm-run-path@^2.0.0:
gauge "~2.7.3"
set-blocking "~2.0.0"
nth-check@^1.0.2:
nth-check@^1.0.2, nth-check@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==
@ -4098,7 +4255,7 @@ object.assign@^4.1.0:
has-symbols "^1.0.0"
object-keys "^1.0.11"
object.getownpropertydescriptors@^2.1.0:
object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649"
integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==
@ -4317,6 +4474,14 @@ parallel-transform@^1.1.0:
inherits "^2.0.3"
readable-stream "^2.1.5"
param-case@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.3.tgz#4be41f8399eff621c56eebb829a5e451d9801238"
integrity sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==
dependencies:
dot-case "^3.0.3"
tslib "^1.10.0"
parse-asn1@^5.0.0:
version "5.1.5"
resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e"
@ -4341,6 +4506,14 @@ parse-passwd@^1.0.0:
resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=
pascal-case@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.1.tgz#5ac1975133ed619281e88920973d2cd1f279de5f"
integrity sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==
dependencies:
no-case "^3.0.3"
tslib "^1.10.0"
pascalcase@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
@ -4564,6 +4737,14 @@ pretty-bytes@^5.1.0:
resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.3.0.tgz#f2849e27db79fb4d6cfe24764fc4134f165989f2"
integrity sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg==
pretty-error@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz#be89f82d81b1c86ec8fdfbc385045882727f93b6"
integrity sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==
dependencies:
lodash "^4.17.20"
renderkid "^2.0.4"
process-nextick-args@~2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
@ -4740,6 +4921,15 @@ read-pkg@^1.0.0:
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
readable-stream@^3.1.1:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
dependencies:
inherits "^2.0.3"
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
readdirp@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
@ -4808,11 +4998,27 @@ regjsparser@^0.1.4:
dependencies:
jsesc "~0.5.0"
relateurl@^0.2.7:
version "0.2.7"
resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=
remove-trailing-separator@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
renderkid@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.4.tgz#d325e532afb28d3f8796ffee306be8ffd6fc864c"
integrity sha512-K2eXrSOJdq+HuKzlcjOlGoOarUu5SDguDEhE7+Ah4zuOWL40j8A/oHvLlLob9PSTNvVnBd+/q0Er1QfpEuem5g==
dependencies:
css-select "^1.1.0"
dom-converter "^0.2"
htmlparser2 "^3.3.0"
lodash "^4.17.20"
strip-ansi "^3.0.0"
repeat-element@^1.1.2:
version "1.1.3"
resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
@ -5229,7 +5435,7 @@ source-map@^0.5.6:
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
@ -5416,7 +5622,7 @@ string.prototype.trimright@^2.1.1:
define-properties "^1.1.3"
function-bind "^1.1.1"
string_decoder@^1.0.0:
string_decoder@^1.0.0, string_decoder@^1.1.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
@ -5618,6 +5824,15 @@ terser@^4.1.2:
source-map "~0.6.1"
source-map-support "~0.5.12"
terser@^4.6.3:
version "4.8.0"
resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17"
integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==
dependencies:
commander "^2.20.0"
source-map "~0.6.1"
source-map-support "~0.5.12"
through2@^2.0.0:
version "2.0.5"
resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
@ -5721,6 +5936,11 @@ ts-loader@^4.5.0:
micromatch "^3.1.4"
semver "^5.0.1"
tslib@^1.10.0:
version "1.14.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
tslib@^1.9.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
@ -5852,11 +6072,19 @@ use@^3.1.0:
resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
util-deprecate@~1.0.1:
util-deprecate@^1.0.1, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
util.promisify@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==
dependencies:
define-properties "^1.1.2"
object.getownpropertydescriptors "^2.0.3"
util.promisify@^1.0.0, util.promisify@~1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee"
@ -5881,6 +6109,11 @@ util@^0.11.0:
dependencies:
inherits "2.0.3"
utila@~0.4:
version "0.4.0"
resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c"
integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=
uuid@^3.0.1, uuid@^3.3.2:
version "3.4.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
@ -5956,6 +6189,11 @@ vue-removed-hook-mixin@^0.1.1:
resolved "https://registry.yarnpkg.com/vue-removed-hook-mixin/-/vue-removed-hook-mixin-0.1.1.tgz#df2e939c87d8ecf1707f0b3b3a21def81dedbaf5"
integrity sha512-ElO0fn1QT25S7WVHUS7rSug7qBHwR/OPxBTdaH2+DdMz0A/lyw3H40c/Q08k2xvndmx7tAglsevcTk2DgKPsvw==
vue-router@^3.4.8:
version "3.4.8"
resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.4.8.tgz#2c06261d35d8075893470352d42d70b6287b8194"
integrity sha512-3BsR84AqarcmweXjItxw3jwQsiYNssYg090yi4rlzTnCJxmHtkyCvhNz9Z7qRSOkmiV485KkUCReTp5AjNY4wg==
vue2-leaflet@^1.0.2:
version "1.2.3"
resolved "https://registry.yarnpkg.com/vue2-leaflet/-/vue2-leaflet-1.2.3.tgz#00ddeb9db4fb9a5e3b8f9c09cd97a4734366415e"