├── .gitignore ├── .travis.yml ├── CONTRIBUTING.md ├── README.md ├── api ├── .firebaserc ├── README.md ├── app.yaml ├── firebase.json ├── functions │ ├── index.js │ └── package.json ├── package-lock.json ├── package.json ├── src │ ├── deploy.ts │ └── index.ts ├── tsconfig.json └── yarn.lock ├── docs └── api.md ├── media └── logo.png └── site ├── .firebaserc ├── .gitignore ├── Gemfile ├── Gemfile.lock ├── _apps ├── angular-dart-hnpwa.txt ├── angular-hacker-news.txt ├── angular-hn.txt ├── angular-hnpwa.txt ├── apprun-hn.txt ├── compost-hn.txt ├── cxjs-hackernews.txt ├── cycle-hn.txt ├── dojo-2.txt ├── elm-hnpwa.txt ├── ember-hn.txt ├── firebase-hnpwa.txt ├── glimmer-hn-pwa.txt ├── hnpwa-ember.txt ├── hnpwa-react.txt ├── hnpwa-vue.txt ├── inferno-hn.txt ├── mithril-hn.txt ├── mobx-ts-hn.txt ├── next-hnpwa.txt ├── nextjs-firebase-hnpwa.txt ├── nextjs-hn.txt ├── ng-hnpwa.txt ├── nuxt-hn.txt ├── polymer-hn.txt ├── preact-hacker-news.txt ├── preact-hn.txt ├── quasar-hackernews.txt ├── react-hn-kristofer.txt ├── react-hn-stephen.txt ├── react-hn-suriel.txt ├── react-hn.txt ├── react-native-web.txt ├── stencil-ionic-hn.txt ├── svelte-hacker-news.txt ├── vanilla-hn.txt ├── vanilla-wc-hn.txt ├── viper-news.txt ├── vue-hacker-news.txt ├── vue-hn-pwa.txt ├── webcomponents-hn.txt └── zuix-hn.txt ├── _config.yml ├── _contributors ├── addy.txt ├── alexchopin.txt ├── alexnoz.txt ├── alfredo.txt ├── andrea.txt ├── anthony.txt ├── anubhav.txt ├── ashish.txt ├── atinux.txt ├── chris-h.txt ├── chris.txt ├── cristian.txt ├── damien.txt ├── dan.txt ├── david.txt ├── eugen.txt ├── evan.txt ├── gene.txt ├── houssein.txt ├── ivan.txt ├── jimmy.txt ├── johan.txt ├── jonny.txt ├── justin.txt ├── kevin.txt ├── kevmoo.txt ├── kristofer.txt ├── kulshekhar.txt ├── leon.txt ├── majid.txt ├── malbernaz.txt ├── marko.txt ├── matan.txt ├── michael.txt ├── naythan.txt ├── pi0.txt ├── rich.txt ├── rstoenescu.txt ├── rubenlie.txt ├── ryan.txt ├── sebastian.txt ├── stephen.txt ├── steve.txt ├── suriel.txt ├── taehwanno.txt ├── usman.txt └── yysun.txt ├── _includes ├── footer.html ├── github-corner.svg ├── google-analytics.html ├── head.html ├── header.html ├── implementation.html ├── script-lazysizes.html └── service-worker-register.html ├── _layouts ├── default.html └── home.html ├── _sass └── extra.scss ├── assets ├── favicon.ico ├── images │ ├── angular-dart-hnpwa.png │ ├── angular-hacker-news-mobile.png │ ├── angular-hn-pwa.png │ ├── angular2hn-mobile.png │ ├── apprun-hn.png │ ├── compost-hn.png │ ├── cxjs-hackernews.png │ ├── cycle-hn.png │ ├── dojo-2-hnpwa.png │ ├── elm-mobile.png │ ├── ember-hn-mobile.png │ ├── ember-mobile.png │ ├── favicon.png │ ├── glimmer-hn-pwa.png │ ├── hn-vanilla-wc.png │ ├── hnpwa-angular.png │ ├── hnpwa-firebase.png │ ├── hnpwa-logo.png │ ├── hnpwa-react.png │ ├── hnpwa-showcase.png │ ├── hnpwa-vue.png │ ├── inferno-hn.png │ ├── mithril-hn-pwa.png │ ├── mobx-ts-hn.png │ ├── next-fb-hnpwa.png │ ├── next-hnpwa.png │ ├── nextjs-hn.png │ ├── nuxt-hn.png │ ├── polymer-mobile.png │ ├── preact-hnpwa.png │ ├── preacthn-mobile.png │ ├── quasar-hn.png │ ├── react-hn-stephen.png │ ├── react-hn-suriel.png │ ├── reacthn-kristofer-mobile.png │ ├── reacthn-mobile.png │ ├── rnw-hn.png │ ├── stencil-ionic.png │ ├── sveltehn-mobile.png │ ├── vanilla-wc-hn.png │ ├── vanillahn-mobile.png │ ├── viperhtml-mobile.png │ ├── vue-hn-pwa.png │ ├── vuehn-mobile.png │ └── zuixhn-mobile.png ├── manifest.json └── styles │ ├── main.scss │ └── tachyons.min.css ├── firebase.json ├── functions ├── index.js └── package.json ├── index.md ├── package-lock.json ├── package.json └── sw-precache-config.js /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | api/dist 4 | api/env.json 5 | api/.firebase 6 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | Build Status 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 | -------------------------------------------------------------------------------- /api/.firebaserc: -------------------------------------------------------------------------------- 1 | { 2 | "projects": { 3 | "prod": "hnpwa-coffee", 4 | "staging": "hnpwa-api" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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/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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /media/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/media/logo.png -------------------------------------------------------------------------------- /site/.firebaserc: -------------------------------------------------------------------------------- 1 | { 2 | "projects": { 3 | "default": "hnpwa-site" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /site/.gitignore: -------------------------------------------------------------------------------- 1 | _site 2 | .sass-cache 3 | .jekyll-metadata 4 | service-acc.json 5 | service-worker.js 6 | node_modules 7 | -------------------------------------------------------------------------------- /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/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/_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/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/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/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/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/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/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/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/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/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/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 | -------------------------------------------------------------------------------- /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/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/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/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/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/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/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/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/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/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/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/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/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/_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/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/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/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-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/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/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/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/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 | -------------------------------------------------------------------------------- /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/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/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/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 | -------------------------------------------------------------------------------- /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/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/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/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/_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 | -------------------------------------------------------------------------------- /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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/_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/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/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/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/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/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/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/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/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/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/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/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/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/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/_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/_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/usman.txt: -------------------------------------------------------------------------------- 1 | --- 2 | weight: 35 3 | name: 'Usman' 4 | image: https://github.com/usm4n.png 5 | link: https://github.com/usm4n 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/_includes/footer.html: -------------------------------------------------------------------------------- 1 | 33 | -------------------------------------------------------------------------------- /site/_includes/github-corner.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /site/_includes/google-analytics.html: -------------------------------------------------------------------------------- 1 | 11 | 12 | -------------------------------------------------------------------------------- /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/_includes/header.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | HN PWA 4 |

Hacker News readers as Progressive Web Apps

5 |
6 | 7 | 8 | {% include github-corner.svg %} 9 | 10 |
11 | -------------------------------------------------------------------------------- /site/_includes/implementation.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 |
5 |

{{ app.title }}

6 | 7 |

8 | {{ app.github-title }} 9 |

10 | 11 |
12 |
13 |
Lighthouse:
14 |
15 | 16 | {{ app.lighthouse }} 17 | 18 |
19 |
20 | 21 |
22 |
Interactive (Emerging Markets):
23 |
24 | 25 | {{ app.interactive-em }} 26 | 27 |
28 |
29 | 30 |
31 |
Interactive (Faster 3G):
32 |
33 | 34 | {{ app.interactive-faster-3g }} 35 | 36 |
37 |
38 |
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 |
129 | VIEW APP 130 | SOURCE CODE 131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 | {{ app.title }} HN PWA running on a mobile phone 149 |
150 |
151 |
152 |
153 |
154 |
155 |
-------------------------------------------------------------------------------- /site/_includes/script-lazysizes.html: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /site/_includes/service-worker-register.html: -------------------------------------------------------------------------------- 1 | 12 | -------------------------------------------------------------------------------- /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/_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 |
-------------------------------------------------------------------------------- /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/assets/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/favicon.ico -------------------------------------------------------------------------------- /site/assets/images/angular-dart-hnpwa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/angular-dart-hnpwa.png -------------------------------------------------------------------------------- /site/assets/images/angular-hacker-news-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/angular-hacker-news-mobile.png -------------------------------------------------------------------------------- /site/assets/images/angular-hn-pwa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/angular-hn-pwa.png -------------------------------------------------------------------------------- /site/assets/images/angular2hn-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/angular2hn-mobile.png -------------------------------------------------------------------------------- /site/assets/images/apprun-hn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/apprun-hn.png -------------------------------------------------------------------------------- /site/assets/images/compost-hn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/compost-hn.png -------------------------------------------------------------------------------- /site/assets/images/cxjs-hackernews.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/cxjs-hackernews.png -------------------------------------------------------------------------------- /site/assets/images/cycle-hn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/cycle-hn.png -------------------------------------------------------------------------------- /site/assets/images/dojo-2-hnpwa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/dojo-2-hnpwa.png -------------------------------------------------------------------------------- /site/assets/images/elm-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/elm-mobile.png -------------------------------------------------------------------------------- /site/assets/images/ember-hn-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/ember-hn-mobile.png -------------------------------------------------------------------------------- /site/assets/images/ember-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/ember-mobile.png -------------------------------------------------------------------------------- /site/assets/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/favicon.png -------------------------------------------------------------------------------- /site/assets/images/glimmer-hn-pwa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/glimmer-hn-pwa.png -------------------------------------------------------------------------------- /site/assets/images/hn-vanilla-wc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/hn-vanilla-wc.png -------------------------------------------------------------------------------- /site/assets/images/hnpwa-angular.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/hnpwa-angular.png -------------------------------------------------------------------------------- /site/assets/images/hnpwa-firebase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/hnpwa-firebase.png -------------------------------------------------------------------------------- /site/assets/images/hnpwa-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/hnpwa-logo.png -------------------------------------------------------------------------------- /site/assets/images/hnpwa-react.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/hnpwa-react.png -------------------------------------------------------------------------------- /site/assets/images/hnpwa-showcase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/hnpwa-showcase.png -------------------------------------------------------------------------------- /site/assets/images/hnpwa-vue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/hnpwa-vue.png -------------------------------------------------------------------------------- /site/assets/images/inferno-hn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/inferno-hn.png -------------------------------------------------------------------------------- /site/assets/images/mithril-hn-pwa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/mithril-hn-pwa.png -------------------------------------------------------------------------------- /site/assets/images/mobx-ts-hn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/mobx-ts-hn.png -------------------------------------------------------------------------------- /site/assets/images/next-fb-hnpwa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/next-fb-hnpwa.png -------------------------------------------------------------------------------- /site/assets/images/next-hnpwa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/next-hnpwa.png -------------------------------------------------------------------------------- /site/assets/images/nextjs-hn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/nextjs-hn.png -------------------------------------------------------------------------------- /site/assets/images/nuxt-hn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/nuxt-hn.png -------------------------------------------------------------------------------- /site/assets/images/polymer-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/polymer-mobile.png -------------------------------------------------------------------------------- /site/assets/images/preact-hnpwa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/preact-hnpwa.png -------------------------------------------------------------------------------- /site/assets/images/preacthn-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/preacthn-mobile.png -------------------------------------------------------------------------------- /site/assets/images/quasar-hn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/quasar-hn.png -------------------------------------------------------------------------------- /site/assets/images/react-hn-stephen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/react-hn-stephen.png -------------------------------------------------------------------------------- /site/assets/images/react-hn-suriel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/react-hn-suriel.png -------------------------------------------------------------------------------- /site/assets/images/reacthn-kristofer-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/reacthn-kristofer-mobile.png -------------------------------------------------------------------------------- /site/assets/images/reacthn-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/reacthn-mobile.png -------------------------------------------------------------------------------- /site/assets/images/rnw-hn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/rnw-hn.png -------------------------------------------------------------------------------- /site/assets/images/stencil-ionic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/stencil-ionic.png -------------------------------------------------------------------------------- /site/assets/images/sveltehn-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/sveltehn-mobile.png -------------------------------------------------------------------------------- /site/assets/images/vanilla-wc-hn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/vanilla-wc-hn.png -------------------------------------------------------------------------------- /site/assets/images/vanillahn-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/vanillahn-mobile.png -------------------------------------------------------------------------------- /site/assets/images/viperhtml-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/viperhtml-mobile.png -------------------------------------------------------------------------------- /site/assets/images/vue-hn-pwa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/vue-hn-pwa.png -------------------------------------------------------------------------------- /site/assets/images/vuehn-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/vuehn-mobile.png -------------------------------------------------------------------------------- /site/assets/images/zuixhn-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samccone/hacker-news-pwas/f2fa5d3f32a38081abf02930e91ab978f55e3ab7/site/assets/images/zuixhn-mobile.png -------------------------------------------------------------------------------- /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/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/firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "hosting": { 3 | "public": "_site", 4 | "rewrites": [ 5 | { 6 | "source": "/api/v0/**", 7 | "function": "api0" 8 | } 9 | ] 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /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/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 | -------------------------------------------------------------------------------- /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/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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | --------------------------------------------------------------------------------