{"action":"created","comment":{"url":"https://api.github.com/repos/paulirish/pwmetrics/pulls/comments/110390766","pull_request_review_id":31561785,"id":110390766,"diff_hunk":"@@ -0,0 +1,262 @@\n+// Copyright 2016 Google Inc. All Rights Reserved.\n+// Licensed under the Apache License, Version 2.0. See LICENSE\n+\n+const lighthouse = require('lighthouse');\n+import {ChromeLauncher} from 'lighthouse/lighthouse-cli/chrome-launcher';\n+const perfConfig: any = require('lighthouse/lighthouse-core/config/perf.json');\n+const opn = require('opn');\n+\n+const Sheets = require('./sheets/index');\n+const Chart = require('./chart/chart');\n+const metrics = require('./metrics');\n+const expectations = require('./expectations');\n+const {upload} = require('./upload');\n+const messages = require('./utils/messages');\n+\n+import {MainOptions, FeatureFlags, AuthorizeCredentials, LighthouseResults, MetricsResults, TermWritableStream, PWMetricsResults, SheetsConfig, ExpectationMetrics} from '../types/types';\n+\n+const MAX_LIGHTHOUSE_TRIES = 2;\n+const SIGINT = 'SIGINT';\n+const SIGINT_EXIT_CODE = 130;\n+const getTimelineViewerUrl = (id: string) => `https://chromedevtools.github.io/timeline-viewer/?loadTimelineFromURL=https://drive.google.com/file/d//${id}/view?usp=drivesdk`\n+\n+class PWMetrics {\n+  flags: FeatureFlags = {\n+    runs: 1,\n+    submit: false,\n+    upload: false,\n+    view: false,\n+    expectations: false,\n+    output: false,\n+    // @todo remove when new lighthouse version be released, because -https://github.com/GoogleChrome/lighthouse/pull/1778\n+    disableCpuThrottling: false\n+  };\n+  runs: number;\n+  sheets: SheetsConfig;\n+  expectations: ExpectationMetrics;\n+  clientSecret: AuthorizeCredentials;\n+  tryLighthouseCounter: number;\n+  launcher: ChromeLauncher | undefined = undefined;\n+\n+  constructor(public url: string, opts: MainOptions) {\n+    this.flags = Object.assign({}, this.flags, opts.flags);\n+    this.runs = this.flags.runs;\n+    this.sheets = opts.sheets;\n+    this.expectations = opts.expectations;\n+    this.clientSecret = opts.clientSecret;\n+    this.tryLighthouseCounter = 0;\n+\n+    if (this.flags.expectations) {\n+      if (this.expectations) {\n+        expectations.validateMetrics(this.expectations);\n+        this.expectations = expectations.normalizeMetrics(this.expectations);\n+      } else throw new Error(getMessageWithPrefix('ERROR', 'NO_EXPECTATIONS_FOUND'));\n+    }\n+  }\n+\n+  async start() {\n+    const runs = Array.apply(null, {length: +this.runs}).map(Number.call, Number);\n+    let metricsResults: MetricsResults[] = [];\n+\n+    // Kill spawned Chrome process in case of ctrl-C.\n+    process.on(SIGINT, async() => {\n+      if (this.launcher) {\n+        try {\n+          await this.killLauncher();\n+          process.exit(SIGINT_EXIT_CODE);\n+          console.log(messages.getMessage('CLOSING_CHROME'));\n+        } catch (error) {\n+          throw error;\n+        }\n+      }\n+    });\n+    for (let runIndex of runs) {\n+      try {\n+        metricsResults[runIndex] = await this.run();\n+        console.log(messages.getMessageWithPrefix('SUCCESS', 'SUCCESS_RUN', runIndex, runs.length));\n+      } catch (error) {\n+        metricsResults[runIndex] = error;\n+        console.error(messages.getMessageWithPrefix('ERROR', 'FAILED_RUN', runIndex, runs.length, error.message));\n+      }\n+    }\n+\n+    let results: PWMetricsResults = {runs: metricsResults.filter(r => !(r instanceof Error))};\n+    if (this.runs > 1 && !this.flags.submit) {\n+      results.median = this.findMedianRun(metricsResults);\n+      console.log(messages.getMessage('MEDIAN_RUN'));\n+      this.displayOutput(results.median);\n+    } else if (this.flags.submit) {\n+      const sheets = new Sheets(this.sheets, this.clientSecret);\n+      await sheets.appendResults(results.runs);\n+    }\n+    return results;\n+  }\n+\n+  async run(): Promise<MetricsResults> {\n+    try {\n+      let lhResults: LighthouseResults;\n+      await this.launchChrome();\n+\n+      if (process.env.CI) {\n+        // handling CRI_TIMEOUT issue - https://github.com/GoogleChrome/lighthouse/issues/833\n+        this.tryLighthouseCounter = 0;\n+        lhResults = await this.runLighthouseOnCI();\n+      } else {\n+        lhResults = await lighthouse(this.url, this.flags);\n+      }\n+\n+      const metricsResults: MetricsResults = await this.recordLighthouseTrace(lhResults);\n+      await this.killLauncher();\n+\n+      return metricsResults;\n+    } catch (error) {\n+      await this.killLauncher();\n+      throw error;\n+    }\n+  }\n+\n+  async killLauncher() {\n+    if (typeof this.launcher !== 'undefined') {\n+      await this.launcher!.kill();\n+    }\n+  }\n+\n+  async runLighthouseOnCI(): Promise<LighthouseResults> {\n+    try {\n+      return await lighthouse(this.url, this.flags, perfConfig);\n+    } catch(error) {\n+      if (error.code === 'CRI_TIMEOUT' && this.tryLighthouseCounter <= MAX_LIGHTHOUSE_TRIES) {\n+        return await this.retryLighthouseOnCI();\n+      }\n+\n+      if (this.tryLighthouseCounter > MAX_LIGHTHOUSE_TRIES) {\n+        throw new Error(messages.getMessage('CRI_TIMEOUT_REJECT'));\n+      }\n+    }\n+  }\n+\n+  async retryLighthouseOnCI(): Promise<LighthouseResults> {\n+    this.tryLighthouseCounter++;\n+    console.log(messages.getMessage('CRI_TIMEOUT_RELAUNCH'));\n+\n+    try {\n+      return await this.runLighthouseOnCI();\n+    } catch(error) {\n+      console.error(error.message);\n+      console.error(messages.getMessage('CLOSING_CHROME'));\n+      await this.killLauncher();\n+    }\n+  }\n+\n+  async launchChrome(): Promise<ChromeLauncher> {\n+    try {\n+      this.launcher = new ChromeLauncher();\n+      await this.launcher.isDebuggerReady();\n+    } catch(e) {\n+      console.log(messages.getMessage('LAUNCHING_CHROME'));\n+      return this.launcher.run();\n+    }\n+  }\n+\n+  async recordLighthouseTrace(data: LighthouseResults): Promise<MetricsResults> {\n+    try {\n+      const preparedData = metrics.prepareData(data);\n+\n+      if (this.flags.upload) {\n+        const driveResponse = await upload(data, this.clientSecret);\n+        this.view(driveResponse.id);\n+      }\n+\n+      if (!this.flags.submit && this.runs <= 1) {\n+        this.displayOutput(preparedData);\n+      }\n+\n+      if (this.flags.expectations) {\n+        expectations.checkExpectations(preparedData.timings, this.expectations);\n+      }\n+\n+      return preparedData;\n+    } catch (error) {\n+      throw error;\n+    }\n+  }\n+\n+  displayOutput(data: MetricsResults): MetricsResults {\n+    if (this.flags.output) {\n+      return data;\n+    } else {\n+      this.showChart(data);\n+    }\n+    return data;\n+  }\n+\n+  showChart(data: MetricsResults) {\n+    // reverse to preserve the order, because cli-chart.\n+    let timings = data.timings;\n+\n+    timings = timings.filter(r => {\n+      if (r.timing === undefined) {\n+        console.error(messages.getMessageWithPrefix('ERROR', 'METRIC_IS_UNAVAILABLE', r.title));\n+      }\n+      // don't chart hidden metrics, but include in json\n+      return !metrics.hiddenMetrics.includes(r.id);\n+    });\n+\n+    const fullWidthInMs = Math.max(...timings.map(result => result.timing));\n+    const maxLabelWidth = Math.max(...timings.map(result => result.title.length));\n+    const stdout = <TermWritableStream>(process.stdout);\n+    const chartOps = {\n+      // 90% of terminal width to give some right margin\n+      width: stdout.columns * 0.9 - maxLabelWidth,\n+      xlabel: 'Time (ms) since navigation start',\n+\n+      // nearest second\n+      maxBound: Math.ceil(fullWidthInMs / 1000) * 1000,\n+      xmax: fullWidthInMs,\n+      lmargin: maxLabelWidth + 1,\n+\n+      // 2 rows per bar, horitzonal plot\n+      height: timings.length * 2,\n+      step: 2,\n+      direction: 'x'\n+    };\n+\n+    const chart = new Chart(chartOps);\n+    timings.forEach(result => {\n+      chart.addBar({\n+        size: result.timing,\n+        label: result.title,\n+        barLabel: `${Math.floor(result.timing).toLocaleString()}`,\n+        color: result.color\n+      });\n+    });\n+    chart.draw();\n+    return data;\n+  }\n+\n+  findMedianRun(results: MetricsResults[]): MetricsResults {\n+    const ttiValues = results.map(r => r.timings.find(timing => timing.id === metrics.ids.TTI).timing);\n+    const medianTTI = this.median(ttiValues);\n+    // in the case of duplicate runs having the exact same TTI, we naively pick the first\n+    // @fixme, but any for now...\n+    return results.find((result: any) => result.timings.find((timing:any) =>\n+        timing.id === metrics.ids.TTI && timing.timing === medianTTI\n+      )\n+    );\n+  }\n+\n+  median(values: Array<number>) {","path":"lib/index.ts","position":248,"original_position":248,"commit_id":"c32d3c030ee53963e2db051ad369f7e6344e1774","original_commit_id":"c32d3c030ee53963e2db051ad369f7e6344e1774","user":{"login":"pedro93","id":3718654,"avatar_url":"https://avatars3.githubusercontent.com/u/3718654?v=3","gravatar_id":"","url":"https://api.github.com/users/pedro93","html_url":"https://github.com/pedro93","followers_url":"https://api.github.com/users/pedro93/followers","following_url":"https://api.github.com/users/pedro93/following{/other_user}","gists_url":"https://api.github.com/users/pedro93/gists{/gist_id}","starred_url":"https://api.github.com/users/pedro93/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pedro93/subscriptions","organizations_url":"https://api.github.com/users/pedro93/orgs","repos_url":"https://api.github.com/users/pedro93/repos","events_url":"https://api.github.com/users/pedro93/events{/privacy}","received_events_url":"https://api.github.com/users/pedro93/received_events","type":"User","site_admin":false},"body":"```js\r\nmedian(values: Array<number>): number\r\n```\r\nOr is Typescript smart enough to detect that?","created_at":"2017-04-07T13:36:51Z","updated_at":"2017-04-07T13:36:51Z","html_url":"https://github.com/paulirish/pwmetrics/pull/92#discussion_r110390766","pull_request_url":"https://api.github.com/repos/paulirish/pwmetrics/pulls/92","_links":{"self":{"href":"https://api.github.com/repos/paulirish/pwmetrics/pulls/comments/110390766"},"html":{"href":"https://github.com/paulirish/pwmetrics/pull/92#discussion_r110390766"},"pull_request":{"href":"https://api.github.com/repos/paulirish/pwmetrics/pulls/92"}}},"pull_request":{"url":"https://api.github.com/repos/paulirish/pwmetrics/pulls/92","id":114528158,"html_url":"https://github.com/paulirish/pwmetrics/pull/92","diff_url":"https://github.com/paulirish/pwmetrics/pull/92.diff","patch_url":"https://github.com/paulirish/pwmetrics/pull/92.patch","issue_url":"https://api.github.com/repos/paulirish/pwmetrics/issues/92","number":92,"state":"open","locked":false,"title":"index.js -> index.ts","user":{"login":"denar90","id":6231516,"avatar_url":"https://avatars3.githubusercontent.com/u/6231516?v=3","gravatar_id":"","url":"https://api.github.com/users/denar90","html_url":"https://github.com/denar90","followers_url":"https://api.github.com/users/denar90/followers","following_url":"https://api.github.com/users/denar90/following{/other_user}","gists_url":"https://api.github.com/users/denar90/gists{/gist_id}","starred_url":"https://api.github.com/users/denar90/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/denar90/subscriptions","organizations_url":"https://api.github.com/users/denar90/orgs","repos_url":"https://api.github.com/users/denar90/repos","events_url":"https://api.github.com/users/denar90/events{/privacy}","received_events_url":"https://api.github.com/users/denar90/received_events","type":"User","site_admin":false},"body":"@paulirish @samccone last migration file to .ts 🍻 \r\n\r\nP.S. Index file looks like newly created but if look at [blame history](https://github.com/denar90/pwmetrics/blame/ef26e6576786c52e7da0716a757b76410247b8bc/lib/index.ts), it's saved, I think it's a github diff issue...\r\n\r\nGuys you can look commit after commit to watch diff better...","created_at":"2017-04-06T06:10:47Z","updated_at":"2017-04-07T13:36:51Z","closed_at":null,"merged_at":null,"merge_commit_sha":"77ced0d019e8fecd90d2c2172ee3583df5300051","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/paulirish/pwmetrics/pulls/92/commits","review_comments_url":"https://api.github.com/repos/paulirish/pwmetrics/pulls/92/comments","review_comment_url":"https://api.github.com/repos/paulirish/pwmetrics/pulls/comments{/number}","comments_url":"https://api.github.com/repos/paulirish/pwmetrics/issues/92/comments","statuses_url":"https://api.github.com/repos/paulirish/pwmetrics/statuses/c32d3c030ee53963e2db051ad369f7e6344e1774","head":{"label":"denar90:index.ts","ref":"index.ts","sha":"c32d3c030ee53963e2db051ad369f7e6344e1774","user":{"login":"denar90","id":6231516,"avatar_url":"https://avatars3.githubusercontent.com/u/6231516?v=3","gravatar_id":"","url":"https://api.github.com/users/denar90","html_url":"https://github.com/denar90","followers_url":"https://api.github.com/users/denar90/followers","following_url":"https://api.github.com/users/denar90/following{/other_user}","gists_url":"https://api.github.com/users/denar90/gists{/gist_id}","starred_url":"https://api.github.com/users/denar90/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/denar90/subscriptions","organizations_url":"https://api.github.com/users/denar90/orgs","repos_url":"https://api.github.com/users/denar90/repos","events_url":"https://api.github.com/users/denar90/events{/privacy}","received_events_url":"https://api.github.com/users/denar90/received_events","type":"User","site_admin":false},"repo":{"id":74167070,"name":"pwmetrics","full_name":"denar90/pwmetrics","owner":{"login":"denar90","id":6231516,"avatar_url":"https://avatars3.githubusercontent.com/u/6231516?v=3","gravatar_id":"","url":"https://api.github.com/users/denar90","html_url":"https://github.com/denar90","followers_url":"https://api.github.com/users/denar90/followers","following_url":"https://api.github.com/users/denar90/following{/other_user}","gists_url":"https://api.github.com/users/denar90/gists{/gist_id}","starred_url":"https://api.github.com/users/denar90/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/denar90/subscriptions","organizations_url":"https://api.github.com/users/denar90/orgs","repos_url":"https://api.github.com/users/denar90/repos","events_url":"https://api.github.com/users/denar90/events{/privacy}","received_events_url":"https://api.github.com/users/denar90/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/denar90/pwmetrics","description":"Progressive web metrics at your fingertipz","fork":true,"url":"https://api.github.com/repos/denar90/pwmetrics","forks_url":"https://api.github.com/repos/denar90/pwmetrics/forks","keys_url":"https://api.github.com/repos/denar90/pwmetrics/keys{/key_id}","collaborators_url":"https://api.github.com/repos/denar90/pwmetrics/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/denar90/pwmetrics/teams","hooks_url":"https://api.github.com/repos/denar90/pwmetrics/hooks","issue_events_url":"https://api.github.com/repos/denar90/pwmetrics/issues/events{/number}","events_url":"https://api.github.com/repos/denar90/pwmetrics/events","assignees_url":"https://api.github.com/repos/denar90/pwmetrics/assignees{/user}","branches_url":"https://api.github.com/repos/denar90/pwmetrics/branches{/branch}","tags_url":"https://api.github.com/repos/denar90/pwmetrics/tags","blobs_url":"https://api.github.com/repos/denar90/pwmetrics/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/denar90/pwmetrics/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/denar90/pwmetrics/git/refs{/sha}","trees_url":"https://api.github.com/repos/denar90/pwmetrics/git/trees{/sha}","statuses_url":"https://api.github.com/repos/denar90/pwmetrics/statuses/{sha}","languages_url":"https://api.github.com/repos/denar90/pwmetrics/languages","stargazers_url":"https://api.github.com/repos/denar90/pwmetrics/stargazers","contributors_url":"https://api.github.com/repos/denar90/pwmetrics/contributors","subscribers_url":"https://api.github.com/repos/denar90/pwmetrics/subscribers","subscription_url":"https://api.github.com/repos/denar90/pwmetrics/subscription","commits_url":"https://api.github.com/repos/denar90/pwmetrics/commits{/sha}","git_commits_url":"https://api.github.com/repos/denar90/pwmetrics/git/commits{/sha}","comments_url":"https://api.github.com/repos/denar90/pwmetrics/comments{/number}","issue_comment_url":"https://api.github.com/repos/denar90/pwmetrics/issues/comments{/number}","contents_url":"https://api.github.com/repos/denar90/pwmetrics/contents/{+path}","compare_url":"https://api.github.com/repos/denar90/pwmetrics/compare/{base}...{head}","merges_url":"https://api.github.com/repos/denar90/pwmetrics/merges","archive_url":"https://api.github.com/repos/denar90/pwmetrics/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/denar90/pwmetrics/downloads","issues_url":"https://api.github.com/repos/denar90/pwmetrics/issues{/number}","pulls_url":"https://api.github.com/repos/denar90/pwmetrics/pulls{/number}","milestones_url":"https://api.github.com/repos/denar90/pwmetrics/milestones{/number}","notifications_url":"https://api.github.com/repos/denar90/pwmetrics/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/denar90/pwmetrics/labels{/name}","releases_url":"https://api.github.com/repos/denar90/pwmetrics/releases{/id}","deployments_url":"https://api.github.com/repos/denar90/pwmetrics/deployments","created_at":"2016-11-18T21:18:52Z","updated_at":"2016-11-18T21:18:53Z","pushed_at":"2017-04-07T12:09:14Z","git_url":"git://github.com/denar90/pwmetrics.git","ssh_url":"git@github.com:denar90/pwmetrics.git","clone_url":"https://github.com/denar90/pwmetrics.git","svn_url":"https://github.com/denar90/pwmetrics","homepage":"","size":302,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"paulirish:master","ref":"master","sha":"9ca6df28cf52a4c270eb86ad5dbeebd2813f046d","user":{"login":"paulirish","id":39191,"avatar_url":"https://avatars3.githubusercontent.com/u/39191?v=3","gravatar_id":"","url":"https://api.github.com/users/paulirish","html_url":"https://github.com/paulirish","followers_url":"https://api.github.com/users/paulirish/followers","following_url":"https://api.github.com/users/paulirish/following{/other_user}","gists_url":"https://api.github.com/users/paulirish/gists{/gist_id}","starred_url":"https://api.github.com/users/paulirish/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/paulirish/subscriptions","organizations_url":"https://api.github.com/users/paulirish/orgs","repos_url":"https://api.github.com/users/paulirish/repos","events_url":"https://api.github.com/users/paulirish/events{/privacy}","received_events_url":"https://api.github.com/users/paulirish/received_events","type":"User","site_admin":false},"repo":{"id":66429461,"name":"pwmetrics","full_name":"paulirish/pwmetrics","owner":{"login":"paulirish","id":39191,"avatar_url":"https://avatars3.githubusercontent.com/u/39191?v=3","gravatar_id":"","url":"https://api.github.com/users/paulirish","html_url":"https://github.com/paulirish","followers_url":"https://api.github.com/users/paulirish/followers","following_url":"https://api.github.com/users/paulirish/following{/other_user}","gists_url":"https://api.github.com/users/paulirish/gists{/gist_id}","starred_url":"https://api.github.com/users/paulirish/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/paulirish/subscriptions","organizations_url":"https://api.github.com/users/paulirish/orgs","repos_url":"https://api.github.com/users/paulirish/repos","events_url":"https://api.github.com/users/paulirish/events{/privacy}","received_events_url":"https://api.github.com/users/paulirish/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/paulirish/pwmetrics","description":"Progressive web metrics at your fingertipz","fork":false,"url":"https://api.github.com/repos/paulirish/pwmetrics","forks_url":"https://api.github.com/repos/paulirish/pwmetrics/forks","keys_url":"https://api.github.com/repos/paulirish/pwmetrics/keys{/key_id}","collaborators_url":"https://api.github.com/repos/paulirish/pwmetrics/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/paulirish/pwmetrics/teams","hooks_url":"https://api.github.com/repos/paulirish/pwmetrics/hooks","issue_events_url":"https://api.github.com/repos/paulirish/pwmetrics/issues/events{/number}","events_url":"https://api.github.com/repos/paulirish/pwmetrics/events","assignees_url":"https://api.github.com/repos/paulirish/pwmetrics/assignees{/user}","branches_url":"https://api.github.com/repos/paulirish/pwmetrics/branches{/branch}","tags_url":"https://api.github.com/repos/paulirish/pwmetrics/tags","blobs_url":"https://api.github.com/repos/paulirish/pwmetrics/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/paulirish/pwmetrics/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/paulirish/pwmetrics/git/refs{/sha}","trees_url":"https://api.github.com/repos/paulirish/pwmetrics/git/trees{/sha}","statuses_url":"https://api.github.com/repos/paulirish/pwmetrics/statuses/{sha}","languages_url":"https://api.github.com/repos/paulirish/pwmetrics/languages","stargazers_url":"https://api.github.com/repos/paulirish/pwmetrics/stargazers","contributors_url":"https://api.github.com/repos/paulirish/pwmetrics/contributors","subscribers_url":"https://api.github.com/repos/paulirish/pwmetrics/subscribers","subscription_url":"https://api.github.com/repos/paulirish/pwmetrics/subscription","commits_url":"https://api.github.com/repos/paulirish/pwmetrics/commits{/sha}","git_commits_url":"https://api.github.com/repos/paulirish/pwmetrics/git/commits{/sha}","comments_url":"https://api.github.com/repos/paulirish/pwmetrics/comments{/number}","issue_comment_url":"https://api.github.com/repos/paulirish/pwmetrics/issues/comments{/number}","contents_url":"https://api.github.com/repos/paulirish/pwmetrics/contents/{+path}","compare_url":"https://api.github.com/repos/paulirish/pwmetrics/compare/{base}...{head}","merges_url":"https://api.github.com/repos/paulirish/pwmetrics/merges","archive_url":"https://api.github.com/repos/paulirish/pwmetrics/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/paulirish/pwmetrics/downloads","issues_url":"https://api.github.com/repos/paulirish/pwmetrics/issues{/number}","pulls_url":"https://api.github.com/repos/paulirish/pwmetrics/pulls{/number}","milestones_url":"https://api.github.com/repos/paulirish/pwmetrics/milestones{/number}","notifications_url":"https://api.github.com/repos/paulirish/pwmetrics/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/paulirish/pwmetrics/labels{/name}","releases_url":"https://api.github.com/repos/paulirish/pwmetrics/releases{/id}","deployments_url":"https://api.github.com/repos/paulirish/pwmetrics/deployments","created_at":"2016-08-24T04:22:43Z","updated_at":"2017-04-07T08:03:18Z","pushed_at":"2017-04-07T12:09:15Z","git_url":"git://github.com/paulirish/pwmetrics.git","ssh_url":"git@github.com:paulirish/pwmetrics.git","clone_url":"https://github.com/paulirish/pwmetrics.git","svn_url":"https://github.com/paulirish/pwmetrics","homepage":"","size":263,"stargazers_count":347,"watchers_count":347,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":15,"mirror_url":null,"open_issues_count":5,"forks":15,"open_issues":5,"watchers":347,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/paulirish/pwmetrics/pulls/92"},"html":{"href":"https://github.com/paulirish/pwmetrics/pull/92"},"issue":{"href":"https://api.github.com/repos/paulirish/pwmetrics/issues/92"},"comments":{"href":"https://api.github.com/repos/paulirish/pwmetrics/issues/92/comments"},"review_comments":{"href":"https://api.github.com/repos/paulirish/pwmetrics/pulls/92/comments"},"review_comment":{"href":"https://api.github.com/repos/paulirish/pwmetrics/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/paulirish/pwmetrics/pulls/92/commits"},"statuses":{"href":"https://api.github.com/repos/paulirish/pwmetrics/statuses/c32d3c030ee53963e2db051ad369f7e6344e1774"}}}}
{"actor":{"display_login":"pedro93"}}