{"action":"created","comment":{"url":"https://api.github.com/repos/girder/girder/pulls/comments/88520801","pull_request_review_id":9091872,"id":88520801,"diff_hunk":"@@ -73,9 +75,39 @@ module.exports = function (grunt) {\n     grunt.loadNpmTasks('grunt-curl');\n     grunt.loadNpmTasks('grunt-zip');\n     grunt.loadNpmTasks('grunt-file-creator');\n-    grunt.loadNpmTasks('grunt-npm-install');\n     grunt.loadNpmTasks('grunt-webpack');\n \n+    grunt.registerTask('npm-install', 'Install plugin NPM dependencies', function (plugin) {","path":"Gruntfile.js","position":16,"original_position":16,"commit_id":"a5dba5b43e36877477f49a1f1dbd8497627155cb","original_commit_id":"a5dba5b43e36877477f49a1f1dbd8497627155cb","user":{"login":"zachmullen","id":555959,"avatar_url":"https://avatars.githubusercontent.com/u/555959?v=3","gravatar_id":"","url":"https://api.github.com/users/zachmullen","html_url":"https://github.com/zachmullen","followers_url":"https://api.github.com/users/zachmullen/followers","following_url":"https://api.github.com/users/zachmullen/following{/other_user}","gists_url":"https://api.github.com/users/zachmullen/gists{/gist_id}","starred_url":"https://api.github.com/users/zachmullen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zachmullen/subscriptions","organizations_url":"https://api.github.com/users/zachmullen/orgs","repos_url":"https://api.github.com/users/zachmullen/repos","events_url":"https://api.github.com/users/zachmullen/events{/privacy}","received_events_url":"https://api.github.com/users/zachmullen/received_events","type":"User","site_admin":false},"body":"Since this task is to do with plugins, we should move it inside plugin.js IMO, to keep this top level Gruntfile clean.","created_at":"2016-11-17T18:56:07Z","updated_at":"2016-11-17T18:56:11Z","html_url":"https://github.com/girder/girder/pull/1664#discussion_r88520801","pull_request_url":"https://api.github.com/repos/girder/girder/pulls/1664","_links":{"self":{"href":"https://api.github.com/repos/girder/girder/pulls/comments/88520801"},"html":{"href":"https://github.com/girder/girder/pull/1664#discussion_r88520801"},"pull_request":{"href":"https://api.github.com/repos/girder/girder/pulls/1664"}}},"pull_request":{"url":"https://api.github.com/repos/girder/girder/pulls/1664","id":92341016,"html_url":"https://github.com/girder/girder/pull/1664","diff_url":"https://github.com/girder/girder/pull/1664.diff","patch_url":"https://github.com/girder/girder/pull/1664.patch","issue_url":"https://api.github.com/repos/girder/girder/issues/1664","number":1664,"state":"open","locked":false,"title":"Plugin build process improvements","user":{"login":"ronichoudhury","id":2903332,"avatar_url":"https://avatars.githubusercontent.com/u/2903332?v=3","gravatar_id":"","url":"https://api.github.com/users/ronichoudhury","html_url":"https://github.com/ronichoudhury","followers_url":"https://api.github.com/users/ronichoudhury/followers","following_url":"https://api.github.com/users/ronichoudhury/following{/other_user}","gists_url":"https://api.github.com/users/ronichoudhury/gists{/gist_id}","starred_url":"https://api.github.com/users/ronichoudhury/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ronichoudhury/subscriptions","organizations_url":"https://api.github.com/users/ronichoudhury/orgs","repos_url":"https://api.github.com/users/ronichoudhury/repos","events_url":"https://api.github.com/users/ronichoudhury/events{/privacy}","received_events_url":"https://api.github.com/users/ronichoudhury/received_events","type":"User","site_admin":false},"body":"Opening this PR mainly to start a discussion on whether the ideas implemented here are worthwhile or not.\r\n\r\nHere is a summary of features introduced:\r\n- Plugin NPM dependencies can now be specified as a package.json file (in `npm.file`)\r\n  - The fields to install from within that file can be specified in `npm.fields` (default: `['devDependencies', 'dependencies', 'optionalDependencies']`)\r\n- The NPM deps are now installed in a separate directory, named for the plugin (i.e., `node_modules_foobar` alongside `node_modules`, the latter containing Girder's own NPM dependencies).\r\n    - The webpack configured aliases the name \"girder_plugins/<pluginname>/node\" to this directory, so the plugin does `require('girder_plugins/<pluginname>/foobar')` to get its private dependency, or `require('foobar')` to use Girder's\r\n- The plugin.json file gains a new `webpack` section. This can contain the following options:\r\n    - `configHelper` - an optional JavaScript file (relative to the plugin directory) exporting a function of two variables, a base webpack config, and an object containing some build information, that returns a modified copy of the base config. This can be used to install loaders scoped to plugin content, modify the list of plugins, dump debug information, etc. By default (i.e. if the config option goes unspecified), the identity function is used.\r\n    - `main` - a relative path to the entry point for the plugin. Defaults to `web_client/main.js`\r\n    - `output` - a file basename, relative to the *output* plugin directory, naming the output file for the plugin. Defaults to `plugin`. Since Girder automatically loads all JS files with a basename of \"plugin\" into the Girder web client, this option can control whether a plugin is a Girder client extension, or a standalone web client, by specifying a name other than \"plugin\" here.\r\n    - `defaultLoaders` - a boolean value that expresses the plugin's desire to use Girder's own webpack loader configuration. Even if this is set to `true`, you can still use `configHelper` to add your own loaders, etc. This is `true` by default, so be sure to set it to `false` explicitly if you want to start your loader configuration from scratch.\r\n- `CommonsChunkPlugin` is disabled, but this was done for simplicity, following the same change possibly being made in a branch parallel to this one.","created_at":"2016-11-04T13:37:35Z","updated_at":"2016-11-17T18:56:11Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b2ebc2e2964eb7191fd56e5afb6124f63145c872","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/girder/girder/pulls/1664/commits","review_comments_url":"https://api.github.com/repos/girder/girder/pulls/1664/comments","review_comment_url":"https://api.github.com/repos/girder/girder/pulls/comments{/number}","comments_url":"https://api.github.com/repos/girder/girder/issues/1664/comments","statuses_url":"https://api.github.com/repos/girder/girder/statuses/a5dba5b43e36877477f49a1f1dbd8497627155cb","head":{"label":"girder:webpack-loader-module","ref":"webpack-loader-module","sha":"a5dba5b43e36877477f49a1f1dbd8497627155cb","user":{"login":"girder","id":5150517,"avatar_url":"https://avatars.githubusercontent.com/u/5150517?v=3","gravatar_id":"","url":"https://api.github.com/users/girder","html_url":"https://github.com/girder","followers_url":"https://api.github.com/users/girder/followers","following_url":"https://api.github.com/users/girder/following{/other_user}","gists_url":"https://api.github.com/users/girder/gists{/gist_id}","starred_url":"https://api.github.com/users/girder/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/girder/subscriptions","organizations_url":"https://api.github.com/users/girder/orgs","repos_url":"https://api.github.com/users/girder/repos","events_url":"https://api.github.com/users/girder/events{/privacy}","received_events_url":"https://api.github.com/users/girder/received_events","type":"Organization","site_admin":false},"repo":{"id":11854950,"name":"girder","full_name":"girder/girder","owner":{"login":"girder","id":5150517,"avatar_url":"https://avatars.githubusercontent.com/u/5150517?v=3","gravatar_id":"","url":"https://api.github.com/users/girder","html_url":"https://github.com/girder","followers_url":"https://api.github.com/users/girder/followers","following_url":"https://api.github.com/users/girder/following{/other_user}","gists_url":"https://api.github.com/users/girder/gists{/gist_id}","starred_url":"https://api.github.com/users/girder/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/girder/subscriptions","organizations_url":"https://api.github.com/users/girder/orgs","repos_url":"https://api.github.com/users/girder/repos","events_url":"https://api.github.com/users/girder/events{/privacy}","received_events_url":"https://api.github.com/users/girder/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/girder/girder","description":"A data management platform for the web","fork":false,"url":"https://api.github.com/repos/girder/girder","forks_url":"https://api.github.com/repos/girder/girder/forks","keys_url":"https://api.github.com/repos/girder/girder/keys{/key_id}","collaborators_url":"https://api.github.com/repos/girder/girder/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/girder/girder/teams","hooks_url":"https://api.github.com/repos/girder/girder/hooks","issue_events_url":"https://api.github.com/repos/girder/girder/issues/events{/number}","events_url":"https://api.github.com/repos/girder/girder/events","assignees_url":"https://api.github.com/repos/girder/girder/assignees{/user}","branches_url":"https://api.github.com/repos/girder/girder/branches{/branch}","tags_url":"https://api.github.com/repos/girder/girder/tags","blobs_url":"https://api.github.com/repos/girder/girder/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/girder/girder/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/girder/girder/git/refs{/sha}","trees_url":"https://api.github.com/repos/girder/girder/git/trees{/sha}","statuses_url":"https://api.github.com/repos/girder/girder/statuses/{sha}","languages_url":"https://api.github.com/repos/girder/girder/languages","stargazers_url":"https://api.github.com/repos/girder/girder/stargazers","contributors_url":"https://api.github.com/repos/girder/girder/contributors","subscribers_url":"https://api.github.com/repos/girder/girder/subscribers","subscription_url":"https://api.github.com/repos/girder/girder/subscription","commits_url":"https://api.github.com/repos/girder/girder/commits{/sha}","git_commits_url":"https://api.github.com/repos/girder/girder/git/commits{/sha}","comments_url":"https://api.github.com/repos/girder/girder/comments{/number}","issue_comment_url":"https://api.github.com/repos/girder/girder/issues/comments{/number}","contents_url":"https://api.github.com/repos/girder/girder/contents/{+path}","compare_url":"https://api.github.com/repos/girder/girder/compare/{base}...{head}","merges_url":"https://api.github.com/repos/girder/girder/merges","archive_url":"https://api.github.com/repos/girder/girder/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/girder/girder/downloads","issues_url":"https://api.github.com/repos/girder/girder/issues{/number}","pulls_url":"https://api.github.com/repos/girder/girder/pulls{/number}","milestones_url":"https://api.github.com/repos/girder/girder/milestones{/number}","notifications_url":"https://api.github.com/repos/girder/girder/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/girder/girder/labels{/name}","releases_url":"https://api.github.com/repos/girder/girder/releases{/id}","deployments_url":"https://api.github.com/repos/girder/girder/deployments","created_at":"2013-08-02T23:55:54Z","updated_at":"2016-11-07T17:01:16Z","pushed_at":"2016-11-17T16:23:17Z","git_url":"git://github.com/girder/girder.git","ssh_url":"git@github.com:girder/girder.git","clone_url":"https://github.com/girder/girder.git","svn_url":"https://github.com/girder/girder","homepage":"http://girder.readthedocs.io","size":10835,"stargazers_count":70,"watchers_count":70,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":53,"mirror_url":null,"open_issues_count":196,"forks":53,"open_issues":196,"watchers":70,"default_branch":"master"}},"base":{"label":"girder:master","ref":"master","sha":"5eb865cd50a684e6fbed8ce9744149a8c07c9ba9","user":{"login":"girder","id":5150517,"avatar_url":"https://avatars.githubusercontent.com/u/5150517?v=3","gravatar_id":"","url":"https://api.github.com/users/girder","html_url":"https://github.com/girder","followers_url":"https://api.github.com/users/girder/followers","following_url":"https://api.github.com/users/girder/following{/other_user}","gists_url":"https://api.github.com/users/girder/gists{/gist_id}","starred_url":"https://api.github.com/users/girder/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/girder/subscriptions","organizations_url":"https://api.github.com/users/girder/orgs","repos_url":"https://api.github.com/users/girder/repos","events_url":"https://api.github.com/users/girder/events{/privacy}","received_events_url":"https://api.github.com/users/girder/received_events","type":"Organization","site_admin":false},"repo":{"id":11854950,"name":"girder","full_name":"girder/girder","owner":{"login":"girder","id":5150517,"avatar_url":"https://avatars.githubusercontent.com/u/5150517?v=3","gravatar_id":"","url":"https://api.github.com/users/girder","html_url":"https://github.com/girder","followers_url":"https://api.github.com/users/girder/followers","following_url":"https://api.github.com/users/girder/following{/other_user}","gists_url":"https://api.github.com/users/girder/gists{/gist_id}","starred_url":"https://api.github.com/users/girder/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/girder/subscriptions","organizations_url":"https://api.github.com/users/girder/orgs","repos_url":"https://api.github.com/users/girder/repos","events_url":"https://api.github.com/users/girder/events{/privacy}","received_events_url":"https://api.github.com/users/girder/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/girder/girder","description":"A data management platform for the web","fork":false,"url":"https://api.github.com/repos/girder/girder","forks_url":"https://api.github.com/repos/girder/girder/forks","keys_url":"https://api.github.com/repos/girder/girder/keys{/key_id}","collaborators_url":"https://api.github.com/repos/girder/girder/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/girder/girder/teams","hooks_url":"https://api.github.com/repos/girder/girder/hooks","issue_events_url":"https://api.github.com/repos/girder/girder/issues/events{/number}","events_url":"https://api.github.com/repos/girder/girder/events","assignees_url":"https://api.github.com/repos/girder/girder/assignees{/user}","branches_url":"https://api.github.com/repos/girder/girder/branches{/branch}","tags_url":"https://api.github.com/repos/girder/girder/tags","blobs_url":"https://api.github.com/repos/girder/girder/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/girder/girder/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/girder/girder/git/refs{/sha}","trees_url":"https://api.github.com/repos/girder/girder/git/trees{/sha}","statuses_url":"https://api.github.com/repos/girder/girder/statuses/{sha}","languages_url":"https://api.github.com/repos/girder/girder/languages","stargazers_url":"https://api.github.com/repos/girder/girder/stargazers","contributors_url":"https://api.github.com/repos/girder/girder/contributors","subscribers_url":"https://api.github.com/repos/girder/girder/subscribers","subscription_url":"https://api.github.com/repos/girder/girder/subscription","commits_url":"https://api.github.com/repos/girder/girder/commits{/sha}","git_commits_url":"https://api.github.com/repos/girder/girder/git/commits{/sha}","comments_url":"https://api.github.com/repos/girder/girder/comments{/number}","issue_comment_url":"https://api.github.com/repos/girder/girder/issues/comments{/number}","contents_url":"https://api.github.com/repos/girder/girder/contents/{+path}","compare_url":"https://api.github.com/repos/girder/girder/compare/{base}...{head}","merges_url":"https://api.github.com/repos/girder/girder/merges","archive_url":"https://api.github.com/repos/girder/girder/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/girder/girder/downloads","issues_url":"https://api.github.com/repos/girder/girder/issues{/number}","pulls_url":"https://api.github.com/repos/girder/girder/pulls{/number}","milestones_url":"https://api.github.com/repos/girder/girder/milestones{/number}","notifications_url":"https://api.github.com/repos/girder/girder/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/girder/girder/labels{/name}","releases_url":"https://api.github.com/repos/girder/girder/releases{/id}","deployments_url":"https://api.github.com/repos/girder/girder/deployments","created_at":"2013-08-02T23:55:54Z","updated_at":"2016-11-07T17:01:16Z","pushed_at":"2016-11-17T16:23:17Z","git_url":"git://github.com/girder/girder.git","ssh_url":"git@github.com:girder/girder.git","clone_url":"https://github.com/girder/girder.git","svn_url":"https://github.com/girder/girder","homepage":"http://girder.readthedocs.io","size":10835,"stargazers_count":70,"watchers_count":70,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":53,"mirror_url":null,"open_issues_count":196,"forks":53,"open_issues":196,"watchers":70,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/girder/girder/pulls/1664"},"html":{"href":"https://github.com/girder/girder/pull/1664"},"issue":{"href":"https://api.github.com/repos/girder/girder/issues/1664"},"comments":{"href":"https://api.github.com/repos/girder/girder/issues/1664/comments"},"review_comments":{"href":"https://api.github.com/repos/girder/girder/pulls/1664/comments"},"review_comment":{"href":"https://api.github.com/repos/girder/girder/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/girder/girder/pulls/1664/commits"},"statuses":{"href":"https://api.github.com/repos/girder/girder/statuses/a5dba5b43e36877477f49a1f1dbd8497627155cb"}}}}
{"actor":{"display_login":"zachmullen"}}