{"action":"created","comment":{"url":"https://api.github.com/repos/facebook/react/pulls/comments/92460341","pull_request_review_id":12976598,"id":92460341,"diff_hunk":"@@ -0,0 +1,367 @@\n+/**\n+ * Copyright 2013-present, Facebook, Inc.\n+ * All rights reserved.\n+ *\n+ * This source code is licensed under the BSD-style license found in the\n+ * LICENSE file in the root directory of this source tree. An additional grant\n+ * of patent rights can be found in the PATENTS file in the same directory.\n+ *\n+ * @providesModule ReactNativeFiber\n+ * @flow\n+ */\n+\n+'use strict';\n+\n+import type { Fiber } from 'ReactFiber';\n+import type { ReactNodeList } from 'ReactTypes';\n+\n+const NativeMethodsMixin = require('NativeMethodsMixin');\n+const ReactControlledComponent = require('ReactControlledComponent');\n+const ReactFiberReconciler = require('ReactFiberReconciler');\n+const ReactGenericBatching = require('ReactGenericBatching');\n+const ReactInstanceMap = require('ReactInstanceMap');\n+const ReactNativeAttributePayload = require('ReactNativeAttributePayload');\n+const ReactNativeComponentTree = require('ReactNativeComponentTree');\n+const ReactNativeInjection = require('ReactNativeInjection');\n+const ReactNativeTagHandles = require('ReactNativeTagHandles');\n+const ReactNativeViewConfigRegistry = require('ReactNativeViewConfigRegistry');\n+const ReactPortal = require('ReactPortal');\n+const UIManager = require('UIManager');\n+\n+const deepFreezeAndThrowOnMutationInDev = require('deepFreezeAndThrowOnMutationInDev');\n+const findNodeHandle = require('findNodeHandle');\n+const invariant = require('invariant');\n+\n+const { precacheFiberNode, uncacheFiberNode } = ReactNativeComponentTree;\n+\n+ReactNativeInjection.inject();\n+// ReactControlledComponent.injection.injectFiberControlledHostComponent(\n+//   ReactNativeFiberComponent\n+// );\n+\n+type Container = mixed;\n+type Props = mixed;\n+type Instance = mixed;\n+type TextInstance = mixed;\n+\n+function NativeHostComponent(tag) {\n+  this._nativeTag = tag;\n+  this._children = [];\n+}\n+Object.assign(NativeHostComponent.prototype, NativeMethodsMixin);\n+\n+function recursivelyUncacheFiberNode (node) {\n+  if (typeof node === 'number') { // Leaf node (eg text)\n+    uncacheFiberNode(node);\n+  } else {\n+    uncacheFiberNode(node._nativeTag);\n+\n+    node._children.forEach(recursivelyUncacheFiberNode);\n+  }\n+}\n+\n+const NativeRenderer = ReactFiberReconciler({\n+\n+  appendChild(\n+    parentInstance : Instance | Container,\n+    child : Instance | TextInstance\n+  ) : void {\n+    if (typeof parentInstance === 'number') {\n+      // Root container\n+      UIManager.setChildren(\n+        parentInstance, // containerTag\n+        [child._nativeTag] // reactTags\n+      );\n+    } else {\n+      parentInstance._children.push(child);\n+\n+      UIManager.manageChildren(\n+        parentInstance._nativeTag, // containerTag\n+        [], // moveFromIndices\n+        [], // moveToIndices\n+        [child._nativeTag], // addChildReactTags\n+        [parentInstance._children.length - 1], // addAtIndices\n+        [], // removeAtIndices\n+      );\n+    }\n+  },\n+\n+  appendInitialChild(parentInstance : Instance, child : Instance | TextInstance) : void {\n+    if (typeof child === 'number') {\n+      parentInstance._children.push(child);\n+    } else {\n+      parentInstance._children.push(child);\n+    }\n+  },\n+\n+  commitTextUpdate(\n+    textInstance : TextInstance,\n+    oldText : string,\n+    newText : string\n+  ) : void {\n+    UIManager.updateView(\n+      textInstance, // reactTag\n+      'RCTRawText', // viewName\n+      {text: newText}, // props\n+    );\n+  },\n+\n+  commitUpdate(\n+    instance : Instance,\n+    oldProps : Props,\n+    newProps : Props,\n+    rootContainerInstance : Object,\n+    internalInstanceHandle : Object\n+  ) : void {\n+    precacheFiberNode(internalInstanceHandle, instance._nativeTag);\n+\n+    const updatePayload = ReactNativeAttributePayload.diff(\n+      oldProps,\n+      newProps,\n+      instance.viewConfig.validAttributes\n+    );\n+\n+    UIManager.updateView(\n+      instance._nativeTag, // reactTag\n+      instance.viewConfig.uiViewClassName, // viewName\n+      updatePayload, // props\n+    );\n+  },\n+\n+  createInstance(\n+    type : string,\n+    props : Props,\n+    rootContainerInstance : Container,\n+    hostContext : string | null,\n+    internalInstanceHandle : Object\n+  ) : Instance {\n+    const tag = ReactNativeTagHandles.allocateTag();\n+    const viewConfig = ReactNativeViewConfigRegistry.get(type);\n+\n+    if (__DEV__) {\n+      for (let key in viewConfig.validAttributes) {\n+        if (props.hasOwnProperty(key)) {\n+          deepFreezeAndThrowOnMutationInDev(props[key]);\n+        }\n+      }\n+    }\n+\n+    const updatePayload = ReactNativeAttributePayload.create(\n+      props,\n+      viewConfig.validAttributes\n+    );\n+\n+    UIManager.createView(\n+      tag, // reactTag\n+      viewConfig.uiViewClassName, // viewName\n+      rootContainerInstance, // rootTag\n+      updatePayload // props\n+    );\n+\n+    const component = new NativeHostComponent(tag);\n+    component.viewConfig = viewConfig;\n+\n+    precacheFiberNode(internalInstanceHandle, tag);\n+\n+    return component;\n+  },\n+\n+  createTextInstance(\n+    text : string,\n+    rootContainerInstance : Container,\n+    internalInstanceHandle : Object,\n+  ) : TextInstance {\n+    const tag = ReactNativeTagHandles.allocateTag();\n+\n+    UIManager.createView(\n+      tag, // reactTag\n+      'RCTRawText', // viewName\n+      rootContainerInstance, // rootTag\n+      {text: text} // props\n+    );\n+\n+    precacheFiberNode(internalInstanceHandle, tag);\n+\n+    return tag;\n+  },\n+\n+  finalizeInitialChildren(\n+    parentInstance : Instance,\n+    props : Props,\n+    rootContainerInstance : Container,\n+  ) : void {\n+    // Map from child objects to native tags.\n+    // Either way we need to pass a copy of the Array to prevent it from being frozen.\n+    const nativeTags = parentInstance._children.map(\n+      (child) => typeof child === 'number'\n+        ? child // Leaf node (eg text)\n+        : child._nativeTag\n+    );\n+\n+    UIManager.setChildren(\n+      parentInstance._nativeTag, // containerTag\n+      nativeTags // reactTags\n+    );\n+  },\n+\n+  getChildHostContext(\n+    parentHostContext : string | null,\n+    type : string\n+  ) {\n+    return parentHostContext;\n+  },\n+\n+  insertBefore(\n+    parentInstance : Instance | Container,\n+    child : Instance | TextInstance,\n+    beforeChild : Instance | TextInstance\n+  ) : void {\n+    const beforeChildIndex = parentInstance._children.indexOf(beforeChild);\n+    const index = parentInstance._children.indexOf(child);\n+\n+    // Move existing child or add new child?\n+    if (index >= 0) {\n+      parentInstance._children.splice(index,1);\n+      parentInstance._children.splice(beforeChildIndex,0,child);\n+\n+      UIManager.manageChildren(\n+        parentInstance._nativeTag, // containerID\n+        [index], // moveFromIndices\n+        [beforeChildIndex], // moveToIndices\n+        [], // addChildReactTags\n+        [], // addAtIndices\n+        [], // removeAtIndices\n+      );\n+    } else {\n+      parentInstance._children.splice(beforeChildIndex,0,child);\n+\n+      UIManager.manageChildren(\n+        parentInstance._nativeTag, // containerID\n+        [], // moveFromIndices\n+        [], // moveToIndices\n+        [child._nativeTag], // addChildReactTags\n+        [beforeChildIndex], // addAtIndices\n+        [], // removeAtIndices\n+      );\n+    }\n+  },\n+\n+  prepareForCommit() : void {\n+    // Noop?\n+  },\n+\n+  prepareUpdate(\n+    instance : Instance,\n+    oldProps : Props,\n+    newProps : Props\n+  ) : boolean {\n+    return true;\n+  },\n+\n+  removeChild(parentInstance : Instance | Container, child : Instance | TextInstance) : void {\n+    recursivelyUncacheFiberNode(child);\n+\n+    if (typeof parentInstance === 'number') {\n+      UIManager.manageChildren(\n+        parentInstance, // containerID\n+        [], // moveFromIndices\n+        [], // moveToIndices\n+        [], // addChildReactTags\n+        [], // addAtIndices\n+        [0], // removeAtIndices\n+      );\n+    } else {\n+      const index = parentInstance._children.indexOf(child);\n+\n+      parentInstance._children.splice(index, 1);\n+\n+      UIManager.manageChildren(\n+        parentInstance._nativeTag, // containerID\n+        [], // moveFromIndices\n+        [], // moveToIndices\n+        [], // addChildReactTags\n+        [], // addAtIndices\n+        [index], // removeAtIndices\n+      );\n+    }\n+  },\n+\n+  resetAfterCommit() : void {\n+    // Noop?\n+  },\n+\n+  resetTextContent(instance : Instance) : void {\n+    // Noop?\n+  },\n+\n+  scheduleAnimationCallback: window.requestAnimationFrame,\n+\n+  scheduleDeferredCallback: window.requestIdleCallback,\n+\n+  shouldSetTextContent(props : Props) : boolean {\n+    return false;","path":"src/renderers/native/ReactNativeFiber.js","position":null,"original_position":302,"commit_id":"abacd2fe5f4e693481bd38ea270dad5ff1bbe573","original_commit_id":"3d11b18e963dd8f07e2c17e1a6376d272ef16a42","user":{"login":"bvaughn","id":29597,"avatar_url":"https://avatars.githubusercontent.com/u/29597?v=3","gravatar_id":"","url":"https://api.github.com/users/bvaughn","html_url":"https://github.com/bvaughn","followers_url":"https://api.github.com/users/bvaughn/followers","following_url":"https://api.github.com/users/bvaughn/following{/other_user}","gists_url":"https://api.github.com/users/bvaughn/gists{/gist_id}","starred_url":"https://api.github.com/users/bvaughn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bvaughn/subscriptions","organizations_url":"https://api.github.com/users/bvaughn/orgs","repos_url":"https://api.github.com/users/bvaughn/repos","events_url":"https://api.github.com/users/bvaughn/events{/privacy}","received_events_url":"https://api.github.com/users/bvaughn/received_events","type":"User","site_admin":false},"body":"Right, I understand. But that implementation wouldn't reduce the number of (native) _views_ created, just the number of Fibers. And it's not clear to me that the additional complexity added to the renderer's `createInstance` (checking if type is `RCTText` and children are stringifyable) is a worthwhile trade off. So I thought to err on the side of a simpler renderer, at least for this initial pass.","created_at":"2016-12-14T18:43:52Z","updated_at":"2016-12-14T18:43:52Z","html_url":"https://github.com/facebook/react/pull/8560#discussion_r92460341","pull_request_url":"https://api.github.com/repos/facebook/react/pulls/8560","_links":{"self":{"href":"https://api.github.com/repos/facebook/react/pulls/comments/92460341"},"html":{"href":"https://github.com/facebook/react/pull/8560#discussion_r92460341"},"pull_request":{"href":"https://api.github.com/repos/facebook/react/pulls/8560"}}},"pull_request":{"url":"https://api.github.com/repos/facebook/react/pulls/8560","id":97654033,"html_url":"https://github.com/facebook/react/pull/8560","diff_url":"https://github.com/facebook/react/pull/8560.diff","patch_url":"https://github.com/facebook/react/pull/8560.patch","issue_url":"https://api.github.com/repos/facebook/react/issues/8560","number":8560,"state":"open","locked":false,"title":"ReactNative fiber renderer","user":{"login":"bvaughn","id":29597,"avatar_url":"https://avatars.githubusercontent.com/u/29597?v=3","gravatar_id":"","url":"https://api.github.com/users/bvaughn","html_url":"https://github.com/bvaughn","followers_url":"https://api.github.com/users/bvaughn/followers","following_url":"https://api.github.com/users/bvaughn/following{/other_user}","gists_url":"https://api.github.com/users/bvaughn/gists{/gist_id}","starred_url":"https://api.github.com/users/bvaughn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bvaughn/subscriptions","organizations_url":"https://api.github.com/users/bvaughn/orgs","repos_url":"https://api.github.com/users/bvaughn/repos","events_url":"https://api.github.com/users/bvaughn/events{/privacy}","received_events_url":"https://api.github.com/users/bvaughn/received_events","type":"User","site_admin":false},"body":"This PR adds a new, fiber-based renderer for native dubbed `ReactNativeFiber`. Existing native renderer has been renamed to `ReactNativeStack` and a new flags file `ReactNativeFeatureFlags` has been added to switch between the 2 renderers. (Other than injecting a `findNodeHandle` strategy `ReactNativeStack` has not been modified.)\r\n\r\nI've done some basic smoke-testings with Android and iOS and the fiber renderer seems to work well with the following applications: Catalyst, Ads Manager, and Facebook \"Events\" tab.\r\n\r\nI have also added/enhanced Flow types for `UIManager` with this PR. If it's desirable for that work to be split into a separate PR, let me know and I can break it off.\r\n\r\n## Known issues\r\n\r\n* The inspector does not work with the Fiber-based renderer. The react-native `InspectorUtils.getOwnerHierarchy` reaches into stack internals in a way that is not Fiber-compatible and causes a runtime error.\r\n* I've observed a couple of context-related errors in Ads Manager that seem to be caused by the item \"_top-level context push/pop isn't properly matched up_\" mentioned on the umbrella task #7925 relates to this. (I've tested a few hacks on the context-related code and the Ads Manager issues I observed no longer occur.)\r\n\r\n## Open question: How should we handle children?\r\n\r\n`ReactNativeFiber` currently creates wrapper objects to bundle each native tag with its children and `viewConfig`. This creates one wrapper object per native view which may be undesirable. We _could_ remove the wrapper object but we would need to pass some additional information to the `HostConfig` methods:\r\n* ~~Pass `type` to the following methods: `commitUpdate`. (This is necessary to get the `viewConfig` for `validAttributes` and `uiViewClassName`.)~~ **Edit** Already done via PR #8563.\r\n* Pass `children` to the following methods: `appendChild`, `finalizeInitialChildren`, `insertBefore`, `removeChild`. (This is necessary to add/set/move/remove children.)\r\n* Provide a hook to recursively call remove children (so that we can uncache all child nodes). (Without this the `RCTUIManager` errors with \"_Invalid view set to be the JS responder_\".)\r\n\r\nAs for tracking the `children` array there are 2 options to consider:\r\n\r\n### Option 1: Manage index information in Fiber\r\n\r\nFiber has enough information to pass the additional params to the `HostConfig` but it would need to calculate and/or store the child information in order to do so. The benefit provided to `ReactNativeFiber` may be outweighed by Fiber having to do this for other renderers that don't require the information.\r\n\r\n### Option 2: Update native bridge\r\n\r\nA better solution to this issue might be to change the iOS and Android bridges to move away from the index-based add/remove methods.\r\n\r\nFor example, iOS provides methods that could be used instead of our current index-based ones:\r\n* [`addSubview`](https://developer.apple.com/reference/uikit/uiview/1622616-addsubview) for `appendChild`\r\n* [`insertSubview(_:aboveSubview:)`](https://developer.apple.com/reference/uikit/uiview/1622570-inseratsubview) for `insertBefore`\r\n* [`removeFromSuperview`](https://developer.apple.com/reference/uikit/uiview/1622421-removefromsuperview) for `removeChild`\r\n\r\nThis would also need to be supported on the Android side, perhaps with the following methods:\r\n* [`addView`](https://developer.android.com/reference/android/view/ViewManager.html#addView) for `appendChild`\r\n* [`View` `getZ` and `setZ` methods](https://developer.android.com/reference/android/view/View.html#Z) for `insertBefore` (_should verify with someone more familiar with Android_)\r\n* [`removeView`](https://developer.android.com/reference/android/view/ViewManager.html#removeView) for `removeChild`","created_at":"2016-12-12T23:10:02Z","updated_at":"2016-12-14T18:43:52Z","closed_at":null,"merged_at":null,"merge_commit_sha":"02d4ae921a5a99c7348c3bc1099f3f1323a9bfab","assignee":{"login":"spicyj","id":6820,"avatar_url":"https://avatars.githubusercontent.com/u/6820?v=3","gravatar_id":"","url":"https://api.github.com/users/spicyj","html_url":"https://github.com/spicyj","followers_url":"https://api.github.com/users/spicyj/followers","following_url":"https://api.github.com/users/spicyj/following{/other_user}","gists_url":"https://api.github.com/users/spicyj/gists{/gist_id}","starred_url":"https://api.github.com/users/spicyj/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spicyj/subscriptions","organizations_url":"https://api.github.com/users/spicyj/orgs","repos_url":"https://api.github.com/users/spicyj/repos","events_url":"https://api.github.com/users/spicyj/events{/privacy}","received_events_url":"https://api.github.com/users/spicyj/received_events","type":"User","site_admin":false},"assignees":[{"login":"spicyj","id":6820,"avatar_url":"https://avatars.githubusercontent.com/u/6820?v=3","gravatar_id":"","url":"https://api.github.com/users/spicyj","html_url":"https://github.com/spicyj","followers_url":"https://api.github.com/users/spicyj/followers","following_url":"https://api.github.com/users/spicyj/following{/other_user}","gists_url":"https://api.github.com/users/spicyj/gists{/gist_id}","starred_url":"https://api.github.com/users/spicyj/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spicyj/subscriptions","organizations_url":"https://api.github.com/users/spicyj/orgs","repos_url":"https://api.github.com/users/spicyj/repos","events_url":"https://api.github.com/users/spicyj/events{/privacy}","received_events_url":"https://api.github.com/users/spicyj/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/facebook/react/pulls/8560/commits","review_comments_url":"https://api.github.com/repos/facebook/react/pulls/8560/comments","review_comment_url":"https://api.github.com/repos/facebook/react/pulls/comments{/number}","comments_url":"https://api.github.com/repos/facebook/react/issues/8560/comments","statuses_url":"https://api.github.com/repos/facebook/react/statuses/abacd2fe5f4e693481bd38ea270dad5ff1bbe573","head":{"label":"bvaughn:react-native-fiber","ref":"react-native-fiber","sha":"abacd2fe5f4e693481bd38ea270dad5ff1bbe573","user":{"login":"bvaughn","id":29597,"avatar_url":"https://avatars.githubusercontent.com/u/29597?v=3","gravatar_id":"","url":"https://api.github.com/users/bvaughn","html_url":"https://github.com/bvaughn","followers_url":"https://api.github.com/users/bvaughn/followers","following_url":"https://api.github.com/users/bvaughn/following{/other_user}","gists_url":"https://api.github.com/users/bvaughn/gists{/gist_id}","starred_url":"https://api.github.com/users/bvaughn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bvaughn/subscriptions","organizations_url":"https://api.github.com/users/bvaughn/orgs","repos_url":"https://api.github.com/users/bvaughn/repos","events_url":"https://api.github.com/users/bvaughn/events{/privacy}","received_events_url":"https://api.github.com/users/bvaughn/received_events","type":"User","site_admin":false},"repo":{"id":74410855,"name":"react","full_name":"bvaughn/react","owner":{"login":"bvaughn","id":29597,"avatar_url":"https://avatars.githubusercontent.com/u/29597?v=3","gravatar_id":"","url":"https://api.github.com/users/bvaughn","html_url":"https://github.com/bvaughn","followers_url":"https://api.github.com/users/bvaughn/followers","following_url":"https://api.github.com/users/bvaughn/following{/other_user}","gists_url":"https://api.github.com/users/bvaughn/gists{/gist_id}","starred_url":"https://api.github.com/users/bvaughn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bvaughn/subscriptions","organizations_url":"https://api.github.com/users/bvaughn/orgs","repos_url":"https://api.github.com/users/bvaughn/repos","events_url":"https://api.github.com/users/bvaughn/events{/privacy}","received_events_url":"https://api.github.com/users/bvaughn/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/bvaughn/react","description":"A declarative, efficient, and flexible JavaScript library for building user interfaces.","fork":true,"url":"https://api.github.com/repos/bvaughn/react","forks_url":"https://api.github.com/repos/bvaughn/react/forks","keys_url":"https://api.github.com/repos/bvaughn/react/keys{/key_id}","collaborators_url":"https://api.github.com/repos/bvaughn/react/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/bvaughn/react/teams","hooks_url":"https://api.github.com/repos/bvaughn/react/hooks","issue_events_url":"https://api.github.com/repos/bvaughn/react/issues/events{/number}","events_url":"https://api.github.com/repos/bvaughn/react/events","assignees_url":"https://api.github.com/repos/bvaughn/react/assignees{/user}","branches_url":"https://api.github.com/repos/bvaughn/react/branches{/branch}","tags_url":"https://api.github.com/repos/bvaughn/react/tags","blobs_url":"https://api.github.com/repos/bvaughn/react/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/bvaughn/react/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/bvaughn/react/git/refs{/sha}","trees_url":"https://api.github.com/repos/bvaughn/react/git/trees{/sha}","statuses_url":"https://api.github.com/repos/bvaughn/react/statuses/{sha}","languages_url":"https://api.github.com/repos/bvaughn/react/languages","stargazers_url":"https://api.github.com/repos/bvaughn/react/stargazers","contributors_url":"https://api.github.com/repos/bvaughn/react/contributors","subscribers_url":"https://api.github.com/repos/bvaughn/react/subscribers","subscription_url":"https://api.github.com/repos/bvaughn/react/subscription","commits_url":"https://api.github.com/repos/bvaughn/react/commits{/sha}","git_commits_url":"https://api.github.com/repos/bvaughn/react/git/commits{/sha}","comments_url":"https://api.github.com/repos/bvaughn/react/comments{/number}","issue_comment_url":"https://api.github.com/repos/bvaughn/react/issues/comments{/number}","contents_url":"https://api.github.com/repos/bvaughn/react/contents/{+path}","compare_url":"https://api.github.com/repos/bvaughn/react/compare/{base}...{head}","merges_url":"https://api.github.com/repos/bvaughn/react/merges","archive_url":"https://api.github.com/repos/bvaughn/react/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/bvaughn/react/downloads","issues_url":"https://api.github.com/repos/bvaughn/react/issues{/number}","pulls_url":"https://api.github.com/repos/bvaughn/react/pulls{/number}","milestones_url":"https://api.github.com/repos/bvaughn/react/milestones{/number}","notifications_url":"https://api.github.com/repos/bvaughn/react/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/bvaughn/react/labels{/name}","releases_url":"https://api.github.com/repos/bvaughn/react/releases{/id}","deployments_url":"https://api.github.com/repos/bvaughn/react/deployments","created_at":"2016-11-21T22:18:38Z","updated_at":"2016-11-21T22:18:45Z","pushed_at":"2016-12-14T06:27:00Z","git_url":"git://github.com/bvaughn/react.git","ssh_url":"git@github.com:bvaughn/react.git","clone_url":"https://github.com/bvaughn/react.git","svn_url":"https://github.com/bvaughn/react","homepage":"https://facebook.github.io/react/","size":110519,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"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":"facebook:master","ref":"master","sha":"3def431543f9ea9e872ff98966c53a7f00f292e9","user":{"login":"facebook","id":69631,"avatar_url":"https://avatars.githubusercontent.com/u/69631?v=3","gravatar_id":"","url":"https://api.github.com/users/facebook","html_url":"https://github.com/facebook","followers_url":"https://api.github.com/users/facebook/followers","following_url":"https://api.github.com/users/facebook/following{/other_user}","gists_url":"https://api.github.com/users/facebook/gists{/gist_id}","starred_url":"https://api.github.com/users/facebook/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/facebook/subscriptions","organizations_url":"https://api.github.com/users/facebook/orgs","repos_url":"https://api.github.com/users/facebook/repos","events_url":"https://api.github.com/users/facebook/events{/privacy}","received_events_url":"https://api.github.com/users/facebook/received_events","type":"Organization","site_admin":false},"repo":{"id":10270250,"name":"react","full_name":"facebook/react","owner":{"login":"facebook","id":69631,"avatar_url":"https://avatars.githubusercontent.com/u/69631?v=3","gravatar_id":"","url":"https://api.github.com/users/facebook","html_url":"https://github.com/facebook","followers_url":"https://api.github.com/users/facebook/followers","following_url":"https://api.github.com/users/facebook/following{/other_user}","gists_url":"https://api.github.com/users/facebook/gists{/gist_id}","starred_url":"https://api.github.com/users/facebook/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/facebook/subscriptions","organizations_url":"https://api.github.com/users/facebook/orgs","repos_url":"https://api.github.com/users/facebook/repos","events_url":"https://api.github.com/users/facebook/events{/privacy}","received_events_url":"https://api.github.com/users/facebook/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/facebook/react","description":"A declarative, efficient, and flexible JavaScript library for building user interfaces.","fork":false,"url":"https://api.github.com/repos/facebook/react","forks_url":"https://api.github.com/repos/facebook/react/forks","keys_url":"https://api.github.com/repos/facebook/react/keys{/key_id}","collaborators_url":"https://api.github.com/repos/facebook/react/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/facebook/react/teams","hooks_url":"https://api.github.com/repos/facebook/react/hooks","issue_events_url":"https://api.github.com/repos/facebook/react/issues/events{/number}","events_url":"https://api.github.com/repos/facebook/react/events","assignees_url":"https://api.github.com/repos/facebook/react/assignees{/user}","branches_url":"https://api.github.com/repos/facebook/react/branches{/branch}","tags_url":"https://api.github.com/repos/facebook/react/tags","blobs_url":"https://api.github.com/repos/facebook/react/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/facebook/react/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/facebook/react/git/refs{/sha}","trees_url":"https://api.github.com/repos/facebook/react/git/trees{/sha}","statuses_url":"https://api.github.com/repos/facebook/react/statuses/{sha}","languages_url":"https://api.github.com/repos/facebook/react/languages","stargazers_url":"https://api.github.com/repos/facebook/react/stargazers","contributors_url":"https://api.github.com/repos/facebook/react/contributors","subscribers_url":"https://api.github.com/repos/facebook/react/subscribers","subscription_url":"https://api.github.com/repos/facebook/react/subscription","commits_url":"https://api.github.com/repos/facebook/react/commits{/sha}","git_commits_url":"https://api.github.com/repos/facebook/react/git/commits{/sha}","comments_url":"https://api.github.com/repos/facebook/react/comments{/number}","issue_comment_url":"https://api.github.com/repos/facebook/react/issues/comments{/number}","contents_url":"https://api.github.com/repos/facebook/react/contents/{+path}","compare_url":"https://api.github.com/repos/facebook/react/compare/{base}...{head}","merges_url":"https://api.github.com/repos/facebook/react/merges","archive_url":"https://api.github.com/repos/facebook/react/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/facebook/react/downloads","issues_url":"https://api.github.com/repos/facebook/react/issues{/number}","pulls_url":"https://api.github.com/repos/facebook/react/pulls{/number}","milestones_url":"https://api.github.com/repos/facebook/react/milestones{/number}","notifications_url":"https://api.github.com/repos/facebook/react/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/facebook/react/labels{/name}","releases_url":"https://api.github.com/repos/facebook/react/releases{/id}","deployments_url":"https://api.github.com/repos/facebook/react/deployments","created_at":"2013-05-24T16:15:54Z","updated_at":"2016-12-14T18:17:08Z","pushed_at":"2016-12-14T18:29:55Z","git_url":"git://github.com/facebook/react.git","ssh_url":"git@github.com:facebook/react.git","clone_url":"https://github.com/facebook/react.git","svn_url":"https://github.com/facebook/react","homepage":"https://facebook.github.io/react/","size":111143,"stargazers_count":55750,"watchers_count":55750,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":10044,"mirror_url":null,"open_issues_count":648,"forks":10044,"open_issues":648,"watchers":55750,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/facebook/react/pulls/8560"},"html":{"href":"https://github.com/facebook/react/pull/8560"},"issue":{"href":"https://api.github.com/repos/facebook/react/issues/8560"},"comments":{"href":"https://api.github.com/repos/facebook/react/issues/8560/comments"},"review_comments":{"href":"https://api.github.com/repos/facebook/react/pulls/8560/comments"},"review_comment":{"href":"https://api.github.com/repos/facebook/react/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/facebook/react/pulls/8560/commits"},"statuses":{"href":"https://api.github.com/repos/facebook/react/statuses/abacd2fe5f4e693481bd38ea270dad5ff1bbe573"}}}}
{"actor":{"display_login":"bvaughn"}}