{"action":"created","comment":{"url":"https://api.github.com/repos/enactjs/enact/pulls/comments/187376316","pull_request_review_id":119144775,"id":187376316,"diff_hunk":"@@ -0,0 +1,297 @@\n+import {forward} from '@enact/core/handle';\n+import ForwardRef from '@enact/ui/ForwardRef';\n+import {Media, getKeyFromSource} from '@enact/ui/Media';\n+import Slottable from '@enact/ui/Slottable';\n+import compose from 'ramda/src/compose';\n+import React from 'react';\n+\n+import css from './VideoPlayer.less';\n+\n+import PropTypes from 'prop-types';\n+\n+/**\n+ * Adds support for preloading a video source for `VideoPlayer`.\n+ *\n+ * @class VideoBase\n+ * @memberof moonstone/VideoPlayer\n+ * @ui\n+ * @private\n+ */\n+const VideoBase = class extends React.Component {\n+\tstatic displayName = 'Video'\n+\n+\tstatic propTypes = /** @lends moonstone/VideoPlayer.Video.prototype */ {\n+\n+\t\t/**\n+\t\t * Video component to use. The default (`'video'`) renders an `HTMLVideoElement`. Custom\n+\t\t * video components must have a similar API structure, exposing the following APIs:\n+\t\t *\n+\t\t * Properties:\n+\t\t * * `currentTime` {Number} - Playback index of the media in seconds\n+\t\t * * `duration` {Number} - Media's entire duration in seconds\n+\t\t * * `error` {Boolean} - `true` if video playback has errored.\n+\t\t * * `loading` {Boolean} - `true` if video playback is loading.\n+\t\t * * `paused` {Boolean} - Playing vs paused state. `true` means the media is paused\n+\t\t * * `playbackRate` {Number} - Current playback rate, as a number\n+\t\t * * `proportionLoaded` {Number} - A value between `0` and `1`\n+\t\t *\trepresenting the proportion of the media that has loaded\n+\t\t * * `proportionPlayed` {Number} - A value between `0` and `1` representing the\n+\t\t *\tproportion of the media that has already been shown\n+\t\t *\n+\t\t * Methods:\n+\t\t * * `play()` - play video\n+\t\t * * `pause()` - pause video\n+\t\t * * `load()` - load video\n+\t\t *\n+\t\t * The [`source`]{@link moonstone/VideoPlayer.VideoBase.source} property is passed to\n+\t\t * the video component as a child node.\n+\t\t *\n+\t\t * @type {Component}\n+\t\t * @default 'video'\n+\t\t * @public\n+\t\t */\n+\t\tmediaComponent: PropTypes.oneOfType([PropTypes.string, PropTypes.func, PropTypes.element]),\n+\n+\t\t/**\n+\t\t * Disable automatically playing the video after it has loaded\n+\t\t *\n+\t\t * @type {Boolean}\n+\t\t * @default false\n+\t\t * @public\n+\t\t */\n+\t\tnoAutoPlay: PropTypes.bool,\n+\n+\t\t/**\n+\t\t * The video source to be preloaded. Expects a `<source>` node.\n+\t\t *\n+\t\t * @type {String|Node}\n+\t\t * @public\n+\t\t */\n+\t\tpreloadSource:  PropTypes.node,\n+\n+\t\t/**\n+\t\t * Called with a reference to the active [Media]{@link ui/Media.Media} component\n+\t\t *\n+\t\t * @type {Function}\n+\t\t * @private\n+\t\t */\n+\t\tsetMedia: PropTypes.func,\n+\n+\t\t/**\n+\t\t * The video source to be played.\n+\t\t *\n+\t\t * Any children `<source>` elements will be sent directly to the `mediaComponent` as video\n+\t\t * sources.\n+\t\t *\n+\t\t * See: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/source\n+\t\t *\n+\t\t * @type {Node}\n+\t\t * @public\n+\t\t */\n+\t\tsource: PropTypes.node\n+\t}\n+\n+\tstatic defaultProps = {\n+\t\tmediaComponent: 'video'\n+\t}\n+\n+\tconstructor (props) {\n+\t\tsuper(props);\n+\t\tthis.isPlayerMounted = false;\n+\n+\t\tthis.loaded = {\n+\t\t\tvideo: false,\n+\t\t\tpreload: false\n+\t\t};\n+\t}\n+\n+\tcomponentDidMount () {\n+\t\tthis.isPlayerMounted = true;\n+\t\tthis.setMedia();\n+\t}\n+\n+\tcomponentDidUpdate (prevProps) {\n+\t\tconst {source, preloadSource} = this.props;\n+\t\tconst {source: prevSource, preloadSource: prevPreloadSource} = prevProps;\n+\n+\t\tconst key = getKeyFromSource(source);\n+\t\tconst prevKey = getKeyFromSource(prevSource);\n+\t\tconst preloadKey = getKeyFromSource(preloadSource);\n+\t\tconst prevPreloadKey = getKeyFromSource(prevPreloadSource);\n+\n+\t\t// if there's source and it has changed and it's not the prior preloaded source\n+\t\tif (source && key !== prevKey) {\n+\t\t\t// if it wasn't the preload key\n+\t\t\tif (key !== prevPreloadKey) {\n+\t\t\t\t// flag it as unloaded\n+\t\t\t\tthis.loaded.video = false;\n+\t\t\t} else {\n+\t\t\t\t// if the preload video is switched to the current, try to play it now because it\n+\t\t\t\t// won't fire an onLoadStart events since it has already loaded.\n+\t\t\t\tthis.autoPlay();\n+\t\t\t}\n+\t\t}\n+\n+\t\tif (preloadSource && preloadKey !== prevPreloadKey) {\n+\t\t\t// flag it as unloaded (if its not the same as source) and load it\n+\t\t\tthis.loaded.preload = preloadKey === key;\n+\n+\t\t\t// In the case that the previous source equalled the previous preload (causing the\n+\t\t\t// preload video node to not be created) and then the preload source was changed, we\n+\t\t\t// need to guard against accessing the preloadVideo node.\n+\t\t\tif (this.preloadVideo) {\n+\t\t\t\tthis.preloadVideo.load();\n+\t\t\t}\n+\t\t}\n+\n+\t\tif (this.props.setMedia !== prevProps.setMedia) {\n+\t\t\tthis.clearMedia(prevProps);\n+\t\t\tthis.setMedia();\n+\t\t}\n+\t}\n+\n+\tcomponentWillUnmount () {\n+\t\tthis.clearMedia();\n+\t}\n+\n+\tcanPlay () {\n+\t\treturn this.isPlayerMounted && this.loaded.video && (\n+\t\t\t// video can play if there isn't a preloaded source or there is and it has loaded\n+\t\t\t!this.props.preloadSource || this.loaded.preload\n+\t\t);\n+\t}\n+\n+\tclearMedia ({setMedia} = this.props) {\n+\t\tif (setMedia) {\n+\t\t\tsetMedia(null);\n+\t\t}\n+\t}\n+\n+\tsetMedia ({setMedia} = this.props) {\n+\t\tif (setMedia) {\n+\t\t\tsetMedia(this.video);\n+\t\t}\n+\t}\n+\n+\tautoPlay () {\n+\t\tif (this.props.noAutoPlay || !this.canPlay()) return;\n+\n+\t\tthis.video.play();\n+\n+\t\tforward('onLoadStart', this.loadStartEvent, this.props);","path":"packages/moonstone/VideoPlayer/Video.js","position":181,"original_position":181,"commit_id":"c5020e3b08e6eee00c42ecdf586e20f0c911b7ab","original_commit_id":"c5020e3b08e6eee00c42ecdf586e20f0c911b7ab","user":{"login":"ryanjduffy","id":788456,"avatar_url":"https://avatars3.githubusercontent.com/u/788456?v=4","gravatar_id":"","url":"https://api.github.com/users/ryanjduffy","html_url":"https://github.com/ryanjduffy","followers_url":"https://api.github.com/users/ryanjduffy/followers","following_url":"https://api.github.com/users/ryanjduffy/following{/other_user}","gists_url":"https://api.github.com/users/ryanjduffy/gists{/gist_id}","starred_url":"https://api.github.com/users/ryanjduffy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ryanjduffy/subscriptions","organizations_url":"https://api.github.com/users/ryanjduffy/orgs","repos_url":"https://api.github.com/users/ryanjduffy/repos","events_url":"https://api.github.com/users/ryanjduffy/events{/privacy}","received_events_url":"https://api.github.com/users/ryanjduffy/received_events","type":"User","site_admin":false},"body":"I don't think that will happen. If the preload video fires `onLoadStart` first, `canPlay` will prevent this line from being reached because `this.loaded.video` will be `false`. If the video fires `onLoadStart` first, its event will be cached in `loadStartEvent` and will be forwarded when the preload video fires `onLoadStart`.\r\n\r\nDo you read it the same way?","created_at":"2018-05-10T16:01:37Z","updated_at":"2018-05-10T16:01:38Z","html_url":"https://github.com/enactjs/enact/pull/1626#discussion_r187376316","pull_request_url":"https://api.github.com/repos/enactjs/enact/pulls/1626","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/enactjs/enact/pulls/comments/187376316"},"html":{"href":"https://github.com/enactjs/enact/pull/1626#discussion_r187376316"},"pull_request":{"href":"https://api.github.com/repos/enactjs/enact/pulls/1626"}},"in_reply_to_id":187216462},"pull_request":{"url":"https://api.github.com/repos/enactjs/enact/pulls/1626","id":186090827,"html_url":"https://github.com/enactjs/enact/pull/1626","diff_url":"https://github.com/enactjs/enact/pull/1626.diff","patch_url":"https://github.com/enactjs/enact/pull/1626.patch","issue_url":"https://api.github.com/repos/enactjs/enact/issues/1626","number":1626,"state":"open","locked":false,"title":"ENYO-5244: Add Video component for preload support","user":{"login":"ryanjduffy","id":788456,"avatar_url":"https://avatars3.githubusercontent.com/u/788456?v=4","gravatar_id":"","url":"https://api.github.com/users/ryanjduffy","html_url":"https://github.com/ryanjduffy","followers_url":"https://api.github.com/users/ryanjduffy/followers","following_url":"https://api.github.com/users/ryanjduffy/following{/other_user}","gists_url":"https://api.github.com/users/ryanjduffy/gists{/gist_id}","starred_url":"https://api.github.com/users/ryanjduffy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ryanjduffy/subscriptions","organizations_url":"https://api.github.com/users/ryanjduffy/orgs","repos_url":"https://api.github.com/users/ryanjduffy/repos","events_url":"https://api.github.com/users/ryanjduffy/events{/privacy}","received_events_url":"https://api.github.com/users/ryanjduffy/received_events","type":"User","site_admin":false},"body":"### Issue Resolved / Feature Added\r\n[//]: # (Describe the issue resolved or feature added by this pull request)\r\nAdding onto the work in #1535 to further encapsulate preloading support and refactor related components\r\n\r\n### Resolution\r\n[//]: # (Does the code work as intended?)\r\n[//]: # (What is the impact of this change and *why* was it made?)\r\n\r\n* Added `moonstone/VideoPlayer.Video` to support the `preloadSource` prop and fully encapsulate source switching from `VideoPlayer`\r\n* Added `ui/ForwardRef` to support maintaining the correct `ref` to the media\r\n* Changed `ui/Media` to auto-load media and marked the component `@public` in docs\r\n* Updated `moonstone/MediaOverlay` to leverage `ui/Media`'s loading support\r\n\r\n### Additional Considerations\r\n[//]: # (How should the change be tested?)\r\n[//]: # (Are there any outstanding questions?)\r\n[//]: # (Were any side-effects caused by the change?)\r\n\r\n* Validate both the VideoPlayer sample  and QA sample\r\n* Validate VideoPlayer accessibility tests\r\n* Validate the MediaOverlay sample\r\n\r\n### Links\r\n[//]: # (Related issues, references)\r\n\r\n\r\n### Comments\r\n\r\nEnact-DCO-1.0-Signed-off-by: Ryan Duffy (ryan.duffy@lge.com)","created_at":"2018-05-04T20:14:56Z","updated_at":"2018-05-10T16:01:38Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8d22023b4661edd397f6b6b41ae317eb7c52e39f","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/enactjs/enact/pulls/1626/commits","review_comments_url":"https://api.github.com/repos/enactjs/enact/pulls/1626/comments","review_comment_url":"https://api.github.com/repos/enactjs/enact/pulls/comments{/number}","comments_url":"https://api.github.com/repos/enactjs/enact/issues/1626/comments","statuses_url":"https://api.github.com/repos/enactjs/enact/statuses/c5020e3b08e6eee00c42ecdf586e20f0c911b7ab","head":{"label":"enactjs:feature/ENYO-4162-ryan","ref":"feature/ENYO-4162-ryan","sha":"c5020e3b08e6eee00c42ecdf586e20f0c911b7ab","user":{"login":"enactjs","id":22086053,"avatar_url":"https://avatars2.githubusercontent.com/u/22086053?v=4","gravatar_id":"","url":"https://api.github.com/users/enactjs","html_url":"https://github.com/enactjs","followers_url":"https://api.github.com/users/enactjs/followers","following_url":"https://api.github.com/users/enactjs/following{/other_user}","gists_url":"https://api.github.com/users/enactjs/gists{/gist_id}","starred_url":"https://api.github.com/users/enactjs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/enactjs/subscriptions","organizations_url":"https://api.github.com/users/enactjs/orgs","repos_url":"https://api.github.com/users/enactjs/repos","events_url":"https://api.github.com/users/enactjs/events{/privacy}","received_events_url":"https://api.github.com/users/enactjs/received_events","type":"Organization","site_admin":false},"repo":{"id":67653065,"name":"enact","full_name":"enactjs/enact","owner":{"login":"enactjs","id":22086053,"avatar_url":"https://avatars2.githubusercontent.com/u/22086053?v=4","gravatar_id":"","url":"https://api.github.com/users/enactjs","html_url":"https://github.com/enactjs","followers_url":"https://api.github.com/users/enactjs/followers","following_url":"https://api.github.com/users/enactjs/following{/other_user}","gists_url":"https://api.github.com/users/enactjs/gists{/gist_id}","starred_url":"https://api.github.com/users/enactjs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/enactjs/subscriptions","organizations_url":"https://api.github.com/users/enactjs/orgs","repos_url":"https://api.github.com/users/enactjs/repos","events_url":"https://api.github.com/users/enactjs/events{/privacy}","received_events_url":"https://api.github.com/users/enactjs/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/enactjs/enact","description":"An app development framework built atop React that’s easy to use, performant and customizable.","fork":false,"url":"https://api.github.com/repos/enactjs/enact","forks_url":"https://api.github.com/repos/enactjs/enact/forks","keys_url":"https://api.github.com/repos/enactjs/enact/keys{/key_id}","collaborators_url":"https://api.github.com/repos/enactjs/enact/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/enactjs/enact/teams","hooks_url":"https://api.github.com/repos/enactjs/enact/hooks","issue_events_url":"https://api.github.com/repos/enactjs/enact/issues/events{/number}","events_url":"https://api.github.com/repos/enactjs/enact/events","assignees_url":"https://api.github.com/repos/enactjs/enact/assignees{/user}","branches_url":"https://api.github.com/repos/enactjs/enact/branches{/branch}","tags_url":"https://api.github.com/repos/enactjs/enact/tags","blobs_url":"https://api.github.com/repos/enactjs/enact/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/enactjs/enact/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/enactjs/enact/git/refs{/sha}","trees_url":"https://api.github.com/repos/enactjs/enact/git/trees{/sha}","statuses_url":"https://api.github.com/repos/enactjs/enact/statuses/{sha}","languages_url":"https://api.github.com/repos/enactjs/enact/languages","stargazers_url":"https://api.github.com/repos/enactjs/enact/stargazers","contributors_url":"https://api.github.com/repos/enactjs/enact/contributors","subscribers_url":"https://api.github.com/repos/enactjs/enact/subscribers","subscription_url":"https://api.github.com/repos/enactjs/enact/subscription","commits_url":"https://api.github.com/repos/enactjs/enact/commits{/sha}","git_commits_url":"https://api.github.com/repos/enactjs/enact/git/commits{/sha}","comments_url":"https://api.github.com/repos/enactjs/enact/comments{/number}","issue_comment_url":"https://api.github.com/repos/enactjs/enact/issues/comments{/number}","contents_url":"https://api.github.com/repos/enactjs/enact/contents/{+path}","compare_url":"https://api.github.com/repos/enactjs/enact/compare/{base}...{head}","merges_url":"https://api.github.com/repos/enactjs/enact/merges","archive_url":"https://api.github.com/repos/enactjs/enact/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/enactjs/enact/downloads","issues_url":"https://api.github.com/repos/enactjs/enact/issues{/number}","pulls_url":"https://api.github.com/repos/enactjs/enact/pulls{/number}","milestones_url":"https://api.github.com/repos/enactjs/enact/milestones{/number}","notifications_url":"https://api.github.com/repos/enactjs/enact/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/enactjs/enact/labels{/name}","releases_url":"https://api.github.com/repos/enactjs/enact/releases{/id}","deployments_url":"https://api.github.com/repos/enactjs/enact/deployments","created_at":"2016-09-08T00:14:51Z","updated_at":"2018-05-01T21:25:16Z","pushed_at":"2018-05-10T15:28:51Z","git_url":"git://github.com/enactjs/enact.git","ssh_url":"git@github.com:enactjs/enact.git","clone_url":"https://github.com/enactjs/enact.git","svn_url":"https://github.com/enactjs/enact","homepage":"http://enactjs.com","size":14675,"stargazers_count":60,"watchers_count":60,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"archived":false,"open_issues_count":59,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":3,"open_issues":59,"watchers":60,"default_branch":"master"}},"base":{"label":"enactjs:develop","ref":"develop","sha":"41df8592327dc2be47fdcda226acbb7a071118ae","user":{"login":"enactjs","id":22086053,"avatar_url":"https://avatars2.githubusercontent.com/u/22086053?v=4","gravatar_id":"","url":"https://api.github.com/users/enactjs","html_url":"https://github.com/enactjs","followers_url":"https://api.github.com/users/enactjs/followers","following_url":"https://api.github.com/users/enactjs/following{/other_user}","gists_url":"https://api.github.com/users/enactjs/gists{/gist_id}","starred_url":"https://api.github.com/users/enactjs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/enactjs/subscriptions","organizations_url":"https://api.github.com/users/enactjs/orgs","repos_url":"https://api.github.com/users/enactjs/repos","events_url":"https://api.github.com/users/enactjs/events{/privacy}","received_events_url":"https://api.github.com/users/enactjs/received_events","type":"Organization","site_admin":false},"repo":{"id":67653065,"name":"enact","full_name":"enactjs/enact","owner":{"login":"enactjs","id":22086053,"avatar_url":"https://avatars2.githubusercontent.com/u/22086053?v=4","gravatar_id":"","url":"https://api.github.com/users/enactjs","html_url":"https://github.com/enactjs","followers_url":"https://api.github.com/users/enactjs/followers","following_url":"https://api.github.com/users/enactjs/following{/other_user}","gists_url":"https://api.github.com/users/enactjs/gists{/gist_id}","starred_url":"https://api.github.com/users/enactjs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/enactjs/subscriptions","organizations_url":"https://api.github.com/users/enactjs/orgs","repos_url":"https://api.github.com/users/enactjs/repos","events_url":"https://api.github.com/users/enactjs/events{/privacy}","received_events_url":"https://api.github.com/users/enactjs/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/enactjs/enact","description":"An app development framework built atop React that’s easy to use, performant and customizable.","fork":false,"url":"https://api.github.com/repos/enactjs/enact","forks_url":"https://api.github.com/repos/enactjs/enact/forks","keys_url":"https://api.github.com/repos/enactjs/enact/keys{/key_id}","collaborators_url":"https://api.github.com/repos/enactjs/enact/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/enactjs/enact/teams","hooks_url":"https://api.github.com/repos/enactjs/enact/hooks","issue_events_url":"https://api.github.com/repos/enactjs/enact/issues/events{/number}","events_url":"https://api.github.com/repos/enactjs/enact/events","assignees_url":"https://api.github.com/repos/enactjs/enact/assignees{/user}","branches_url":"https://api.github.com/repos/enactjs/enact/branches{/branch}","tags_url":"https://api.github.com/repos/enactjs/enact/tags","blobs_url":"https://api.github.com/repos/enactjs/enact/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/enactjs/enact/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/enactjs/enact/git/refs{/sha}","trees_url":"https://api.github.com/repos/enactjs/enact/git/trees{/sha}","statuses_url":"https://api.github.com/repos/enactjs/enact/statuses/{sha}","languages_url":"https://api.github.com/repos/enactjs/enact/languages","stargazers_url":"https://api.github.com/repos/enactjs/enact/stargazers","contributors_url":"https://api.github.com/repos/enactjs/enact/contributors","subscribers_url":"https://api.github.com/repos/enactjs/enact/subscribers","subscription_url":"https://api.github.com/repos/enactjs/enact/subscription","commits_url":"https://api.github.com/repos/enactjs/enact/commits{/sha}","git_commits_url":"https://api.github.com/repos/enactjs/enact/git/commits{/sha}","comments_url":"https://api.github.com/repos/enactjs/enact/comments{/number}","issue_comment_url":"https://api.github.com/repos/enactjs/enact/issues/comments{/number}","contents_url":"https://api.github.com/repos/enactjs/enact/contents/{+path}","compare_url":"https://api.github.com/repos/enactjs/enact/compare/{base}...{head}","merges_url":"https://api.github.com/repos/enactjs/enact/merges","archive_url":"https://api.github.com/repos/enactjs/enact/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/enactjs/enact/downloads","issues_url":"https://api.github.com/repos/enactjs/enact/issues{/number}","pulls_url":"https://api.github.com/repos/enactjs/enact/pulls{/number}","milestones_url":"https://api.github.com/repos/enactjs/enact/milestones{/number}","notifications_url":"https://api.github.com/repos/enactjs/enact/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/enactjs/enact/labels{/name}","releases_url":"https://api.github.com/repos/enactjs/enact/releases{/id}","deployments_url":"https://api.github.com/repos/enactjs/enact/deployments","created_at":"2016-09-08T00:14:51Z","updated_at":"2018-05-01T21:25:16Z","pushed_at":"2018-05-10T15:28:51Z","git_url":"git://github.com/enactjs/enact.git","ssh_url":"git@github.com:enactjs/enact.git","clone_url":"https://github.com/enactjs/enact.git","svn_url":"https://github.com/enactjs/enact","homepage":"http://enactjs.com","size":14675,"stargazers_count":60,"watchers_count":60,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"archived":false,"open_issues_count":59,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":3,"open_issues":59,"watchers":60,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/enactjs/enact/pulls/1626"},"html":{"href":"https://github.com/enactjs/enact/pull/1626"},"issue":{"href":"https://api.github.com/repos/enactjs/enact/issues/1626"},"comments":{"href":"https://api.github.com/repos/enactjs/enact/issues/1626/comments"},"review_comments":{"href":"https://api.github.com/repos/enactjs/enact/pulls/1626/comments"},"review_comment":{"href":"https://api.github.com/repos/enactjs/enact/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/enactjs/enact/pulls/1626/commits"},"statuses":{"href":"https://api.github.com/repos/enactjs/enact/statuses/c5020e3b08e6eee00c42ecdf586e20f0c911b7ab"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"ryanjduffy"}}