Compare commits
	
		
			21 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					2325881bd8 | ||
| 
						 | 
					067fea2b7a | ||
| 
						 | 
					8ac689ca57 | ||
| 
						 | 
					5e9ffe7fcf | ||
| 
						 | 
					3b3ba92d27 | ||
| 
						 | 
					df2834fd81 | ||
| 
						 | 
					2ecfefb35f | ||
| 
						 | 
					d18d3f800b | ||
| 
						 | 
					9d7fd4eaf0 | ||
| 
						 | 
					032ebfd307 | ||
| 
						 | 
					7f74a0f551 | ||
| 
						 | 
					dc42180339 | ||
| 
						 | 
					972cbb8b2e | ||
| 
						 | 
					5ee895357d | ||
| 
						 | 
					d7cfe64273 | ||
| 
						 | 
					f06354f909 | ||
| 
						 | 
					0416fd541c | ||
| 
						 | 
					98701b1c7c | ||
| 
						 | 
					17e08c02bb | ||
| 
						 | 
					22108a2782 | ||
| 
						 | 
					742056bbef | 
							
								
								
									
										25
									
								
								.editorconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								.editorconfig
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,25 @@
 | 
			
		||||
root = true
 | 
			
		||||
 | 
			
		||||
[*]
 | 
			
		||||
charset = utf-8
 | 
			
		||||
end_of_line = lf
 | 
			
		||||
indent_style = space
 | 
			
		||||
indent_size = 4
 | 
			
		||||
insert_final_newline = true
 | 
			
		||||
trim_trailing_whitespace = true
 | 
			
		||||
max_line_length = 120
 | 
			
		||||
 | 
			
		||||
[*.sh]
 | 
			
		||||
indent_size = 2
 | 
			
		||||
 | 
			
		||||
[*.js]
 | 
			
		||||
indent_size = 2
 | 
			
		||||
 | 
			
		||||
[*.vue]
 | 
			
		||||
indent_size = 2
 | 
			
		||||
 | 
			
		||||
[Makefile]
 | 
			
		||||
indent_style = tab
 | 
			
		||||
 | 
			
		||||
[package.json]
 | 
			
		||||
indent_size = 1
 | 
			
		||||
							
								
								
									
										3
									
								
								.prettierrc.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.prettierrc.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
{
 | 
			
		||||
  "printWidth": 120
 | 
			
		||||
}
 | 
			
		||||
@@ -8,7 +8,8 @@ services:
 | 
			
		||||
 | 
			
		||||
before_install:
 | 
			
		||||
  - nvm install --lts
 | 
			
		||||
  - npm i
 | 
			
		||||
  - npm i -g npm
 | 
			
		||||
  - npm ci
 | 
			
		||||
  - go get -u github.com/gobuffalo/packr/packr
 | 
			
		||||
 | 
			
		||||
after_success:
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ dozzle doesn't support authentication out of the box. You can control the device
 | 
			
		||||
 | 
			
		||||
    $ docker run --volume=/var/run/docker.sock:/var/run/docker.sock -p 8888:1224 amir20/dozzle:latest -addr localhost:1224
 | 
			
		||||
 | 
			
		||||
will bind to `localhost` on port `1224`. You can then use use reverse proxy to control who can see the dozzle.
 | 
			
		||||
will bind to `localhost` on port `1224`. You can then use use reverse proxy to control who can see dozzle.
 | 
			
		||||
 | 
			
		||||
#### Environment variable, DOCKER_API_VERSION
 | 
			
		||||
 | 
			
		||||
@@ -38,7 +38,7 @@ If you see
 | 
			
		||||
 | 
			
		||||
Then you need to modify `DOCKER_API_VERSION` to let dozzle know which version of the API is supported. By default, `DOCKER_API_VERSION=1.38` and you can change it to by passing `-e` flag. For example, this would change the `DOCKER_API_VERSION` to `1.20`
 | 
			
		||||
 | 
			
		||||
$ docker run --volume=/var/run/docker.sock:/var/run/docker.sock -e DOCKER_API_VERSION=1.20 -p 8888:8080 amir20/dozzle:latest
 | 
			
		||||
    $ docker run --volume=/var/run/docker.sock:/var/run/docker.sock -e DOCKER_API_VERSION=1.20 -p 8888:8080 amir20/dozzle:latest
 | 
			
		||||
 | 
			
		||||
If you are not sure what to set `DOCKER_API_VERSION` then run `docker version` which will show supported API version.
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +1,48 @@
 | 
			
		||||
<template lang="html">
 | 
			
		||||
    <router-view></router-view>
 | 
			
		||||
  <div class="columns is-marginless">
 | 
			
		||||
    <aside class="column menu is-2 section">
 | 
			
		||||
      <h1 class="title has-text-warning">Dozzle</h1>
 | 
			
		||||
      <p class="menu-label">Containers</p>
 | 
			
		||||
      <ul class="menu-list">
 | 
			
		||||
        <li v-for="item in containers">
 | 
			
		||||
          <router-link
 | 
			
		||||
            :to="{ name: 'container', params: { id: item.Id } }"
 | 
			
		||||
            active-class="is-active"
 | 
			
		||||
            class="tooltip is-tooltip-right is-tooltip-info"
 | 
			
		||||
            :data-tooltip="item.Names[0]"
 | 
			
		||||
          >
 | 
			
		||||
            <div class="hide-overflow">{{ item.Names[0] }}</div>
 | 
			
		||||
          </router-link>
 | 
			
		||||
        </li>
 | 
			
		||||
      </ul>
 | 
			
		||||
    </aside>
 | 
			
		||||
    <div class="column is-offset-2"><router-view></router-view></div>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
export default {
 | 
			
		||||
  name: "App"
 | 
			
		||||
  name: "App",
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      containers: []
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
  async created() {
 | 
			
		||||
    this.containers = await (await fetch(`/api/containers.json`)).json();
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="css">
 | 
			
		||||
.section.is-fullwidth {
 | 
			
		||||
  padding: 0 !important;
 | 
			
		||||
<style scoped>
 | 
			
		||||
aside {
 | 
			
		||||
  position: fixed;
 | 
			
		||||
  padding-right: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.hide-overflow {
 | 
			
		||||
  text-overflow: ellipsis;
 | 
			
		||||
  white-space: nowrap;
 | 
			
		||||
  overflow: hidden;
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										71
									
								
								assets/components/ScrollbarNotification.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								assets/components/ScrollbarNotification.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,71 @@
 | 
			
		||||
<template lang="html">
 | 
			
		||||
  <transition name="fade">
 | 
			
		||||
    <button
 | 
			
		||||
      class="button scroll-notification"
 | 
			
		||||
      :class="hasNew ? 'is-warning' : 'is-primary'"
 | 
			
		||||
      @click="scrollToBottom"
 | 
			
		||||
      v-show="visible"
 | 
			
		||||
    >
 | 
			
		||||
      <span class="icon large"> <i class="fas fa-chevron-down"></i> </span>
 | 
			
		||||
    </button>
 | 
			
		||||
  </transition>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
export default {
 | 
			
		||||
  props: ["messages"],
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      visible: false,
 | 
			
		||||
      hasNew: false
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
  mounted() {
 | 
			
		||||
    document.addEventListener("scroll", this.onScroll, { passive: true });
 | 
			
		||||
    setTimeout(() => this.scrollToBottom(), 500);
 | 
			
		||||
  },
 | 
			
		||||
  beforeDestroy() {
 | 
			
		||||
    document.removeEventListener("scroll", this.onScroll);
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    scrollToBottom() {
 | 
			
		||||
      this.visible = false;
 | 
			
		||||
      window.scrollTo(0, document.documentElement.scrollHeight || document.body.scrollHeight);
 | 
			
		||||
    },
 | 
			
		||||
    onScroll() {
 | 
			
		||||
      const scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
 | 
			
		||||
      const scrollBottom =
 | 
			
		||||
        (document.documentElement.scrollHeight || document.body.scrollHeight) - document.documentElement.clientHeight;
 | 
			
		||||
      const diff = Math.abs(scrollTop - scrollBottom);
 | 
			
		||||
      this.visible = diff > 50;
 | 
			
		||||
      if (!this.visible) {
 | 
			
		||||
        this.hasNew = false;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  watch: {
 | 
			
		||||
    messages(newValue, oldValue) {
 | 
			
		||||
      if (this.visible) {
 | 
			
		||||
        this.hasNew = true;
 | 
			
		||||
      } else {
 | 
			
		||||
        this.scrollToBottom();
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
<style scoped>
 | 
			
		||||
.scroll-notification {
 | 
			
		||||
  position: fixed;
 | 
			
		||||
  right: 40px;
 | 
			
		||||
  bottom: 30px;
 | 
			
		||||
}
 | 
			
		||||
.fade-enter-active,
 | 
			
		||||
.fade-leave-active {
 | 
			
		||||
  transition: opacity 0.15s ease-in;
 | 
			
		||||
}
 | 
			
		||||
.fade-enter,
 | 
			
		||||
.fade-leave-to {
 | 
			
		||||
  opacity: 0;
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
@@ -1,19 +1,16 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
    <head>
 | 
			
		||||
        <meta charset="utf-8" />
 | 
			
		||||
        <meta name="viewport" content="width=device-width, initial-scale=1" />
 | 
			
		||||
        <title>Dozzle</title>
 | 
			
		||||
        <link href="https://fonts.googleapis.com/css?family=Roboto|Roboto+Mono|Gafata" rel="stylesheet">
 | 
			
		||||
        <link href="./styles.scss" rel="stylesheet">
 | 
			
		||||
        <script defer src="https://use.fontawesome.com/releases/v5.3.1/js/all.js"></script>
 | 
			
		||||
    </head>
 | 
			
		||||
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="utf-8">
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1">
 | 
			
		||||
    <title>Dozzle</title>
 | 
			
		||||
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.min.css">
 | 
			
		||||
    <script defer src="https://use.fontawesome.com/releases/v5.3.1/js/all.js"></script>
 | 
			
		||||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
    <section class="section is-fullwidth">
 | 
			
		||||
    <body class="is-dark">
 | 
			
		||||
        <div id="app"></div>
 | 
			
		||||
    </section>
 | 
			
		||||
    <script src="/main.js"></script>
 | 
			
		||||
</body>
 | 
			
		||||
 | 
			
		||||
</html>
 | 
			
		||||
        <script src="/main.js"></script>
 | 
			
		||||
    </body>
 | 
			
		||||
</html>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,13 +1,17 @@
 | 
			
		||||
import Vue from "vue";
 | 
			
		||||
import VueRouter from "vue-router";
 | 
			
		||||
import App from "./App.vue";
 | 
			
		||||
import Index from "./pages/Index.vue";
 | 
			
		||||
import Container from "./pages/Container.vue";
 | 
			
		||||
import Index from "./pages/Index.vue";
 | 
			
		||||
 | 
			
		||||
Vue.use(VueRouter);
 | 
			
		||||
 | 
			
		||||
const routes = [
 | 
			
		||||
  { path: "/", component: Index },
 | 
			
		||||
  {
 | 
			
		||||
    path: "/",
 | 
			
		||||
    component: Index,
 | 
			
		||||
    name: "default"
 | 
			
		||||
  },
 | 
			
		||||
  {
 | 
			
		||||
    path: "/container/:id",
 | 
			
		||||
    component: Container,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,27 @@
 | 
			
		||||
<template lang="html">
 | 
			
		||||
    <ul ref="events" class="events"></ul>
 | 
			
		||||
  <div class="is-fullheight">
 | 
			
		||||
    <ul ref="events" class="events">
 | 
			
		||||
      <li v-for="item in messages" class="event" :key="item.key">
 | 
			
		||||
        <span class="date">{{ item.dateRelative }}</span> <span class="text">{{ item.message }}</span>
 | 
			
		||||
      </li>
 | 
			
		||||
    </ul>
 | 
			
		||||
    <scrollbar-notification :messages="messages"></scrollbar-notification>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import { formatRelative } from "date-fns";
 | 
			
		||||
let ws;
 | 
			
		||||
import ScrollbarNotification from "../components/ScrollbarNotification";
 | 
			
		||||
 | 
			
		||||
let ws = null;
 | 
			
		||||
let nextId = 0;
 | 
			
		||||
const parseMessage = data => {
 | 
			
		||||
  const date = new Date(data.substring(0, 30));
 | 
			
		||||
  const dateRelative = formatRelative(date, new Date());
 | 
			
		||||
  const message = data.substring(30);
 | 
			
		||||
  const key = nextId++;
 | 
			
		||||
  return {
 | 
			
		||||
    key,
 | 
			
		||||
    date,
 | 
			
		||||
    dateRelative,
 | 
			
		||||
    message
 | 
			
		||||
@@ -20,46 +31,56 @@ const parseMessage = data => {
 | 
			
		||||
export default {
 | 
			
		||||
  props: ["id"],
 | 
			
		||||
  name: "Container",
 | 
			
		||||
  mounted() {
 | 
			
		||||
    ws = new WebSocket(`ws://${window.location.host}/api/logs?id=${this.id}`);
 | 
			
		||||
    ws.onopen = e => console.log("Connection opened.");
 | 
			
		||||
    ws.onclose = e => console.log("Connection closed.");
 | 
			
		||||
    ws.onerror = e => console.error("Connection error: " + e.data);
 | 
			
		||||
    ws.onmessage = e => {
 | 
			
		||||
      const data = parseMessage(e.data);
 | 
			
		||||
      const parent = this.$refs.events;
 | 
			
		||||
      const item = document.createElement("li");
 | 
			
		||||
      item.className = "event";
 | 
			
		||||
 | 
			
		||||
      const date = document.createElement("span");
 | 
			
		||||
      date.className = "date";
 | 
			
		||||
      date.innerHTML = data.dateRelative;
 | 
			
		||||
      item.appendChild(date);
 | 
			
		||||
 | 
			
		||||
      const message = document.createElement("span");
 | 
			
		||||
      message.className = "text";
 | 
			
		||||
      message.innerHTML = data.message;
 | 
			
		||||
      item.appendChild(message);
 | 
			
		||||
 | 
			
		||||
      parent.appendChild(item);
 | 
			
		||||
 | 
			
		||||
      this.$nextTick(() => item.scrollIntoView());
 | 
			
		||||
  components: {
 | 
			
		||||
    ScrollbarNotification
 | 
			
		||||
  },
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      messages: []
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
  created() {
 | 
			
		||||
    this.loadLogs(this.id);
 | 
			
		||||
  },
 | 
			
		||||
  beforeDestroy() {
 | 
			
		||||
    ws.close();
 | 
			
		||||
    ws = null;
 | 
			
		||||
  },
 | 
			
		||||
  watch: {
 | 
			
		||||
    id(newValue, oldValue) {
 | 
			
		||||
      if (oldValue !== newValue) {
 | 
			
		||||
        this.loadLogs(newValue);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    loadLogs(id) {
 | 
			
		||||
      if (ws) {
 | 
			
		||||
        ws.close();
 | 
			
		||||
        ws = null;
 | 
			
		||||
        this.messages = [];
 | 
			
		||||
      }
 | 
			
		||||
      ws = new WebSocket(`ws://${window.location.host}/api/logs?id=${this.id}`);
 | 
			
		||||
      ws.onopen = e => console.log("Connection opened.");
 | 
			
		||||
      ws.onclose = e => console.log("Connection closed.");
 | 
			
		||||
      ws.onerror = e => console.error("Connection error: " + e.data);
 | 
			
		||||
      ws.onmessage = e => {
 | 
			
		||||
        const message = parseMessage(e.data);
 | 
			
		||||
        this.messages.push(message);
 | 
			
		||||
      };
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
<style>
 | 
			
		||||
<style scoped>
 | 
			
		||||
.events {
 | 
			
		||||
  color: #ddd;
 | 
			
		||||
  background-color: #111;
 | 
			
		||||
  padding: 10px;
 | 
			
		||||
  font-family: "Roboto Mono", monaco, monospace;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.event {
 | 
			
		||||
  font-family: monaco, monospace;
 | 
			
		||||
  font-size: 12px;
 | 
			
		||||
  font-size: 13px;
 | 
			
		||||
  line-height: 16px;
 | 
			
		||||
  padding: 0 15px 0 30px;
 | 
			
		||||
  word-wrap: break-word;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -67,4 +88,8 @@ export default {
 | 
			
		||||
  background-color: #262626;
 | 
			
		||||
  color: #258ccd;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.is-fullheight {
 | 
			
		||||
  min-height: 100vh;
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,55 +1,22 @@
 | 
			
		||||
<template lang="html">
 | 
			
		||||
<div class="container">
 | 
			
		||||
    <div class="content">
 | 
			
		||||
        <section class="section">
 | 
			
		||||
            <ul class="is-marginless is-paddless">
 | 
			
		||||
                <li v-for="item in containers" class=" unstyled box">
 | 
			
		||||
                    <router-link :to="{name: 'container', params: {id: item.Id}}" class="columns">
 | 
			
		||||
                        <div class="column is-6">
 | 
			
		||||
                            <h2 class="is-2 hide-overflow">{{ item.Names[0] }}</h2>
 | 
			
		||||
                            <span class="subtitle is-6 code hide-overflow">{{ item.Command}}</span>
 | 
			
		||||
                        </div>
 | 
			
		||||
                        <div class="column is-4">
 | 
			
		||||
                            <span class="code hide-overflow">{{ item.Image }}</span>
 | 
			
		||||
                        </div>
 | 
			
		||||
                        <div class="column is-narrow">
 | 
			
		||||
                            <span class="subtitle is-7">{{ item.Status}}</span>
 | 
			
		||||
                        </div>
 | 
			
		||||
                    </router-link>
 | 
			
		||||
                </li>
 | 
			
		||||
            </ul>
 | 
			
		||||
        </section>
 | 
			
		||||
  <div class="hero is-fullheight is-dark">
 | 
			
		||||
    <div class="hero-body">
 | 
			
		||||
      <div class="container has-text-centered">
 | 
			
		||||
        <h1 class="title">Please choose a container from the list to view the logs</h1>
 | 
			
		||||
      </div>
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
export default {
 | 
			
		||||
  name: "Index",
 | 
			
		||||
  data() {
 | 
			
		||||
    return {
 | 
			
		||||
      containers: []
 | 
			
		||||
    };
 | 
			
		||||
  },
 | 
			
		||||
  async created() {
 | 
			
		||||
    this.containers = await (await fetch(`/api/containers.json`)).json();
 | 
			
		||||
  }
 | 
			
		||||
  props: [],
 | 
			
		||||
  name: "Default"
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<style lang="css">
 | 
			
		||||
.hide-overflow {
 | 
			
		||||
  text-overflow: ellipsis;
 | 
			
		||||
  white-space: nowrap;
 | 
			
		||||
  overflow: hidden;
 | 
			
		||||
}
 | 
			
		||||
.code {
 | 
			
		||||
  background-color: #f5f5f5;
 | 
			
		||||
  color: #ff3860;
 | 
			
		||||
  font-size: 0.875em;
 | 
			
		||||
  font-weight: 400;
 | 
			
		||||
  padding: 0.25em 0.5em 0.25em;
 | 
			
		||||
  display: block;
 | 
			
		||||
  border-radius: 2px;
 | 
			
		||||
<style scoped>
 | 
			
		||||
.hero.is-dark {
 | 
			
		||||
  color: #ddd;
 | 
			
		||||
  background-color: #111;
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								assets/styles.scss
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								assets/styles.scss
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
@charset "utf-8";
 | 
			
		||||
 | 
			
		||||
$menu-item-active-background-color: hsl(171, 100%, 41%);
 | 
			
		||||
$menu-item-color: hsl(0, 6%, 87%);
 | 
			
		||||
 | 
			
		||||
@import "../node_modules/bulma/bulma.sass";
 | 
			
		||||
@import "../node_modules/bulma-tooltip/src/sass";
 | 
			
		||||
 | 
			
		||||
.is-dark {
 | 
			
		||||
    color: #ddd;
 | 
			
		||||
    background-color: #111;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
body {
 | 
			
		||||
    font-family: "Roboto", sans-serif;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h1.title {
 | 
			
		||||
    font-family: "Gafata", sans-serif;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										12
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								main.go
									
									
									
									
									
								
							@@ -5,6 +5,7 @@ import (
 | 
			
		||||
	"encoding/binary"
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"flag"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"log"
 | 
			
		||||
	"net/http"
 | 
			
		||||
 | 
			
		||||
@@ -36,6 +37,7 @@ func main() {
 | 
			
		||||
	box := packr.NewBox("./static")
 | 
			
		||||
	http.HandleFunc("/api/containers.json", listContainers)
 | 
			
		||||
	http.HandleFunc("/api/logs", logs)
 | 
			
		||||
	http.HandleFunc("/version", versionHandler)
 | 
			
		||||
	http.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
 | 
			
		||||
		fileServer := http.FileServer(box)
 | 
			
		||||
		if box.Has(req.URL.Path) {
 | 
			
		||||
@@ -49,6 +51,12 @@ func main() {
 | 
			
		||||
	log.Fatal(http.ListenAndServe(*addr, nil))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func versionHandler(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	fmt.Fprintln(w, version)
 | 
			
		||||
	fmt.Fprintln(w, commit)
 | 
			
		||||
	fmt.Fprintln(w, date)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func listContainers(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	containers, err := cli.ContainerList(context.Background(), types.ContainerListOptions{})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -66,7 +74,7 @@ func logs(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	}
 | 
			
		||||
	defer c.Close()
 | 
			
		||||
 | 
			
		||||
	options := types.ContainerLogsOptions{ShowStdout: true, ShowStderr: true, Follow: true, Tail: "500", Timestamps: true}
 | 
			
		||||
	options := types.ContainerLogsOptions{ShowStdout: true, ShowStderr: true, Follow: true, Tail: "300", Timestamps: true}
 | 
			
		||||
	reader, err := cli.ContainerLogs(context.Background(), id, options)
 | 
			
		||||
	defer reader.Close()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
@@ -78,7 +86,7 @@ func logs(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
	for {
 | 
			
		||||
		_, err := reader.Read(hdr)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			panic(err)
 | 
			
		||||
            log.Panicln(err)
 | 
			
		||||
		}
 | 
			
		||||
		count := binary.BigEndian.Uint32(hdr[4:])
 | 
			
		||||
		n, err := reader.Read(content[:count])
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										504
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										504
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "dozzle",
 | 
			
		||||
  "version": "1.0.9",
 | 
			
		||||
  "version": "1.0.16",
 | 
			
		||||
  "lockfileVersion": 1,
 | 
			
		||||
  "requires": true,
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
@@ -14,40 +14,102 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "@babel/core": {
 | 
			
		||||
      "version": "7.1.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.1.2.tgz",
 | 
			
		||||
      "integrity": "sha512-IFeSSnjXdhDaoysIlev//UzHZbdEmm7D0EIH2qtse9xK7mXEZQpYjs2P00XlP1qYsYvid79p+Zgg6tz1mp6iVw==",
 | 
			
		||||
      "version": "7.1.6",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.1.6.tgz",
 | 
			
		||||
      "integrity": "sha512-Hz6PJT6e44iUNpAn8AoyAs6B3bl60g7MJQaI0rZEar6ECzh6+srYO1xlIdssio34mPaUtAb1y+XlkkSJzok3yw==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "@babel/code-frame": "^7.0.0",
 | 
			
		||||
        "@babel/generator": "^7.1.2",
 | 
			
		||||
        "@babel/helpers": "^7.1.2",
 | 
			
		||||
        "@babel/parser": "^7.1.2",
 | 
			
		||||
        "@babel/generator": "^7.1.6",
 | 
			
		||||
        "@babel/helpers": "^7.1.5",
 | 
			
		||||
        "@babel/parser": "^7.1.6",
 | 
			
		||||
        "@babel/template": "^7.1.2",
 | 
			
		||||
        "@babel/traverse": "^7.1.0",
 | 
			
		||||
        "@babel/types": "^7.1.2",
 | 
			
		||||
        "@babel/traverse": "^7.1.6",
 | 
			
		||||
        "@babel/types": "^7.1.6",
 | 
			
		||||
        "convert-source-map": "^1.1.0",
 | 
			
		||||
        "debug": "^3.1.0",
 | 
			
		||||
        "json5": "^0.5.0",
 | 
			
		||||
        "debug": "^4.1.0",
 | 
			
		||||
        "json5": "^2.1.0",
 | 
			
		||||
        "lodash": "^4.17.10",
 | 
			
		||||
        "resolve": "^1.3.2",
 | 
			
		||||
        "semver": "^5.4.1",
 | 
			
		||||
        "source-map": "^0.5.0"
 | 
			
		||||
      },
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@babel/generator": {
 | 
			
		||||
          "version": "7.1.6",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.1.6.tgz",
 | 
			
		||||
          "integrity": "sha512-brwPBtVvdYdGxtenbQgfCdDPmtkmUBZPjUoK5SXJEBuHaA5BCubh9ly65fzXz7R6o5rA76Rs22ES8Z+HCc0YIQ==",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "@babel/types": "^7.1.6",
 | 
			
		||||
            "jsesc": "^2.5.1",
 | 
			
		||||
            "lodash": "^4.17.10",
 | 
			
		||||
            "source-map": "^0.5.0",
 | 
			
		||||
            "trim-right": "^1.0.1"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "@babel/parser": {
 | 
			
		||||
          "version": "7.1.6",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.1.6.tgz",
 | 
			
		||||
          "integrity": "sha512-dWP6LJm9nKT6ALaa+bnL247GHHMWir3vSlZ2+IHgHgktZQx0L3Uvq2uAWcuzIe+fujRsYWBW2q622C5UvGK9iQ==",
 | 
			
		||||
          "dev": true
 | 
			
		||||
        },
 | 
			
		||||
        "@babel/traverse": {
 | 
			
		||||
          "version": "7.1.6",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.6.tgz",
 | 
			
		||||
          "integrity": "sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ==",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "@babel/code-frame": "^7.0.0",
 | 
			
		||||
            "@babel/generator": "^7.1.6",
 | 
			
		||||
            "@babel/helper-function-name": "^7.1.0",
 | 
			
		||||
            "@babel/helper-split-export-declaration": "^7.0.0",
 | 
			
		||||
            "@babel/parser": "^7.1.6",
 | 
			
		||||
            "@babel/types": "^7.1.6",
 | 
			
		||||
            "debug": "^4.1.0",
 | 
			
		||||
            "globals": "^11.1.0",
 | 
			
		||||
            "lodash": "^4.17.10"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "@babel/types": {
 | 
			
		||||
          "version": "7.1.6",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.1.6.tgz",
 | 
			
		||||
          "integrity": "sha512-DMiUzlY9DSjVsOylJssxLHSgj6tWM9PRFJOGW/RaOglVOK9nzTxoOMfTfRQXGUCUQ/HmlG2efwC+XqUEJ5ay4w==",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "esutils": "^2.0.2",
 | 
			
		||||
            "lodash": "^4.17.10",
 | 
			
		||||
            "to-fast-properties": "^2.0.0"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "debug": {
 | 
			
		||||
          "version": "3.2.6",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
 | 
			
		||||
          "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
 | 
			
		||||
          "version": "4.1.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz",
 | 
			
		||||
          "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "ms": "^2.1.1"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "jsesc": {
 | 
			
		||||
          "version": "2.5.2",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
 | 
			
		||||
          "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
 | 
			
		||||
          "dev": true
 | 
			
		||||
        },
 | 
			
		||||
        "json5": {
 | 
			
		||||
          "version": "0.5.1",
 | 
			
		||||
          "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
 | 
			
		||||
          "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
 | 
			
		||||
          "version": "2.1.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz",
 | 
			
		||||
          "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "minimist": "^1.2.0"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "minimist": {
 | 
			
		||||
          "version": "1.2.0",
 | 
			
		||||
          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
 | 
			
		||||
          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
 | 
			
		||||
          "dev": true
 | 
			
		||||
        },
 | 
			
		||||
        "ms": {
 | 
			
		||||
@@ -55,6 +117,12 @@
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
 | 
			
		||||
          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
 | 
			
		||||
          "dev": true
 | 
			
		||||
        },
 | 
			
		||||
        "to-fast-properties": {
 | 
			
		||||
          "version": "2.0.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
 | 
			
		||||
          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
 | 
			
		||||
          "dev": true
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
@@ -282,14 +350,90 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "@babel/helpers": {
 | 
			
		||||
      "version": "7.1.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.1.2.tgz",
 | 
			
		||||
      "integrity": "sha512-Myc3pUE8eswD73aWcartxB16K6CGmHDv9KxOmD2CeOs/FaEAQodr3VYGmlvOmog60vNQ2w8QbatuahepZwrHiA==",
 | 
			
		||||
      "version": "7.1.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.1.5.tgz",
 | 
			
		||||
      "integrity": "sha512-2jkcdL02ywNBry1YNFAH/fViq4fXG0vdckHqeJk+75fpQ2OH+Az6076tX/M0835zA45E0Cqa6pV5Kiv9YOqjEg==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "@babel/template": "^7.1.2",
 | 
			
		||||
        "@babel/traverse": "^7.1.0",
 | 
			
		||||
        "@babel/types": "^7.1.2"
 | 
			
		||||
        "@babel/traverse": "^7.1.5",
 | 
			
		||||
        "@babel/types": "^7.1.5"
 | 
			
		||||
      },
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@babel/generator": {
 | 
			
		||||
          "version": "7.1.6",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.1.6.tgz",
 | 
			
		||||
          "integrity": "sha512-brwPBtVvdYdGxtenbQgfCdDPmtkmUBZPjUoK5SXJEBuHaA5BCubh9ly65fzXz7R6o5rA76Rs22ES8Z+HCc0YIQ==",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "@babel/types": "^7.1.6",
 | 
			
		||||
            "jsesc": "^2.5.1",
 | 
			
		||||
            "lodash": "^4.17.10",
 | 
			
		||||
            "source-map": "^0.5.0",
 | 
			
		||||
            "trim-right": "^1.0.1"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "@babel/parser": {
 | 
			
		||||
          "version": "7.1.6",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.1.6.tgz",
 | 
			
		||||
          "integrity": "sha512-dWP6LJm9nKT6ALaa+bnL247GHHMWir3vSlZ2+IHgHgktZQx0L3Uvq2uAWcuzIe+fujRsYWBW2q622C5UvGK9iQ==",
 | 
			
		||||
          "dev": true
 | 
			
		||||
        },
 | 
			
		||||
        "@babel/traverse": {
 | 
			
		||||
          "version": "7.1.6",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.1.6.tgz",
 | 
			
		||||
          "integrity": "sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ==",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "@babel/code-frame": "^7.0.0",
 | 
			
		||||
            "@babel/generator": "^7.1.6",
 | 
			
		||||
            "@babel/helper-function-name": "^7.1.0",
 | 
			
		||||
            "@babel/helper-split-export-declaration": "^7.0.0",
 | 
			
		||||
            "@babel/parser": "^7.1.6",
 | 
			
		||||
            "@babel/types": "^7.1.6",
 | 
			
		||||
            "debug": "^4.1.0",
 | 
			
		||||
            "globals": "^11.1.0",
 | 
			
		||||
            "lodash": "^4.17.10"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "@babel/types": {
 | 
			
		||||
          "version": "7.1.6",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.1.6.tgz",
 | 
			
		||||
          "integrity": "sha512-DMiUzlY9DSjVsOylJssxLHSgj6tWM9PRFJOGW/RaOglVOK9nzTxoOMfTfRQXGUCUQ/HmlG2efwC+XqUEJ5ay4w==",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "esutils": "^2.0.2",
 | 
			
		||||
            "lodash": "^4.17.10",
 | 
			
		||||
            "to-fast-properties": "^2.0.0"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "debug": {
 | 
			
		||||
          "version": "4.1.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz",
 | 
			
		||||
          "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "ms": "^2.1.1"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "jsesc": {
 | 
			
		||||
          "version": "2.5.2",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
 | 
			
		||||
          "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
 | 
			
		||||
          "dev": true
 | 
			
		||||
        },
 | 
			
		||||
        "ms": {
 | 
			
		||||
          "version": "2.1.1",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
 | 
			
		||||
          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
 | 
			
		||||
          "dev": true
 | 
			
		||||
        },
 | 
			
		||||
        "to-fast-properties": {
 | 
			
		||||
          "version": "2.0.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
 | 
			
		||||
          "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
 | 
			
		||||
          "dev": true
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "@babel/highlight": {
 | 
			
		||||
@@ -986,6 +1130,58 @@
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "@iamstarkov/listr-update-renderer": {
 | 
			
		||||
      "version": "0.4.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@iamstarkov/listr-update-renderer/-/listr-update-renderer-0.4.1.tgz",
 | 
			
		||||
      "integrity": "sha512-IJyxQWsYDEkf8C8QthBn5N8tIUR9V9je6j3sMIpAkonaadjbvxmRC6RAhpa3RKxndhNnU2M6iNbtJwd7usQYIA==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "chalk": "^1.1.3",
 | 
			
		||||
        "cli-truncate": "^0.2.1",
 | 
			
		||||
        "elegant-spinner": "^1.0.1",
 | 
			
		||||
        "figures": "^1.7.0",
 | 
			
		||||
        "indent-string": "^3.0.0",
 | 
			
		||||
        "log-symbols": "^1.0.2",
 | 
			
		||||
        "log-update": "^2.3.0",
 | 
			
		||||
        "strip-ansi": "^3.0.1"
 | 
			
		||||
      },
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "ansi-styles": {
 | 
			
		||||
          "version": "2.2.1",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
 | 
			
		||||
          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
 | 
			
		||||
          "dev": true
 | 
			
		||||
        },
 | 
			
		||||
        "chalk": {
 | 
			
		||||
          "version": "1.1.3",
 | 
			
		||||
          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
 | 
			
		||||
          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "ansi-styles": "^2.2.1",
 | 
			
		||||
            "escape-string-regexp": "^1.0.2",
 | 
			
		||||
            "has-ansi": "^2.0.0",
 | 
			
		||||
            "strip-ansi": "^3.0.0",
 | 
			
		||||
            "supports-color": "^2.0.0"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "log-symbols": {
 | 
			
		||||
          "version": "1.0.2",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz",
 | 
			
		||||
          "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "chalk": "^1.0.0"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "supports-color": {
 | 
			
		||||
          "version": "2.0.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
 | 
			
		||||
          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
 | 
			
		||||
          "dev": true
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "@mrmlnc/readdir-enhanced": {
 | 
			
		||||
      "version": "2.2.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
 | 
			
		||||
@@ -1068,7 +1264,7 @@
 | 
			
		||||
    },
 | 
			
		||||
    "ansi-escapes": {
 | 
			
		||||
      "version": "3.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
 | 
			
		||||
      "resolved": "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
 | 
			
		||||
      "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
@@ -1622,6 +1818,16 @@
 | 
			
		||||
      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "bulma": {
 | 
			
		||||
      "version": "0.7.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/bulma/-/bulma-0.7.2.tgz",
 | 
			
		||||
      "integrity": "sha512-6JHEu8U/1xsyOst/El5ImLcZIiE2JFXgvrz8GGWbnDLwTNRPJzdAM0aoUM1Ns0avALcVb6KZz9NhzmU53dGDcQ=="
 | 
			
		||||
    },
 | 
			
		||||
    "bulma-tooltip": {
 | 
			
		||||
      "version": "2.0.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/bulma-tooltip/-/bulma-tooltip-2.0.2.tgz",
 | 
			
		||||
      "integrity": "sha512-xsqWeWV7tsUn3uH04SqJeP7/CyC1RaDVIyVzr4/sIO3friIIOi7L6jc5g7qUwDxuBQl72yH/yRPuefpXoQ4hWg=="
 | 
			
		||||
    },
 | 
			
		||||
    "cache-base": {
 | 
			
		||||
      "version": "1.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
 | 
			
		||||
@@ -1646,9 +1852,9 @@
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "camelcase": {
 | 
			
		||||
      "version": "4.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
 | 
			
		||||
      "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
 | 
			
		||||
      "version": "5.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz",
 | 
			
		||||
      "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "caniuse-api": {
 | 
			
		||||
@@ -2024,16 +2230,16 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "concurrently": {
 | 
			
		||||
      "version": "4.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-4.0.1.tgz",
 | 
			
		||||
      "integrity": "sha512-D8UI+mlI/bfvrA57SeKOht6sEpb01dKk+8Yee4fbnkk1Ue8r3S+JXoEdFZIpzQlXJGtnxo47Wvvg/kG4ba3U6Q==",
 | 
			
		||||
      "version": "4.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-4.1.0.tgz",
 | 
			
		||||
      "integrity": "sha512-pwzXCE7qtOB346LyO9eFWpkFJVO3JQZ/qU/feGeaAHiX1M3Rw3zgXKc5cZ8vSH5DGygkjzLFDzA/pwoQDkRNGg==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "chalk": "^2.4.1",
 | 
			
		||||
        "date-fns": "^1.23.0",
 | 
			
		||||
        "lodash": "^4.17.10",
 | 
			
		||||
        "read-pkg": "^4.0.1",
 | 
			
		||||
        "rxjs": "6.2.2",
 | 
			
		||||
        "rxjs": "^6.3.3",
 | 
			
		||||
        "spawn-command": "^0.0.2-1",
 | 
			
		||||
        "supports-color": "^4.5.0",
 | 
			
		||||
        "tree-kill": "^1.1.0",
 | 
			
		||||
@@ -2449,8 +2655,7 @@
 | 
			
		||||
    "date-fns": {
 | 
			
		||||
      "version": "2.0.0-alpha.25",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.0.0-alpha.25.tgz",
 | 
			
		||||
      "integrity": "sha512-iQzJkHF0L4wah9Ae9PkvwemwFz6qmRLuNZcghmvf2t+ptLs1qXzONLiGtjmPQzL6+JpC01JjlTopY2AEy4NFAg==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
      "integrity": "sha512-iQzJkHF0L4wah9Ae9PkvwemwFz6qmRLuNZcghmvf2t+ptLs1qXzONLiGtjmPQzL6+JpC01JjlTopY2AEy4NFAg=="
 | 
			
		||||
    },
 | 
			
		||||
    "date-now": {
 | 
			
		||||
      "version": "0.1.4",
 | 
			
		||||
@@ -2902,12 +3107,6 @@
 | 
			
		||||
        "strip-eof": "^1.0.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "exit-hook": {
 | 
			
		||||
      "version": "1.1.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz",
 | 
			
		||||
      "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "expand-brackets": {
 | 
			
		||||
      "version": "2.1.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
 | 
			
		||||
@@ -3794,9 +3993,15 @@
 | 
			
		||||
      "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "globals": {
 | 
			
		||||
      "version": "11.9.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz",
 | 
			
		||||
      "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "globby": {
 | 
			
		||||
      "version": "6.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
 | 
			
		||||
      "resolved": "http://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
 | 
			
		||||
      "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
@@ -4443,13 +4648,13 @@
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "husky": {
 | 
			
		||||
      "version": "1.1.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/husky/-/husky-1.1.2.tgz",
 | 
			
		||||
      "integrity": "sha512-9TdkUpBeEOjz0AnFdUN4i3w8kEbOsVs9/WSeJqWLq2OO6bcKQhVW64Zi+pVd/AMRLpN3QTINb6ZXiELczvdmqQ==",
 | 
			
		||||
      "version": "1.1.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/husky/-/husky-1.1.4.tgz",
 | 
			
		||||
      "integrity": "sha512-cZjGpS7qsaBSo3fOMUuR7erQloX3l5XzL1v/RkIqU6zrQImDdU70z5Re9fGDp7+kbYlM2EtS4aYMlahBeiCUGw==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "cosmiconfig": "^5.0.6",
 | 
			
		||||
        "execa": "^0.9.0",
 | 
			
		||||
        "execa": "^1.0.0",
 | 
			
		||||
        "find-up": "^3.0.0",
 | 
			
		||||
        "get-stdin": "^6.0.0",
 | 
			
		||||
        "is-ci": "^1.2.1",
 | 
			
		||||
@@ -4460,25 +4665,14 @@
 | 
			
		||||
        "slash": "^2.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "cross-spawn": {
 | 
			
		||||
          "version": "5.1.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
 | 
			
		||||
          "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "lru-cache": "^4.0.1",
 | 
			
		||||
            "shebang-command": "^1.2.0",
 | 
			
		||||
            "which": "^1.2.9"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "execa": {
 | 
			
		||||
          "version": "0.9.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/execa/-/execa-0.9.0.tgz",
 | 
			
		||||
          "integrity": "sha512-BbUMBiX4hqiHZUA5+JujIjNb6TyAlp2D5KLheMjMluwOuzcnylDL4AxZYLLn1n2AGB49eSWwyKvvEQoRpnAtmA==",
 | 
			
		||||
          "version": "1.0.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
 | 
			
		||||
          "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "cross-spawn": "^5.0.1",
 | 
			
		||||
            "get-stream": "^3.0.0",
 | 
			
		||||
            "cross-spawn": "^6.0.0",
 | 
			
		||||
            "get-stream": "^4.0.0",
 | 
			
		||||
            "is-stream": "^1.1.0",
 | 
			
		||||
            "npm-run-path": "^2.0.0",
 | 
			
		||||
            "p-finally": "^1.0.0",
 | 
			
		||||
@@ -4486,11 +4680,14 @@
 | 
			
		||||
            "strip-eof": "^1.0.0"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "slash": {
 | 
			
		||||
          "version": "2.0.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
 | 
			
		||||
          "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
 | 
			
		||||
          "dev": true
 | 
			
		||||
        "get-stream": {
 | 
			
		||||
          "version": "4.1.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
 | 
			
		||||
          "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "pump": "^3.0.0"
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
@@ -4998,11 +5195,12 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "lint-staged": {
 | 
			
		||||
      "version": "8.0.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-8.0.4.tgz",
 | 
			
		||||
      "integrity": "sha512-Rs0VxXoyFqHMrPQgKAMy+O907+m5Po71UVPhBi7BUBwU7ZZ2aoc+mZmpOX3DVPCoTcy6+hqJa9yIZfacNpJHdg==",
 | 
			
		||||
      "version": "8.0.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-8.0.5.tgz",
 | 
			
		||||
      "integrity": "sha512-QI2D6lw2teArlr2fmrrCIqHxef7mK2lKjz9e+aZSzFlk5rsy10rg97p3wA9H/vIFR3Fvn34fAgUktD/k896S2A==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "@iamstarkov/listr-update-renderer": "0.4.1",
 | 
			
		||||
        "chalk": "^2.3.1",
 | 
			
		||||
        "commander": "^2.14.1",
 | 
			
		||||
        "cosmiconfig": "^5.0.2",
 | 
			
		||||
@@ -5016,7 +5214,6 @@
 | 
			
		||||
        "is-windows": "^1.0.2",
 | 
			
		||||
        "jest-validate": "^23.5.0",
 | 
			
		||||
        "listr": "^0.14.2",
 | 
			
		||||
        "listr-update-renderer": "https://github.com/okonet/listr-update-renderer/tarball/upgrade-log-update",
 | 
			
		||||
        "lodash": "^4.17.5",
 | 
			
		||||
        "log-symbols": "^2.2.0",
 | 
			
		||||
        "micromatch": "^3.1.8",
 | 
			
		||||
@@ -5072,9 +5269,9 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "listr": {
 | 
			
		||||
      "version": "0.14.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.2.tgz",
 | 
			
		||||
      "integrity": "sha512-vmaNJ1KlGuGWShHI35X/F8r9xxS0VTHh9GejVXwSN20fG5xpq3Jh4bJbnumoT6q5EDM/8/YP1z3YMtQbFmhuXw==",
 | 
			
		||||
      "version": "0.14.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz",
 | 
			
		||||
      "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "@samverschueren/stream-to-observable": "^0.3.0",
 | 
			
		||||
@@ -5082,10 +5279,18 @@
 | 
			
		||||
        "is-promise": "^2.1.0",
 | 
			
		||||
        "is-stream": "^1.1.0",
 | 
			
		||||
        "listr-silent-renderer": "^1.1.1",
 | 
			
		||||
        "listr-update-renderer": "^0.4.0",
 | 
			
		||||
        "listr-verbose-renderer": "^0.4.0",
 | 
			
		||||
        "p-map": "^1.1.1",
 | 
			
		||||
        "rxjs": "^6.1.0"
 | 
			
		||||
        "listr-update-renderer": "^0.5.0",
 | 
			
		||||
        "listr-verbose-renderer": "^0.5.0",
 | 
			
		||||
        "p-map": "^2.0.0",
 | 
			
		||||
        "rxjs": "^6.3.3"
 | 
			
		||||
      },
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "p-map": {
 | 
			
		||||
          "version": "2.0.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.0.0.tgz",
 | 
			
		||||
          "integrity": "sha512-GO107XdrSUmtHxVoi60qc9tUl/KkNKm+X2CF4P9amalpGxv5YqVPJNfSb0wcA+syCopkZvYYIzW8OVTQW59x/w==",
 | 
			
		||||
          "dev": true
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "listr-silent-renderer": {
 | 
			
		||||
@@ -5095,8 +5300,9 @@
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "listr-update-renderer": {
 | 
			
		||||
      "version": "https://github.com/okonet/listr-update-renderer/tarball/upgrade-log-update",
 | 
			
		||||
      "integrity": "sha512-YF5bCQPbpiVDh/Ali3O5gmBYnvmNIcNZKBq0hueOqYum8T/+VR1gCLgLXmRs2OpPsVAzdsENQO0BJCyFt9FjKA==",
 | 
			
		||||
      "version": "0.5.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz",
 | 
			
		||||
      "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "chalk": "^1.1.3",
 | 
			
		||||
@@ -5146,72 +5352,31 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "listr-verbose-renderer": {
 | 
			
		||||
      "version": "0.4.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz",
 | 
			
		||||
      "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=",
 | 
			
		||||
      "version": "0.5.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz",
 | 
			
		||||
      "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "chalk": "^1.1.3",
 | 
			
		||||
        "cli-cursor": "^1.0.2",
 | 
			
		||||
        "chalk": "^2.4.1",
 | 
			
		||||
        "cli-cursor": "^2.1.0",
 | 
			
		||||
        "date-fns": "^1.27.2",
 | 
			
		||||
        "figures": "^1.7.0"
 | 
			
		||||
        "figures": "^2.0.0"
 | 
			
		||||
      },
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "ansi-styles": {
 | 
			
		||||
          "version": "2.2.1",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
 | 
			
		||||
          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
 | 
			
		||||
          "dev": true
 | 
			
		||||
        },
 | 
			
		||||
        "chalk": {
 | 
			
		||||
          "version": "1.1.3",
 | 
			
		||||
          "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
 | 
			
		||||
          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "ansi-styles": "^2.2.1",
 | 
			
		||||
            "escape-string-regexp": "^1.0.2",
 | 
			
		||||
            "has-ansi": "^2.0.0",
 | 
			
		||||
            "strip-ansi": "^3.0.0",
 | 
			
		||||
            "supports-color": "^2.0.0"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "cli-cursor": {
 | 
			
		||||
          "version": "1.0.2",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz",
 | 
			
		||||
          "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "restore-cursor": "^1.0.1"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "date-fns": {
 | 
			
		||||
          "version": "1.29.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz",
 | 
			
		||||
          "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==",
 | 
			
		||||
          "dev": true
 | 
			
		||||
        },
 | 
			
		||||
        "onetime": {
 | 
			
		||||
          "version": "1.1.0",
 | 
			
		||||
          "resolved": "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz",
 | 
			
		||||
          "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=",
 | 
			
		||||
          "dev": true
 | 
			
		||||
        },
 | 
			
		||||
        "restore-cursor": {
 | 
			
		||||
          "version": "1.0.1",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz",
 | 
			
		||||
          "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=",
 | 
			
		||||
        "figures": {
 | 
			
		||||
          "version": "2.0.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
 | 
			
		||||
          "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "exit-hook": "^1.0.0",
 | 
			
		||||
            "onetime": "^1.0.0"
 | 
			
		||||
            "escape-string-regexp": "^1.0.5"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "supports-color": {
 | 
			
		||||
          "version": "2.0.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
 | 
			
		||||
          "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
 | 
			
		||||
          "dev": true
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
@@ -5331,9 +5496,9 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "map-age-cleaner": {
 | 
			
		||||
      "version": "0.1.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz",
 | 
			
		||||
      "integrity": "sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ==",
 | 
			
		||||
      "version": "0.1.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
 | 
			
		||||
      "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "p-defer": "^1.0.0"
 | 
			
		||||
@@ -7515,9 +7680,9 @@
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "prettier": {
 | 
			
		||||
      "version": "1.14.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.14.3.tgz",
 | 
			
		||||
      "integrity": "sha512-qZDVnCrnpsRJJq5nSsiHCE3BYMED2OtsI+cmzIzF1QIfqm5ALf8tEJcO27zV1gKNKRPdhjO0dNWnrzssDQ1tFg==",
 | 
			
		||||
      "version": "1.15.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.15.2.tgz",
 | 
			
		||||
      "integrity": "sha512-YgPLFFA0CdKL4Eg2IHtUSjzj/BWgszDHiNQAe0VAIBse34148whfdzLagRL+QiKS+YfK5ftB6X4v/MBw8yCoug==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "pretty-format": {
 | 
			
		||||
@@ -7857,9 +8022,9 @@
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "rxjs": {
 | 
			
		||||
      "version": "6.2.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz",
 | 
			
		||||
      "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==",
 | 
			
		||||
      "version": "6.3.3",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
 | 
			
		||||
      "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "tslib": "^1.9.0"
 | 
			
		||||
@@ -7889,6 +8054,15 @@
 | 
			
		||||
        "clones": "^1.1.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "sass": {
 | 
			
		||||
      "version": "1.15.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/sass/-/sass-1.15.1.tgz",
 | 
			
		||||
      "integrity": "sha512-WiDa5BsePB/rQEbh/Fv2pVDUCasxuRYjW7GsWx8Ld23LY61vx1VV5Mzf/7mu5kLWKMryMqo65fzYL34HgaM47w==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "chokidar": "^2.0.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "sax": {
 | 
			
		||||
      "version": "1.2.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
 | 
			
		||||
@@ -8035,9 +8209,9 @@
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "simple-git": {
 | 
			
		||||
      "version": "1.106.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.106.0.tgz",
 | 
			
		||||
      "integrity": "sha512-LaxKq4X9Om7bb16Cpinc36hT1YLHMM9KDQMSWJVv4Y1TGDEUuZbs+0lAk2JSKkCEO3xFjcMSx5OjvZo+i4eJvQ==",
 | 
			
		||||
      "version": "1.107.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.107.0.tgz",
 | 
			
		||||
      "integrity": "sha512-t4OK1JRlp4ayKRfcW6owrWcRVLyHRUlhGd0uN6ZZTqfDq8a5XpcUdOKiGRNobHEuMtNqzp0vcJNvhYWwh5PsQA==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "debug": "^4.0.1"
 | 
			
		||||
@@ -8077,6 +8251,12 @@
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "slash": {
 | 
			
		||||
      "version": "2.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
 | 
			
		||||
      "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "slice-ansi": {
 | 
			
		||||
      "version": "0.0.4",
 | 
			
		||||
      "resolved": "http://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz",
 | 
			
		||||
@@ -8674,9 +8854,9 @@
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "tree-kill": {
 | 
			
		||||
      "version": "1.2.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz",
 | 
			
		||||
      "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==",
 | 
			
		||||
      "version": "1.2.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.1.tgz",
 | 
			
		||||
      "integrity": "sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "trim-right": {
 | 
			
		||||
@@ -9056,12 +9236,6 @@
 | 
			
		||||
        "async-limiter": "~1.0.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "xregexp": {
 | 
			
		||||
      "version": "4.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz",
 | 
			
		||||
      "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "xtend": {
 | 
			
		||||
      "version": "4.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
 | 
			
		||||
@@ -9081,13 +9255,13 @@
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "yargs": {
 | 
			
		||||
      "version": "12.0.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz",
 | 
			
		||||
      "integrity": "sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==",
 | 
			
		||||
      "version": "12.0.4",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.4.tgz",
 | 
			
		||||
      "integrity": "sha512-f5esswlPO351AnejaO2A1ZZr0zesz19RehQKwiRDqWtrraWrJy16tsUIKgDXFMVytvNOHPVmTiaTh3wO67I0fQ==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "cliui": "^4.0.0",
 | 
			
		||||
        "decamelize": "^2.0.0",
 | 
			
		||||
        "decamelize": "^1.2.0",
 | 
			
		||||
        "find-up": "^3.0.0",
 | 
			
		||||
        "get-caller-file": "^1.0.1",
 | 
			
		||||
        "os-locale": "^3.0.0",
 | 
			
		||||
@@ -9097,27 +9271,17 @@
 | 
			
		||||
        "string-width": "^2.0.0",
 | 
			
		||||
        "which-module": "^2.0.0",
 | 
			
		||||
        "y18n": "^3.2.1 || ^4.0.0",
 | 
			
		||||
        "yargs-parser": "^10.1.0"
 | 
			
		||||
      },
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "decamelize": {
 | 
			
		||||
          "version": "2.0.0",
 | 
			
		||||
          "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz",
 | 
			
		||||
          "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "xregexp": "4.0.0"
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        "yargs-parser": "^11.1.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "yargs-parser": {
 | 
			
		||||
      "version": "10.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz",
 | 
			
		||||
      "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==",
 | 
			
		||||
      "version": "11.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.0.tgz",
 | 
			
		||||
      "integrity": "sha512-lGA5HsbjkpCfekDBHAhgE5OE8xEoqiUDylowr+BvhRCwG1xVYTsd8hx2CYC0NY4k9RIgJeybFTG2EZW4P2aN1w==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "camelcase": "^4.1.0"
 | 
			
		||||
        "camelcase": "^5.0.0",
 | 
			
		||||
        "decamelize": "^1.2.0"
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										105
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										105
									
								
								package.json
									
									
									
									
									
								
							@@ -1,54 +1,57 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "dozzle",
 | 
			
		||||
  "version": "1.0.9",
 | 
			
		||||
  "description": "",
 | 
			
		||||
  "main": "index.js",
 | 
			
		||||
  "scripts": {
 | 
			
		||||
    "start": "concurrently 'go run main.go' 'npm run watch-assets'",
 | 
			
		||||
    "watch-assets": "parcel watch assets/index.html -d static",
 | 
			
		||||
    "build": "parcel build assets/index.html -d static",
 | 
			
		||||
    "clean": "rm -rf static"
 | 
			
		||||
  },
 | 
			
		||||
  "repository": {
 | 
			
		||||
    "type": "git",
 | 
			
		||||
    "url": "git+https://github.com/amir20/dozzle.git"
 | 
			
		||||
  },
 | 
			
		||||
  "author": "",
 | 
			
		||||
  "license": "ISC",
 | 
			
		||||
  "bugs": {
 | 
			
		||||
    "url": "https://github.com/amir20/dozzle/issues"
 | 
			
		||||
  },
 | 
			
		||||
  "homepage": "https://github.com/amir20/dozzle#readme",
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "vue": "^2.5.17",
 | 
			
		||||
    "vue-router": "^3.0.1"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "@babel/core": "^7.1.2",
 | 
			
		||||
    "@babel/plugin-transform-runtime": "^7.1.0",
 | 
			
		||||
    "@vue/component-compiler-utils": "^2.3.0",
 | 
			
		||||
    "concurrently": "^4.0.1",
 | 
			
		||||
    "date-fns": "^2.0.0-alpha.25",
 | 
			
		||||
    "husky": "^1.1.2",
 | 
			
		||||
    "lint-staged": "^8.0.4",
 | 
			
		||||
    "parcel-bundler": "^1.10.3",
 | 
			
		||||
    "prettier": "^1.14.3",
 | 
			
		||||
    "vue-hot-reload-api": "^2.3.1",
 | 
			
		||||
    "vue-template-compiler": "^2.5.17"
 | 
			
		||||
  },
 | 
			
		||||
  "husky": {
 | 
			
		||||
    "hooks": {
 | 
			
		||||
      "pre-commit": "lint-staged"
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "lint-staged": {
 | 
			
		||||
    "*.{js,vue,css}": [
 | 
			
		||||
      "prettier --write",
 | 
			
		||||
      "git add"
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
  "browserslist": [
 | 
			
		||||
    ">5%",
 | 
			
		||||
    "not ie <= 8"
 | 
			
		||||
 "name": "dozzle",
 | 
			
		||||
 "version": "1.0.16",
 | 
			
		||||
 "description": "",
 | 
			
		||||
 "main": "index.js",
 | 
			
		||||
 "scripts": {
 | 
			
		||||
  "start": "concurrently 'go run main.go' 'npm run watch-assets'",
 | 
			
		||||
  "watch-assets": "parcel watch assets/index.html -d static",
 | 
			
		||||
  "build": "parcel build assets/index.html -d static",
 | 
			
		||||
  "clean": "rm -rf static"
 | 
			
		||||
 },
 | 
			
		||||
 "repository": {
 | 
			
		||||
  "type": "git",
 | 
			
		||||
  "url": "git+https://github.com/amir20/dozzle.git"
 | 
			
		||||
 },
 | 
			
		||||
 "author": "",
 | 
			
		||||
 "license": "ISC",
 | 
			
		||||
 "bugs": {
 | 
			
		||||
  "url": "https://github.com/amir20/dozzle/issues"
 | 
			
		||||
 },
 | 
			
		||||
 "homepage": "https://github.com/amir20/dozzle#readme",
 | 
			
		||||
 "dependencies": {
 | 
			
		||||
  "bulma": "^0.7.2",
 | 
			
		||||
  "bulma-tooltip": "^2.0.2",
 | 
			
		||||
  "date-fns": "^2.0.0-alpha.25",
 | 
			
		||||
  "vue": "^2.5.17",
 | 
			
		||||
  "vue-router": "^3.0.1"
 | 
			
		||||
 },
 | 
			
		||||
 "devDependencies": {
 | 
			
		||||
  "@babel/core": "^7.1.6",
 | 
			
		||||
  "@babel/plugin-transform-runtime": "^7.1.0",
 | 
			
		||||
  "@vue/component-compiler-utils": "^2.3.0",
 | 
			
		||||
  "concurrently": "^4.1.0",
 | 
			
		||||
  "husky": "^1.1.4",
 | 
			
		||||
  "lint-staged": "^8.0.5",
 | 
			
		||||
  "parcel-bundler": "^1.10.3",
 | 
			
		||||
  "prettier": "^1.15.2",
 | 
			
		||||
  "sass": "^1.15.1",
 | 
			
		||||
  "vue-hot-reload-api": "^2.3.1",
 | 
			
		||||
  "vue-template-compiler": "^2.5.17"
 | 
			
		||||
 },
 | 
			
		||||
 "husky": {
 | 
			
		||||
  "hooks": {
 | 
			
		||||
   "pre-commit": "lint-staged"
 | 
			
		||||
  }
 | 
			
		||||
 },
 | 
			
		||||
 "lint-staged": {
 | 
			
		||||
  "*.{js,vue,css}": [
 | 
			
		||||
   "prettier --write",
 | 
			
		||||
   "git add"
 | 
			
		||||
  ]
 | 
			
		||||
 },
 | 
			
		||||
 "browserslist": [
 | 
			
		||||
  ">5%",
 | 
			
		||||
  "not ie <= 8"
 | 
			
		||||
 ]
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user