{"action":"created","comment":{"url":"https://api.github.com/repos/commercetools/nodejs/pulls/comments/234581319","pull_request_review_id":176249455,"id":234581319,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIzNDU4MTMxOQ==","diff_hunk":"@@ -0,0 +1,106 @@\n+/* @flow */\n+import type { TokenInfo } from 'types/sdk'\n+import * as constants from './constants'\n+\n+export default class TokenProvider {\n+  // Set flowtype annotations\n+  tokenInfo: ?TokenInfo\n+  sdkAuth: Object\n+  onTokenInfoChanged: (tokenInfo: TokenInfo) => void\n+  onTokenInfoRefreshed: (\n+    newTokenInfo: TokenInfo,\n+    oldTokenInfo: TokenInfo\n+  ) => void\n+\n+  constructor(\n+    {\n+      sdkAuth,\n+      onTokenInfoChanged,\n+      onTokenInfoRefreshed,\n+    }: {\n+      sdkAuth: Object,\n+      onTokenInfoChanged: (tokenInfo: TokenInfo) => void,\n+      onTokenInfoRefreshed: (\n+        newTokenInfo: TokenInfo,\n+        oldTokenInfo: TokenInfo\n+      ) => void,\n+    },\n+    tokenInfo: ?TokenInfo = null\n+  ) {\n+    if (!sdkAuth) throw new Error('Property \"sdkAuth\" was not provided')\n+\n+    if (tokenInfo) TokenProvider._validateTokenInfo(tokenInfo)\n+    this.onTokenInfoChanged = onTokenInfoChanged || (() => {})\n+    this.onTokenInfoRefreshed = onTokenInfoRefreshed || (() => {})\n+\n+    this.sdkAuth = sdkAuth\n+    this.tokenInfo = tokenInfo\n+  }\n+\n+  static _validateTokenInfo(tokenInfo: TokenInfo) {\n+    if (!tokenInfo.access_token && !tokenInfo.refresh_token)\n+      throw new Error(\n+        'At least one of \"access_token\" or \"refresh_token\" properties has to be provided'\n+      )\n+  }\n+\n+  static _isTokenExpired(tokenInfo: TokenInfo): boolean {\n+    if (!tokenInfo.access_token || !tokenInfo.expires_at) return true\n+\n+    // token is expired if current time is bigger than expiration time minus some offset\n+    // NOTE: all timezones use same place of unix timestamp origin\n+    return (\n+      Date.now() >= (tokenInfo.expires_at || 0) - constants.EXPIRATION_OFFSET\n+    )\n+  }\n+\n+  _performRefreshedTokenFlow(refreshToken: ?string): Promise<any> {\n+    return this.sdkAuth.refreshTokenFlow(refreshToken)\n+  }\n+\n+  _refreshToken(oldTokenInfo: TokenInfo): Promise<any> {\n+    if (!oldTokenInfo.refresh_token)\n+      throw new Error('Property \"refresh_token\" is missing')\n+\n+    let newTokenInfo\n+    return Promise.resolve()\n+      .then(\n+        (): Promise<any> =>\n+          this._performRefreshedTokenFlow(oldTokenInfo.refresh_token)\n+      )\n+      .then(\n+        (tokenInfo: TokenInfo): void => {\n+          newTokenInfo = tokenInfo\n+          newTokenInfo.refresh_token = oldTokenInfo.refresh_token\n+\n+          return this.onTokenInfoRefreshed(newTokenInfo, oldTokenInfo)\n+        }\n+      )\n+      .then((): Promise<TokenInfo> => this.setTokenInfo(newTokenInfo))\n+  }\n+\n+  getTokenInfo(): TokenInfo {\n+    if (!this.tokenInfo) throw new Error('Property \"tokenInfo\" was not set')\n+    return this.tokenInfo\n+  }\n+\n+  setTokenInfo(tokenInfo: TokenInfo): Promise<TokenInfo> {\n+    TokenProvider._validateTokenInfo(tokenInfo)\n+\n+    this.tokenInfo = tokenInfo\n+    return Promise.resolve(this.onTokenInfoChanged(tokenInfo)).then(\n+      (): TokenInfo => tokenInfo\n+    )\n+  }\n+\n+  getToken(): Promise<any> {","path":"packages/sdk-auth/src/tokenProvider.js","position":null,"original_position":96,"commit_id":"b766567456c0a10f66c6d4fb89a090193ec7ba00","original_commit_id":"101f10e4884922baae95f61fcd18d18d190263b9","user":{"login":"junajan","id":1090382,"node_id":"MDQ6VXNlcjEwOTAzODI=","avatar_url":"https://avatars0.githubusercontent.com/u/1090382?v=4","gravatar_id":"","url":"https://api.github.com/users/junajan","html_url":"https://github.com/junajan","followers_url":"https://api.github.com/users/junajan/followers","following_url":"https://api.github.com/users/junajan/following{/other_user}","gists_url":"https://api.github.com/users/junajan/gists{/gist_id}","starred_url":"https://api.github.com/users/junajan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/junajan/subscriptions","organizations_url":"https://api.github.com/users/junajan/orgs","repos_url":"https://api.github.com/users/junajan/repos","events_url":"https://api.github.com/users/junajan/events{/privacy}","received_events_url":"https://api.github.com/users/junajan/received_events","type":"User","site_admin":false},"body":"Updated here https://github.com/commercetools/nodejs/pull/972/commits/b766567456c0a10f66c6d4fb89a090193ec7ba00#diff-8cba27ea0adf2d30bb8ff90a63194e4dR92","created_at":"2018-11-19T11:19:12Z","updated_at":"2018-11-19T11:19:13Z","html_url":"https://github.com/commercetools/nodejs/pull/972#discussion_r234581319","pull_request_url":"https://api.github.com/repos/commercetools/nodejs/pulls/972","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/commercetools/nodejs/pulls/comments/234581319"},"html":{"href":"https://github.com/commercetools/nodejs/pull/972#discussion_r234581319"},"pull_request":{"href":"https://api.github.com/repos/commercetools/nodejs/pulls/972"}},"in_reply_to_id":234219851},"pull_request":{"url":"https://api.github.com/repos/commercetools/nodejs/pulls/972","id":230521913,"node_id":"MDExOlB1bGxSZXF1ZXN0MjMwNTIxOTEz","html_url":"https://github.com/commercetools/nodejs/pull/972","diff_url":"https://github.com/commercetools/nodejs/pull/972.diff","patch_url":"https://github.com/commercetools/nodejs/pull/972.patch","issue_url":"https://api.github.com/repos/commercetools/nodejs/issues/972","number":972,"state":"open","locked":false,"title":"feat(sdk-auth): add token provider for automated token refresh","user":{"login":"junajan","id":1090382,"node_id":"MDQ6VXNlcjEwOTAzODI=","avatar_url":"https://avatars0.githubusercontent.com/u/1090382?v=4","gravatar_id":"","url":"https://api.github.com/users/junajan","html_url":"https://github.com/junajan","followers_url":"https://api.github.com/users/junajan/followers","following_url":"https://api.github.com/users/junajan/following{/other_user}","gists_url":"https://api.github.com/users/junajan/gists{/gist_id}","starred_url":"https://api.github.com/users/junajan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/junajan/subscriptions","organizations_url":"https://api.github.com/users/junajan/orgs","repos_url":"https://api.github.com/users/junajan/repos","events_url":"https://api.github.com/users/junajan/events{/privacy}","received_events_url":"https://api.github.com/users/junajan/received_events","type":"User","site_admin":false},"body":"#### Summary\r\nFixes #718 \r\n\r\n#### Description\r\nThis PR introduces new class which accepts token info and refreshes `access_token` when it gets expired.\r\n\r\n#### Todo\r\n- Tests\r\n  - [x] Unit\r\n  - [ ] Integration\r\n- [ ] Documentation\r\n- [ ] Flow annotation\r\n","created_at":"2018-11-13T15:36:54Z","updated_at":"2018-11-19T11:19:13Z","closed_at":null,"merged_at":null,"merge_commit_sha":"32515a074e437faa9c2b6bccd65b635f14cf1985","assignee":{"login":"junajan","id":1090382,"node_id":"MDQ6VXNlcjEwOTAzODI=","avatar_url":"https://avatars0.githubusercontent.com/u/1090382?v=4","gravatar_id":"","url":"https://api.github.com/users/junajan","html_url":"https://github.com/junajan","followers_url":"https://api.github.com/users/junajan/followers","following_url":"https://api.github.com/users/junajan/following{/other_user}","gists_url":"https://api.github.com/users/junajan/gists{/gist_id}","starred_url":"https://api.github.com/users/junajan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/junajan/subscriptions","organizations_url":"https://api.github.com/users/junajan/orgs","repos_url":"https://api.github.com/users/junajan/repos","events_url":"https://api.github.com/users/junajan/events{/privacy}","received_events_url":"https://api.github.com/users/junajan/received_events","type":"User","site_admin":false},"assignees":[{"login":"junajan","id":1090382,"node_id":"MDQ6VXNlcjEwOTAzODI=","avatar_url":"https://avatars0.githubusercontent.com/u/1090382?v=4","gravatar_id":"","url":"https://api.github.com/users/junajan","html_url":"https://github.com/junajan","followers_url":"https://api.github.com/users/junajan/followers","following_url":"https://api.github.com/users/junajan/following{/other_user}","gists_url":"https://api.github.com/users/junajan/gists{/gist_id}","starred_url":"https://api.github.com/users/junajan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/junajan/subscriptions","organizations_url":"https://api.github.com/users/junajan/orgs","repos_url":"https://api.github.com/users/junajan/repos","events_url":"https://api.github.com/users/junajan/events{/privacy}","received_events_url":"https://api.github.com/users/junajan/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"lauraluiz","id":1917621,"node_id":"MDQ6VXNlcjE5MTc2MjE=","avatar_url":"https://avatars2.githubusercontent.com/u/1917621?v=4","gravatar_id":"","url":"https://api.github.com/users/lauraluiz","html_url":"https://github.com/lauraluiz","followers_url":"https://api.github.com/users/lauraluiz/followers","following_url":"https://api.github.com/users/lauraluiz/following{/other_user}","gists_url":"https://api.github.com/users/lauraluiz/gists{/gist_id}","starred_url":"https://api.github.com/users/lauraluiz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lauraluiz/subscriptions","organizations_url":"https://api.github.com/users/lauraluiz/orgs","repos_url":"https://api.github.com/users/lauraluiz/repos","events_url":"https://api.github.com/users/lauraluiz/events{/privacy}","received_events_url":"https://api.github.com/users/lauraluiz/received_events","type":"User","site_admin":false},{"login":"Babanila","id":23488237,"node_id":"MDQ6VXNlcjIzNDg4MjM3","avatar_url":"https://avatars2.githubusercontent.com/u/23488237?v=4","gravatar_id":"","url":"https://api.github.com/users/Babanila","html_url":"https://github.com/Babanila","followers_url":"https://api.github.com/users/Babanila/followers","following_url":"https://api.github.com/users/Babanila/following{/other_user}","gists_url":"https://api.github.com/users/Babanila/gists{/gist_id}","starred_url":"https://api.github.com/users/Babanila/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Babanila/subscriptions","organizations_url":"https://api.github.com/users/Babanila/orgs","repos_url":"https://api.github.com/users/Babanila/repos","events_url":"https://api.github.com/users/Babanila/events{/privacy}","received_events_url":"https://api.github.com/users/Babanila/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/commercetools/nodejs/pulls/972/commits","review_comments_url":"https://api.github.com/repos/commercetools/nodejs/pulls/972/comments","review_comment_url":"https://api.github.com/repos/commercetools/nodejs/pulls/comments{/number}","comments_url":"https://api.github.com/repos/commercetools/nodejs/issues/972/comments","statuses_url":"https://api.github.com/repos/commercetools/nodejs/statuses/b766567456c0a10f66c6d4fb89a090193ec7ba00","head":{"label":"commercetools:718-token-provider","ref":"718-token-provider","sha":"b766567456c0a10f66c6d4fb89a090193ec7ba00","user":{"login":"commercetools","id":1084585,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEwODQ1ODU=","avatar_url":"https://avatars3.githubusercontent.com/u/1084585?v=4","gravatar_id":"","url":"https://api.github.com/users/commercetools","html_url":"https://github.com/commercetools","followers_url":"https://api.github.com/users/commercetools/followers","following_url":"https://api.github.com/users/commercetools/following{/other_user}","gists_url":"https://api.github.com/users/commercetools/gists{/gist_id}","starred_url":"https://api.github.com/users/commercetools/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/commercetools/subscriptions","organizations_url":"https://api.github.com/users/commercetools/orgs","repos_url":"https://api.github.com/users/commercetools/repos","events_url":"https://api.github.com/users/commercetools/events{/privacy}","received_events_url":"https://api.github.com/users/commercetools/received_events","type":"Organization","site_admin":false},"repo":{"id":70048127,"node_id":"MDEwOlJlcG9zaXRvcnk3MDA0ODEyNw==","name":"nodejs","full_name":"commercetools/nodejs","private":false,"owner":{"login":"commercetools","id":1084585,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEwODQ1ODU=","avatar_url":"https://avatars3.githubusercontent.com/u/1084585?v=4","gravatar_id":"","url":"https://api.github.com/users/commercetools","html_url":"https://github.com/commercetools","followers_url":"https://api.github.com/users/commercetools/followers","following_url":"https://api.github.com/users/commercetools/following{/other_user}","gists_url":"https://api.github.com/users/commercetools/gists{/gist_id}","starred_url":"https://api.github.com/users/commercetools/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/commercetools/subscriptions","organizations_url":"https://api.github.com/users/commercetools/orgs","repos_url":"https://api.github.com/users/commercetools/repos","events_url":"https://api.github.com/users/commercetools/events{/privacy}","received_events_url":"https://api.github.com/users/commercetools/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/commercetools/nodejs","description":"Everything related to the Node.js ecosystem for the commercetools platform.","fork":false,"url":"https://api.github.com/repos/commercetools/nodejs","forks_url":"https://api.github.com/repos/commercetools/nodejs/forks","keys_url":"https://api.github.com/repos/commercetools/nodejs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/commercetools/nodejs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/commercetools/nodejs/teams","hooks_url":"https://api.github.com/repos/commercetools/nodejs/hooks","issue_events_url":"https://api.github.com/repos/commercetools/nodejs/issues/events{/number}","events_url":"https://api.github.com/repos/commercetools/nodejs/events","assignees_url":"https://api.github.com/repos/commercetools/nodejs/assignees{/user}","branches_url":"https://api.github.com/repos/commercetools/nodejs/branches{/branch}","tags_url":"https://api.github.com/repos/commercetools/nodejs/tags","blobs_url":"https://api.github.com/repos/commercetools/nodejs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/commercetools/nodejs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/commercetools/nodejs/git/refs{/sha}","trees_url":"https://api.github.com/repos/commercetools/nodejs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/commercetools/nodejs/statuses/{sha}","languages_url":"https://api.github.com/repos/commercetools/nodejs/languages","stargazers_url":"https://api.github.com/repos/commercetools/nodejs/stargazers","contributors_url":"https://api.github.com/repos/commercetools/nodejs/contributors","subscribers_url":"https://api.github.com/repos/commercetools/nodejs/subscribers","subscription_url":"https://api.github.com/repos/commercetools/nodejs/subscription","commits_url":"https://api.github.com/repos/commercetools/nodejs/commits{/sha}","git_commits_url":"https://api.github.com/repos/commercetools/nodejs/git/commits{/sha}","comments_url":"https://api.github.com/repos/commercetools/nodejs/comments{/number}","issue_comment_url":"https://api.github.com/repos/commercetools/nodejs/issues/comments{/number}","contents_url":"https://api.github.com/repos/commercetools/nodejs/contents/{+path}","compare_url":"https://api.github.com/repos/commercetools/nodejs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/commercetools/nodejs/merges","archive_url":"https://api.github.com/repos/commercetools/nodejs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/commercetools/nodejs/downloads","issues_url":"https://api.github.com/repos/commercetools/nodejs/issues{/number}","pulls_url":"https://api.github.com/repos/commercetools/nodejs/pulls{/number}","milestones_url":"https://api.github.com/repos/commercetools/nodejs/milestones{/number}","notifications_url":"https://api.github.com/repos/commercetools/nodejs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/commercetools/nodejs/labels{/name}","releases_url":"https://api.github.com/repos/commercetools/nodejs/releases{/id}","deployments_url":"https://api.github.com/repos/commercetools/nodejs/deployments","created_at":"2016-10-05T09:53:20Z","updated_at":"2018-11-13T16:53:45Z","pushed_at":"2018-11-19T11:17:30Z","git_url":"git://github.com/commercetools/nodejs.git","ssh_url":"git@github.com:commercetools/nodejs.git","clone_url":"https://github.com/commercetools/nodejs.git","svn_url":"https://github.com/commercetools/nodejs","homepage":"https://commercetools.github.io/nodejs/","size":6199,"stargazers_count":18,"watchers_count":18,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":12,"mirror_url":null,"archived":false,"open_issues_count":29,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":12,"open_issues":29,"watchers":18,"default_branch":"master"}},"base":{"label":"commercetools:master","ref":"master","sha":"9ce98abfddac28acbd1dd6c223d06ea31315153a","user":{"login":"commercetools","id":1084585,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEwODQ1ODU=","avatar_url":"https://avatars3.githubusercontent.com/u/1084585?v=4","gravatar_id":"","url":"https://api.github.com/users/commercetools","html_url":"https://github.com/commercetools","followers_url":"https://api.github.com/users/commercetools/followers","following_url":"https://api.github.com/users/commercetools/following{/other_user}","gists_url":"https://api.github.com/users/commercetools/gists{/gist_id}","starred_url":"https://api.github.com/users/commercetools/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/commercetools/subscriptions","organizations_url":"https://api.github.com/users/commercetools/orgs","repos_url":"https://api.github.com/users/commercetools/repos","events_url":"https://api.github.com/users/commercetools/events{/privacy}","received_events_url":"https://api.github.com/users/commercetools/received_events","type":"Organization","site_admin":false},"repo":{"id":70048127,"node_id":"MDEwOlJlcG9zaXRvcnk3MDA0ODEyNw==","name":"nodejs","full_name":"commercetools/nodejs","private":false,"owner":{"login":"commercetools","id":1084585,"node_id":"MDEyOk9yZ2FuaXphdGlvbjEwODQ1ODU=","avatar_url":"https://avatars3.githubusercontent.com/u/1084585?v=4","gravatar_id":"","url":"https://api.github.com/users/commercetools","html_url":"https://github.com/commercetools","followers_url":"https://api.github.com/users/commercetools/followers","following_url":"https://api.github.com/users/commercetools/following{/other_user}","gists_url":"https://api.github.com/users/commercetools/gists{/gist_id}","starred_url":"https://api.github.com/users/commercetools/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/commercetools/subscriptions","organizations_url":"https://api.github.com/users/commercetools/orgs","repos_url":"https://api.github.com/users/commercetools/repos","events_url":"https://api.github.com/users/commercetools/events{/privacy}","received_events_url":"https://api.github.com/users/commercetools/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/commercetools/nodejs","description":"Everything related to the Node.js ecosystem for the commercetools platform.","fork":false,"url":"https://api.github.com/repos/commercetools/nodejs","forks_url":"https://api.github.com/repos/commercetools/nodejs/forks","keys_url":"https://api.github.com/repos/commercetools/nodejs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/commercetools/nodejs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/commercetools/nodejs/teams","hooks_url":"https://api.github.com/repos/commercetools/nodejs/hooks","issue_events_url":"https://api.github.com/repos/commercetools/nodejs/issues/events{/number}","events_url":"https://api.github.com/repos/commercetools/nodejs/events","assignees_url":"https://api.github.com/repos/commercetools/nodejs/assignees{/user}","branches_url":"https://api.github.com/repos/commercetools/nodejs/branches{/branch}","tags_url":"https://api.github.com/repos/commercetools/nodejs/tags","blobs_url":"https://api.github.com/repos/commercetools/nodejs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/commercetools/nodejs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/commercetools/nodejs/git/refs{/sha}","trees_url":"https://api.github.com/repos/commercetools/nodejs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/commercetools/nodejs/statuses/{sha}","languages_url":"https://api.github.com/repos/commercetools/nodejs/languages","stargazers_url":"https://api.github.com/repos/commercetools/nodejs/stargazers","contributors_url":"https://api.github.com/repos/commercetools/nodejs/contributors","subscribers_url":"https://api.github.com/repos/commercetools/nodejs/subscribers","subscription_url":"https://api.github.com/repos/commercetools/nodejs/subscription","commits_url":"https://api.github.com/repos/commercetools/nodejs/commits{/sha}","git_commits_url":"https://api.github.com/repos/commercetools/nodejs/git/commits{/sha}","comments_url":"https://api.github.com/repos/commercetools/nodejs/comments{/number}","issue_comment_url":"https://api.github.com/repos/commercetools/nodejs/issues/comments{/number}","contents_url":"https://api.github.com/repos/commercetools/nodejs/contents/{+path}","compare_url":"https://api.github.com/repos/commercetools/nodejs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/commercetools/nodejs/merges","archive_url":"https://api.github.com/repos/commercetools/nodejs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/commercetools/nodejs/downloads","issues_url":"https://api.github.com/repos/commercetools/nodejs/issues{/number}","pulls_url":"https://api.github.com/repos/commercetools/nodejs/pulls{/number}","milestones_url":"https://api.github.com/repos/commercetools/nodejs/milestones{/number}","notifications_url":"https://api.github.com/repos/commercetools/nodejs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/commercetools/nodejs/labels{/name}","releases_url":"https://api.github.com/repos/commercetools/nodejs/releases{/id}","deployments_url":"https://api.github.com/repos/commercetools/nodejs/deployments","created_at":"2016-10-05T09:53:20Z","updated_at":"2018-11-13T16:53:45Z","pushed_at":"2018-11-19T11:17:30Z","git_url":"git://github.com/commercetools/nodejs.git","ssh_url":"git@github.com:commercetools/nodejs.git","clone_url":"https://github.com/commercetools/nodejs.git","svn_url":"https://github.com/commercetools/nodejs","homepage":"https://commercetools.github.io/nodejs/","size":6199,"stargazers_count":18,"watchers_count":18,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":12,"mirror_url":null,"archived":false,"open_issues_count":29,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":12,"open_issues":29,"watchers":18,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/commercetools/nodejs/pulls/972"},"html":{"href":"https://github.com/commercetools/nodejs/pull/972"},"issue":{"href":"https://api.github.com/repos/commercetools/nodejs/issues/972"},"comments":{"href":"https://api.github.com/repos/commercetools/nodejs/issues/972/comments"},"review_comments":{"href":"https://api.github.com/repos/commercetools/nodejs/pulls/972/comments"},"review_comment":{"href":"https://api.github.com/repos/commercetools/nodejs/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/commercetools/nodejs/pulls/972/commits"},"statuses":{"href":"https://api.github.com/repos/commercetools/nodejs/statuses/b766567456c0a10f66c6d4fb89a090193ec7ba00"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"junajan"}}