{"action":"created","comment":{"url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/pulls/comments/65916796","id":65916796,"diff_hunk":"@@ -195,7 +270,151 @@ export default class TypescriptLanguageExtension implements Editor.HostExtension\n      */\n     projectLoaded(ev: Editor.EditorEvents.LoadProjectEvent) {\n         // got a load, we need to reset the language service\n-        console.log(`${this.name}: received a project loaded event for project at ${ev.path}`);\n-        this.loadProjectFiles();\n+        // console.log(`${this.name}: received a project loaded event for project at ${ev.path}`);\n+\n+        this.isTypescriptProject = false;\n+        //scan all the files in the project for any typescript files so we can determine if this is a typescript project\n+        Atomic.fileSystem.scanDir(ToolCore.toolSystem.project.resourcePath, \"*.ts\", Atomic.SCAN_FILES, true).forEach(filename => {\n+            this.isTypescriptProject = true;\n+        });\n+\n+        this.configureTypescriptProject();\n+    }\n+\n+\n+    /**\n+     * Called when the project is unloaded\n+     */\n+    projectUnloaded() {\n+        // Clean up\n+        this.serviceRegistry.uiServices.removePluginMenuItemSource(\"TypeScript\");\n+        this.compileOnSaveMenuItem = null;\n+        this.isTypescriptProject = false;\n+    }\n+\n+    /*** UIService implementation ***/\n+\n+    /**\n+     * Called when a plugin menu item is clicked\n+     * @param  {string} refId\n+     * @return {boolean}\n+     */\n+    menuItemClicked(refId: string): boolean {\n+        let [extension, action] = refId.split(\".\");\n+        if (extension == this.name) {\n+            switch (action) {\n+                case \"compileonsave\":\n+                    let isCompileOnSave = this.serviceRegistry.projectServices.getUserPreference(this.name, \"CompileOnSave\", false);\n+                    // Toggle\n+                    isCompileOnSave = !isCompileOnSave;\n+                    this.serviceRegistry.projectServices.setUserPreference(this.name, \"CompileOnSave\", isCompileOnSave);\n+                    this.compileOnSaveMenuItem.string = `Compile on Save: ${isCompileOnSave ? \"On\" : \"Off\"}`;\n+                    return true;\n+                case \"compileproject\":\n+                    this.doFullCompile();\n+                    return true;\n+            }\n+        }\n+    }\n+\n+    /**\n+     * Handle messages that are submitted via Atomic.Query from within a web view editor.\n+     * @param message The message type that was submitted to be used to determine what the data contains if present\n+     * @param data any additional data that needs to be submitted with the message\n+     */\n+    handleWebMessage(messageType: string, data: any) {\n+        switch (messageType) {\n+            case \"TypeScript.DisplayCompileResults\":\n+                this.displayCompileResults(data);\n+                break;\n+        }\n+    }\n+\n+    setTsConfigOnWebView(tsConfig: any) {\n+        WebView.WebBrowserHost.setGlobalStringProperty(\"TypeScriptLanguageExtension\", \"tsConfig\", JSON.stringify(tsConfig));\n+    }\n+\n+    /**\n+     * Perform a full compile of the TypeScript\n+     */\n+    doFullCompile() {\n+        const editor = this.serviceRegistry.uiServices.getCurrentResourceEditor();\n+        if (editor && editor.typeName == \"JSResourceEditor\" && this.isValidFiletype(editor.fullPath)) {\n+            const jsEditor = <Editor.JSResourceEditor>editor;\n+            jsEditor.webView.webClient.executeJavaScript(`TypeScript_DoFullCompile();`);\n+        } else {\n+            this.serviceRegistry.uiServices.showModalError(\"TypeScript Compilation\", \"Please open a TypeScript file in the editor before attempting to do a full compile.\");\n+        }\n+\n+        // Ideally, we would want to either launch up a background web view, or shell out to node or something and not\n+        // need to have an editor open.  Still researching this\n+        /*\n+            const url = `atomic://${ToolCore.toolEnvironment.toolDataDir}CodeEditor/Editor.html`;\n+            const webClient = new WebView.WebClient();\n+            this.webClient = webClient;\n+            //this.webClient.loadURL(url);\n+\n+            const webTexture = new WebView.WebTexture2D();\n+            webClient.webRenderHandler = webTexture;\n+\n+            // doesn't work because atomicquery doesn't seem to be exposed to WebView.WebClient instances\n+            webClient.subscribeToEvent(EditorEvents.WebMessage, (data) => {\n+                switch (data.message) {\n+                    case \"editorLoadComplete\":\n+                        webClient.unsubscribeFromEvent(EditorEvents.WebMessage);\n+                        webClient.executeJavaScript(`TypeScript_DoFullCompile();`);\n+                        break;\n+                }\n+            });\n+\n+            webClient.createBrowser(url, 1, 1);\n+        */\n+    }\n+\n+    /**\n+     * Display the results of the compilation step\n+     * @param  {any[]} annotations\n+     */\n+    displayCompileResults(results: {\n+        annotations: any[],\n+        compilerOptions: any,\n+        duration: number\n+    }) {\n+        // get the name of the resources directory without preceding path\n+        let resourceDir = ToolCore.toolSystem.project.resourcePath.replace(Atomic.addTrailingSlash(ToolCore.toolSystem.project.projectPath), \"\");\n+        let messageArray = results.annotations.filter(result => {\n+            // If we are compiling the lib.d.ts or some other built-in library and it was successful, then\n+            // we really don't need to display that result since it's just noise.  Only display it if it fails\n+            if (result.type == \"success\") {\n+                return result.file.indexOf(ToolCore.toolSystem.project.projectPath) == 0;\n+            }\n+            return true;\n+        }).map(result => {\n+\n+            // Clean up the path for display\n+            let file = result.file.replace(ToolCore.toolSystem.project.projectPath, \"\");\n+            let message = `<color #888888>${file}: </color>`;\n+            if (result.type == \"success\") {\n+                message += `<color #00ff00>${result.text}</color>`;\n+            } else {\n+                message += `<color #e3e02b>${result.text} at line ${result.row} col ${result.column}</color>`;\n+            }\n+            return message;\n+        }).join(\"\\n\");\n+\n+        if (messageArray.length == 0) {\n+            messageArray = \"Success\";\n+        }\n+\n+        let message = [\n+            \"Compiler Options: \",\n+            JSON.stringify(results.compilerOptions, null, 2),\n+            \"\",\n+            messageArray,\n+            \"\",\n+            `Compilation Completed in ${results.duration}ms`","path":"Script/AtomicEditor/hostExtensions/languageExtensions/TypscriptLanguageExtension.ts","position":406,"original_position":406,"commit_id":"cb5756dbf4638b6eaea32004c2867a9edafb1b67","original_commit_id":"cb5756dbf4638b6eaea32004c2867a9edafb1b67","user":{"login":"JoshEngebretson","id":376203,"avatar_url":"https://avatars.githubusercontent.com/u/376203?v=3","gravatar_id":"","url":"https://api.github.com/users/JoshEngebretson","html_url":"https://github.com/JoshEngebretson","followers_url":"https://api.github.com/users/JoshEngebretson/followers","following_url":"https://api.github.com/users/JoshEngebretson/following{/other_user}","gists_url":"https://api.github.com/users/JoshEngebretson/gists{/gist_id}","starred_url":"https://api.github.com/users/JoshEngebretson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JoshEngebretson/subscriptions","organizations_url":"https://api.github.com/users/JoshEngebretson/orgs","repos_url":"https://api.github.com/users/JoshEngebretson/repos","events_url":"https://api.github.com/users/JoshEngebretson/events{/privacy}","received_events_url":"https://api.github.com/users/JoshEngebretson/received_events","type":"User","site_admin":false},"body":"Time metric good to keep an eye on","created_at":"2016-06-06T15:55:51Z","updated_at":"2016-06-06T15:55:51Z","html_url":"https://github.com/AtomicGameEngine/AtomicGameEngine/pull/835#discussion_r65916796","pull_request_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/pulls/835","_links":{"self":{"href":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/pulls/comments/65916796"},"html":{"href":"https://github.com/AtomicGameEngine/AtomicGameEngine/pull/835#discussion_r65916796"},"pull_request":{"href":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/pulls/835"}}},"pull_request":{"url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/pulls/835","id":72446834,"html_url":"https://github.com/AtomicGameEngine/AtomicGameEngine/pull/835","diff_url":"https://github.com/AtomicGameEngine/AtomicGameEngine/pull/835.diff","patch_url":"https://github.com/AtomicGameEngine/AtomicGameEngine/pull/835.patch","issue_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/issues/835","number":835,"state":"open","locked":false,"title":"in-editor TypeScript compilation","user":{"login":"shaddockh","id":2951562,"avatar_url":"https://avatars.githubusercontent.com/u/2951562?v=3","gravatar_id":"","url":"https://api.github.com/users/shaddockh","html_url":"https://github.com/shaddockh","followers_url":"https://api.github.com/users/shaddockh/followers","following_url":"https://api.github.com/users/shaddockh/following{/other_user}","gists_url":"https://api.github.com/users/shaddockh/gists{/gist_id}","starred_url":"https://api.github.com/users/shaddockh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/shaddockh/subscriptions","organizations_url":"https://api.github.com/users/shaddockh/orgs","repos_url":"https://api.github.com/users/shaddockh/repos","events_url":"https://api.github.com/users/shaddockh/events{/privacy}","received_events_url":"https://api.github.com/users/shaddockh/received_events","type":"User","site_admin":false},"body":"I'm going to go ahead and open up this PR since the in-editor typescript compilation appears to be functional...just needs a good testing.   Also testing in Windows (and Linux when the webviews work) since I've pretty much been doing this in OSX land.\r\n\r\n### Changes\r\n- New menu item Developer->Plugins->TypeScript->Compile on Save: on/off\r\n  Clicking on this will toggle compile on save on or off which will compile the currently edited file when you save.  This value is persisted in your project preferences file.\r\n\r\n- New menu item Developer->Plugins->TypeScript->Compile\r\n  Clicking on this will compile all of the TypeScript in your project directory and display the results\r\n\r\n- Updated the Web View command: EDITOR_SAVE_FILE to allow the web view to pass up a fully qualified path/filename and file contents and it will get saved to the filesystem.  I added in protections that will ignore the request if the filename/path does not reside within the project directory, or the filename/path contains \"..\" which could allow saving a file outside the directory.  Since theoretically, the web view could be pointed to an editor on the internet, it just adds a little safety\r\n\r\n- The TypeScript compiler will first look for an Atomic.d.ts in the project directory and if it doesn't find one, will use the one in the app data folder.  This opens up the ability to have projects that are always up to date with the Atomic.d.ts.  However, if you want to use an external editor, you will still need to copy the Atomic.d.ts in\r\n\r\n- If there is a tsconfig.json file in the root of the project, the extension will pull it in and add any additional files within the [files] section that the editor isn't aware of.\r\n\r\n### Open issues\r\n* Currently the Compile menu will only work if a web view editor is open since the TypeScript language service lives inside a web worker attached to the web views.  I experimented around with dynamically instantiating a web view from the editor script, but it doesn't appear the AtomicQuery is available from those dynamic web views.  The idea would be that if there isn't a web view open, an off-screen one could be loaded and used to compile\r\n\r\n* For compiler errors, there isn't a way to click on the error and open and jump to that line...maybe as an enhancement in a later PR\r\n\r\n* Currently you will need to compile your typescript prior to building/running.  It should be pretty easy to hook into the Project Start Player event to do that, but it would be nice to have the off-screen compiler working first\r\n\r\n* A nice to have would be a menu that allows you to update your in-project copy of Atomic.d.ts with the latest from the app.\r\n\r\nPhew!\r\n","created_at":"2016-06-03T02:47:27Z","updated_at":"2016-06-06T15:55:51Z","closed_at":null,"merged_at":null,"merge_commit_sha":"48122bd3cac4f6f65a7257a0d3b7fb69372a63f9","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/pulls/835/commits","review_comments_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/pulls/835/comments","review_comment_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/pulls/comments{/number}","comments_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/issues/835/comments","statuses_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/statuses/cb5756dbf4638b6eaea32004c2867a9edafb1b67","head":{"label":"AtomicGameEngine:TSH-ATOMIC-TYPESCRIPT","ref":"TSH-ATOMIC-TYPESCRIPT","sha":"cb5756dbf4638b6eaea32004c2867a9edafb1b67","user":{"login":"AtomicGameEngine","id":9641691,"avatar_url":"https://avatars.githubusercontent.com/u/9641691?v=3","gravatar_id":"","url":"https://api.github.com/users/AtomicGameEngine","html_url":"https://github.com/AtomicGameEngine","followers_url":"https://api.github.com/users/AtomicGameEngine/followers","following_url":"https://api.github.com/users/AtomicGameEngine/following{/other_user}","gists_url":"https://api.github.com/users/AtomicGameEngine/gists{/gist_id}","starred_url":"https://api.github.com/users/AtomicGameEngine/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AtomicGameEngine/subscriptions","organizations_url":"https://api.github.com/users/AtomicGameEngine/orgs","repos_url":"https://api.github.com/users/AtomicGameEngine/repos","events_url":"https://api.github.com/users/AtomicGameEngine/events{/privacy}","received_events_url":"https://api.github.com/users/AtomicGameEngine/received_events","type":"Organization","site_admin":false},"repo":{"id":29790707,"name":"AtomicGameEngine","full_name":"AtomicGameEngine/AtomicGameEngine","owner":{"login":"AtomicGameEngine","id":9641691,"avatar_url":"https://avatars.githubusercontent.com/u/9641691?v=3","gravatar_id":"","url":"https://api.github.com/users/AtomicGameEngine","html_url":"https://github.com/AtomicGameEngine","followers_url":"https://api.github.com/users/AtomicGameEngine/followers","following_url":"https://api.github.com/users/AtomicGameEngine/following{/other_user}","gists_url":"https://api.github.com/users/AtomicGameEngine/gists{/gist_id}","starred_url":"https://api.github.com/users/AtomicGameEngine/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AtomicGameEngine/subscriptions","organizations_url":"https://api.github.com/users/AtomicGameEngine/orgs","repos_url":"https://api.github.com/users/AtomicGameEngine/repos","events_url":"https://api.github.com/users/AtomicGameEngine/events{/privacy}","received_events_url":"https://api.github.com/users/AtomicGameEngine/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/AtomicGameEngine/AtomicGameEngine","description":"The Atomic Game Engine: http://www.AtomicGameEngine.com","fork":false,"url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine","forks_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/forks","keys_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/teams","hooks_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/hooks","issue_events_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/issues/events{/number}","events_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/events","assignees_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/assignees{/user}","branches_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/branches{/branch}","tags_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/tags","blobs_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/git/refs{/sha}","trees_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/statuses/{sha}","languages_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/languages","stargazers_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/stargazers","contributors_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/contributors","subscribers_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/subscribers","subscription_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/subscription","commits_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/commits{/sha}","git_commits_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/git/commits{/sha}","comments_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/comments{/number}","issue_comment_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/issues/comments{/number}","contents_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/contents/{+path}","compare_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/merges","archive_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/downloads","issues_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/issues{/number}","pulls_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/pulls{/number}","milestones_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/milestones{/number}","notifications_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/labels{/name}","releases_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/releases{/id}","deployments_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/deployments","created_at":"2015-01-24T20:35:25Z","updated_at":"2016-06-06T04:14:59Z","pushed_at":"2016-06-05T18:38:37Z","git_url":"git://github.com/AtomicGameEngine/AtomicGameEngine.git","ssh_url":"git@github.com:AtomicGameEngine/AtomicGameEngine.git","clone_url":"https://github.com/AtomicGameEngine/AtomicGameEngine.git","svn_url":"https://github.com/AtomicGameEngine/AtomicGameEngine","homepage":"","size":87593,"stargazers_count":795,"watchers_count":795,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":143,"mirror_url":null,"open_issues_count":275,"forks":143,"open_issues":275,"watchers":795,"default_branch":"master"}},"base":{"label":"AtomicGameEngine:master","ref":"master","sha":"5a3d5b43f19d73a448e3b4ecfc429df5809baefb","user":{"login":"AtomicGameEngine","id":9641691,"avatar_url":"https://avatars.githubusercontent.com/u/9641691?v=3","gravatar_id":"","url":"https://api.github.com/users/AtomicGameEngine","html_url":"https://github.com/AtomicGameEngine","followers_url":"https://api.github.com/users/AtomicGameEngine/followers","following_url":"https://api.github.com/users/AtomicGameEngine/following{/other_user}","gists_url":"https://api.github.com/users/AtomicGameEngine/gists{/gist_id}","starred_url":"https://api.github.com/users/AtomicGameEngine/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AtomicGameEngine/subscriptions","organizations_url":"https://api.github.com/users/AtomicGameEngine/orgs","repos_url":"https://api.github.com/users/AtomicGameEngine/repos","events_url":"https://api.github.com/users/AtomicGameEngine/events{/privacy}","received_events_url":"https://api.github.com/users/AtomicGameEngine/received_events","type":"Organization","site_admin":false},"repo":{"id":29790707,"name":"AtomicGameEngine","full_name":"AtomicGameEngine/AtomicGameEngine","owner":{"login":"AtomicGameEngine","id":9641691,"avatar_url":"https://avatars.githubusercontent.com/u/9641691?v=3","gravatar_id":"","url":"https://api.github.com/users/AtomicGameEngine","html_url":"https://github.com/AtomicGameEngine","followers_url":"https://api.github.com/users/AtomicGameEngine/followers","following_url":"https://api.github.com/users/AtomicGameEngine/following{/other_user}","gists_url":"https://api.github.com/users/AtomicGameEngine/gists{/gist_id}","starred_url":"https://api.github.com/users/AtomicGameEngine/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AtomicGameEngine/subscriptions","organizations_url":"https://api.github.com/users/AtomicGameEngine/orgs","repos_url":"https://api.github.com/users/AtomicGameEngine/repos","events_url":"https://api.github.com/users/AtomicGameEngine/events{/privacy}","received_events_url":"https://api.github.com/users/AtomicGameEngine/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/AtomicGameEngine/AtomicGameEngine","description":"The Atomic Game Engine: http://www.AtomicGameEngine.com","fork":false,"url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine","forks_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/forks","keys_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/teams","hooks_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/hooks","issue_events_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/issues/events{/number}","events_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/events","assignees_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/assignees{/user}","branches_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/branches{/branch}","tags_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/tags","blobs_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/git/refs{/sha}","trees_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/statuses/{sha}","languages_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/languages","stargazers_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/stargazers","contributors_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/contributors","subscribers_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/subscribers","subscription_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/subscription","commits_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/commits{/sha}","git_commits_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/git/commits{/sha}","comments_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/comments{/number}","issue_comment_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/issues/comments{/number}","contents_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/contents/{+path}","compare_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/merges","archive_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/downloads","issues_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/issues{/number}","pulls_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/pulls{/number}","milestones_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/milestones{/number}","notifications_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/labels{/name}","releases_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/releases{/id}","deployments_url":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/deployments","created_at":"2015-01-24T20:35:25Z","updated_at":"2016-06-06T04:14:59Z","pushed_at":"2016-06-05T18:38:37Z","git_url":"git://github.com/AtomicGameEngine/AtomicGameEngine.git","ssh_url":"git@github.com:AtomicGameEngine/AtomicGameEngine.git","clone_url":"https://github.com/AtomicGameEngine/AtomicGameEngine.git","svn_url":"https://github.com/AtomicGameEngine/AtomicGameEngine","homepage":"","size":87593,"stargazers_count":795,"watchers_count":795,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":143,"mirror_url":null,"open_issues_count":275,"forks":143,"open_issues":275,"watchers":795,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/pulls/835"},"html":{"href":"https://github.com/AtomicGameEngine/AtomicGameEngine/pull/835"},"issue":{"href":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/issues/835"},"comments":{"href":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/issues/835/comments"},"review_comments":{"href":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/pulls/835/comments"},"review_comment":{"href":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/pulls/835/commits"},"statuses":{"href":"https://api.github.com/repos/AtomicGameEngine/AtomicGameEngine/statuses/cb5756dbf4638b6eaea32004c2867a9edafb1b67"}}}}
{"actor":{"display_login":"JoshEngebretson"}}