├── site
├── .firebaserc
├── assets
│ ├── favicon.ico
│ ├── images
│ │ ├── cycle-hn.png
│ │ ├── favicon.png
│ │ ├── nuxt-hn.png
│ │ ├── rnw-hn.png
│ │ ├── apprun-hn.png
│ │ ├── compost-hn.png
│ │ ├── elm-mobile.png
│ │ ├── hnpwa-logo.png
│ │ ├── hnpwa-vue.png
│ │ ├── inferno-hn.png
│ │ ├── mobx-ts-hn.png
│ │ ├── next-hnpwa.png
│ │ ├── nextjs-hn.png
│ │ ├── quasar-hn.png
│ │ ├── vue-hn-pwa.png
│ │ ├── dojo-2-hnpwa.png
│ │ ├── ember-mobile.png
│ │ ├── hn-vanilla-wc.png
│ │ ├── hnpwa-angular.png
│ │ ├── hnpwa-react.png
│ │ ├── next-fb-hnpwa.png
│ │ ├── preact-hnpwa.png
│ │ ├── stencil-ionic.png
│ │ ├── vanilla-wc-hn.png
│ │ ├── vuehn-mobile.png
│ │ ├── zuixhn-mobile.png
│ │ ├── angular-hn-pwa.png
│ │ ├── cxjs-hackernews.png
│ │ ├── ember-hn-mobile.png
│ │ ├── glimmer-hn-pwa.png
│ │ ├── hnpwa-firebase.png
│ │ ├── hnpwa-showcase.png
│ │ ├── mithril-hn-pwa.png
│ │ ├── polymer-mobile.png
│ │ ├── preacthn-mobile.png
│ │ ├── react-hn-suriel.png
│ │ ├── reacthn-mobile.png
│ │ ├── sveltehn-mobile.png
│ │ ├── angular-dart-hnpwa.png
│ │ ├── angular2hn-mobile.png
│ │ ├── react-hn-stephen.png
│ │ ├── vanillahn-mobile.png
│ │ ├── viperhtml-mobile.png
│ │ ├── reacthn-kristofer-mobile.png
│ │ └── angular-hacker-news-mobile.png
│ ├── styles
│ │ └── main.scss
│ └── manifest.json
├── .gitignore
├── _contributors
│ ├── pi0.txt
│ ├── yysun.txt
│ ├── dan.txt
│ ├── jonny.txt
│ ├── usman.txt
│ ├── evan.txt
│ ├── gene.txt
│ ├── justin.txt
│ ├── kevmoo.txt
│ ├── leon.txt
│ ├── majid.txt
│ ├── marko.txt
│ ├── steve.txt
│ ├── addy.txt
│ ├── anthony.txt
│ ├── ashish.txt
│ ├── atinux.txt
│ ├── david.txt
│ ├── eugen.txt
│ ├── jimmy.txt
│ ├── matan.txt
│ ├── rich.txt
│ ├── rubenlie.txt
│ ├── ryan.txt
│ ├── suriel.txt
│ ├── alexnoz.txt
│ ├── anubhav.txt
│ ├── damien.txt
│ ├── johan.txt
│ ├── kevin.txt
│ ├── malbernaz.txt
│ ├── michael.txt
│ ├── alexchopin.txt
│ ├── alfredo.txt
│ ├── andrea.txt
│ ├── chris-h.txt
│ ├── chris.txt
│ ├── cristian.txt
│ ├── kulshekhar.txt
│ ├── naythan.txt
│ ├── sebastian.txt
│ ├── taehwanno.txt
│ ├── houssein.txt
│ ├── ivan.txt
│ ├── rstoenescu.txt
│ ├── stephen.txt
│ └── kristofer.txt
├── functions
│ ├── index.js
│ └── package.json
├── index.md
├── firebase.json
├── _includes
│ ├── service-worker-register.html
│ ├── google-analytics.html
│ ├── header.html
│ ├── github-corner.svg
│ ├── footer.html
│ ├── head.html
│ ├── script-lazysizes.html
│ └── implementation.html
├── _layouts
│ ├── default.html
│ └── home.html
├── package.json
├── sw-precache-config.js
├── Gemfile
├── _apps
│ ├── stencil-ionic-hn.txt
│ ├── vanilla-hn.txt
│ ├── cycle-hn.txt
│ ├── svelte-hacker-news.txt
│ ├── compost-hn.txt
│ ├── elm-hnpwa.txt
│ ├── firebase-hnpwa.txt
│ ├── webcomponents-hn.txt
│ ├── dojo-2.txt
│ ├── hnpwa-ember.txt
│ ├── apprun-hn.txt
│ ├── react-native-web.txt
│ ├── vanilla-wc-hn.txt
│ ├── zuix-hn.txt
│ ├── viper-news.txt
│ ├── angular-hn.txt
│ ├── mithril-hn.txt
│ ├── react-hn-stephen.txt
│ ├── glimmer-hn-pwa.txt
│ ├── mobx-ts-hn.txt
│ ├── preact-hn.txt
│ ├── cxjs-hackernews.txt
│ ├── react-hn-suriel.txt
│ ├── nuxt-hn.txt
│ ├── inferno-hn.txt
│ ├── angular-dart-hnpwa.txt
│ ├── hnpwa-vue.txt
│ ├── nextjs-firebase-hnpwa.txt
│ ├── nextjs-hn.txt
│ ├── next-hnpwa.txt
│ ├── preact-hacker-news.txt
│ ├── angular-hnpwa.txt
│ ├── angular-hacker-news.txt
│ ├── react-hn-kristofer.txt
│ ├── react-hn.txt
│ ├── vue-hacker-news.txt
│ ├── hnpwa-react.txt
│ ├── ember-hn.txt
│ ├── vue-hn-pwa.txt
│ ├── ng-hnpwa.txt
│ ├── quasar-hackernews.txt
│ └── polymer-hn.txt
├── Gemfile.lock
├── _config.yml
├── _sass
│ └── extra.scss
└── package-lock.json
├── .gitignore
├── media
└── logo.png
├── api
├── .firebaserc
├── app.yaml
├── functions
│ ├── index.js
│ └── package.json
├── src
│ ├── deploy.ts
│ └── index.ts
├── tsconfig.json
├── firebase.json
├── package.json
└── README.md
├── .travis.yml
├── CONTRIBUTING.md
├── docs
└── api.md
└── README.md
/site/.firebaserc:
--------------------------------------------------------------------------------
1 | {
2 | "projects": {
3 | "default": "hnpwa-site"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 | api/dist
4 | api/env.json
5 | api/.firebase
6 |
--------------------------------------------------------------------------------
/media/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/media/logo.png
--------------------------------------------------------------------------------
/site/assets/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/favicon.ico
--------------------------------------------------------------------------------
/api/.firebaserc:
--------------------------------------------------------------------------------
1 | {
2 | "projects": {
3 | "prod": "hnpwa-coffee",
4 | "staging": "hnpwa-api"
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/site/.gitignore:
--------------------------------------------------------------------------------
1 | _site
2 | .sass-cache
3 | .jekyll-metadata
4 | service-acc.json
5 | service-worker.js
6 | node_modules
7 |
--------------------------------------------------------------------------------
/site/assets/images/cycle-hn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/cycle-hn.png
--------------------------------------------------------------------------------
/site/assets/images/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/favicon.png
--------------------------------------------------------------------------------
/site/assets/images/nuxt-hn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/nuxt-hn.png
--------------------------------------------------------------------------------
/site/assets/images/rnw-hn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/rnw-hn.png
--------------------------------------------------------------------------------
/site/assets/images/apprun-hn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/apprun-hn.png
--------------------------------------------------------------------------------
/site/assets/images/compost-hn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/compost-hn.png
--------------------------------------------------------------------------------
/site/assets/images/elm-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/elm-mobile.png
--------------------------------------------------------------------------------
/site/assets/images/hnpwa-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/hnpwa-logo.png
--------------------------------------------------------------------------------
/site/assets/images/hnpwa-vue.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/hnpwa-vue.png
--------------------------------------------------------------------------------
/site/assets/images/inferno-hn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/inferno-hn.png
--------------------------------------------------------------------------------
/site/assets/images/mobx-ts-hn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/mobx-ts-hn.png
--------------------------------------------------------------------------------
/site/assets/images/next-hnpwa.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/next-hnpwa.png
--------------------------------------------------------------------------------
/site/assets/images/nextjs-hn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/nextjs-hn.png
--------------------------------------------------------------------------------
/site/assets/images/quasar-hn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/quasar-hn.png
--------------------------------------------------------------------------------
/site/assets/images/vue-hn-pwa.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/vue-hn-pwa.png
--------------------------------------------------------------------------------
/site/assets/images/dojo-2-hnpwa.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/dojo-2-hnpwa.png
--------------------------------------------------------------------------------
/site/assets/images/ember-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/ember-mobile.png
--------------------------------------------------------------------------------
/site/assets/images/hn-vanilla-wc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/hn-vanilla-wc.png
--------------------------------------------------------------------------------
/site/assets/images/hnpwa-angular.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/hnpwa-angular.png
--------------------------------------------------------------------------------
/site/assets/images/hnpwa-react.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/hnpwa-react.png
--------------------------------------------------------------------------------
/site/assets/images/next-fb-hnpwa.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/next-fb-hnpwa.png
--------------------------------------------------------------------------------
/site/assets/images/preact-hnpwa.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/preact-hnpwa.png
--------------------------------------------------------------------------------
/site/assets/images/stencil-ionic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/stencil-ionic.png
--------------------------------------------------------------------------------
/site/assets/images/vanilla-wc-hn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/vanilla-wc-hn.png
--------------------------------------------------------------------------------
/site/assets/images/vuehn-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/vuehn-mobile.png
--------------------------------------------------------------------------------
/site/assets/images/zuixhn-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/zuixhn-mobile.png
--------------------------------------------------------------------------------
/site/assets/images/angular-hn-pwa.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/angular-hn-pwa.png
--------------------------------------------------------------------------------
/site/assets/images/cxjs-hackernews.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/cxjs-hackernews.png
--------------------------------------------------------------------------------
/site/assets/images/ember-hn-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/ember-hn-mobile.png
--------------------------------------------------------------------------------
/site/assets/images/glimmer-hn-pwa.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/glimmer-hn-pwa.png
--------------------------------------------------------------------------------
/site/assets/images/hnpwa-firebase.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/hnpwa-firebase.png
--------------------------------------------------------------------------------
/site/assets/images/hnpwa-showcase.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/hnpwa-showcase.png
--------------------------------------------------------------------------------
/site/assets/images/mithril-hn-pwa.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/mithril-hn-pwa.png
--------------------------------------------------------------------------------
/site/assets/images/polymer-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/polymer-mobile.png
--------------------------------------------------------------------------------
/site/assets/images/preacthn-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/preacthn-mobile.png
--------------------------------------------------------------------------------
/site/assets/images/react-hn-suriel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/react-hn-suriel.png
--------------------------------------------------------------------------------
/site/assets/images/reacthn-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/reacthn-mobile.png
--------------------------------------------------------------------------------
/site/assets/images/sveltehn-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/sveltehn-mobile.png
--------------------------------------------------------------------------------
/site/assets/images/angular-dart-hnpwa.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/angular-dart-hnpwa.png
--------------------------------------------------------------------------------
/site/assets/images/angular2hn-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/angular2hn-mobile.png
--------------------------------------------------------------------------------
/site/assets/images/react-hn-stephen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/react-hn-stephen.png
--------------------------------------------------------------------------------
/site/assets/images/vanillahn-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/vanillahn-mobile.png
--------------------------------------------------------------------------------
/site/assets/images/viperhtml-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/viperhtml-mobile.png
--------------------------------------------------------------------------------
/site/assets/styles/main.scss:
--------------------------------------------------------------------------------
1 | ---
2 | # Only the main Sass file needs front matter (the dashes are enough)
3 | ---
4 |
5 | @import "extra";
6 |
--------------------------------------------------------------------------------
/site/_contributors/pi0.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 14
3 | name: 'Pooya'
4 | image: https://github.com/pi0.png
5 | link: https://github.com/pi0
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/yysun.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 99
3 | name: 'yysun'
4 | image: https://github.com/yysun.png
5 | link: https://github.com/yysun
6 | ---
--------------------------------------------------------------------------------
/site/_contributors/dan.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 8
3 | name: 'Dan'
4 | image: https://github.com/azakus.png
5 | link: https://github.com/azakus
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/jonny.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 2
3 | name: 'Jonny'
4 | image: https://github.com/insin.png
5 | link: https://github.com/insin
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/usman.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 35
3 | name: 'Usman'
4 | image: https://github.com/usm4n.png
5 | link: https://github.com/usm4n
6 | ---
7 |
--------------------------------------------------------------------------------
/api/app.yaml:
--------------------------------------------------------------------------------
1 | runtime: nodejs
2 | env: flex
3 | manual_scaling:
4 | instances: 1
5 | resources:
6 | cpu: 1
7 | memory_gb: 0.5
8 | disk_size_gb: 10
9 |
--------------------------------------------------------------------------------
/site/_contributors/evan.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 5
3 | name: 'Evan'
4 | image: https://github.com/yyx990803.png
5 | link: https://github.com/yyx990803
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/gene.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 13
3 | name: 'Gene'
4 | image: https://github.com/genemars.png
5 | link: https://github.com/genemars
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/justin.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 20
3 | name: 'Justin'
4 | image: https://github.com/jgw96.png
5 | link: https://github.com/jgw96
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/kevmoo.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 32
3 | name: 'kevmoo'
4 | image: https://github.com/kevmoo.png
5 | link: https://github.com/kevmoo
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/leon.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 31
3 | name: 'Leon'
4 | image: https://github.com/leonsenft.png
5 | link: https://github.com/leonsenft
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/majid.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 17
3 | name: 'Majid'
4 | image: https://github.com/mhadaily.png
5 | link: https://github.com/mhadaily
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/marko.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 34
3 | name: 'Marko'
4 | image: https://github.com/mstijak.png
5 | link: https://github.com/mstijak
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/steve.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 10
3 | name: 'Steve'
4 | image: https://github.com/sorvell.png
5 | link: https://github.com/sorvell
6 | ---
7 |
--------------------------------------------------------------------------------
/site/assets/images/reacthn-kristofer-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/reacthn-kristofer-mobile.png
--------------------------------------------------------------------------------
/site/_contributors/addy.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 1
3 | name: 'Addy'
4 | image: https://github.com/addyosmani.png
5 | link: https://github.com/addyosmani
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/anthony.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 28
3 | name: 'Anthony'
4 | image: https://github.com/agubler.png
5 | link: https://github.com/agubler
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/ashish.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 35
3 | name: 'Ashish'
4 | image: https://github.com/Ashishdce.png
5 | link: https://github.com/Ashishdce
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/atinux.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 15
3 | name: 'Sebastien'
4 | image: https://github.com/atinux.png
5 | link: https://github.com/atinux
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/david.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 18
3 | name: 'David'
4 | image: https://github.com/davideast.png
5 | link: https://github.com/davideast
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/eugen.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 30
3 | name: 'Eugen'
4 | image: https://github.com/eugenkiss.png
5 | link: https://github.com/eugenkiss
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/jimmy.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 13
3 | name: 'Jimmy'
4 | image: https://github.com/ragingwind.png
5 | link: https://github.com/ragingwind
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/matan.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 30
3 | name: 'Matan'
4 | image: https://github.com/matanlurey.png
5 | link: https://github.com/matanlurey
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/rich.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 4
3 | name: 'Rich'
4 | image: https://github.com/Rich-Harris.png
5 | link: https://github.com/Rich-Harris
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/rubenlie.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 26
3 | name: 'Ruben Lie'
4 | image: https://github.com/rl-king.png
5 | link: https://github.com/rl-king
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/ryan.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 12
3 | name: 'Ryan'
4 | image: https://github.com/chimon2000.png
5 | link: https://github.com/chimon2000
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/suriel.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 32
3 | name: 'Suriel'
4 | image: https://github.com/surielmx.png
5 | link: https://github.com/surielmx
6 | ---
7 |
--------------------------------------------------------------------------------
/site/assets/images/angular-hacker-news-mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/samccone/hacker-news-pwas/HEAD/site/assets/images/angular-hacker-news-mobile.png
--------------------------------------------------------------------------------
/site/functions/index.js:
--------------------------------------------------------------------------------
1 | const hnapi = require('hnpwa-api');
2 |
3 | exports.api0 = hnapi.trigger({
4 | useCors: true,
5 | routerPath: '/api/v0'
6 | });
7 |
--------------------------------------------------------------------------------
/site/_contributors/alexnoz.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 34
3 | name: 'Alex Nozdriukhin'
4 | image: https://github.com/alexnoz.png
5 | link: https://github.com/alexnoz
6 | ---
--------------------------------------------------------------------------------
/site/_contributors/anubhav.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 17
3 | name: 'Anubhav'
4 | image: https://github.com/anubhav7495.png
5 | link: https://github.com/anubhav7495
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/damien.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 29
3 | name: 'Damien'
4 | image: https://github.com/dsolimando.png
5 | link: https://github.com/dsolimando
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/johan.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 31
3 | name: 'Johan'
4 | image: https://github.com/johanholmerin.png
5 | link: https://github.com/johanholmerin
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/kevin.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 9
3 | name: 'Kevin'
4 | image: https://github.com/kevinpschaaf.png
5 | link: https://github.com/kevinpschaaf
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/malbernaz.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 30
3 | name: 'malbernaz'
4 | image: https://github.com/malbernaz.png
5 | link: https://github.com/malbernaz
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/michael.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 12
3 | name: 'Michael'
4 | image: https://github.com/mstewart6.png
5 | link: https://github.com/mstewart6
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/alexchopin.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 16
3 | name: 'Alexandre'
4 | image: https://github.com/alexchopin.png
5 | link: https://github.com/alexchopin
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/alfredo.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 19
3 | name: 'Alfredo'
4 | image: https://github.com/alfredoperez.png
5 | link: https://github.com/alfredoperez
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/andrea.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 7
3 | name: 'Andrea'
4 | image: https://github.com/WebReflection.png
5 | link: https://github.com/WebReflection
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/chris-h.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 31
3 | name: 'Chris H'
4 | image: https://github.com/lamplightdev.png
5 | link: https://github.com/lamplightdev
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/chris.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 11
3 | name: 'Chris'
4 | image: https://github.com/chrisdwheatley.png
5 | link: https://github.com/chrisdwheatley
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/cristian.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 18
3 | name: 'Cristian'
4 | image: https://github.com/cristianbote.png
5 | link: https://github.com/cristianbote
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/kulshekhar.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 24
3 | name: 'Kulshekhar'
4 | image: https://github.com/kulshekhar.png
5 | link: https://github.com/kulshekhar
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/naythan.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 33
3 | name: 'Naythan'
4 | image: https://github.com/aretheregods.png
5 | link: https://github.com/aretheregods
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/sebastian.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 17
3 | name: 'Sebastian'
4 | image: https://github.com/sebastianm.png
5 | link: https://github.com/SebastianM
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/taehwanno.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 21
3 | name: 'Taehwan, No'
4 | image: https://github.com/taehwanno.png
5 | link: https://github.com/taehwanno
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/houssein.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 6
3 | name: 'Houssein'
4 | image: https://github.com/housseindjirdeh.png
5 | link: https://github.com/housseindjirdeh
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/ivan.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 11
3 | name: 'Ivan Vanderbyl'
4 | image: https://github.com/ivanvanderbyl.png
5 | link: https://github.com/ivanvanderbyl
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/rstoenescu.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 33
3 | name: 'Razvan Stoenescu'
4 | image: https://github.com/rstoenescu.png
5 | link: https://github.com/rstoenescu
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/stephen.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 20
3 | name: 'Stephen'
4 | image: https://github.com/stephenkingsley.png
5 | link: https://github.com/stephenkingsley
6 | ---
7 |
--------------------------------------------------------------------------------
/site/_contributors/kristofer.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 3
3 | name: 'Kristofer'
4 | image: https://github.com/kristoferbaxter.png
5 | link: https://github.com/kristoferbaxter
6 | ---
7 |
--------------------------------------------------------------------------------
/site/index.md:
--------------------------------------------------------------------------------
1 | ---
2 | # You don't need to edit this file, it's empty on purpose.
3 | # Edit theme's home layout instead if you wanna make some changes
4 | layout: home
5 | ---
6 |
--------------------------------------------------------------------------------
/site/firebase.json:
--------------------------------------------------------------------------------
1 | {
2 | "hosting": {
3 | "public": "_site",
4 | "rewrites": [
5 | {
6 | "source": "/api/v0/**",
7 | "function": "api0"
8 | }
9 | ]
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/api/functions/index.js:
--------------------------------------------------------------------------------
1 | const hnapi = require('hnpwa-api');
2 |
3 | exports.api0 = hnapi.trigger({
4 | useCors: true,
5 | routerPath: '/v0',
6 | cdnCacheExpiry: 1200,
7 | browserCacheExpiry: 300,
8 | staleWhileRevalidate: 86400
9 | });
10 |
--------------------------------------------------------------------------------
/api/src/deploy.ts:
--------------------------------------------------------------------------------
1 | const client = require('firebase-tools');
2 |
3 | export async function deploy(token: string) {
4 | try {
5 | return await client.deploy({
6 | project: 'hnpwa-coffee',
7 | only: 'hosting',
8 | token,
9 | cwd: process.cwd()
10 | });
11 | } catch (e) {
12 | throw e;
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/site/functions/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "functions",
3 | "description": "Cloud Functions for Firebase",
4 | "dependencies": {
5 | "cors": "^2.8.3",
6 | "express": "^4.15.3",
7 | "firebase-admin": "~4.2.1",
8 | "firebase-functions": "^0.5.7",
9 | "hnpwa-api": "^0.1.5"
10 | },
11 | "private": true
12 | }
13 |
--------------------------------------------------------------------------------
/api/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "module": "commonjs",
4 | "target": "es2015",
5 | "noImplicitAny": true,
6 | "sourceMap": false,
7 | "outDir": "dist",
8 | "strictNullChecks": true,
9 | "moduleResolution": "node",
10 | "declaration": true
11 | },
12 | "files": [
13 | "src/index.ts"
14 | ]
15 | }
16 |
--------------------------------------------------------------------------------
/site/_includes/service-worker-register.html:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/site/assets/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Hacker News PWA",
3 | "short_name": "HN PWA",
4 | "description": "Hacker News readers as Progressive Web Apps",
5 | "theme_color": "#F4751E",
6 | "background_color": "#FFFFFF",
7 | "start_url": "/",
8 | "display": "standalone",
9 | "icons": [
10 | {
11 | "src": "/assets/images/favicon.png",
12 | "type": "image/png",
13 | "sizes": "512x512"
14 | }
15 | ]
16 | }
17 |
--------------------------------------------------------------------------------
/site/_includes/google-analytics.html:
--------------------------------------------------------------------------------
1 |
11 |
12 |
--------------------------------------------------------------------------------
/api/firebase.json:
--------------------------------------------------------------------------------
1 | {
2 | "hosting": {
3 | "public": "dist/public",
4 | "rewrites": [
5 | {
6 | "source": "/v0**",
7 | "function": "api0"
8 | },
9 | {
10 | "source": "/v0/**",
11 | "function": "api0"
12 | }
13 | ],
14 | "headers": [
15 | {
16 | "source": "**",
17 | "headers": [
18 | {
19 | "key": "Access-Control-Allow-Origin",
20 | "value": "*"
21 | }
22 | ]
23 | }
24 | ]
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/site/_layouts/default.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {% include head.html %}
5 |
6 |
7 |
8 | {% include header.html %}
9 |
10 |
11 |
12 | {{ content }}
13 |
14 |
15 |
16 | {% include footer.html %}
17 |
18 | {% include script-lazysizes.html %}
19 | {% include service-worker-register.html %}
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/site/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "hacker-news-pwas",
3 | "description": "Hacker News readers as Progressive Web Apps",
4 | "scripts": {
5 | "build": "JEKYLL_ENV=production bundle exec jekyll build",
6 | "dev": "bundle exec jekyll serve",
7 | "dev-sw": "npm run build && sw-precache --config=sw-precache-config.js && npm run dev",
8 | "precache": "sw-precache --config=sw-precache-config.js --root=_site --verbose"
9 | },
10 | "devDependencies": {
11 | "sw-precache": "^5.1.1"
12 | },
13 | "dependencies": {}
14 | }
15 |
--------------------------------------------------------------------------------
/api/functions/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "functions",
3 | "description": "Cloud Functions for Firebase",
4 | "scripts": {
5 | "serve": "firebase serve --only functions",
6 | "shell": "firebase experimental:functions:shell",
7 | "start": "npm run shell",
8 | "deploy": "firebase deploy --only functions",
9 | "logs": "firebase functions:log"
10 | },
11 | "dependencies": {
12 | "firebase-admin": "^5.8.1",
13 | "firebase-functions": "^0.8.1",
14 | "hnpwa-api": "^0.2.0"
15 | },
16 | "private": true
17 | }
18 |
--------------------------------------------------------------------------------
/site/_includes/header.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
Hacker News readers as Progressive Web Apps
5 |
6 |
7 |
8 | {% include github-corner.svg %}
9 |
10 |
11 |
--------------------------------------------------------------------------------
/site/sw-precache-config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | staticFileGlobs: ['_site/**/*.html', '_site/assets/styles/*'],
3 | stripPrefix: '_site/',
4 | runtimeCaching: [
5 | {
6 | urlPattern: /images/,
7 | handler: 'fastest',
8 | options: {
9 | cache: {
10 | name: 'app-images',
11 | },
12 | },
13 | },
14 | {
15 | urlPattern: /^https:\/\/github.com\/(.*).png/,
16 | handler: 'cacheFirst',
17 | options: {
18 | cache: {
19 | name: 'contributor-headshots',
20 | },
21 | },
22 | },
23 | ],
24 | };
25 |
--------------------------------------------------------------------------------
/site/_includes/github-corner.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/api/src/index.ts:
--------------------------------------------------------------------------------
1 | require('@google-cloud/trace-agent').start();
2 |
3 | import { deploy } from './deploy';
4 | import { publisher } from 'hnpwa-api';
5 | const ErrorReporting = require('@google-cloud/error-reporting');
6 | const errors = ErrorReporting();
7 |
8 | const env = require('../env.json');
9 |
10 | const runner = publisher({
11 | interval: '*/20 * * * *',
12 | dest: 'dist/public/v0',
13 | cwd: process.cwd(),
14 | log: console.log
15 | }, async function afterWrite() {
16 | try {
17 | const token = env.TOKEN;
18 | if(typeof token === undefined || typeof token === null) {
19 | throw new Error('No token provided for Firebase Hosting deployment');
20 | }
21 | await deploy(token);
22 | console.log('Deployed to Firebase Hosting!');
23 | } catch (e) {
24 | errors.report(e);
25 | }
26 | });
27 |
28 | runner.start();
29 |
--------------------------------------------------------------------------------
/site/Gemfile:
--------------------------------------------------------------------------------
1 | source "https://rubygems.org"
2 | ruby RUBY_VERSION
3 |
4 | # Hello! This is where you manage which Jekyll version is used to run.
5 | # When you want to use a different version, change it below, save the
6 | # file and run `bundle install`. Run Jekyll with `bundle exec`, like so:
7 | #
8 | # bundle exec jekyll serve
9 | #
10 | # This will help ensure the proper Jekyll version is running.
11 | # Happy Jekylling!
12 | gem "jekyll", "3.3.1"
13 |
14 | # This is the default theme for new Jekyll sites. You may change this to anything you like.
15 | gem "minima", "~> 2.0"
16 |
17 | # If you want to use GitHub Pages, remove the "gem "jekyll"" above and
18 | # uncomment the line below. To upgrade, run `bundle update github-pages`.
19 | # gem "github-pages", group: :jekyll_plugins
20 |
21 | # If you have any plugins, put them here!
22 | group :jekyll_plugins do
23 | gem "jekyll-feed", "~> 0.6"
24 | end
25 |
--------------------------------------------------------------------------------
/site/_apps/stencil-ionic-hn.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 23
3 | title: 'Stencil HN'
4 | github-title: 'ionic-team/ionic-stencil-hn-app'
5 | libraries:
6 | - Stencil
7 | - Ionic/Core
8 | service-worker: 'Application Shell'
9 | server-side-rendering: 'No'
10 | api: 'HNPWA api'
11 | hosting: 'Firebase'
12 | authors:
13 | - name: 'Justin'
14 | lighthouse: '91/100'
15 | interactive-em: '2.97s'
16 | interactive-faster-3g: '1.92s'
17 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=170913_V3_44c6e4792285dd5509e6c95fdc3188f3&run=3
18 | wpt-em-link: https://www.webpagetest.org/result/170824_31_d8b43867baae06562c35baf8ea575c77/
19 | wpt-faster-3g-link: https://www.webpagetest.org/result/170913_V3_44c6e4792285dd5509e6c95fdc3188f3/
20 | image: /assets/images/stencil-ionic.png
21 | app-link: https://corehacker-10883.firebaseapp.com/
22 | github-link: https://github.com/ionic-team/ionic-stencil-hn-app
23 | ---
24 |
--------------------------------------------------------------------------------
/api/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "api.hnpwa.com",
3 | "version": "0.0.1",
4 | "private": true,
5 | "description": "The publish server for api.hnpwa.com",
6 | "main": "dist/index.js",
7 | "scripts": {
8 | "build": "rm -rf dist && tsc && cp env.json dist/env.json",
9 | "start": "node dist/index",
10 | "deploy": "gcloud app deploy --version yolo",
11 | "deploy:firebase": "firebase deploy --only functions,hosting",
12 | "copy:firebase": "cp firebase-config.json dist/firebase.json && cp .firebaserc dist/.firebaserc"
13 | },
14 | "keywords": [],
15 | "author": "",
16 | "license": "MIT",
17 | "dependencies": {
18 | "@google-cloud/error-reporting": "^0.2.2",
19 | "@google-cloud/trace-agent": "^2.4.1",
20 | "@types/fs-extra": "^5.0.0",
21 | "firebase-tools": "^7.0.0",
22 | "fs-extra": "^5.0.0",
23 | "hnpwa-api": "^0.2.0",
24 | "typescript": "^2.7.2"
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/site/_apps/vanilla-hn.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 20
3 | title: 'Vanilla HN'
4 | github-title: 'cristianbote/hnpwa-vanilla'
5 | library: 'Plain javascript'
6 | module-bundling: 'Webpack'
7 | service-worker: 'Application Shell'
8 | server-side-rendering: 'No'
9 | api: 'hnpwa.com/api'
10 | hosting: 'Firebase static files hosting + preload/prefetch link headers'
11 | authors:
12 | - name: 'Cristian'
13 | lighthouse: '91/100'
14 | interactive-em: '3.0s'
15 | interactive-faster-3g: '2.4s'
16 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=170712_QD_1962982caa117830d68f99b8e218bb67&run=3
17 | wpt-em-link: https://www.webpagetest.org/result/170712_MJ_9eda2ffea1034eaf6426dfc6c5dec60f/
18 | wpt-faster-3g-link: https://www.webpagetest.org/result/170712_QD_1962982caa117830d68f99b8e218bb67/
19 | image: /assets/images/vanillahn-mobile.png
20 | app-link: https://hnpwa-vanilla.firebaseapp.com/
21 | github-link: https://github.com/cristianbote/hnpwa-vanilla
22 | ---
23 |
--------------------------------------------------------------------------------
/site/_apps/cycle-hn.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 35
3 | title: 'Cycle HN'
4 | github-title: 'usm4n/cycle-hn'
5 | libraries:
6 | - name: 'CycleJS'
7 | - name: 'cycle-onionify'
8 | - name: 'switch-path'
9 | - name: 'cyclejs-utils'
10 | service-worker: 'Application Shell + SWPrecache Webpack Plugin'
11 | server-side-rendering: 'No'
12 | api: 'HNPWA api'
13 | hosting: 'Firebase'
14 | authors:
15 | - name: 'Usman'
16 | lighthouse: '91/100'
17 | interactive-em: '5.29s'
18 | interactive-faster-3g: '2.46s'
19 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=171022_D4_0a8774786db703b384b9254e6fba3b5e&run=1
20 | wpt-em-link: https://www.webpagetest.org/result/171022_D4_0a8774786db703b384b9254e6fba3b5e/
21 | wpt-faster-3g-link: https://www.webpagetest.org/result/171022_KC_9b0cc70f94cbffc933d4dc2a3af8ac40/
22 | image: /assets/images/cycle-hn.png
23 | app-link: https://cyclejs-hn.firebaseapp.com
24 | github-link: https://github.com/usm4n/cycle-hn
25 | ---
26 |
--------------------------------------------------------------------------------
/site/_apps/svelte-hacker-news.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 4
3 | title: 'Svelte Hacker News'
4 | github-title: 'sveltejs/svelte-hackernews'
5 | libraries:
6 | - name: 'Svelte'
7 | module-bundling: 'Rollup'
8 | service-worker: 'Application Shell + data caching'
9 | server-side-rendering: 'Yes'
10 | api: 'Hacker News Firebase API'
11 | hosting: 'Now'
12 | authors:
13 | - name: 'Rich'
14 | lighthouse: '73/100'
15 | interactive-em: '2.5s'
16 | interactive-faster-3g: '2.2s'
17 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=170611_K5_aaca06336e5608c4a825246b383dc663&run=2
18 | wpt-em-link: https://www.webpagetest.org/result/170611_K5_aaca06336e5608c4a825246b383dc663/
19 | wpt-faster-3g-link: https://www.webpagetest.org/result/170611_BP_6fc0112b1b7a2862e4aedef7c9277416/
20 | image: /assets/images/sveltehn-mobile.png
21 | app-link: https://hn.svelte.technology/
22 | github-link: https://github.com/sveltejs/svelte-hackernews
23 | framework-link: https://svelte.technology/
24 | ---
25 |
--------------------------------------------------------------------------------
/site/_apps/compost-hn.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 31
3 | title: 'Vanilla Web Components with Compost mixins'
4 | github-title: 'lamplightdev/compost-hn'
5 | library: 'Compost mixins'
6 | module-bundling: 'Rollup'
7 | service-worker: 'Shell + data caching with Workbox'
8 | perfomance-patterns: 'Local caching of API results, CDN cache'
9 | server-side-rendering: 'no'
10 | api: 'HNPWA API'
11 | hosting: 'Firebase'
12 | authors:
13 | - name: 'Chris H'
14 | lighthouse: '100/100'
15 | interactive-em: '2.9s'
16 | interactive-faster-3g: '2.1s'
17 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=180702_W9_bafc7423cffbbc3d44109b729e18d079&run=2
18 | wpt-em-link: https://www.webpagetest.org/result/180702_DA_56e0a6c671fefa00a43b1ad36d9591a2/
19 | wpt-faster-3g-link: https://www.webpagetest.org/result/180702_W9_bafc7423cffbbc3d44109b729e18d079/
20 | image: /assets/images/compost-hn.png
21 | app-link: https://compost-35844.firebaseapp.com
22 | github-link: https://github.com/lamplightdev/compost-hn
23 | ---
24 |
--------------------------------------------------------------------------------
/site/_apps/elm-hnpwa.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 26
3 | title: 'Elm HN'
4 | github-title: 'rl-king/elm-hnpwa'
5 | libraries:
6 | - name: 'Elm 0.19'
7 | module-bundling: 'Elm'
8 | service-worker: 'Data caching with SWPrecachePlugin'
9 | perfomance-patterns: 'Cache requested resources in session'
10 | server-side-rendering: 'None'
11 | api: 'api.hnpwa.com/v0'
12 | hosting: 'Firebase'
13 | authors:
14 | - name: 'Ruben Lie'
15 | lighthouse: 100/100
16 | interactive-em: 3.5s
17 | interactive-faster-3g: 3s
18 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=180822_RX_4aed4242befc099f493683b7b2294514&run=3
19 | wpt-em-link: https://www.webpagetest.org/result/180822_E6_9d2e28de77d9a5ae9f437f718059a7d4/
20 | wpt-faster-3g-link: https://www.webpagetest.org/result/180822_RX_4aed4242befc099f493683b7b2294514/
21 | image: /assets/images/elm-mobile.png
22 | app-link: https://elm-hnpwa.firebaseapp.com
23 | github-link: https://github.com/rl-king/elm-hnpwa
24 | framework-link: http://elm-lang.org
25 | ---
26 |
--------------------------------------------------------------------------------
/site/_apps/firebase-hnpwa.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 17
3 | title: 'HNPWA Firebase'
4 | github-title: 'davideast/hnpwa-firebase'
5 | libraries:
6 | - name: 'HTML/CSS'
7 | scaffolding: 'Firebase CLI'
8 | module-bundling: 'N/A'
9 | service-worker: 'Workboxjs'
10 | perfomance-patterns: 'CDN Cache'
11 | server-side-rendering: 'Yes'
12 | api: 'hnpwa.com/api/v0'
13 | hosting: 'Firebase'
14 | authors:
15 | - name: 'David'
16 | lighthouse: '98/100'
17 | interactive-em: '1.3s'
18 | interactive-faster-3g: '0.7s'
19 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=170712_FR_5ea158fd9c684d6d8dee49f833093289&run=2
20 | wpt-em-link: https://www.webpagetest.org/result/170712_FR_5ea158fd9c684d6d8dee49f833093289/
21 | wpt-faster-3g-link: https://www.webpagetest.org/result/170712_88_101P/
22 | image: /assets/images/hnpwa-firebase.png
23 | app-link: https://hnpwa-firebase.firebaseapp.com/
24 | github-link: https://github.com/davideast/hnpwa-firebase
25 | framework-link: https://firebase.google.com/
26 | ---
27 |
--------------------------------------------------------------------------------
/site/_apps/webcomponents-hn.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 29
3 | title: 'Vanillia WebComponents'
4 | github-title: 'dsolimando/hnpwa-mobileelements'
5 | library: 'No Libray'
6 | module-bundling: 'No module bundling'
7 | service-worker: 'Application Shell'
8 | perfomance-patterns: 'HTTP/2, Gzip static assets, CDN'
9 | server-side-rendering: 'yes'
10 | api: 'Node-hnapi (unofficial)'
11 | hosting: 'Google Compute Engine'
12 | authors:
13 | - name: 'Damien'
14 | lighthouse: '91/100'
15 | interactive-em: '2.3s'
16 | interactive-faster-3g: '1.3s'
17 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=171125_1Y_6ce8db5468e664a2ba0362a045ca2e40&run=3
18 | wpt-em-link: https://www.webpagetest.org/result/170816_S5_19V8
19 | wpt-faster-3g-link: https://www.webpagetest.org/result/171125_1Y_6ce8db5468e664a2ba0362a045ca2e40/
20 | image: /assets/images/hn-vanilla-wc.png
21 | app-link: https://dm3bm9rb0n9kc.cloudfront.net/
22 | github-link: https://github.com/dsolimando/hnpwa-mobileelements/tree/pagination
23 | ---
24 |
--------------------------------------------------------------------------------
/site/_apps/dojo-2.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 28
3 | title: 'Dojo 2'
4 | github-title: 'agubler/dojo-2-hn'
5 | library: 'Dojo 2'
6 | module-bundling: 'Webpack'
7 | service-worker: 'Application Shell + Service Worker support via Dojo CLI build'
8 | perfomance-patterns: 'HTTP/2 and Build time rendering'
9 | server-side-rendering: 'None'
10 | api: 'Node-hnapi (unofficial)'
11 | hosting: 'Firebase'
12 | authors:
13 | - name: 'Anthony'
14 | lighthouse: '100/100'
15 | interactive-em: '2.8s'
16 | interactive-faster-3g: '2.0s'
17 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=180710_AR_0594d9615756dfb535efb6cf84eb55c8&run=1
18 | wpt-em-link: https://www.webpagetest.org/result/180710_AR_0594d9615756dfb535efb6cf84eb55c8/
19 | wpt-faster-3g-link: https://www.webpagetest.org/result/180710_TX_b9c7df57f02b8587f64480b60771911a/
20 | image: /assets/images/dojo-2-hnpwa.png
21 | app-link: https://dojo-2-hnpwa-d668d.firebaseapp.com/
22 | github-link: https://github.com/agubler/dojo-2-hn
23 | framework-link: https://dojo.io
24 | ---
25 |
--------------------------------------------------------------------------------
/site/_apps/hnpwa-ember.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 24
3 | title: 'Ember HNPWA'
4 | github-title: 'mstewart6/hnpwa-ember'
5 | libraries:
6 | - name: 'Ember'
7 | scaffolding: 'Ember CLI'
8 | module-bundling: 'Broccoli'
9 | service-worker: 'Application Shell + data caching with sw-precache'
10 | server-side-rendering: 'Ember Fastboot'
11 | api: 'Node-hnapi (unofficial)'
12 | hosting: 'Heroku + Amazon S3'
13 | authors:
14 | - name: 'Michael'
15 | lighthouse: '91/100'
16 | interactive-em: '7.7s'
17 | interactive-faster-3g: '5.3s'
18 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=171116_1A_bd400cf488e5f2c4fd82f5a0d5cc552c&run=3
19 | wpt-em-link: https://www.webpagetest.org/result/171116_96_40f517b86363de55c010798883cb8866/
20 | wpt-faster-3g-link: https://www.webpagetest.org/result/171116_1A_bd400cf488e5f2c4fd82f5a0d5cc552c/
21 | image: /assets/images/ember-mobile.png
22 | app-link: https://hnpwa-ember.herokuapp.com/
23 | github-link: https://github.com/mstewart6/hnpwa-ember
24 | framework-link: https://emberjs.com/
25 | ---
26 |
--------------------------------------------------------------------------------
/site/_apps/apprun-hn.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 99
3 | title: 'AppRun HN'
4 | github-title: 'yysun/apprun-hn'
5 | libraries:
6 | - name: 'AppRun'
7 | scaffolding: 'AppRun CLI'
8 | module-bundling: 'Webpack'
9 | service-worker: 'Workboxjs'
10 | perfomance-patterns: 'Application Shell + data caching with sw-precache'
11 | server-side-rendering: 'No'
12 | api: 'Official API (Firebase)'
13 | hosting: 'GitHub'
14 | authors:
15 | - name: 'yysun'
16 | lighthouse: '92/100'
17 | interactive-em: '4.7s'
18 | interactive-faster-3g: '4.0s'
19 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=180705_M2_18125a251cfe19a1b9d4aa173d32d2e0&run=2
20 | wpt-em-link: https://www.webpagetest.org/result/180705_FR_cf50ec3bd4c0e17802a9bae0cae6ff2e/
21 | wpt-faster-3g-link: https://www.webpagetest.org/result/180705_M2_18125a251cfe19a1b9d4aa173d32d2e0/
22 | image: /assets/images/apprun-hn.png
23 | app-link: https://yysun.github.io/apprun-hn
24 | github-link: https://github.com/yysun/apprun-hn
25 | framework-link: https://github.com/yysun/apprun
26 | ---
27 |
--------------------------------------------------------------------------------
/site/_apps/react-native-web.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 31
3 | title: 'React Native Web'
4 | github-title: 'johanholmerin/rnw-hn'
5 | library: 'React Native'
6 | libraries:
7 | - name: 'React Native'
8 | module-bundling: 'Webpack'
9 | service-worker: 'Application Shell with SW Precache'
10 | perfomance-patterns: 'HTTP/2, preconnect'
11 | server-side-rendering: 'No'
12 | api: 'hnpwa.com/api'
13 | hosting: 'Firebase'
14 | authors:
15 | - name: 'Johan'
16 | lighthouse: '100/100'
17 | interactive-em: '5.36s'
18 | interactive-faster-3g: '4.18s'
19 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=180403_ZP_9c22071ae912336f1338347e27a70d42&run=2
20 | wpt-em-link: https://www.webpagetest.org/result/180403_EX_feab3a99055d6404191add00e77f4a96/
21 | wpt-faster-3g-link: https://www.webpagetest.org/result/180403_ZP_9c22071ae912336f1338347e27a70d42/
22 | image: /assets/images/rnw-hn.png
23 | app-link: https://rnw-hn.firebaseapp.com/
24 | github-link: https://github.com/johanholmerin/rnw-hn
25 | framework-link: https://facebook.github.io/react-native/
26 | ---
27 |
--------------------------------------------------------------------------------
/site/_apps/vanilla-wc-hn.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 33
3 | title: 'Vanilla Web Components HN'
4 | github-title: 'alexnoz/vanilla-wc-hnpwa'
5 | module-bundling: 'Webpack'
6 | service-worker: 'Application Shell + runtime caching with SWPrecachePlugin'
7 | perfomance-patterns: '2 bundles (ES2015+ and transpiled), route-level code splitting, preload/prefetch resources, CSS inlining'
8 | server-side-rendering: 'No'
9 | api: 'api.hnpwa.com/v0/'
10 | hosting: 'Firebase'
11 | authors:
12 | - name: 'Alex Nozdriukhin'
13 | lighthouse: '100/100'
14 | interactive-em: '2.6s'
15 | interactive-faster-3g: '1.6s'
16 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=180718_SK_9d0e0e8c4a174ddc770fc210fe809e62&run=2
17 | wpt-em-link: https://www.webpagetest.org/result/180718_G6_d4db68fcd9834b2fc080fe268dbc9717/
18 | wpt-faster-3g-link: https://www.webpagetest.org/result/180718_SK_9d0e0e8c4a174ddc770fc210fe809e62/
19 | image: /assets/images/vanilla-wc-hn.png
20 | app-link: https://vanilla-wc-hnpwa.firebaseapp.com
21 | github-link: https://github.com/alexnoz/vanilla-wc-hnpwa
22 | ---
--------------------------------------------------------------------------------
/site/_apps/zuix-hn.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 19
3 | title: 'Zuix HN'
4 | github-title: 'genielabs/zuix-hn'
5 | library: 'ZUIX'
6 | libraries:
7 | - name: 'ZUIX'
8 | module-bundling: 'zuix-bundler'
9 | service-worker: 'Application Shell + Workbox data caching'
10 | perfomance-patterns: 'Lazy loaded components with caching'
11 | server-side-rendering: 'None'
12 | api: 'Hacker News Firebase API'
13 | hosting: 'Firebase'
14 | authors:
15 | - name: 'Gene'
16 | lighthouse: '91/100'
17 | interactive-em: '6.2s'
18 | interactive-faster-3g: '4.8s'
19 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=170724_JT_fc286336283f4594b5e9a14ee486d437&run=3
20 | wpt-em-link: https://www.webpagetest.org/result/170724_F6_c37ad291bb720b8c203da685d8a704b4/
21 | wpt-faster-3g-link: https://www.webpagetest.org/result/170724_JT_fc286336283f4594b5e9a14ee486d437/
22 | image: /assets/images/zuixhn-mobile.png
23 | app-link: https://zuix-hn.firebaseapp.com/
24 | github-link: https://github.com/g-labs-sw/zuix-hackernews
25 | framework-link: https://genielabs.github.io/zuix/
26 | ---
27 |
--------------------------------------------------------------------------------
/site/_apps/viper-news.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 25
3 | title: 'Viper-news'
4 | github-title: 'WebReflection/viper-news'
5 | libraries:
6 | - name: 'viperHTML'
7 | module-bundling: 'Webpack'
8 | service-worker: 'Application Shell + data caching'
9 | perfomance-patterns: 'Asynchronous Partial Outputs'
10 | server-side-rendering: 'Yes'
11 | api: 'Hacker News Firebase API'
12 | hosting: 'Google App Engine'
13 | authors:
14 | - name: 'Andrea'
15 | lighthouse: '91/100'
16 | interactive-em: '1.78s'
17 | interactive-faster-3g: '1.5s'
18 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=171116_3Q_636bd0fd4f0da9aeeec699d460e63a32&run=1
19 | wpt-em-link: https://www.webpagetest.org/result/171116_8C_00c37105fe46ea1939831f11622ec445/
20 | wpt-faster-3g-link: https://www.webpagetest.org/result/171116_3Q_636bd0fd4f0da9aeeec699d460e63a32/
21 | image: /assets/images/viperhtml-mobile.png
22 | app-link: https://viperhtml-164315.appspot.com/
23 | github-link: https://github.com/WebReflection/viper-news
24 | framework-link: https://github.com/WebReflection/viperHTML
25 | ---
26 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: ruby
2 | rvm:
3 | - 2.3.3
4 | before_install:
5 | - cd site
6 | - nvm install 7
7 | - npm install
8 | # Cloud Functions has its own package.json
9 | - cd functions && npm i && cd ..
10 | script:
11 | - npm run build
12 | - npm run precache
13 | deploy:
14 | provider: firebase
15 | skip_cleanup: true
16 | token:
17 | secure: "$FIREBASE_TOKEN"
18 | env:
19 | global:
20 | secure: k1fUHvLf3YawrS9M3rCzaS8xlt9F7s33UtuDFcFCpEQP02FYRos/shmlAgJ6MCzdRfVxNAeJ4f8skmygaKZoNdvqi6l8zZGQhSRc5SeWDLtZe3u5gUS9l7uUUgPLpHz7KXhPTie0FU2sbRRvqpOno8zXsR5ysggwHPShhx6aaVES8aOSsyWduPClewTNHnUEV5O8lMoyUPFJWe4zPF2IlKci5lE8tUddZyi+ue3pwuoBs+0ITKVRxxX9LIS3Ktu5MKAIWB2DC/zZ3TisL9eaGrHutkvYdF7CrndbQ7Vp/5QXfrvq+7e1A7ui39jvd0QdPu8W7xuxmOIJ/8rApmVJ/8jZW//g4YJTj4D1AIbbcocCLHZXO8Lg9OCLgOmyUJP0qH1z0JwHvBQCaDrJWIJxybPGZueDfmee2Sz1ZtpgyYfv4MfQthYOaOc7VKqK9NgJs2U+mjBQWr4p3aS57FAmsTBU/VbpdaXqHK+lH398rAopGWOjT+wt5bJzPpO1hiFObrJSIthnxH4WNRyrLxs3JZ8iCrMDOiF1Kv+/DyeoevaHLcNpsTqodJ+UpxAPPpoWxbKE7J95ntFul+KuMbZYNoG/4HUTDlCjvpJbOqJKCrX2PmKMABA4/mfBoLEjVoCu25gNmAve3auqvJnuZ3w1AFbewPx8fNdVbBAX7vQ6zxo=
21 |
--------------------------------------------------------------------------------
/site/_apps/angular-hn.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 6
3 | title: 'Angular HN'
4 | github-title: 'housseindjirdeh/angular2-hn'
5 | libraries:
6 | - name: 'Angular'
7 | scaffolding: 'Angular CLI'
8 | module-bundling: 'Webpack'
9 | service-worker: 'Application Shell + data caching with sw-precache'
10 | perfomance-patterns: 'Lazy loaded modules'
11 | server-side-rendering: 'None'
12 | api: 'Node-hnapi (unofficial)'
13 | hosting: 'Firebase'
14 | authors:
15 | - name: 'Houssein'
16 | lighthouse: '91/100'
17 | interactive-em: '6.0s'
18 | interactive-faster-3g: '4.4s'
19 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=170612_BV_5cd2c04584152647e2e556f5af8f5eba&run=3
20 | wpt-em-link: https://www.webpagetest.org/result/170612_N2_7f979f17312d8feaa1709697d388c1ab/
21 | wpt-faster-3g-link: https://www.webpagetest.org/result/170612_BV_5cd2c04584152647e2e556f5af8f5eba/
22 | image: /assets/images/angular2hn-mobile.png
23 | app-link: https://angular2-hn.firebaseapp.com/
24 | github-link: https://github.com/housseindjirdeh/angular2-hn
25 | framework-link: https://angular.io/
26 | ---
27 |
--------------------------------------------------------------------------------
/site/_apps/mithril-hn.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 12
3 | title: 'Mithril HN'
4 | github-title: 'chimon2000/mithril-hn'
5 | libraries:
6 | - name: 'Mithril'
7 | - name: 'typestyle'
8 | module-bundling: 'fuse-box'
9 | service-worker: 'Application Shell'
10 | perfomance-patterns: 'HTTP/2 with Server Push'
11 | server-side-rendering: 'None'
12 | api: 'Node-hnapi (unofficial)'
13 | hosting: 'Firebase functions over HTTP/2 with Server Push + edge-caching'
14 | authors:
15 | - name: 'Ryan'
16 | lighthouse: 91/100
17 | interactive-em: 4.9s
18 | interactive-faster-3g: 4.2s
19 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=170615_KW_cc7ce98d7be5f17a1381b42aebc6b69d&run=2
20 | wpt-em-link: https://www.webpagetest.org/result/170615_51_48fa6a90be213da908a150776c040326/
21 | wpt-faster-3g-link: https://www.webpagetest.org/result/170615_9W_b966e04a3cdec211f0c723bf8a453779/
22 | image: /assets/images/mithril-hn-pwa.png
23 | app-link: https://mithril-hn.firebaseapp.com
24 | github-link: https://github.com/chimon2000/mithril-hn
25 | framework-link: https://mithril.js.org
26 | ---
27 |
--------------------------------------------------------------------------------
/site/_apps/react-hn-stephen.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 23
3 | title: 'React HN'
4 | github-title: 'stephenkingsley/hackerNews-pwa'
5 | library: 'React'
6 | libraries:
7 | - name: 'React'
8 | - name: 'React Router'
9 | module-bundling: 'Webpack'
10 | service-worker: 'Application Shell'
11 | server-side-rendering: 'No'
12 | api: 'Node-hnapi (unoffical)'
13 | hosting: 'Firebase'
14 | other-details: 'create-react-app'
15 | authors:
16 | - name: 'Stephen'
17 | lighthouse: '91/100'
18 | interactive-em: '3.1s'
19 | interactive-faster-3g: '2.41s'
20 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=170826_0V_8516618e5aaa2650da5aabbc773c8929&run=3
21 | wpt-em-link: https://www.webpagetest.org/result/170826_1T_9823f5188c7a02b16c87c1bb00826991/
22 | wpt-faster-3g-link: https://www.webpagetest.org/result/170826_8P_f18463655253ad388a2f129f75095afe/
23 | image: /assets/images/react-hn-stephen.png
24 | app-link: https://hn-pwa-d8b2e.firebaseapp.com/
25 | github-link: https://github.com/stephenkingsley/hackerNews-pwa
26 | framework-link: https://facebook.github.io/react/
27 | ---
28 |
--------------------------------------------------------------------------------
/site/_apps/glimmer-hn-pwa.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 21
3 | title: 'Glimmer HN'
4 | github-title: 'mhadaily/glimmer-hn-pwa'
5 | libraries:
6 | - name: 'Glimmer.js'
7 | scaffolding: 'Ember CLI'
8 | module-bundling: 'Broccoli'
9 | service-worker: 'Application Shell + data caching with ESW'
10 | perfomance-patterns: 'Prefetch/Preload JS + DNS, Critical CSS, HTTP/2 Server Push'
11 | server-side-rendering: 'None'
12 | api: 'Node-hnapi (unofficial)'
13 | hosting: 'Firebase'
14 | authors:
15 | - name: 'Majid'
16 | lighthouse: '91/100'
17 | interactive-em: '4.12s'
18 | interactive-faster-3g: '2.81s'
19 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=170920_JG_f68db76d6ecdfc19c30be596eab755a2&run=2
20 | wpt-em-link: https://www.webpagetest.org/result/170920_TT_f75f4bf5930c888202f1c40443a9f4ec/
21 | wpt-faster-3g-link: https://www.webpagetest.org/result/170920_JG_f68db76d6ecdfc19c30be596eab755a2/
22 | image: /assets/images/glimmer-hn-pwa.png
23 | app-link: https://glimmer-hn-pwa.firebaseapp.com/
24 | github-link: https://github.com/mhadaily/glimmer-hn-pwa
25 | framework-link: https://glimmerjs.org/
26 | ---
27 |
--------------------------------------------------------------------------------
/site/_apps/mobx-ts-hn.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 31
3 | title: 'MobX TS HN'
4 | github-title: 'eugenkiss/hnclient'
5 | library: 'React'
6 | libraries:
7 | - name: 'React/Inferno'
8 | - name: 'MobX'
9 | - name: 'TypeScript'
10 | - name: 'Router5'
11 | - name: 'emotion'
12 | module-bundling: 'Webpack'
13 | service-worker: 'SWPrecache'
14 | perfomance-patterns: 'Critical CSS, request caching'
15 | server-side-rendering: 'None'
16 | api: 'hnpwa.com/api/v0'
17 | hosting: 'Firebase'
18 | authors:
19 | - name: 'Eugen'
20 | lighthouse: '90/100'
21 | interactive-em: '7.3s'
22 | interactive-faster-3g: '3.9s'
23 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=180208_JJ_01f07a06adb2f1d7b7b68adc8902fe4f&run=3
24 | wpt-em-link: https://www.webpagetest.org/result/180208_MC_589f0257c719d7a20c39d19818d6b42f/
25 | wpt-faster-3g-link: https://www.webpagetest.org/result/180208_JJ_01f07a06adb2f1d7b7b68adc8902fe4f/
26 | image: /assets/images/mobx-ts-hn.png
27 | app-link: https://hn.eugenkiss.com
28 | github-link: https://github.com/eugenkiss/hnclient
29 | framework-link: https://mobx.js.org
30 | ---
31 |
--------------------------------------------------------------------------------
/site/_apps/preact-hn.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 3
3 | title: 'Preact HN'
4 | github-title: 'kristoferbaxter/preact-hn'
5 | library: 'Preact'
6 | libraries:
7 | - name: 'Preact'
8 | module-bundling: 'Webpack'
9 | service-worker: 'Application Shell with SW Precache'
10 | perfomance-patterns: 'HTTP/2 with Server Push, Brotli and Zopfli static assets'
11 | server-side-rendering: 'Yes'
12 | api: 'In-memory cached Hacker News Firebase API'
13 | hosting: 'Webfaction + Cloudflare'
14 | authors:
15 | - name: 'Kristofer'
16 | lighthouse: '93/100'
17 | interactive-em: '1.9s'
18 | interactive-faster-3g: '1.5s'
19 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=171009_R6_14208c102da44d9b2c10d78825ea128a&run=1
20 | wpt-em-link: https://www.webpagetest.org/result/171009_R6_14208c102da44d9b2c10d78825ea128a/
21 | wpt-faster-3g-link: https://www.webpagetest.org/result/171009_KZ_4637d4705732307a8d01e2fc0869bde3/
22 | image: /assets/images/preacthn-mobile.png
23 | app-link: https://hn.kristoferbaxter.com/
24 | github-link: https://github.com/kristoferbaxter/preact-hn
25 | framework-link: https://preactjs.com/
26 | ---
27 |
--------------------------------------------------------------------------------
/site/_apps/cxjs-hackernews.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 34
3 | title: 'CxJS Hacker News'
4 | github-title: 'codaxy/cxjs-hackernews'
5 | libraries:
6 | - name: 'CxJS'
7 | - name: 'Preact'
8 | scaffolding: 'Cx CLI'
9 | module-bundling: 'Webpack'
10 | service-worker: 'Application Shell + runtime data caching with sw-precache (sw-precache-webpack-plugin)'
11 | perfomance-patterns: 'Code-splitting, CSS and JS inlining'
12 | server-side-rendering: 'None'
13 | api: 'Node-hnapi (unoffical)'
14 | hosting: 'Netlify'
15 | authors:
16 | - name: 'Marko'
17 | lighthouse: '91/100'
18 | interactive-em: '4.5s'
19 | interactive-faster-3g: '3.7s'
20 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=170724_9N_d79b5c0abdf81a731b9d8d767508c2a1&run=2
21 | wpt-em-link: https://www.webpagetest.org/result/170724_X7_4839a02a6189db13446f21200993008e/
22 | wpt-faster-3g-link: https://www.webpagetest.org/result/170724_9N_d79b5c0abdf81a731b9d8d767508c2a1/
23 | image: /assets/images/cxjs-hackernews.png
24 | app-link: https://hn.cxjs.io/
25 | github-link: https://github.com/codaxy/cxjs-hackernews
26 | framework-link: https://cxjs.io/
27 | ---
28 |
--------------------------------------------------------------------------------
/site/_apps/react-hn-suriel.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 33
3 | title: 'React HN'
4 | github-title: 'surielmx/reacthnpwa'
5 | library: 'React'
6 | libraries:
7 | - name: 'React'
8 | - name: 'React Router'
9 | module-bundling: 'Webpack'
10 | service-worker: 'Application Shell'
11 | perfomance-patterns: 'HTTP/2, route based code splitting'
12 | server-side-rendering: 'No'
13 | api: 'api.hnpwa.com/v0'
14 | hosting: 'Firebase'
15 | other-details: 'Asynchronously loaded routes'
16 | authors:
17 | - name: 'Suriel'
18 | lighthouse: '91/100'
19 | interactive-em: '4.6s'
20 | interactive-faster-3g: '3.2s'
21 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=180502_3Z_98e8d3054059210ddaa78f835bcac68a&run=3
22 | wpt-em-link: https://www.webpagetest.org/result/180502_PF_e804f8fd48e450f54a7ffad0d4e15b0a/
23 | wpt-faster-3g-link: https://www.webpagetest.org/result/180502_W2_3d8192b37f093d8b5056de24f768cc6b/
24 | image: /assets/images/react-hn-suriel.png
25 | app-link: https://reacthnsuriel.firebaseapp.com/
26 | github-link: https://github.com/surielmx/reacthnpwa
27 | framework-link: https://facebook.github.io/react/
28 | ---
29 |
--------------------------------------------------------------------------------
/site/_apps/nuxt-hn.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 15
3 | title: 'HNPWA with Nuxt.js'
4 | github-title: 'nuxt/hackernews'
5 | libraries:
6 | - name: 'Vue'
7 | - name: 'Nuxt'
8 | - name: 'PWA Module'
9 | module-bundling: 'Webpack'
10 | service-worker: 'Workbox'
11 | perfomance-patterns: 'PRPL, Prefetch/Preload JS + DNS + Data, Critical Path CSS, Server Side Caching'
12 | server-side-rendering: 'Yes'
13 | api: 'Hacker News Firebase API'
14 | hosting: 'Now + CloudFlare CDN'
15 | authors:
16 | - name: 'Pooya'
17 | - name: 'Sebastien'
18 | - name: 'Alexandre'
19 | lighthouse: '91/100'
20 | interactive-em: '3.8s'
21 | interactive-faster-3g: '3.5s'
22 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=170620_PG_a2a9feaf4ace07a61b2c6c2a171b1c79&run=1
23 | wpt-em-link: https://www.webpagetest.org/result/170620_B1_0b83d61272c77c16c3f3f1f16fb72d2e/
24 | wpt-faster-3g-link: https://www.webpagetest.org/result/170620_PG_a2a9feaf4ace07a61b2c6c2a171b1c79/
25 | image: /assets/images/nuxt-hn.png
26 | app-link: https://hn.nuxtjs.org
27 | github-link: https://github.com/nuxt/hackernews
28 | framework-link: https://nuxtjs.org
29 | ---
30 |
--------------------------------------------------------------------------------
/site/_apps/inferno-hn.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 33
3 | title: 'Inferno HN'
4 | github-title: 'aretheregods/hackerinferno'
5 | libraries:
6 | - name: 'Inferno'
7 | scaffolding: 'create-inferno-app'
8 | module-bundling: 'Webpack'
9 | service-worker: 'Application Shell + data caching with sw-precache'
10 | perfomance-patterns: 'PRPL, code-splitting for granular loading'
11 | server-side-rendering: 'None'
12 | api: 'node_hnapi'
13 | hosting: 'Firebase'
14 | other-details: 'Route-specific pushing'
15 | authors:
16 | - name: 'Naythan'
17 | lighthouse: '91/100'
18 | interactive-em: '2.7s'
19 | interactive-faster-3g: '2.17s'
20 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=180119_PQ_af0a8e774030765c339c4eae3b1296a9&run=3
21 | wpt-em-link: https://www.webpagetest.org/result/180116_GM_c366e069195609ce4bbf6f58dd77f1cd/
22 | wpt-faster-3g-link: https://www.webpagetest.org/result/180119_PQ_af0a8e774030765c339c4eae3b1296a9/
23 | image: /assets/images/inferno-hn.png
24 | app-link: https://infernohackernews.firebaseapp.com/
25 | github-link: https://github.com/aretheregods/hackerinferno
26 | framework-link: https://infernojs.org/
27 | ---
28 |
--------------------------------------------------------------------------------
/site/_apps/angular-dart-hnpwa.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 31
3 | title: 'AngularDart HNPWA'
4 | github-title: 'dart-lang/angular'
5 | libraries:
6 | - name: 'AngularDart'
7 | - name: 'AngularDart Router'
8 | module-bundling: 'Dart2JS'
9 | service-worker: 'Worker generated from package:pwa'
10 | perfomance-patterns: 'Lazy loaded modules'
11 | server-side-rendering: 'None'
12 | api: 'api.hnpwa.com/v0'
13 | hosting: 'Firebase'
14 | authors:
15 | - name: 'Matan'
16 | - name: 'Leon'
17 | - name: 'kevmoo'
18 | lighthouse: '100/100'
19 | interactive-em: '4.1s'
20 | interactive-faster-3g: '2.1s'
21 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=180413_E9_539052ab0cb071da2e0363156ac9bc7e&run=1
22 | wpt-em-link: https://www.webpagetest.org/result/180413_PM_8219e620f184dc9a94441274d8dead71/
23 | wpt-faster-3g-link: https://www.webpagetest.org/result/180413_E9_539052ab0cb071da2e0363156ac9bc7e/
24 | image: /assets/images/angular-dart-hnpwa.png
25 | app-link: https://hnpwa.dartlang.org/
26 | github-link: https://github.com/dart-lang/angular/tree/master/examples/hacker_news_pwa
27 | framework-link: https://webdev.dartlang.org/angular
28 | ---
29 |
--------------------------------------------------------------------------------
/site/_apps/hnpwa-vue.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 16
3 | title: 'HNPWA Vue'
4 | github-title: 'anubhav7495/hnpwa-vue'
5 | libraries:
6 | - name: 'Vue'
7 | - name: 'vue-router'
8 | - name: 'vue-pwa-boilerplate'
9 | module-bundling: 'Webpack'
10 | service-worker: 'Application Shell with SWPrecachePlugin'
11 | perfomance-patterns: 'preload/prefetch resources, client-side data preload, lazy loaded routes, dns-prefetch'
12 | server-side-rendering: 'None'
13 | api: 'Node-hnapi (unofficial)'
14 | hosting: 'Github Pages'
15 | authors:
16 | - name: 'Anubhav'
17 | lighthouse: '91/100'
18 | interactive-em: '4.3s'
19 | interactive-faster-3g: '3.4s'
20 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=170717_C8_230384878d6c07f66bb59cf11f15ad24&run=3
21 | wpt-em-link: https://www.webpagetest.org/result/170717_TC_8b6a7c9d33d6687172ff9104a78cbae3/
22 | wpt-faster-3g-link: https://www.webpagetest.org/result/170717_C8_230384878d6c07f66bb59cf11f15ad24/
23 | image: /assets/images/hnpwa-vue.png
24 | app-link: https://anubhav7495.github.io/hnpwa-vue/
25 | github-link: https://github.com/anubhav7495/hnpwa-vue
26 | framework-link: https://vuejs.org/
27 | ---
28 |
--------------------------------------------------------------------------------
/site/_apps/nextjs-firebase-hnpwa.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 24
3 | title: 'Next.js HN'
4 | github-title: 'kulshekhar/next-hnpwa'
5 | libraries:
6 | - name: 'Next.js'
7 | - name: 'Preact'
8 | module-bundling: 'Next.js with additional Webpack config'
9 | service-worker: 'Application & data caching with sw-precache'
10 | perfomance-patterns: 'In memory LRU cache, preact-compat alias in production, CDN cache'
11 | server-side-rendering: 'Yes'
12 | api: 'Official API (Firebase)'
13 | hosting: 'Firebase'
14 | authors:
15 | - name: 'Kulshekhar'
16 | lighthouse: '91/100'
17 | interactive-em: '2.7s'
18 | interactive-faster-3g: '2.2s'
19 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=170924_SG_e20c408039688ecdcc07205ff6a91299&run=2
20 | wpt-em-link: https://www.webpagetest.org/result/170924_BQ_08b80e1854f5bfa0c5b36d10a5373b1e/
21 | wpt-faster-3g-link: https://www.webpagetest.org/result/170924_SG_e20c408039688ecdcc07205ff6a91299/
22 | image: /assets/images/next-fb-hnpwa.png
23 | app-link: https://next-fb-hnpwa.firebaseapp.com/
24 | github-link: https://github.com/kulshekhar/next-hnpwa
25 | framework-link: https://github.com/zeit/next.js
26 | ---
27 |
--------------------------------------------------------------------------------
/site/_apps/nextjs-hn.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 18
3 | title: 'Next.js HN'
4 | github-title: 'chrisdwheatley/nextjs-hn'
5 | libraries:
6 | - name: 'Next.js'
7 | - name: 'Preact'
8 | module-bundling: 'Next.js with additional Webpack config'
9 | service-worker: 'Application & data caching with sw-precache'
10 | perfomance-patterns: 'In memory LRU cache, DNS prefetch, preact-compat alias in production'
11 | server-side-rendering: 'Yes'
12 | api: 'Node-hnapi (unofficial)'
13 | hosting: 'Digital Ocean & Cloudflare'
14 | authors:
15 | - name: 'Chris'
16 | lighthouse: '91/100'
17 | interactive-em: '5.75s'
18 | interactive-faster-3g: '4.83s'
19 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=170715_KJ_1f08f67beb3451497c196a02e67dd71d&run=3
20 | wpt-em-link: https://www.webpagetest.org/result/170715_6V_90471cfb419635b88ed2da5d77fa5f75/
21 | wpt-faster-3g-link: https://www.webpagetest.org/result/170715_KJ_1f08f67beb3451497c196a02e67dd71d/
22 | image: /assets/images/nextjs-hn.png
23 | app-link: https://nextjs-hn.chrisdwheatley.com
24 | github-link: https://github.com/chrisdwheatley/nextjs-hn
25 | framework-link: https://github.com/zeit/next.js
26 | ---
27 |
--------------------------------------------------------------------------------
/site/_apps/next-hnpwa.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 14
3 | title: 'HNPWA with Next.js'
4 | github-title: 'codebusking/next-hnpwa-guide-kit'
5 | libraries:
6 | - name: 'Next.js'
7 | - name: 'firebase-hackernews'
8 | module-bundling: 'Webpack'
9 | service-worker: 'Application Shell + data caching with Workbox'
10 | perfomance-patterns: 'Server-side data pre-fetching, preload/prefetch'
11 | server-side-rendering: 'Yes'
12 | api: 'Hacker News Firebase API via firebase-hackernews running on service worker'
13 | hosting: 'Now'
14 | authors:
15 | - name: 'Jimmy'
16 | lighthouse: '91/100'
17 | interactive-em: '3.3s'
18 | interactive-faster-3g: '3.0s'
19 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=170615_8A_f6ee37ba2caadbb9139e35cf97129673
20 | wpt-em-link: https://www.webpagetest.org/result/170615_8A_f6ee37ba2caadbb9139e35cf97129673/
21 | wpt-faster-3g-link: https://www.webpagetest.org/result/170615_TK_5f9791787bb3bf5916205d05a150cb94/
22 | image: /assets/images/next-hnpwa.png
23 | app-link: https://next-hnpwa.now.sh/
24 | github-link: https://github.com/codebusking/next-hnpwa-guide-kit
25 | framework-link: https://github.com/zeit/next.js/
26 | ---
27 |
--------------------------------------------------------------------------------
/site/_apps/preact-hacker-news.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 30
3 | title: 'Preact Hacker News'
4 | github-title: 'malbernaz/preact-hn'
5 | library: 'Preact'
6 | libraries:
7 | - name: 'Preact'
8 | module-bundling: 'Webpack'
9 | service-worker: 'Application Shell with custom worker-loader'
10 | perfomance-patterns: 'HTTP/2, route based code splitting, resources preload, server-side data pre-fetch'
11 | server-side-rendering: 'Yes'
12 | api: 'Hacker News Firebase API on the server communicating with the client via socket'
13 | hosting: 'now.sh'
14 | authors:
15 | - name: 'malbernaz'
16 | lighthouse: '91/100'
17 | interactive-em: '4.8s'
18 | interactive-faster-3g: '3.4s'
19 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=170818_9W_cd328ee0370e86c069c7bd0a70db5e34&run=2
20 | wpt-em-link: https://www.webpagetest.org/result/170818_R4_717b39b3ee0d52ba738f0830742c82b4/
21 | wpt-faster-3g-link: https://www.webpagetest.org/result/170818_9W_cd328ee0370e86c069c7bd0a70db5e34/
22 | image: /assets/images/preact-hnpwa.png
23 | app-link: https://preact-hn.now.sh
24 | github-link: https://github.com/malbernaz/preact-hn
25 | framework-link: https://preactjs.com
26 | ---
27 |
--------------------------------------------------------------------------------
/site/_apps/angular-hnpwa.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 22
3 | title: 'Angular Hacker News'
4 | github-title: 'alfredoperez/ngx-hn'
5 | libraries:
6 | - name: 'Angular'
7 | - name: 'ngu-pwa-tools'
8 | scaffolding: 'Angular CLI'
9 | module-bundling: 'Angular CLI'
10 | service-worker: 'Application shell generated with ng-pwa-tools and service worker from @angular/service-worker'
11 | perfomance-patterns: 'Lazy loaded modules'
12 | server-side-rendering: 'None'
13 | api: 'Node-hnapi (unofficial)'
14 | hosting: 'Firebase with HTTP/2 Server Push'
15 | authors:
16 | - name: 'Alfredo'
17 | lighthouse: '91/100'
18 | interactive-em: '5.5s'
19 | interactive-faster-3g: '4.5s'
20 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=170726_49_9abc8ecb776d6d5081136f0867638dec&run=2
21 | wpt-em-link: https://www.webpagetest.org/result/170726_49_9abc8ecb776d6d5081136f0867638dec/
22 | wpt-faster-3g-link: https://www.webpagetest.org/result/170726_7R_1c883338d59f1d6065984619829f3f3f/
23 | image: /assets/images/angular-hn-pwa.png
24 | app-link: https://ngx-hn.firebaseapp.com
25 | github-link: https://github.com/alfredoperez/ngx-hn
26 | framework-link: https://angular.io/
27 | ---
28 |
--------------------------------------------------------------------------------
/site/_apps/angular-hacker-news.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 18
3 | title: 'Angular Hacker News'
4 | github-title: 'sebastianm/angular-hacker-news'
5 | libraries:
6 | - name: 'Angular'
7 | - name: 'Angular Router'
8 | - name: 'Angular HTTP'
9 | module-bundling: 'Webpack'
10 | service-worker: 'Application Shell + sw-precache'
11 | perfomance-patterns: 'Lazy loaded modules'
12 | server-side-rendering: 'Angular Universal'
13 | api: 'Firebase Hacker News API + Node-hnapi (unofficial)'
14 | hosting: 'Digitalocean'
15 | authors:
16 | - name: 'Sebastian'
17 | lighthouse: '91/100'
18 | interactive-em: '4.3s'
19 | interactive-faster-3g: '3.2s'
20 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=170711_54_532be7068a1836a1647889ad4ac5c1f2&run=3
21 | wpt-em-link: https://www.webpagetest.org/result/170711_91_727a71056a80d4dd71e3a2cbd904a6b9/
22 | wpt-faster-3g-link: https://www.webpagetest.org/result/170711_54_532be7068a1836a1647889ad4ac5c1f2/
23 | image: /assets/images/angular-hacker-news-mobile.png
24 | app-link: https://angularhn.sebastian-mueller.net/
25 | github-link: https://github.com/SebastianM/angular-hacker-news
26 | framework-link: https://angular.io/
27 | ---
28 |
--------------------------------------------------------------------------------
/site/_apps/react-hn-kristofer.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 1
3 | title: 'React HN'
4 | github-title: 'kristoferbaxter/react-hn'
5 | library: 'React'
6 | libraries:
7 | - name: 'React'
8 | - name: 'React Router'
9 | module-bundling: 'Webpack'
10 | service-worker: 'Application Shell with OfflinePlugin'
11 | perfomance-patterns: 'HTTP/2 with Server Push, Brotli and Zopfli static assets'
12 | server-side-rendering: 'Yes'
13 | api: 'In-memory cached Hacker News Firebase API'
14 | hosting: 'Webfaction + Cloudflare'
15 | authors:
16 | - name: 'Kristofer'
17 | lighthouse: '91/100'
18 | interactive-em: '2.57s'
19 | interactive-faster-3g: '2.09s'
20 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=170926_C4_2e99e0bda1db48cfd3b8139722cbc108&run=1
21 | wpt-em-link: https://www.webpagetest.org/result/170926_C4_2e99e0bda1db48cfd3b8139722cbc108/
22 | wpt-faster-3g-link: https://www.webpagetest.org/result/170926_MZ_61d634db2106167b89704d43d49d1ee2/
23 | image: /assets/images/reacthn-kristofer-mobile.png
24 | app-link: https://react-hn.kristoferbaxter.com/
25 | github-link: https://github.com/kristoferbaxter/react-hn
26 | framework-link: https://facebook.github.io/react/
27 | ---
28 |
--------------------------------------------------------------------------------
/site/_apps/react-hn.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 2
3 | title: 'React HN'
4 | github-title: 'insin/react-hn'
5 | library: 'React'
6 | libraries:
7 | - name: 'React'
8 | - name: 'React Router'
9 | module-bundling: 'Webpack'
10 | service-worker: 'Application Shell + data caching with Workbox'
11 | perfomance-patterns: 'PRPL, route-based chunking'
12 | server-side-rendering: 'Yes'
13 | api: 'Hacker News Firebase API + Node-hnapi (unoffical)'
14 | hosting: 'Google App Engine'
15 | other-details: 'Asynchronously loaded routes'
16 | authors:
17 | - name: 'Jonny'
18 | - name: 'Addy'
19 | lighthouse: '91/100'
20 | interactive-em: '6.2s'
21 | interactive-faster-3g: '4.0s'
22 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=170511_QV_f71a12eb44f1f058b0741db2eac3d85a&run=3
23 | wpt-em-link: https://www.webpagetest.org/result/170511_Y7_3a354dfc36f824229a1ae2b1ac93fdbf/
24 | wpt-faster-3g-link: https://www.webpagetest.org/result/170511_QV_f71a12eb44f1f058b0741db2eac3d85a/
25 | image: /assets/images/reacthn-mobile.png
26 | app-link: https://react-hn.appspot.com/
27 | github-link: https://github.com/insin/react-hn
28 | framework-link: https://facebook.github.io/react/
29 | ---
30 |
--------------------------------------------------------------------------------
/site/_apps/vue-hacker-news.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 5
3 | title: 'Vue Hacker News 2.0'
4 | github-title: 'vuejs/vue-hackernews-2.0'
5 | libraries:
6 | - name: 'Vue'
7 | - name: 'vue-router'
8 | - name: 'Vuex'
9 | module-bundling: 'Webpack'
10 | service-worker: 'Application Shell + data caching with SWPrecachePlugin'
11 | perfomance-patterns: 'Server-side data pre-fetching, preload/prefetch resources'
12 | server-side-rendering: 'Yes'
13 | api: 'Hacker News Firebase API'
14 | hosting: 'Now'
15 | other-details: 'Inlined CSS used by rendered components'
16 | authors:
17 | - name: 'Evan'
18 | lighthouse: '93/100'
19 | interactive-em: '6.7s'
20 | interactive-faster-3g: '5.85s'
21 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=170919_Q2_655690ac651cba872483ecc93ac6efe9&run=1
22 | wpt-em-link: https://www.webpagetest.org/result/170919_ME_f239125bd17ccfed31eb2f81ef860567/
23 | wpt-faster-3g-link: https://www.webpagetest.org/result/170919_Q2_655690ac651cba872483ecc93ac6efe9/
24 | image: /assets/images/vuehn-mobile.png
25 | app-link: https://vue-hn.herokuapp.com/
26 | github-link: https://github.com/vuejs/vue-hackernews-2.0
27 | framework-link: https://vuejs.org/
28 | ---
29 |
--------------------------------------------------------------------------------
/site/_apps/hnpwa-react.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 21
3 | title: 'HNPWA with React'
4 | github-title: 'taehwanno/hnpwa-react'
5 | library: 'React'
6 | libraries:
7 | - name: 'React'
8 | - name: 'React Router'
9 | - name: 'Redux'
10 | - name: 'Immutable.js'
11 | module-bundling: 'Webpack'
12 | service-worker: 'Application Shell + data caching and offline google analytics with Workbox'
13 | perfomance-patterns: 'Server-side data pre-fetching, preload/prefetch resources'
14 | server-side-rendering: 'Yes'
15 | api: 'Node-hnapi (unofficial)'
16 | hosting: 'Firebase'
17 | authors:
18 | - name: 'Taehwan, No'
19 | lighthouse: '91/100'
20 | interactive-em: '5.2s'
21 | interactive-faster-3g: '4.3s'
22 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=171029_69_655c5b28865ee880316d1af49358b1a0&run=1
23 | wpt-em-link: https://www.webpagetest.org/result/171029_6Y_04df9e72abb38731d412b0eeb7be1317/
24 | wpt-faster-3g-link: https://www.webpagetest.org/result/171029_69_655c5b28865ee880316d1af49358b1a0/
25 | image: /assets/images/hnpwa-react.png
26 | app-link: https://hnpwa-react.firebaseapp.com/
27 | github-link: https://github.com/taehwanno/hnpwa-react
28 | framework-link: https://reactjs.org/
29 | ---
30 |
--------------------------------------------------------------------------------
/site/_apps/ember-hn.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 10
3 | title: 'HackerNews.io'
4 | github-title: 'ivanvanderbyl/ember-hackernews-pwa'
5 | libraries:
6 | - name: 'Ember.js'
7 | - name: 'Ember Server Worker'
8 | - name: 'Ember Web App'
9 | - name: 'Ember Fetch'
10 | module-bundling: 'Broccoli + Critical + HTMLMin + Imagemin + gzip'
11 | service-worker: 'Application Shell + data caching'
12 | perfomance-patterns: 'Prefetch/Preload JS + DNS, Critical CSS, HTTP/2 Server Push'
13 | server-side-rendering: 'None'
14 | api: 'Node-hnapi (unofficial) + CloudFront'
15 | hosting: 'Cloudfront'
16 | authors:
17 | - name: 'Ivan Vanderbyl'
18 | lighthouse: '100/100'
19 | interactive-em: '4.727s'
20 | interactive-faster-3g: '4.254s'
21 | lighthouse-link: https://googlechrome.github.io/lighthouse/viewer/?gist=c358a609038f463cb06741b2847f5315
22 | wpt-em-link: https://www.webpagetest.org/result/171007_GJ_52584ab4b5e5cf2978d2a20cb28a74e8/
23 | wpt-faster-3g-link: https://www.webpagetest.org/result/171007_3Q_d90b70ffa917bf4ff7300d71575c4262/
24 | image: /assets/images/ember-hn-mobile.png
25 | app-link: https://hackernews.io/
26 | github-link: https://github.com/ivanvanderbyl/ember-hackernews-pwa
27 | framework-link: https://emberjs.com
28 | ---
29 |
--------------------------------------------------------------------------------
/api/README.md:
--------------------------------------------------------------------------------
1 | # HNPWA API Publish Server
2 |
3 | The HNPWA API is served statically by Firebase Hosting. However, the files are generated and published every 20 minutes on AppEngine.
4 |
5 | ## Prioritizing new content
6 | The Official Hacker News API uses categories of new content: Top Stories, Ask, Jobs, Show, Newest, and such. Each category has a max number of pages. The stories on these pages are considered "fresh content". Every 20 minutes the HNPWA API generates static files for these categories and their pages as static files. Since these files are static and prepublished, they will load much more quickly than dynamically generated files. However, the API still provides older individual items. These items are generated with Cloud Functions and served over Firebase Hosting's CDN. These items are likely to take longer to load.
7 |
8 | ## Publishing instructions
9 | 1. Ask davideast for deploy permissions.
10 | 1. Install dependencies inside the `api` folder.
11 | 1. Install the [Google Cloud SDK](https://cloud.google.com/sdk/).
12 | 1. Initialize Google Cloud SDK to HNPWA project.
13 | 1. Run `yarn build` (or `npm run build`).
14 | 1. Run `yarn deploy`.
15 | 1. Check the [GCP dashboard for errors](console.cloud.google.com/errors).
16 |
--------------------------------------------------------------------------------
/site/_apps/vue-hn-pwa.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 13
3 | title: 'HNPWA with Vue.js'
4 | github-title: 'codebusking/vue-hn-pwa-guide-kit'
5 | libraries:
6 | - name: 'Vue'
7 | - name: 'vue-router'
8 | - name: 'vue-pwa-boilerplate'
9 | - name: 'firebase-hackernews'
10 | module-bundling: 'Webpack'
11 | service-worker: 'Application Shell + data caching with SWPrecachePlugin'
12 | perfomance-patterns: 'Server-side data pre-fetching, preload/prefetch and lazy loading for rest of routes'
13 | server-side-rendering: 'Yes'
14 | api: 'Hacker News Firebase API via firebase-hackernews'
15 | hosting: 'Now'
16 | authors:
17 | - name: 'Jimmy'
18 | lighthouse: '91/100'
19 | interactive-em: '5.1s'
20 | interactive-faster-3g: '3.9s'
21 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=170606_8F_9a74ddc961724a98e92b71ea0ad1443e&run=2
22 | wpt-em-link: https://www.webpagetest.org/result/170606_AY_901bc2310bcc8fc640315092d0f0de6b/
23 | wpt-faster-3g-link: https://www.webpagetest.org/result/170606_8F_9a74ddc961724a98e92b71ea0ad1443e/
24 | image: /assets/images/vue-hn-pwa.png
25 | app-link: https://vue-hn-pwa.now.sh/
26 | github-link: https://github.com/codebusking/vue-hn-pwa-guide-kit
27 | framework-link: https://vuejs.org/
28 | ---
29 |
--------------------------------------------------------------------------------
/site/_apps/ng-hnpwa.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 35
3 | title: 'Angular-HN'
4 | github-title: 'ashishdce/hn-pwa-angular'
5 | libraries:
6 | - name: 'Angular'
7 | - name: 'Service-Worker'
8 | - name: 'firebase'
9 | scaffolding: 'Angular CLI'
10 | module-bundling: 'Angular CLI'
11 | service-worker: 'Application shell generated with ng-pwa-tools and service worker from @angular/service-worker'
12 | perfomance-patterns: 'Lazy loaded modules'
13 | server-side-rendering: 'Yes'
14 | api: 'Node-hnapi (unofficial)'
15 | hosting: 'Firebase with HTTP/2 server push'
16 | authors:
17 | - name: 'Ashish'
18 | - name: 'Vinci'
19 | - name: 'Nisheed'
20 | lighthouse: '91/100'
21 | interactive-em: '4.413s'
22 | interactive-faster-3g: '3.7s'
23 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=171126_XB_ca26982d1a4b381aef10674c5be699ad&run=2
24 | wpt-em-link: https://www.webpagetest.org/result/171126_XB_ca26982d1a4b381aef10674c5be699ad/
25 | wpt-faster-3g-link: https://www.webpagetest.org/result/171126_BM_f10b4802bba680c9d7385f6a6ce9843c/
26 | image: /assets/images/hnpwa-angular.png
27 | app-link: https://angular-hnpwa.firebaseapp.com
28 | github-link: https://github.com/Ashishdce/hn-pwa-angular
29 | framework-link: https://angular.io/
30 | ---
31 |
--------------------------------------------------------------------------------
/site/_apps/quasar-hackernews.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 32
3 | title: 'HNPWA with Quasar Framework'
4 | github-title: 'quasarframework/quasar-hackernews'
5 | libraries:
6 | - name: 'Quasar Framework'
7 | - name: 'Vue'
8 | - name: 'vue-router'
9 | - name: 'Vuex'
10 | module-bundling: 'Webpack'
11 | service-worker: 'Application Shell + data caching with SWPrecachePlugin'
12 | perfomance-patterns: 'Server-side data pre-fetching, preload/prefetch resources'
13 | server-side-rendering: 'Yes'
14 | api: 'Hacker News Firebase API'
15 | hosting: 'Now'
16 | other-details: 'Inlined CSS used by rendered components'
17 | authors:
18 | - name: 'Razvan Stoenescu'
19 | lighthouse: '100/100'
20 | interactive-em: '6.84s'
21 | interactive-faster-3g: '5.07s'
22 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=180627_47_1be589c537caa5cdf9debfe7476b9b6c&run=1
23 | wpt-em-link: https://www.webpagetest.org/result/180627_FH_e52159d46786140db0507950e04e7160/
24 | wpt-faster-3g-link: https://www.webpagetest.org/result/180627_47_1be589c537caa5cdf9debfe7476b9b6c/
25 | image: /assets/images/quasar-hn.png
26 | app-link: https://quasar-hackernews.now.sh/
27 | github-link: https://github.com/quasarframework/quasar-hackernews
28 | framework-link: https://quasar-framework.org/
29 | ---
30 |
--------------------------------------------------------------------------------
/site/_apps/polymer-hn.txt:
--------------------------------------------------------------------------------
1 | ---
2 | weight: 8
3 | title: 'Polymer HN'
4 | github-title: 'Polymer/hn-polymer-2'
5 | libraries:
6 | - name: 'Polymer'
7 | scaffolding: 'Polymer CLI & Polymer Starter Kit'
8 | module-bundling: 'Polymer-build with HTML Imports'
9 | service-worker: 'Application Shell + data caching with sw-precache'
10 | perfomance-patterns: 'PRPL, code-splitting for granular loading'
11 | server-side-rendering: 'None'
12 | api: 'Node-hnapi (unofficial)'
13 | hosting: 'Firebase functions over HTTP/2 with Server Push + edge-caching'
14 | other-details: 'Route-specific pushing'
15 | authors:
16 | - name: 'Dan'
17 | - name: 'Kevin'
18 | - name: 'Steve'
19 | lighthouse: 92/100
20 | interactive-em: 2.34s
21 | interactive-faster-3g: 1.8s
22 | lighthouse-link: https://www.webpagetest.org/lighthouse.php?test=170919_XJ_de74b35584767efef8fa98087562e749&run=1
23 | wpt-em-link: https://www.webpagetest.org/result/170919_0Q_d6fdc6e80104db2e359f6c1e74da1ac7/
24 | wpt-faster-3g-link: https://www.webpagetest.org/result/170919_XJ_de74b35584767efef8fa98087562e749/
25 | image: /assets/images/polymer-mobile.png
26 | app-link: https://hn-polymer-2.firebaseapp.com
27 | github-link: https://github.com/polymer/hn-polymer-2
28 | framework-link: https://www.polymer-project.org
29 | ---
30 |
--------------------------------------------------------------------------------
/site/Gemfile.lock:
--------------------------------------------------------------------------------
1 | GEM
2 | remote: https://rubygems.org/
3 | specs:
4 | addressable (2.5.1)
5 | public_suffix (~> 2.0, >= 2.0.2)
6 | colorator (1.1.0)
7 | ffi (1.9.18)
8 | forwardable-extended (2.6.0)
9 | jekyll (3.3.1)
10 | addressable (~> 2.4)
11 | colorator (~> 1.0)
12 | jekyll-sass-converter (~> 1.0)
13 | jekyll-watch (~> 1.1)
14 | kramdown (~> 1.3)
15 | liquid (~> 3.0)
16 | mercenary (~> 0.3.3)
17 | pathutil (~> 0.9)
18 | rouge (~> 1.7)
19 | safe_yaml (~> 1.0)
20 | jekyll-feed (0.9.2)
21 | jekyll (~> 3.3)
22 | jekyll-sass-converter (1.5.0)
23 | sass (~> 3.4)
24 | jekyll-watch (1.5.0)
25 | listen (~> 3.0, < 3.1)
26 | kramdown (1.13.2)
27 | liquid (3.0.6)
28 | listen (3.0.8)
29 | rb-fsevent (~> 0.9, >= 0.9.4)
30 | rb-inotify (~> 0.9, >= 0.9.7)
31 | mercenary (0.3.6)
32 | minima (2.1.1)
33 | jekyll (~> 3.3)
34 | pathutil (0.14.0)
35 | forwardable-extended (~> 2.6)
36 | public_suffix (2.0.5)
37 | rb-fsevent (0.9.8)
38 | rb-inotify (0.9.8)
39 | ffi (>= 0.5.0)
40 | rouge (1.11.1)
41 | safe_yaml (1.0.4)
42 | sass (3.4.23)
43 |
44 | PLATFORMS
45 | ruby
46 |
47 | DEPENDENCIES
48 | jekyll (= 3.3.1)
49 | jekyll-feed (~> 0.6)
50 | minima (~> 2.0)
51 |
52 | RUBY VERSION
53 | ruby 2.5.0p0
54 |
55 | BUNDLED WITH
56 | 1.16.0
57 |
--------------------------------------------------------------------------------
/site/_includes/footer.html:
--------------------------------------------------------------------------------
1 |
33 |
--------------------------------------------------------------------------------
/site/_config.yml:
--------------------------------------------------------------------------------
1 | # Welcome to Jekyll!
2 | #
3 | # This config file is meant for settings that affect your whole blog, values
4 | # which you are expected to set up once and rarely edit after that. If you find
5 | # yourself editing this file very often, consider using Jekyll's data files
6 | # feature for the data you need to update frequently.
7 | #
8 | # For technical reasons, this file is *NOT* reloaded automatically when you use
9 | # 'bundle exec jekyll serve'. If you change this file, please restart the server process.
10 |
11 | # Site settings
12 | # These are used to personalize your new site. If you look in the HTML files,
13 | # you will see them accessed via {{ site.title }}, {{ site.email }}, and so on.
14 | # You can create any custom variable you would like, and they will be accessible
15 | # in the templates via {{ site.myvariable }}.
16 | title: HNPWA
17 | description: > # this means to ignore newlines until "baseurl:"
18 | Hacker News readers as Progressive Web Apps
19 | baseurl: "" # the subpath of your site, e.g. /blog
20 | url: "https://hnpwa.com" # the base hostname & protocol for your site, e.g. http://example.com
21 | twitter_username: "@tastejs"
22 | github_username: "tastejs"
23 | google_analytics: UA-99127594-1
24 | collections:
25 | - apps
26 | - contributors
27 |
28 | # Build settings
29 | markdown: kramdown
30 | gems:
31 | - jekyll-feed
32 | exclude:
33 | - Gemfile
34 | - Gemfile.lock
35 | - vendor
36 | - package.json
37 | - sw-precache-config.js
38 | - node_modules
39 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing
2 |
3 | Thank you for your interest in contributing!
4 |
5 | If your Hacker News implementation meets the [specifications](https://github.com/tastejs/hacker-news-pwas#specification), don't hesitate to put up a PR to add its summary to HNPWA!
6 |
7 | If you would like to file a PR to update the site's design, please file an [issue](https://github.com/tastejs/hacker-news-pwas/issues/new) for it first.
8 |
9 | ## Setup
10 |
11 | 1. Fork the repo
12 | 2. Clone your fork
13 | 3. Make a branch for your changes
14 | 4. Install `Ruby` version 2.1+. To install the latest - execute following commands:
15 | * `curl -L https://get.rvm.io | bash -s stable`
16 | * `rvm install ruby-[version]`
17 | 5. Install `jekyll` and `bundler` gems.
18 | * `gem install jekyll bundler`
19 | 6. Go into the `site` directory and execute:
20 | * `bundle install`
21 | 7. `npm install`
22 | 8. `npm run dev` to kick off a development server
23 | 9. To test the Service Worker locally you can run `npm run dev-sw` instead.
24 | 10. If you're adding a summary of your Hacker News implementation:
25 | * Create a new entry under `_apps` with your application name
26 | * Fill out the list of attributes following the format of any of the other apps in the same directory. You'll need to include an image of your application as well. To fit the phone outline appropriately, please take a screenshot of your application emulated within a Nexus 5X using Chrome DevTools. This [tutorial](https://developers.google.com/web/tools/chrome-devtools/device-mode/) shows how to toggle Device Mode for the browser.
27 | * Add yourself to the `_contributors` directory and similarly fill out all the attributes there (make sure the `authors` attribute underneath your app in `_apps` has the same exact name attribute as here)
28 | 11. Create a pull request from your branch on your fork to `master` on this repo
29 | 12. Have your branch get merged in! :star2:
30 |
--------------------------------------------------------------------------------
/site/_includes/head.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | {% if page.title %}{{ page.title | escape }}{% else %}{{ site.title | escape }}{% endif %}
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 | {% if jekyll.environment == 'production' and site.google_analytics %}
41 | {% include google-analytics.html %}
42 | {% endif %}
43 |
44 |
--------------------------------------------------------------------------------
/site/_layouts/home.html:
--------------------------------------------------------------------------------
1 | ---
2 | layout: default
3 | ---
4 |
5 |
6 | A spiritual successor to TodoMVC
7 |
8 |
9 | TodoMVC has helped thousands of developers select
10 | an MV* framework for their JavaScript applications. However, the web ecosystem
11 | has evolved in the past few years allowing us to build powerful applications using
12 | modern browser capabilities.
13 |
14 |
15 |
16 | To provide developers with examples, we collected a list of unofficial Hacker News clients built with a number of popular JavaScript frameworks and libraries.
17 | Each implementation is a complete Progressive Web App that utilizes
18 | different progressive technologies to provide a fast, reliable and engaging experience.
19 |
20 |
21 |
22 | Our implementations aim to follow a loose specification. They are primarily a learning tool and should not be used to compare the performance of one PWA to another. They can differ based on server infrastructure, performance patterns used and other factors.
23 |
24 |
25 |
26 | {% assign sortedApps = site.apps | sort: 'weight' %}
27 | {% assign numAppsIsEven = site.apps.size | modulo: 2 %}
28 |
29 | {% for app in sortedApps %}
30 | {% include implementation.html app=app %}
31 | {% endfor %}
32 |
33 |
34 |
35 | Submit your Hacker News Progressive Web App
36 |
37 |
38 |
39 | If your Hacker News implementation meets the specifications ,
40 | feel free to submit a summary of it here! HNPWA serves as a reference for building PWAs with different libraries so the
41 | more examples we have the better. Don't worry if there's already one with the same UI library or framework as yours.
42 |
43 |
44 |
SUBMIT
45 |
--------------------------------------------------------------------------------
/docs/api.md:
--------------------------------------------------------------------------------
1 | # HNPWA API
2 |
3 | **A fast, CDN delivered, aggregated Hacker News API**
4 |
5 | https://api.hnpwa.com/v0/news/1.json
6 |
7 | ## Why?
8 |
9 | Everything in the official Hacker News API is either
10 | [an item](https://hacker-news.firebaseio.com/v0/item/8863.json?print=pretty) or
11 | [a list of items](https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty).
12 |
13 | This structure is not ideal for building fast loading Progressive Web Apps since it will require multiple network requests
14 | to get the needed payload for page render.
15 |
16 | The HNPWA solves this problem by aggregating each item in the id list into item feeds.
17 |
18 | ## Item feeds
19 |
20 | There are five item feeds.
21 |
22 | | Name | URL |
23 | | --- | --- |
24 | | News| https://api.hnpwa.com/v0/news/1.json |
25 | | Newest | https://api.hnpwa.com/v0/newest/1.json |
26 | | Ask | https://api.hnpwa.com/v0/ask/1.json |
27 | | Show | https://api.hnpwa.com/v0/show/1.json |
28 | | Jobs | https://api.hnpwa.com/v0/jobs/1.json |
29 |
30 | ### Schema
31 |
32 | Each item feed returns an array of `FeedItem`.
33 |
34 | ```ts
35 | export interface FeedItem {
36 | id: number;
37 | title: string;
38 | points?: number | null;
39 | user?: string | null;
40 | time: number;
41 | time_ago: string;
42 | comments_count: number;
43 | type: string;
44 | url?: string;
45 | domain?: string;
46 | }
47 | ```
48 |
49 | ### Paging
50 |
51 | Item feeds can be paged by accessing the next index in the page. Each page starts at 1 and each feed has a different ending page.
52 |
53 | [https://api.hnpwa.com/v0/news.json/2.json](https://api.hnpwa.com/v0/news.json/2.json)
54 |
55 | | Name | Max Pages |
56 | | --- | --- |
57 | | News| 10 |
58 | | Newest | 12 |
59 | | Ask | 2 |
60 | | Show | 2 |
61 | | Jobs | 1 |
62 |
63 | ## Individual items
64 |
65 | Feeds provide the top level view of an item, but other details like comment threads are available at the individual item level.
66 |
67 | [https://api.hnpwa.com/v0/item/13831370.json](https://api.hnpwa.com/v0/item/13831370.json)
68 |
69 | ### Schema
70 |
71 | ```ts
72 | export interface Item {
73 | id: number;
74 | title: string;
75 | points: number | null;
76 | user: string | null;
77 | time: number;
78 | time_ago: string;
79 | content: string;
80 | deleted?: boolean;
81 | dead?: boolean;
82 | type: string;
83 | url?: string;
84 | domain?: string;
85 | comments: Item[]; // Comments are items too
86 | level: number;
87 | comments_count: number;
88 | }
89 | ```
90 |
91 | ## Users
92 |
93 | Users are retrieved by username.
94 |
95 | [https://api.hnpwa.com/v0/user/davideast.json](https://api.hnpwa.com/v0/user/davideast.json)
96 |
97 | ### Schema
98 |
99 | ```ts
100 | export interface User {
101 | about?: string;
102 | created_time: number;
103 | created: string;
104 | id: string;
105 | karma: number;
106 | }
107 | ```
108 |
109 | ## Local Development
110 |
111 | The HNPWA API uses the [hnpwa-api](https://github.com/davideast/hnpwa-api/) module and runs on [Cloud Functions](https://firebase.google.com/docs/functions/) and [Firebase Hosting](https://firebase.google.com/docs/hosting/functions).
112 | If you want to run the API while offline you can globally install the module to serve offline.
113 |
114 | ```bash
115 | npm i -g hnpwa-api
116 | hnpwa-api --save # saves current HN API data set offline
117 | hnpwa-api --serve --offline --port=4000
118 | ```
119 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Hacker News readers as Progressive Web Apps . A spiritual successor to TodoMVC .
9 |
10 |
11 |
12 |
13 |
14 |
15 | ---
16 |
17 | ## Implementations
18 |
19 | See our [site](https://hnpwa.com/) or the `site/apps` directory for the current
20 | list of implementations.
21 |
22 | ## Specification
23 |
24 | Each implementation must include:
25 |
26 | * Views: Hacker News Top Stories, New, Show, Ask, Jobs & threaded Comments
27 | * Each of these should use routing to enable sharability. For reference, see the [PreactHN](https://hn.kristoferbaxter.com/) implementation.
28 | * App must display 30 items per-page for story list views
29 | * App must be a [Progressive Web App](https://g.co/ProgressiveWebApps)
30 | * App must score over a 90/100 using [Lighthouse](https://github.com/GoogleChrome/lighthouse)
31 | * App must aim to be interactive in under 5 seconds on a Moto G4 over 3G. Use [WebPageTest](https://www.webpagetest.org/easy) using the auto-selected Moto G4 + Faster 3G setting to validate "Time to interactive"
32 | * We look at numeric Lighthouse scores for TTI as well as a manual inspection of the application's Timeline "trace" and [Filmstrip](https://www.webpagetest.org/video/compare.php?tests=170514_00_bb389f33405b558ea644b37f565c8a56-r:1-c:0) as a sanity check.
33 | * App must use the [Application Shell](https://developers.google.com/web/fundamentals/architecture/app-shell) pattern to instantly load the skeleton of the UI on repeat visits
34 | * App is responsive on desktop and mobile, making best use of available screen real-estate. See [Vue HN](https://vue-hn.now.sh/top) as an example.
35 | * App must do its best to work cross-browser
36 |
37 | Optionally:
38 |
39 | * App supports offline caching of HN data (e.g similar to the 'Offline Mode' in ReactHN)
40 | * App may use server-side rendering so displaying content is resilient to JS not loading on the network
41 |
42 | User interface:
43 |
44 | * At this time, HNPWA does not prescribe a specific stylesheet or theme for implementations. We will be aiming to provide this in the near future similar to how we do with TodoMVC.
45 |
46 | ### Data sources
47 |
48 | * [Official real-time Hacker News API powered by Firebase](https://github.com/HackerNews/API)
49 | * [Unofficial Hacker News API](https://github.com/cheeaun/node-hnapi) by cheeaun
50 |
51 | If using the Firebase powered API please use 30 stories per-page to ensure consistency between implementations using the Unofficial API as well as the actual [Hacker News website](https://news.ycombinator.com/)
52 |
53 | ## Network settings
54 |
55 | * Emerging Markets: Chrome Beta on a Motorola G (gen 4) tested from Dulles, Virginia on a 400 Kbps 3G connection with 400ms of latency. Tested with [WebPageTest](https://www.webpagetest.org/easy) using the auto-selected Moto G4 + Emerging Markets setting.
56 | * Faster 3G: Chrome Beta on a Motorola G (gen 4) tested from Dulles, Virginia on a 1.6 Mbps 3G connection with 300ms of latency. Tested with [WebPageTest](https://www.webpagetest.org/easy) using the auto-selected Moto G4 + Faster 3G setting.
57 | * `Time to Interactive` readings taken from linked Lighthouse results in WebPageTest.
58 |
59 | ## License
60 |
61 | Each implementation preserves the license noted in the linked to applications.
62 |
--------------------------------------------------------------------------------
/site/_includes/script-lazysizes.html:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/site/_includes/implementation.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
{{ app.title }}
6 |
7 |
10 |
11 |
39 |
40 |
41 | {% if app.libraries %}
42 |
43 | Framework/UI libraries:
44 |
45 | {% for library in app.libraries %}
46 | {{ library.name }}{% if forloop.last == false %}, {% endif %}
47 | {% endfor %}
48 |
49 |
50 | {% endif %}
51 |
52 | {% if app.scaffolding %}
53 |
54 | Scaffolding:
55 | {{ app.scaffolding }}
56 |
57 | {% endif %}
58 |
59 | {% if app.module-bundling %}
60 |
61 | Module bundling:
62 | {{ app.module-bundling }}
63 |
64 | {% endif %}
65 |
66 | {% if app.service-worker %}
67 |
68 | Service Worker:
69 | {{ app.service-worker }}
70 |
71 | {% endif %}
72 |
73 | {% if app.perfomance-patterns %}
74 |
75 | Performance patterns:
76 | {{ app.perfomance-patterns }}
77 |
78 | {% endif %}
79 |
80 | {% if app.server-side-rendering %}
81 |
82 | Server-side rendering:
83 | {{ app.server-side-rendering }}
84 |
85 | {% endif %}
86 |
87 | {% if app.api %}
88 |
89 | API:
90 | {{ app.api }}
91 |
92 | {% endif %}
93 |
94 | {% if app.hosting %}
95 |
96 | Hosting:
97 | {{ app.hosting }}
98 |
99 | {% endif %}
100 |
101 | {% if app.other-details %}
102 |
103 | Other details:
104 | {{ app.other-details }}
105 |
106 | {% endif %}
107 |
108 | {% if app.authors %}
109 |
110 | {% if app.authors.size == 1 %}
111 | Author:
112 | {% endif %}
113 |
114 | {% if app.authors.size > 1 %}
115 | Authors:
116 | {% endif %}
117 |
118 |
119 | {% for author in app.authors %}
120 | {% assign contributor = site.contributors | where: 'name', {{author.name}} | first %}
121 |
122 |
123 |
124 | {% endfor %}
125 | {% endif %}
126 |
127 |
128 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
--------------------------------------------------------------------------------
/site/_sass/extra.scss:
--------------------------------------------------------------------------------
1 | $primary-orange: #F4751E;
2 |
3 | // overwrite tachyons orange
4 | .b--orange { border-color: $primary-orange; }
5 | .orange { color: $primary-orange; }
6 | .bg-orange { background-color: $primary-orange; }
7 | .hover-orange:hover { color: $primary-orange; }
8 | .hover-orange:focus { color:$primary-orange; }
9 | .hover-bg-orange:hover { background-color: $primary-orange; }
10 | .hover-bg-orange:focus { background-color: $primary-orange; }
11 |
12 | // Svg
13 | .link-svg svg {
14 | height: 1.5rem;
15 | width: 1.5rem;
16 | fill: #555;
17 |
18 | &:hover {
19 | fill: $primary-orange;
20 | }
21 |
22 | // Small
23 | @media screen and (max-width: 30em) {
24 | height: 1rem;
25 | width: 1rem;
26 | }
27 |
28 | // Medium
29 | @media screen and (min-width: 30em) and (max-width: 60em) {
30 | height: 1.25rem;
31 | width: 1.25rem;
32 | }
33 | }
34 |
35 | // Github Corner
36 | .github-corner {
37 | position: absolute;
38 | top: 0;
39 | right: 0;
40 | height: 5rem;
41 | width: 5rem;
42 | fill: $primary-orange;
43 |
44 | &:hover .octo-arm {
45 | animation: octocat-wave 560ms ease-in-out;
46 | }
47 | }
48 |
49 | @keyframes octocat-wave {
50 | 0%, 100% {
51 | transform: rotate(0);
52 | }
53 |
54 | 20%,
55 | 60% {
56 | transform: rotate(-25deg);
57 | }
58 |
59 | 40%,
60 | 80% {
61 | transform: rotate(10deg);
62 | }
63 | }
64 |
65 |
66 | @media (max-width: 500px) {
67 | .github-corner {
68 | &:hover .octo-arm {
69 | animation: none;
70 | }
71 | .octo-arm {
72 | animation: octocat-wave 560ms ease-in-out;
73 | }
74 | }
75 | }
76 |
77 | .phone-outline {
78 | padding: 3.5rem .5rem 3rem;
79 | background-color: #111;
80 | border-radius: 2rem;
81 | position: relative;
82 |
83 | &:after {
84 | content: "";
85 | position: absolute;
86 | height: .25rem;
87 | width: 33%;
88 | top: 1.75rem;
89 | background-color: #222;
90 | left: 50%;
91 | transform: translateX(-50%);
92 | border-radius: .125rem;
93 | }
94 |
95 | &:before {
96 | content: "";
97 | position: absolute;
98 | height: .5rem;
99 | width: .5rem;
100 | top: 1.65rem;
101 | background-color: #222;
102 | left: 20%;
103 | transform: translateX(-50%);
104 | border-radius: .25rem;
105 | }
106 |
107 | img {
108 | border-radius: 2px;
109 | }
110 | }
111 |
112 | .phone-outline-power {
113 | position: absolute;
114 | right: -.1rem;
115 | top: 20%;
116 | width: .3rem;
117 | height: 3rem;
118 | background-color: #000;
119 | border-radius: .15rem;
120 | }
121 |
122 | .device {
123 | display: inline-block;
124 | position: relative;
125 | -webkit-box-sizing: content-box !important;
126 | box-sizing: content-box !important
127 | }
128 |
129 | .device .screen {
130 | width: 100%;
131 | position: relative;
132 | height: 100%;
133 | z-index: 3;
134 | background: #e6e6e6;
135 | overflow: hidden;
136 | display: block;
137 | border-radius: 1px;
138 | -webkit-box-shadow: 0 0 0 3px #111;
139 | box-shadow: 0 0 0 3px #111
140 | }
141 |
142 | .device .top-bar,
143 | .device .bottom-bar {
144 | height: 3px;
145 | background: black;
146 | width: 100%;
147 | display: block
148 | }
149 |
150 | .device .middle-bar {
151 | width: 3px;
152 | height: 4px;
153 | top: 0px;
154 | left: 90px;
155 | background: black;
156 | position: absolute
157 | }
158 |
159 | .device.nexus5 {
160 | padding: 50px 15px 50px 15px;
161 | width: 320px;
162 | height: 568px;
163 | background: #1e1e1e;
164 | border-radius: 20px
165 | }
166 |
167 | .device.nexus5:before {
168 | border-radius: 600px / 50px;
169 | background: inherit;
170 | content: '';
171 | top: 0;
172 | position: absolute;
173 | height: 103.1%;
174 | width: calc(100% - 26px);
175 | top: 50%;
176 | left: 50%;
177 | -webkit-transform: translateX(-50%) translateY(-50%);
178 | transform: translateX(-50%) translateY(-50%)
179 | }
180 |
181 | .device.nexus5 .top-bar {
182 | width: calc(100% - 8px);
183 | height: calc(100% - 6px);
184 | position: absolute;
185 | top: 3px;
186 | left: 4px;
187 | border-radius: 20px;
188 | background: #181818
189 | }
190 |
191 | .device.nexus5 .top-bar:before {
192 | border-radius: 600px / 50px;
193 | background: inherit;
194 | content: '';
195 | top: 0;
196 | position: absolute;
197 | height: 103.0%;
198 | width: calc(100% - 26px);
199 | top: 50%;
200 | left: 50%;
201 | -webkit-transform: translateX(-50%) translateY(-50%);
202 | transform: translateX(-50%) translateY(-50%)
203 | }
204 |
205 | .device.nexus5 .bottom-bar {
206 | display: none
207 | }
208 |
209 | .device.nexus5 .sleep {
210 | width: 3px;
211 | position: absolute;
212 | left: -3px;
213 | top: 110px;
214 | height: 100px;
215 | background: inherit;
216 | border-radius: 2px 0px 0px 2px
217 | }
218 |
219 | .device.nexus5 .volume {
220 | width: 3px;
221 | position: absolute;
222 | right: -3px;
223 | top: 70px;
224 | height: 45px;
225 | background: inherit;
226 | border-radius: 0px 2px 2px 0px
227 | }
228 |
229 | .device.nexus5 .camera {
230 | background: #3c3d3d;
231 | width: 10px;
232 | height: 10px;
233 | position: absolute;
234 | top: 18px;
235 | left: 50%;
236 | z-index: 3;
237 | margin-left: -5px;
238 | border-radius: 100%
239 | }
240 |
241 | .device.nexus5 .camera:before {
242 | background: #3c3d3d;
243 | width: 6px;
244 | height: 6px;
245 | content: '';
246 | display: block;
247 | position: absolute;
248 | top: 2px;
249 | left: -100px;
250 | z-index: 3;
251 | border-radius: 100%
252 | }
253 |
254 | img.app-image:before {
255 | content: " ";
256 | display: block;
257 | position: absolute;
258 | top: -50px;
259 | left: 0;
260 | height: calc(100% + 10px);
261 | width: 100%;
262 | background-color: rgb(230, 230, 230);
263 | border-radius: 5px;
264 | }
265 |
266 | img.app-image:after {
267 | content: attr(alt);
268 | font-size: 16px;
269 | font-weight: 500;
270 | position: absolute;
271 | top: 45%;
272 | left: 0;
273 | text-align: center;
274 | margin: 0 30px;
275 | }
276 |
277 | .app-loader-container {
278 | width: 100%;
279 | height: 100%;
280 | display: flex;
281 | align-items: center;
282 | justify-content: center;
283 | }
284 |
285 | .app-img-container {
286 | width: 100%;
287 | height: 100%;
288 | position: absolute;
289 | top: 0;
290 | left: 0;
291 | }
292 |
293 | .app-img-loader:not(:required) {
294 | -moz-animation: app-img-loader 1000ms infinite linear;
295 | -webkit-animation: app-img-loader 1000ms infinite linear;
296 | animation: app-img-loader 1000ms infinite linear;
297 | -moz-border-radius: 2.4em;
298 | -webkit-border-radius: 2.4em;
299 | border-radius: 2.4em;
300 | border: 0.4em solid #000;
301 | border-left-color: transparent;
302 | color: transparent;
303 | display: inline-block;
304 | font-size: 10px;
305 | line-height: 1.2;
306 | width: 3em;
307 | height: 3em;
308 | text-indent: 100%;
309 | }
310 |
311 | @-moz-keyframes app-img-loader {
312 | 0% {
313 | -moz-transform: rotate(0deg);
314 | transform: rotate(0deg);
315 | }
316 | 100% {
317 | -moz-transform: rotate(360deg);
318 | transform: rotate(360deg);
319 | }
320 | }
321 | @-webkit-keyframes app-img-loader {
322 | 0% {
323 | -webkit-transform: rotate(0deg);
324 | transform: rotate(0deg);
325 | }
326 | 100% {
327 | -webkit-transform: rotate(360deg);
328 | transform: rotate(360deg);
329 | }
330 | }
331 | @keyframes app-img-loader {
332 | 0% {
333 | -moz-transform: rotate(0deg);
334 | -ms-transform: rotate(0deg);
335 | -webkit-transform: rotate(0deg);
336 | transform: rotate(0deg);
337 | }
338 | 100% {
339 | -moz-transform: rotate(360deg);
340 | -ms-transform: rotate(360deg);
341 | -webkit-transform: rotate(360deg);
342 | transform: rotate(360deg);
343 | }
344 | }
--------------------------------------------------------------------------------
/site/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "hacker-news-pwas",
3 | "requires": true,
4 | "lockfileVersion": 1,
5 | "dependencies": {
6 | "ansi-align": {
7 | "version": "2.0.0",
8 | "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz",
9 | "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
10 | "dev": true,
11 | "requires": {
12 | "string-width": "2.1.1"
13 | }
14 | },
15 | "ansi-regex": {
16 | "version": "3.0.0",
17 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
18 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
19 | "dev": true
20 | },
21 | "ansi-styles": {
22 | "version": "3.2.1",
23 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
24 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
25 | "dev": true,
26 | "requires": {
27 | "color-convert": "1.9.1"
28 | }
29 | },
30 | "array-find-index": {
31 | "version": "1.0.2",
32 | "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
33 | "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
34 | "dev": true
35 | },
36 | "balanced-match": {
37 | "version": "1.0.0",
38 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
39 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
40 | "dev": true
41 | },
42 | "boxen": {
43 | "version": "1.3.0",
44 | "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
45 | "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==",
46 | "dev": true,
47 | "requires": {
48 | "ansi-align": "2.0.0",
49 | "camelcase": "4.1.0",
50 | "chalk": "2.4.1",
51 | "cli-boxes": "1.0.0",
52 | "string-width": "2.1.1",
53 | "term-size": "1.2.0",
54 | "widest-line": "2.0.0"
55 | },
56 | "dependencies": {
57 | "camelcase": {
58 | "version": "4.1.0",
59 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
60 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
61 | "dev": true
62 | }
63 | }
64 | },
65 | "brace-expansion": {
66 | "version": "1.1.11",
67 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
68 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
69 | "dev": true,
70 | "requires": {
71 | "balanced-match": "1.0.0",
72 | "concat-map": "0.0.1"
73 | }
74 | },
75 | "builtin-modules": {
76 | "version": "1.1.1",
77 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
78 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
79 | "dev": true
80 | },
81 | "camelcase": {
82 | "version": "2.1.1",
83 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
84 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
85 | "dev": true
86 | },
87 | "camelcase-keys": {
88 | "version": "2.1.0",
89 | "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
90 | "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
91 | "dev": true,
92 | "requires": {
93 | "camelcase": "2.1.1",
94 | "map-obj": "1.0.1"
95 | }
96 | },
97 | "capture-stack-trace": {
98 | "version": "1.0.0",
99 | "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz",
100 | "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=",
101 | "dev": true
102 | },
103 | "chalk": {
104 | "version": "2.4.1",
105 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
106 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
107 | "dev": true,
108 | "requires": {
109 | "ansi-styles": "3.2.1",
110 | "escape-string-regexp": "1.0.5",
111 | "supports-color": "5.4.0"
112 | }
113 | },
114 | "ci-info": {
115 | "version": "1.1.3",
116 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz",
117 | "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==",
118 | "dev": true
119 | },
120 | "cli-boxes": {
121 | "version": "1.0.0",
122 | "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
123 | "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=",
124 | "dev": true
125 | },
126 | "color-convert": {
127 | "version": "1.9.1",
128 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
129 | "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
130 | "dev": true,
131 | "requires": {
132 | "color-name": "1.1.3"
133 | }
134 | },
135 | "color-name": {
136 | "version": "1.1.3",
137 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
138 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
139 | "dev": true
140 | },
141 | "concat-map": {
142 | "version": "0.0.1",
143 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
144 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
145 | "dev": true
146 | },
147 | "configstore": {
148 | "version": "3.1.2",
149 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz",
150 | "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==",
151 | "dev": true,
152 | "requires": {
153 | "dot-prop": "4.2.0",
154 | "graceful-fs": "4.1.11",
155 | "make-dir": "1.2.0",
156 | "unique-string": "1.0.0",
157 | "write-file-atomic": "2.3.0",
158 | "xdg-basedir": "3.0.0"
159 | }
160 | },
161 | "create-error-class": {
162 | "version": "3.0.2",
163 | "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
164 | "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
165 | "dev": true,
166 | "requires": {
167 | "capture-stack-trace": "1.0.0"
168 | }
169 | },
170 | "cross-spawn": {
171 | "version": "5.1.0",
172 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
173 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
174 | "dev": true,
175 | "requires": {
176 | "lru-cache": "4.1.2",
177 | "shebang-command": "1.2.0",
178 | "which": "1.3.0"
179 | }
180 | },
181 | "crypto-random-string": {
182 | "version": "1.0.0",
183 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
184 | "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=",
185 | "dev": true
186 | },
187 | "currently-unhandled": {
188 | "version": "0.4.1",
189 | "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
190 | "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
191 | "dev": true,
192 | "requires": {
193 | "array-find-index": "1.0.2"
194 | }
195 | },
196 | "decamelize": {
197 | "version": "1.2.0",
198 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
199 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
200 | "dev": true
201 | },
202 | "deep-extend": {
203 | "version": "0.5.1",
204 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz",
205 | "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==",
206 | "dev": true
207 | },
208 | "dom-urls": {
209 | "version": "1.1.0",
210 | "resolved": "https://registry.npmjs.org/dom-urls/-/dom-urls-1.1.0.tgz",
211 | "integrity": "sha1-AB3fgWKM0ecGElxxdvU8zsVdkY4=",
212 | "dev": true,
213 | "requires": {
214 | "urijs": "1.19.1"
215 | }
216 | },
217 | "dot-prop": {
218 | "version": "4.2.0",
219 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
220 | "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
221 | "dev": true,
222 | "requires": {
223 | "is-obj": "1.0.1"
224 | }
225 | },
226 | "duplexer3": {
227 | "version": "0.1.4",
228 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
229 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
230 | "dev": true
231 | },
232 | "error-ex": {
233 | "version": "1.3.1",
234 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
235 | "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
236 | "dev": true,
237 | "requires": {
238 | "is-arrayish": "0.2.1"
239 | }
240 | },
241 | "es6-promise": {
242 | "version": "4.2.4",
243 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz",
244 | "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==",
245 | "dev": true
246 | },
247 | "escape-string-regexp": {
248 | "version": "1.0.5",
249 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
250 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
251 | "dev": true
252 | },
253 | "execa": {
254 | "version": "0.7.0",
255 | "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
256 | "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
257 | "dev": true,
258 | "requires": {
259 | "cross-spawn": "5.1.0",
260 | "get-stream": "3.0.0",
261 | "is-stream": "1.1.0",
262 | "npm-run-path": "2.0.2",
263 | "p-finally": "1.0.0",
264 | "signal-exit": "3.0.2",
265 | "strip-eof": "1.0.0"
266 | }
267 | },
268 | "find-up": {
269 | "version": "1.1.2",
270 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
271 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
272 | "dev": true,
273 | "requires": {
274 | "path-exists": "2.1.0",
275 | "pinkie-promise": "2.0.1"
276 | }
277 | },
278 | "fs.realpath": {
279 | "version": "1.0.0",
280 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
281 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
282 | "dev": true
283 | },
284 | "get-stdin": {
285 | "version": "4.0.1",
286 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
287 | "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
288 | "dev": true
289 | },
290 | "get-stream": {
291 | "version": "3.0.0",
292 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
293 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
294 | "dev": true
295 | },
296 | "glob": {
297 | "version": "7.1.2",
298 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
299 | "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=",
300 | "dev": true,
301 | "requires": {
302 | "fs.realpath": "1.0.0",
303 | "inflight": "1.0.6",
304 | "inherits": "2.0.3",
305 | "minimatch": "3.0.4",
306 | "once": "1.4.0",
307 | "path-is-absolute": "1.0.1"
308 | }
309 | },
310 | "global-dirs": {
311 | "version": "0.1.1",
312 | "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
313 | "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
314 | "dev": true,
315 | "requires": {
316 | "ini": "1.3.5"
317 | }
318 | },
319 | "got": {
320 | "version": "6.7.1",
321 | "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
322 | "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
323 | "dev": true,
324 | "requires": {
325 | "create-error-class": "3.0.2",
326 | "duplexer3": "0.1.4",
327 | "get-stream": "3.0.0",
328 | "is-redirect": "1.0.0",
329 | "is-retry-allowed": "1.1.0",
330 | "is-stream": "1.1.0",
331 | "lowercase-keys": "1.0.1",
332 | "safe-buffer": "5.1.2",
333 | "timed-out": "4.0.1",
334 | "unzip-response": "2.0.1",
335 | "url-parse-lax": "1.0.0"
336 | }
337 | },
338 | "graceful-fs": {
339 | "version": "4.1.11",
340 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
341 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
342 | "dev": true
343 | },
344 | "has-flag": {
345 | "version": "3.0.0",
346 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
347 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
348 | "dev": true
349 | },
350 | "hosted-git-info": {
351 | "version": "2.6.0",
352 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz",
353 | "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==",
354 | "dev": true
355 | },
356 | "import-lazy": {
357 | "version": "2.1.0",
358 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
359 | "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
360 | "dev": true
361 | },
362 | "imurmurhash": {
363 | "version": "0.1.4",
364 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
365 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
366 | "dev": true
367 | },
368 | "indent-string": {
369 | "version": "2.1.0",
370 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
371 | "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
372 | "dev": true,
373 | "requires": {
374 | "repeating": "2.0.1"
375 | }
376 | },
377 | "inflight": {
378 | "version": "1.0.6",
379 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
380 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
381 | "dev": true,
382 | "requires": {
383 | "once": "1.4.0",
384 | "wrappy": "1.0.2"
385 | }
386 | },
387 | "inherits": {
388 | "version": "2.0.3",
389 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
390 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
391 | "dev": true
392 | },
393 | "ini": {
394 | "version": "1.3.5",
395 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
396 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
397 | "dev": true
398 | },
399 | "is-arrayish": {
400 | "version": "0.2.1",
401 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
402 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
403 | "dev": true
404 | },
405 | "is-builtin-module": {
406 | "version": "1.0.0",
407 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
408 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
409 | "dev": true,
410 | "requires": {
411 | "builtin-modules": "1.1.1"
412 | }
413 | },
414 | "is-ci": {
415 | "version": "1.1.0",
416 | "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz",
417 | "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==",
418 | "dev": true,
419 | "requires": {
420 | "ci-info": "1.1.3"
421 | }
422 | },
423 | "is-finite": {
424 | "version": "1.0.2",
425 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
426 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
427 | "dev": true,
428 | "requires": {
429 | "number-is-nan": "1.0.1"
430 | }
431 | },
432 | "is-fullwidth-code-point": {
433 | "version": "2.0.0",
434 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
435 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
436 | "dev": true
437 | },
438 | "is-installed-globally": {
439 | "version": "0.1.0",
440 | "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
441 | "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
442 | "dev": true,
443 | "requires": {
444 | "global-dirs": "0.1.1",
445 | "is-path-inside": "1.0.1"
446 | }
447 | },
448 | "is-npm": {
449 | "version": "1.0.0",
450 | "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
451 | "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=",
452 | "dev": true
453 | },
454 | "is-obj": {
455 | "version": "1.0.1",
456 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
457 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
458 | "dev": true
459 | },
460 | "is-path-inside": {
461 | "version": "1.0.1",
462 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
463 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
464 | "dev": true,
465 | "requires": {
466 | "path-is-inside": "1.0.2"
467 | }
468 | },
469 | "is-redirect": {
470 | "version": "1.0.0",
471 | "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
472 | "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=",
473 | "dev": true
474 | },
475 | "is-retry-allowed": {
476 | "version": "1.1.0",
477 | "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
478 | "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=",
479 | "dev": true
480 | },
481 | "is-stream": {
482 | "version": "1.1.0",
483 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
484 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
485 | "dev": true
486 | },
487 | "is-utf8": {
488 | "version": "0.2.1",
489 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
490 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
491 | "dev": true
492 | },
493 | "isarray": {
494 | "version": "0.0.1",
495 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
496 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
497 | "dev": true
498 | },
499 | "isexe": {
500 | "version": "2.0.0",
501 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
502 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
503 | "dev": true
504 | },
505 | "latest-version": {
506 | "version": "3.1.0",
507 | "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
508 | "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
509 | "dev": true,
510 | "requires": {
511 | "package-json": "4.0.1"
512 | }
513 | },
514 | "load-json-file": {
515 | "version": "1.1.0",
516 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
517 | "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
518 | "dev": true,
519 | "requires": {
520 | "graceful-fs": "4.1.11",
521 | "parse-json": "2.2.0",
522 | "pify": "2.3.0",
523 | "pinkie-promise": "2.0.1",
524 | "strip-bom": "2.0.0"
525 | }
526 | },
527 | "lodash._reinterpolate": {
528 | "version": "3.0.0",
529 | "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
530 | "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
531 | "dev": true
532 | },
533 | "lodash.defaults": {
534 | "version": "4.2.0",
535 | "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
536 | "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=",
537 | "dev": true
538 | },
539 | "lodash.template": {
540 | "version": "4.4.0",
541 | "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz",
542 | "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=",
543 | "dev": true,
544 | "requires": {
545 | "lodash._reinterpolate": "3.0.0",
546 | "lodash.templatesettings": "4.1.0"
547 | }
548 | },
549 | "lodash.templatesettings": {
550 | "version": "4.1.0",
551 | "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz",
552 | "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=",
553 | "dev": true,
554 | "requires": {
555 | "lodash._reinterpolate": "3.0.0"
556 | }
557 | },
558 | "loud-rejection": {
559 | "version": "1.6.0",
560 | "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
561 | "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
562 | "dev": true,
563 | "requires": {
564 | "currently-unhandled": "0.4.1",
565 | "signal-exit": "3.0.2"
566 | }
567 | },
568 | "lowercase-keys": {
569 | "version": "1.0.1",
570 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
571 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
572 | "dev": true
573 | },
574 | "lru-cache": {
575 | "version": "4.1.2",
576 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz",
577 | "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==",
578 | "dev": true,
579 | "requires": {
580 | "pseudomap": "1.0.2",
581 | "yallist": "2.1.2"
582 | }
583 | },
584 | "make-dir": {
585 | "version": "1.2.0",
586 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz",
587 | "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==",
588 | "dev": true,
589 | "requires": {
590 | "pify": "3.0.0"
591 | },
592 | "dependencies": {
593 | "pify": {
594 | "version": "3.0.0",
595 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
596 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
597 | "dev": true
598 | }
599 | }
600 | },
601 | "map-obj": {
602 | "version": "1.0.1",
603 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
604 | "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
605 | "dev": true
606 | },
607 | "meow": {
608 | "version": "3.7.0",
609 | "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
610 | "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
611 | "dev": true,
612 | "requires": {
613 | "camelcase-keys": "2.1.0",
614 | "decamelize": "1.2.0",
615 | "loud-rejection": "1.6.0",
616 | "map-obj": "1.0.1",
617 | "minimist": "1.2.0",
618 | "normalize-package-data": "2.4.0",
619 | "object-assign": "4.1.1",
620 | "read-pkg-up": "1.0.1",
621 | "redent": "1.0.0",
622 | "trim-newlines": "1.0.0"
623 | }
624 | },
625 | "minimatch": {
626 | "version": "3.0.4",
627 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
628 | "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=",
629 | "dev": true,
630 | "requires": {
631 | "brace-expansion": "1.1.11"
632 | }
633 | },
634 | "minimist": {
635 | "version": "1.2.0",
636 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
637 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
638 | "dev": true
639 | },
640 | "mkdirp": {
641 | "version": "0.5.1",
642 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
643 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
644 | "dev": true,
645 | "requires": {
646 | "minimist": "0.0.8"
647 | },
648 | "dependencies": {
649 | "minimist": {
650 | "version": "0.0.8",
651 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
652 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
653 | "dev": true
654 | }
655 | }
656 | },
657 | "normalize-package-data": {
658 | "version": "2.4.0",
659 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
660 | "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
661 | "dev": true,
662 | "requires": {
663 | "hosted-git-info": "2.6.0",
664 | "is-builtin-module": "1.0.0",
665 | "semver": "5.5.0",
666 | "validate-npm-package-license": "3.0.3"
667 | }
668 | },
669 | "npm-run-path": {
670 | "version": "2.0.2",
671 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
672 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
673 | "dev": true,
674 | "requires": {
675 | "path-key": "2.0.1"
676 | }
677 | },
678 | "number-is-nan": {
679 | "version": "1.0.1",
680 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
681 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
682 | "dev": true
683 | },
684 | "object-assign": {
685 | "version": "4.1.1",
686 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
687 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
688 | "dev": true
689 | },
690 | "once": {
691 | "version": "1.4.0",
692 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
693 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
694 | "dev": true,
695 | "requires": {
696 | "wrappy": "1.0.2"
697 | }
698 | },
699 | "p-finally": {
700 | "version": "1.0.0",
701 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
702 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
703 | "dev": true
704 | },
705 | "package-json": {
706 | "version": "4.0.1",
707 | "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz",
708 | "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
709 | "dev": true,
710 | "requires": {
711 | "got": "6.7.1",
712 | "registry-auth-token": "3.3.2",
713 | "registry-url": "3.1.0",
714 | "semver": "5.5.0"
715 | }
716 | },
717 | "parse-json": {
718 | "version": "2.2.0",
719 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
720 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
721 | "dev": true,
722 | "requires": {
723 | "error-ex": "1.3.1"
724 | }
725 | },
726 | "path-exists": {
727 | "version": "2.1.0",
728 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
729 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
730 | "dev": true,
731 | "requires": {
732 | "pinkie-promise": "2.0.1"
733 | }
734 | },
735 | "path-is-absolute": {
736 | "version": "1.0.1",
737 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
738 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
739 | "dev": true
740 | },
741 | "path-is-inside": {
742 | "version": "1.0.2",
743 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
744 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
745 | "dev": true
746 | },
747 | "path-key": {
748 | "version": "2.0.1",
749 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
750 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
751 | "dev": true
752 | },
753 | "path-to-regexp": {
754 | "version": "1.7.0",
755 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz",
756 | "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=",
757 | "dev": true,
758 | "requires": {
759 | "isarray": "0.0.1"
760 | }
761 | },
762 | "path-type": {
763 | "version": "1.1.0",
764 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
765 | "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
766 | "dev": true,
767 | "requires": {
768 | "graceful-fs": "4.1.11",
769 | "pify": "2.3.0",
770 | "pinkie-promise": "2.0.1"
771 | }
772 | },
773 | "pify": {
774 | "version": "2.3.0",
775 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
776 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
777 | "dev": true
778 | },
779 | "pinkie": {
780 | "version": "2.0.4",
781 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
782 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
783 | "dev": true
784 | },
785 | "pinkie-promise": {
786 | "version": "2.0.1",
787 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
788 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
789 | "dev": true,
790 | "requires": {
791 | "pinkie": "2.0.4"
792 | }
793 | },
794 | "prepend-http": {
795 | "version": "1.0.4",
796 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
797 | "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
798 | "dev": true
799 | },
800 | "pretty-bytes": {
801 | "version": "4.0.2",
802 | "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz",
803 | "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=",
804 | "dev": true
805 | },
806 | "pseudomap": {
807 | "version": "1.0.2",
808 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
809 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
810 | "dev": true
811 | },
812 | "rc": {
813 | "version": "1.2.7",
814 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz",
815 | "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==",
816 | "dev": true,
817 | "requires": {
818 | "deep-extend": "0.5.1",
819 | "ini": "1.3.5",
820 | "minimist": "1.2.0",
821 | "strip-json-comments": "2.0.1"
822 | }
823 | },
824 | "read-pkg": {
825 | "version": "1.1.0",
826 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
827 | "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
828 | "dev": true,
829 | "requires": {
830 | "load-json-file": "1.1.0",
831 | "normalize-package-data": "2.4.0",
832 | "path-type": "1.1.0"
833 | }
834 | },
835 | "read-pkg-up": {
836 | "version": "1.0.1",
837 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
838 | "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
839 | "dev": true,
840 | "requires": {
841 | "find-up": "1.1.2",
842 | "read-pkg": "1.1.0"
843 | }
844 | },
845 | "redent": {
846 | "version": "1.0.0",
847 | "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
848 | "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
849 | "dev": true,
850 | "requires": {
851 | "indent-string": "2.1.0",
852 | "strip-indent": "1.0.1"
853 | }
854 | },
855 | "registry-auth-token": {
856 | "version": "3.3.2",
857 | "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz",
858 | "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==",
859 | "dev": true,
860 | "requires": {
861 | "rc": "1.2.7",
862 | "safe-buffer": "5.1.2"
863 | }
864 | },
865 | "registry-url": {
866 | "version": "3.1.0",
867 | "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
868 | "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
869 | "dev": true,
870 | "requires": {
871 | "rc": "1.2.7"
872 | }
873 | },
874 | "repeating": {
875 | "version": "2.0.1",
876 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
877 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
878 | "dev": true,
879 | "requires": {
880 | "is-finite": "1.0.2"
881 | }
882 | },
883 | "safe-buffer": {
884 | "version": "5.1.2",
885 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
886 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
887 | "dev": true
888 | },
889 | "semver": {
890 | "version": "5.5.0",
891 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
892 | "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
893 | "dev": true
894 | },
895 | "semver-diff": {
896 | "version": "2.1.0",
897 | "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
898 | "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
899 | "dev": true,
900 | "requires": {
901 | "semver": "5.5.0"
902 | }
903 | },
904 | "serviceworker-cache-polyfill": {
905 | "version": "4.0.0",
906 | "resolved": "https://registry.npmjs.org/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz",
907 | "integrity": "sha1-3hnuc77yGrPAdAo3sz22JGS6ves=",
908 | "dev": true
909 | },
910 | "shebang-command": {
911 | "version": "1.2.0",
912 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
913 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
914 | "dev": true,
915 | "requires": {
916 | "shebang-regex": "1.0.0"
917 | }
918 | },
919 | "shebang-regex": {
920 | "version": "1.0.0",
921 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
922 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
923 | "dev": true
924 | },
925 | "signal-exit": {
926 | "version": "3.0.2",
927 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
928 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
929 | "dev": true
930 | },
931 | "spdx-correct": {
932 | "version": "3.0.0",
933 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz",
934 | "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==",
935 | "dev": true,
936 | "requires": {
937 | "spdx-expression-parse": "3.0.0",
938 | "spdx-license-ids": "3.0.0"
939 | }
940 | },
941 | "spdx-exceptions": {
942 | "version": "2.1.0",
943 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz",
944 | "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==",
945 | "dev": true
946 | },
947 | "spdx-expression-parse": {
948 | "version": "3.0.0",
949 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
950 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
951 | "dev": true,
952 | "requires": {
953 | "spdx-exceptions": "2.1.0",
954 | "spdx-license-ids": "3.0.0"
955 | }
956 | },
957 | "spdx-license-ids": {
958 | "version": "3.0.0",
959 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz",
960 | "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==",
961 | "dev": true
962 | },
963 | "string-width": {
964 | "version": "2.1.1",
965 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
966 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
967 | "dev": true,
968 | "requires": {
969 | "is-fullwidth-code-point": "2.0.0",
970 | "strip-ansi": "4.0.0"
971 | }
972 | },
973 | "strip-ansi": {
974 | "version": "4.0.0",
975 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
976 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
977 | "dev": true,
978 | "requires": {
979 | "ansi-regex": "3.0.0"
980 | }
981 | },
982 | "strip-bom": {
983 | "version": "2.0.0",
984 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
985 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
986 | "dev": true,
987 | "requires": {
988 | "is-utf8": "0.2.1"
989 | }
990 | },
991 | "strip-eof": {
992 | "version": "1.0.0",
993 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
994 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
995 | "dev": true
996 | },
997 | "strip-indent": {
998 | "version": "1.0.1",
999 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
1000 | "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
1001 | "dev": true,
1002 | "requires": {
1003 | "get-stdin": "4.0.1"
1004 | }
1005 | },
1006 | "strip-json-comments": {
1007 | "version": "2.0.1",
1008 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
1009 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
1010 | "dev": true
1011 | },
1012 | "supports-color": {
1013 | "version": "5.4.0",
1014 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
1015 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==",
1016 | "dev": true,
1017 | "requires": {
1018 | "has-flag": "3.0.0"
1019 | }
1020 | },
1021 | "sw-precache": {
1022 | "version": "5.2.1",
1023 | "resolved": "https://registry.npmjs.org/sw-precache/-/sw-precache-5.2.1.tgz",
1024 | "integrity": "sha512-8FAy+BP/FXE+ILfiVTt+GQJ6UEf4CVHD9OfhzH0JX+3zoy2uFk7Vn9EfXASOtVmmIVbL3jE/W8Z66VgPSZcMhw==",
1025 | "dev": true,
1026 | "requires": {
1027 | "dom-urls": "1.1.0",
1028 | "es6-promise": "4.2.4",
1029 | "glob": "7.1.2",
1030 | "lodash.defaults": "4.2.0",
1031 | "lodash.template": "4.4.0",
1032 | "meow": "3.7.0",
1033 | "mkdirp": "0.5.1",
1034 | "pretty-bytes": "4.0.2",
1035 | "sw-toolbox": "3.6.0",
1036 | "update-notifier": "2.5.0"
1037 | }
1038 | },
1039 | "sw-toolbox": {
1040 | "version": "3.6.0",
1041 | "resolved": "https://registry.npmjs.org/sw-toolbox/-/sw-toolbox-3.6.0.tgz",
1042 | "integrity": "sha1-Jt8dHHA0hljk3qKIQxkUm3sxg7U=",
1043 | "dev": true,
1044 | "requires": {
1045 | "path-to-regexp": "1.7.0",
1046 | "serviceworker-cache-polyfill": "4.0.0"
1047 | }
1048 | },
1049 | "term-size": {
1050 | "version": "1.2.0",
1051 | "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
1052 | "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=",
1053 | "dev": true,
1054 | "requires": {
1055 | "execa": "0.7.0"
1056 | }
1057 | },
1058 | "timed-out": {
1059 | "version": "4.0.1",
1060 | "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
1061 | "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
1062 | "dev": true
1063 | },
1064 | "trim-newlines": {
1065 | "version": "1.0.0",
1066 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
1067 | "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
1068 | "dev": true
1069 | },
1070 | "unique-string": {
1071 | "version": "1.0.0",
1072 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
1073 | "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
1074 | "dev": true,
1075 | "requires": {
1076 | "crypto-random-string": "1.0.0"
1077 | }
1078 | },
1079 | "unzip-response": {
1080 | "version": "2.0.1",
1081 | "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
1082 | "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=",
1083 | "dev": true
1084 | },
1085 | "update-notifier": {
1086 | "version": "2.5.0",
1087 | "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz",
1088 | "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==",
1089 | "dev": true,
1090 | "requires": {
1091 | "boxen": "1.3.0",
1092 | "chalk": "2.4.1",
1093 | "configstore": "3.1.2",
1094 | "import-lazy": "2.1.0",
1095 | "is-ci": "1.1.0",
1096 | "is-installed-globally": "0.1.0",
1097 | "is-npm": "1.0.0",
1098 | "latest-version": "3.1.0",
1099 | "semver-diff": "2.1.0",
1100 | "xdg-basedir": "3.0.0"
1101 | }
1102 | },
1103 | "urijs": {
1104 | "version": "1.19.1",
1105 | "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.1.tgz",
1106 | "integrity": "sha512-xVrGVi94ueCJNrBSTjWqjvtgvl3cyOTThp2zaMaFNGp3F542TR6sM3f2o8RqZl+AwteClSVmoCyt0ka4RjQOQg==",
1107 | "dev": true
1108 | },
1109 | "url-parse-lax": {
1110 | "version": "1.0.0",
1111 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
1112 | "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
1113 | "dev": true,
1114 | "requires": {
1115 | "prepend-http": "1.0.4"
1116 | }
1117 | },
1118 | "validate-npm-package-license": {
1119 | "version": "3.0.3",
1120 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz",
1121 | "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==",
1122 | "dev": true,
1123 | "requires": {
1124 | "spdx-correct": "3.0.0",
1125 | "spdx-expression-parse": "3.0.0"
1126 | }
1127 | },
1128 | "which": {
1129 | "version": "1.3.0",
1130 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
1131 | "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
1132 | "dev": true,
1133 | "requires": {
1134 | "isexe": "2.0.0"
1135 | }
1136 | },
1137 | "widest-line": {
1138 | "version": "2.0.0",
1139 | "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz",
1140 | "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=",
1141 | "dev": true,
1142 | "requires": {
1143 | "string-width": "2.1.1"
1144 | }
1145 | },
1146 | "wrappy": {
1147 | "version": "1.0.2",
1148 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1149 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
1150 | "dev": true
1151 | },
1152 | "write-file-atomic": {
1153 | "version": "2.3.0",
1154 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz",
1155 | "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==",
1156 | "dev": true,
1157 | "requires": {
1158 | "graceful-fs": "4.1.11",
1159 | "imurmurhash": "0.1.4",
1160 | "signal-exit": "3.0.2"
1161 | }
1162 | },
1163 | "xdg-basedir": {
1164 | "version": "3.0.0",
1165 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
1166 | "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=",
1167 | "dev": true
1168 | },
1169 | "yallist": {
1170 | "version": "2.1.2",
1171 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
1172 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
1173 | "dev": true
1174 | }
1175 | }
1176 | }
1177 |
--------------------------------------------------------------------------------