Commit d2428aba authored by pooya parsa's avatar pooya parsa

fix lint errors

parent 5cd09955
module.exports = {
"semi": false
}
\ No newline at end of file
export const feeds = {
news: { title: "News", pages: 10 },
newest: { title: "Newest", pages: 12 },
ask: { title: "Ask", pages: 2 },
show: { title: "Show", pages: 2 },
jobs: { title: "Jobs", pages: 1 }
news: { title: 'News', pages: 10 },
newest: { title: 'Newest', pages: 12 },
ask: { title: 'Ask', pages: 2 },
show: { title: 'Show', pages: 2 },
jobs: { title: 'Jobs', pages: 1 }
}
export const validFeeds = Object.keys(feeds)
import express from "express"
import apicache from "apicache"
import express from 'express'
import apicache from 'apicache'
const app = express()
// https://github.com/kwhitley/apicache
app.use(apicache.middleware("15 minutes"))
app.use(apicache.middleware('15 minutes'))
// apicache.options({ debug: true })
export default {
path: "/api/",
path: '/api/',
handler: app
}
......@@ -12,7 +12,7 @@ export const lazy = (commit, task, optimistic, enabled) => {
// Do real task in background
Promise.resolve(task(optimistic))
.then(commit)
.catch(console.error)
.catch(console.error) // eslint-disable-line no-console
// Commit optimistic value and resolve
return Promise.resolve(commit(optimistic))
......
<template>
<li v-if="comment" class="comment">
<div class="by">
<router-link :to="'/user/' + comment.user">{{ comment.user }}</router-link>
<router-link :to="'/user/' + comment.user">
{{ comment.user }}
</router-link>
{{ comment.time | timeAgo }} ago
</div>
<div class="text" v-html="comment.content" />
<div class="text" v-text="comment.content" />
<div v-if="comment.comments && comment.comments.length" :class="{ open }" class="toggle">
<a @click="open = !open">{{ open ? '[-]' : '[+] ' + pluralize(comment.comments.length) + ' collapsed' }}
</a>
......@@ -17,7 +19,7 @@
<script>
export default {
name: "Comment",
name: 'Comment',
props: {
comment: {
type: Object,
......@@ -30,7 +32,7 @@ export default {
}
},
methods: {
pluralize: n => n + (n === 1 ? " reply" : " replies")
pluralize: n => n + (n === 1 ? ' reply' : ' replies')
}
}
</script>
......
<template>
<div class="news-list-nav">
<router-link v-if="page > 1" :to="`/${feed}/${page - 1}`">&lt; prev</router-link>
<router-link v-if="page > 1" :to="`/${feed}/${page - 1}`">
&lt; prev
</router-link>
<a v-else class="disabled">&lt; prev</a>
<span>{{ page }}/{{ maxPage }}</span>
<router-link v-if="hasMore" :to="`/${feed}/${page + 1}`">more &gt;</router-link>
<router-link v-if="hasMore" :to="`/${feed}/${page + 1}`">
more &gt;
</router-link>
<a v-else class="disabled">more &gt;</a>
</div>
</template>
......
......@@ -29,10 +29,10 @@
</template>
<script>
import { timeAgo } from "~/plugins/filters"
import { timeAgo } from '~/plugins/filters'
export default {
name: "NewsItem",
name: 'NewsItem',
props: {
item: {
type: Object,
......
<script>
import Spinner from "./spinner"
import Spinner from './spinner'
export default {
functional: true,
......@@ -11,7 +11,7 @@ export default {
},
render(h, { props, children }) {
return props.loading
? h("div", { style: { "text-align": "center" } }, [
? h('div', { style: { 'text-align': 'center' } }, [
h(Spinner, { props: { show: true } })
])
: children
......
<template>
<transition>
<svg v-show="show" :class="{ show: show }" class="spinner" width="44px" height="44px" viewBox="0 0 44 44">
<circle class="path" fill="none" stroke-width="4" stroke-linecap="round" cx="22" cy="22" r="20"/>
<svg
v-show="show"
:class="{ show: show }"
class="spinner"
width="44px"
height="44px"
viewBox="0 0 44 44"
>
<circle
class="path"
fill="none"
stroke-width="4"
stroke-linecap="round"
cx="22"
cy="22"
r="20"
/>
</svg>
</transition>
</template>
<script>
export default {
name: "Spinner",
name: 'Spinner',
props: {
show: {
type: Boolean,
......
......@@ -18,7 +18,7 @@
</template>
<script>
import { feeds } from "~/common/api"
import { feeds } from '~/common/api'
export default {
head() {
......@@ -29,7 +29,7 @@ export default {
return {
link: [
// We use $route.path since we don't use query parameters
{ rel: "canonical", href: `https://${host}${this.$route.path}` }
{ rel: 'canonical', href: `https://${host}${this.$route.path}` }
]
}
},
......
export default {
head: {
titleTemplate: "Nuxt HN | %s",
titleTemplate: 'Nuxt HN | %s',
meta: [
{
property: "og:image",
property: 'og:image',
content:
"https://user-images.githubusercontent.com/904724/26879447-689b56a8-4b91-11e7-968f-5eea1d6c71b4.png"
'https://user-images.githubusercontent.com/904724/26879447-689b56a8-4b91-11e7-968f-5eea1d6c71b4.png'
},
{ property: "twitter:card", content: "summary_large_image" },
{ property: "twitter:site", content: "@nuxt_js" }
{ property: 'twitter:card', content: 'summary_large_image' },
{ property: 'twitter:site', content: '@nuxt_js' }
],
link: [{ rel: "icon", type: "image/x-icon", href: "/favicon.ico" }]
link: [{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }]
},
loading: {
color: "#59cc93"
color: '#59cc93'
},
manifest: {
name: "Nuxt Hacker News",
short_name: "Nuxt HN",
description: "HackerNews clone built with Nuxt.js",
theme_color: "#188269"
name: 'Nuxt Hacker News',
short_name: 'Nuxt HN',
description: 'HackerNews clone built with Nuxt.js',
theme_color: '#188269'
},
modules: ["@nuxtjs/pwa", "@nuxtjs/component-cache", "@nuxtjs/axios"],
modules: ['@nuxtjs/pwa', '@nuxtjs/component-cache', '@nuxtjs/axios'],
axios: {
proxy: true
},
proxy: {
"/api": {
target: "https://api.hnpwa.com/v0/",
pathRewrite: { "^/api/": "" }
'/api': {
target: 'https://api.hnpwa.com/v0/',
pathRewrite: { '^/api/': '' }
}
},
plugins: ["~/plugins/filters"],
serverMiddleware: ["~/common/cache.js"],
plugins: ['~/plugins/filters'],
serverMiddleware: ['~/common/cache.js'],
render: {
http2: {
push: true
},
static: {
maxAge: "1y",
maxAge: '1y',
setHeaders(res, path) {
if (path.includes("sw.js")) {
res.setHeader("Cache-Control", `public, max-age=${15 * 60}`)
if (path.includes('sw.js')) {
res.setHeader('Cache-Control', `public, max-age=${15 * 60}`)
}
}
}
......
......@@ -43,16 +43,13 @@
"@nuxtjs/eslint-config": "^0.0.1",
"babel-eslint": "^10.0.1",
"eslint": "^5.14.1",
"eslint-config-prettier": "^4.0.0",
"eslint-config-standard": "^12.0.0",
"eslint-plugin-import": "^2.16.0",
"eslint-plugin-jest": "^22.3.0",
"eslint-plugin-node": "^8.0.1",
"eslint-plugin-prettier": "^3.0.1",
"eslint-plugin-promise": "^4.0.1",
"eslint-plugin-standard": "^4.0.0",
"eslint-plugin-vue": "^5.2.2",
"prettier": "^1.11.1",
"stylus": "^0.54.5",
"stylus-loader": "^3.0.2"
}
......
......@@ -12,15 +12,14 @@
</transition>
<item-list-nav :feed="feed" :page="page" :max-page="maxPage" />
</lazy-wrapper>
</div>
</template>
<script>
import Item from "~/components/item.vue"
import ItemListNav from "~/components/item-list-nav.vue"
import LazyWrapper from "~/components/lazy-wrapper"
import { feeds, validFeeds } from "~/common/api"
import Item from '~/components/item.vue'
import ItemListNav from '~/components/item-list-nav.vue'
import LazyWrapper from '~/components/lazy-wrapper'
import { feeds, validFeeds } from '~/common/api'
export default {
components: {
......@@ -33,19 +32,9 @@ export default {
return validFeeds.includes(feed)
},
fetch({ store, params: { feed, page = 1 } }) {
return store.dispatch("FETCH_FEED", { feed, page })
},
head() {
return {
title: feeds[this.$route.params.feed].title
}
},
data() {
return {
transition: "slide-right",
transition: 'slide-right',
displayedPage: Number(this.page) || 1
}
},
......@@ -72,7 +61,17 @@ export default {
},
watch: {
page: "pageChanged"
page: 'pageChanged'
},
fetch({ store, params: { feed, page = 1 } }) {
return store.dispatch('FETCH_FEED', { feed, page })
},
head() {
return {
title: feeds[this.$route.params.feed].title
}
},
mounted() {
......@@ -88,7 +87,7 @@ export default {
// Prefetch next page
this.$store
.dispatch("FETCH_FEED", {
.dispatch('FETCH_FEED', {
feed: this.feed,
page: this.page + 1,
prefetch: true
......@@ -96,7 +95,7 @@ export default {
.catch(() => {})
this.transition =
from === -1 ? null : to > from ? "slide-left" : "slide-right"
from === -1 ? null : to > from ? 'slide-left' : 'slide-right'
this.displayedPage = to
}
......
<script>
import { validFeeds } from "~/common/api"
import { validFeeds } from '~/common/api'
export default {
fetch({ redirect }) {
redirect("/" + validFeeds[0])
redirect('/' + validFeeds[0])
}
}
</script>
<template>
<div class="item-view view" >
<div class="item-view view">
<div class="item-view-header">
<a :href="item.url" target="_blank">
<h1 v-html="item.title" />
<h1 v-text="item.title" />
</a>
<span v-if="item.url" class="host">
({{ item.url | host }})
</span>
<p class="meta">
{{ item.points }} points | by
<router-link :to="'/user/' + item.user">{{ item.user }}</router-link>
<router-link :to="'/user/' + item.user">
{{ item.user }}
</router-link>
{{ item.time | timeAgo }} ago
</p>
</div>
......@@ -19,7 +21,7 @@
{{ item.comments ? item.comments.length + ' comments' : 'No comments yet.' }}
</p>
<ul class="comment-children">
<comment v-for="comment in item.comments" :key="comment.id" :comment="comment"/>
<comment v-for="comment in item.comments" :key="comment.id" :comment="comment" />
</ul>
</lazy-wrapper>
</div>
......@@ -27,11 +29,11 @@
</template>
<script>
import Comment from "~/components/comment.vue"
import LazyWrapper from "~/components/lazy-wrapper"
import Comment from '~/components/comment.vue'
import LazyWrapper from '~/components/lazy-wrapper'
export default {
name: "ItemView",
name: 'ItemView',
components: { Comment, LazyWrapper },
head() {
......@@ -50,7 +52,7 @@ export default {
},
fetch({ store, params: { id } }) {
return store.dispatch("FETCH_ITEM", { id })
return store.dispatch('FETCH_ITEM', { id })
}
}
</script>
......
......@@ -5,10 +5,12 @@
<lazy-wrapper :loading="user.loading">
<ul class="meta">
<li>
<span class="label">Created:</span> {{ user.created_time | timeAgo }} ago</li>
<span class="label">Created:</span> {{ user.created_time | timeAgo }} ago
</li>
<li>
<span class="label">Karma:</span> {{ user.karma || '-' }}</li>
<li v-if="user.about" class="about" v-html="user.about" />
<span class="label">Karma:</span> {{ user.karma || '-' }}
</li>
<li v-if="user.about" class="about" v-text="user.about" />
</ul>
</lazy-wrapper>
<p class="links">
......@@ -23,10 +25,10 @@
</template>
<script>
import LazyWrapper from "~/components/lazy-wrapper"
import LazyWrapper from '~/components/lazy-wrapper'
export default {
name: "UserView",
name: 'UserView',
components: { LazyWrapper },
......@@ -37,11 +39,11 @@ export default {
},
head() {
return this.user ? this.user.id : "User not found"
return this.user ? this.user.id : 'User not found'
},
fetch({ store, route: { params: { id } } }) {
return store.dispatch("FETCH_USER", { id })
return store.dispatch('FETCH_USER', { id })
}
}
</script>
......
import Vue from "vue"
import Vue from 'vue'
export function host(url) {
const host = url.replace(/^https?:\/\//, "").replace(/\/.*$/, "")
const parts = host.split(".").slice(-3)
if (parts[0] === "www") parts.shift()
return parts.join(".")
const host = url.replace(/^https?:\/\//, '').replace(/\/.*$/, '')
const parts = host.split('.').slice(-3)
if (parts[0] === 'www') parts.shift()
return parts.join('.')
}
export function timeAgo(time) {
const between = Date.now() / 1000 - Number(time)
if (between < 3600) {
return pluralize(~~(between / 60), " minute")
return pluralize(~~(between / 60), ' minute')
} else if (between < 86400) {
return pluralize(~~(between / 3600), " hour")
return pluralize(~~(between / 3600), ' hour')
} else {
return pluralize(~~(between / 86400), " day")
return pluralize(~~(between / 86400), ' day')
}
}
......@@ -22,7 +22,7 @@ function pluralize(time, label) {
if (time === 1) {
return time + label
}
return time + label + "s"
return time + label + 's'
}
const filters = {
......@@ -31,6 +31,6 @@ const filters = {
}
export default filters
Object.keys(filters).forEach(key => {
Object.keys(filters).forEach((key) => {
Vue.filter(key, filters[key])
})
import Vue from "vue"
import Vue from 'vue'
import { validFeeds } from "~/common/api"
import { lazy } from "~/common/utils"
import { CancelToken } from "axios"
import { validFeeds } from '~/common/api'
import { lazy } from '~/common/utils'
import { CancelToken } from 'axios'
export default {
// =================================================
......@@ -21,7 +21,7 @@ export default {
}
}
validFeeds.forEach(feed => {
validFeeds.forEach((feed) => {
state.feeds[feed] = {}
})
......@@ -39,17 +39,17 @@ export default {
if (!prefetch) {
if (this.feedCancelSource) {
this.feedCancelSource.cancel(
"priorotize feed: " + feed + " page: " + page
'priorotize feed: ' + feed + ' page: ' + page
)
}
this.feedCancelSource = CancelToken.source()
}
return lazy(
items => {
(items) => {
const ids = items.map(item => item.id)
commit("SET_FEED", { feed, ids, page })
commit("SET_ITEMS", { items })
commit('SET_FEED', { feed, ids, page })
commit('SET_ITEMS', { items })
},
() =>
this.$axios.$get(`/api/${feed}/${page}.json`, {
......@@ -61,7 +61,7 @@ export default {
FETCH_ITEM({ commit, state }, { id }) {
return lazy(
item => commit("SET_ITEM", { item }),
item => commit('SET_ITEM', { item }),
() => this.$axios.$get(`/api/item/${id}.json`),
Object.assign({ id, loading: true, comments: [] }, state.items[id])
)
......@@ -69,7 +69,7 @@ export default {
FETCH_USER({ state, commit }, { id }) {
return lazy(
user => commit("SET_USER", { id, user }),
user => commit('SET_USER', { id, user }),
() => this.$axios.$get(`/api/user/${id}.json`),
Object.assign({ id, loading: true }, state.users[id])
)
......@@ -88,7 +88,7 @@ export default {
}
},
SET_ITEMS: (state, { items }) => {
items.forEach(item => {
items.forEach((item) => {
if (item) {
Vue.set(state.items, item.id, item)
}
......
......@@ -3079,13 +3079,6 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
eslint-config-prettier@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-4.0.0.tgz#16cedeea0a56e74de60dcbbe3be0ab2c645405b9"
integrity sha512-kWuiJxzV5NwOwZcpyozTzDT5KJhBw292bbYro9Is7BWnbNMg15Gmpluc1CTetiCatF8DRkNvgPAOaSyg+bYr3g==
dependencies:
get-stdin "^6.0.0"
eslint-config-standard@^12.0.0:
version "12.0.0"
resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz#638b4c65db0bd5a41319f96bba1f15ddad2107d9"
......@@ -3148,13 +3141,6 @@ eslint-plugin-node@^8.0.1:
resolve "^1.8.1"
semver "^5.5.0"
eslint-plugin-prettier@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.0.1.tgz#19d521e3981f69dd6d14f64aec8c6a6ac6eb0b0d"
integrity sha512-/PMttrarPAY78PLvV3xfWibMOdMDl57hmlQ2XqFeA37wd+CJ7WSxV7txqjVPHi/AAFKd2lX0ZqfsOc/i5yFCSQ==
dependencies:
prettier-linter-helpers "^1.0.0"
eslint-plugin-promise@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz#2d074b653f35a23d1ba89d8e976a985117d1c6a2"
......@@ -3459,11 +3445,6 @@ fast-deep-equal@^2.0.1:
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=
fast-diff@^1.1.2:
version "1.2.0"
resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
fast-json-stable-stringify@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
......@@ -3709,11 +3690,6 @@ gauge@~2.7.3:
strip-ansi "^3.0.1"
wide-align "^1.1.0"
get-stdin@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz#9e09bf712b360ab9225e812048f71fde9c89657b"
integrity sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==
get-stream@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
......@@ -6190,23 +6166,11 @@ prelude-ls@~1.1.2:
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
prettier-linter-helpers@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b"
integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==
dependencies:
fast-diff "^1.1.2"
prettier@1.16.3:
version "1.16.3"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.3.tgz#8c62168453badef702f34b45b6ee899574a6a65d"
integrity sha512-kn/GU6SMRYPxUakNXhpP0EedT/KmaPzr0H5lIsDogrykbaxOpOfAFfk5XA7DZrJyMAv1wlMV3CPcZruGXVVUZw==
prettier@^1.11.1:
version "1.16.4"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.4.tgz#73e37e73e018ad2db9c76742e2647e21790c9717"
integrity sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g==
pretty-bytes@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.1.0.tgz#6237ecfbdc6525beaef4de722cc60a58ae0e6c6d"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment