{"action":"closed","issue":{"url":"https://api.github.com/repos/npm/npm/issues/8147","labels_url":"https://api.github.com/repos/npm/npm/issues/8147/labels{/name}","comments_url":"https://api.github.com/repos/npm/npm/issues/8147/comments","events_url":"https://api.github.com/repos/npm/npm/issues/8147/events","html_url":"https://github.com/npm/npm/issues/8147","id":72445782,"number":8147,"title":"Unable to publish 404","user":{"login":"wesjones","id":820773,"avatar_url":"https://avatars.githubusercontent.com/u/820773?v=3","gravatar_id":"","url":"https://api.github.com/users/wesjones","html_url":"https://github.com/wesjones","followers_url":"https://api.github.com/users/wesjones/followers","following_url":"https://api.github.com/users/wesjones/following{/other_user}","gists_url":"https://api.github.com/users/wesjones/gists{/gist_id}","starred_url":"https://api.github.com/users/wesjones/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wesjones/subscriptions","organizations_url":"https://api.github.com/users/wesjones/orgs","repos_url":"https://api.github.com/users/wesjones/repos","events_url":"https://api.github.com/users/wesjones/events{/privacy}","received_events_url":"https://api.github.com/users/wesjones/received_events","type":"User","site_admin":false},"labels":[],"state":"closed","locked":false,"assignee":null,"milestone":null,"comments":4,"created_at":"2015-05-01T14:41:14Z","updated_at":"2015-05-01T19:23:55Z","closed_at":"2015-05-01T19:23:55Z","body":"I haven't been able to publish to npm for a while. I cannot figure out why.\r\nThe last version I was able to publish was 1.1.5 and now I am on 1.2.6\r\n\r\n```\r\n0 info it worked if it ends with ok\r\n1 verbose cli [ 'node', '/usr/local/bin/npm', 'publish' ]\r\n2 info using npm@2.1.17\r\n3 info using node@v0.10.35\r\n4 verbose publish [ '.' ]\r\n5 silly cache add args [ '.', null ]\r\n6 verbose cache add spec .\r\n7 silly cache add parsed spec { raw: '.',\r\n7 silly cache add   scope: null,\r\n7 silly cache add   name: null,\r\n7 silly cache add   rawSpec: '.',\r\n7 silly cache add   spec: '/Users/wes/PhpstormProjects/wes/webux/ux-datagrid',\r\n7 silly cache add   type: 'directory' }\r\n8 verbose addLocalDirectory /Users/wes/.npm/ux-angularjs-datagrid/1.2.6/package.tgz not in flight; packing\r\n9 verbose tar pack [ '/Users/wes/.npm/ux-angularjs-datagrid/1.2.6/package.tgz',\r\n9 verbose tar pack   '/Users/wes/PhpstormProjects/wes/webux/ux-datagrid' ]\r\n10 verbose tarball /Users/wes/.npm/ux-angularjs-datagrid/1.2.6/package.tgz\r\n11 verbose folder /Users/wes/PhpstormProjects/wes/webux/ux-datagrid\r\n12 info prepublish ux-angularjs-datagrid@1.2.6\r\n13 verbose addLocalTarball adding from inside cache /Users/wes/.npm/ux-angularjs-datagrid/1.2.6/package.tgz\r\n14 silly cache afterAdd ux-angularjs-datagrid@1.2.6\r\n15 verbose afterAdd /Users/wes/.npm/ux-angularjs-datagrid/1.2.6/package/package.json not in flight; writing\r\n16 verbose afterAdd /Users/wes/.npm/ux-angularjs-datagrid/1.2.6/package/package.json written\r\n17 silly publish { name: 'ux-angularjs-datagrid',\r\n17 silly publish   version: '1.2.6',\r\n17 silly publish   filename: 'datagrid',\r\n17 silly publish   packageName: 'ux',\r\n17 silly publish   main: './build/latest/angular-ux-datagrid.js',\r\n17 silly publish   dependencies: {},\r\n17 silly publish   repository:\r\n17 silly publish    { type: 'git',\r\n17 silly publish      url: 'https://github.com/obogo/ux-angularjs-datagrid' },\r\n17 silly publish   bugs: { url: 'https://github.com/obogo/ux-angularjs-datagrid/issues' },\r\n17 silly publish   homepage: 'http://obogo.github.io/ux-angularjs-datagrid/',\r\n17 silly publish   keywords: [ 'angular', 'datagrid', 'angularjs', 'grid' ],\r\n17 silly publish   devDependencies:\r\n17 silly publish    { colors: 'latest',\r\n17 silly publish      express: 'latest',\r\n17 silly publish      optimist: 'latest',\r\n17 silly publish      grunt: '~0.4.1',\r\n17 silly publish      'grunt-contrib-uglify': '~0.6.0',\r\n17 silly publish      'grunt-contrib-jshint': '~0.6.3',\r\n17 silly publish      'grunt-contrib-clean': '~0.5.0',\r\n17 silly publish      'grunt-contrib-htmlmin': '~0.1.3',\r\n17 silly publish      'grunt-bower-install': '~0.5.0',\r\n17 silly publish      'grunt-contrib-watch': '~0.5.2',\r\n17 silly publish      'grunt-contrib-copy': 'latest',\r\n17 silly publish      'grunt-replace': 'latest',\r\n17 silly publish      'grunt-contrib-jasmine': 'latest' },\r\n17 silly publish   engines: { node: '>=0.8.0' },\r\n17 silly publish   scripts: { start: 'node server.js' },\r\n17 silly publish   readme: '####[Releases](https://github.com/obogo/ux-angularjs-datagrid/releases)\\n- Release 1.2.6 [Source Code (zip)](https://github.com/obogo/ux-angularjs-datagrid/archive/v1.2.6.zip) | [Source Code (tar.gz)](https://github.com/obogo/ux-angularjs-datagrid/archive/v1.2.6.tar.gz)\\n\\n## ux-datagrid : An Angular DataGrid ##\\n----------\\n\\n[![Build Status](https://travis-ci.org/obogo/ux-angularjs-datagrid.svg?branch=master)](https://travis-ci.org/obogo/ux-angularjs-datagrid)\\n\\n[Examples (in progress)](http://obogo.github.io/ux-angularjs-datagrid/)\\n[Old Examples](https://rawgithub.com/obogo/ux-angularjs-datagrid/master/samples/index.html)\\n\\n**Highly performant list and datagrid for AngularJS** designed for mobile devices which just makes it all the better on a desktop.\\n\\nMost lists work with recycled or just-in-time created rows for long lists in angular. **Datagrid doesn\\'t work that way because in order to get a smooth scrolling experience on a mobile device you need to allow the browser to handle the scrolling as much as possible**. So to accomplish this Datagrid works on a chunking algorithm to create pieces as they come into view, but never destroy them until the whole grid is destroyed. This allows the scrolling experience to be smooth because the GPU is leveraged from the browser as the DOM is considered to be static until in view.\\n\\nOf course since this is angular there is then the issue with a **digest being too expensive. This is not a problem** because all rows are disabled from the digest when out of view and enabled when in view. So they don\\'t lose their scopes or have to create new ones constantly, but only once. Then **they are just enabled or disabled as they come into view**.\\n\\n- [Demos](https://rawgithub.com/obogo/ux-angularjs-datagrid/master/samples/index.html)\\n- [Unit Tests](https://rawgithub.com/obogo/ux-angularjs-datagrid/master/test/index.html)\\n- [Docs - in Progress](https://rawgithub.com/obogo/ux-angularjs-datagrid/master/docs/angular-ux-datagrid.js.html)\\n\\n### More Examples ###\\n- [Simple Fiddle Example](http://jsfiddle.net/wesjones/uftsG/)\\n- [Infinite Scroll Example](http://jsfiddle.net/wesjones/sqas5wjp/)\\n- [Quick Start](https://github.com/obogo/ux-angularjs-datagrid/wiki/#wiki-quick-start)\\n- [Getting Started](https://github.com/obogo/ux-angularjs-datagrid/wiki/#wiki-getting-started)\\n- [Multiple Row Templates](https://github.com/obogo/ux-angularjs-datagrid/wiki/#wiki-multiple-row-templates)\\n- [Grouped Data](https://github.com/obogo/ux-angularjs-datagrid/wiki/#wiki-grouped-data)\\n\\n## What makes this list/datagrid different? ##\\nChunking is the concept of **grouping the DOM elements in hierarchies** so that the browser does not calculate the position of every element when one changes, but only those in that container, its parents in its container, and so on up the chain. The smaller the groups, the less the browser has to redraw, size, and position elements because it can just move the parent if necessary. **This works regardless of rows all having the same heights or dynamic heights as long as there is a template for each different height.**\\n\\nUsing this concept, datagrid is able to **create many more rows** that are listed natively **like static HTML and allows the browser to use GPU snapshots to keep scrolling smooth**. Dynamic changes cause repaints that are expensive, so this avoids that.\\n\\n**Chunking doesn\\'t have to create them all** though. To make sure the datagrid could start up and jump to any section quickly it needed to be able to only put in chunks that are in view. So once a chunk is requested it will be created if it was not already. This makes it so that a list of 50,000 items can still start up quickly and jump to any location and scroll as smooth as glass on your mobile device.\\n\\n## Time to get your hands dirty! ##\\nDatagrid uses the concept of templates for your rows. You can have as many templates as you like. You can even overwrite the `templateModel` for one of your own as long as you implement the same API. You just need to assign it as an addon. (We will discuss those later).\\n\\nFirst we will create the directive and assign it an array so it has something to display.\\n\\n```html\\n\\t<div ux-datagrid=\"items\"></div>\\n```\\n\\nThese items are read from the scope that the datagrid exists in. It will then take that data and convert it into a normalized array so it can display every item. This does nothing for single dimensional arrays, but for arrays that are multi-dimensional it creates a single array of those based on the `grouped` property.\\n\\nGrouped property is for reading a hierarchy. If you have an object with the property `children` that is an array, then \"children\" would be your grouped property for the datagrid to read it. See this example for use of grouped data. [Grouped Data Example](https://rawgithub.com/obogo/ux-datagrid/master/samples/lotsOfRows/index.html)\\n\\nIn most cases your datagrid will look similar to this one below.\\n\\n```html\\n\\t<div ux-datagrid=\"items\">\\n\\t\\t<script type=\"template/html\" data-template-name=\"default\" data-template-item=\"item\">\\n\\t\\t\\t<div class=\"row\">{{item}}</div>\\n\\t\\t</script>\\n\\t</div>\\n```\\n\\nWhat is really happening here is that the directive is setup with a script template inside of it. The script template allows the contents to be read as a string rather than be interpreted as DOM by the browser. So it makes a very convenient way of writing out your row templates.\\n\\nThe script template has 3 properties. \\n\\n- **type=\"template/html\"** it uses this to match on. So if you don\\'t get it right might not work. This is required.\\n- **template-name** if this is not defined it will be changed to \\'default\\'. So this one is not required if you only have one template, but if you have more than one the second will overwrite the first without this property.\\n- **template-item** this is what you want the data to be referenced by on the row scope. Such as in angular if you do a repeat with \"item in items\" you then reference `item` in your template. This does the same thing with this property.\\n\\n###Dynamically specify your templates instead of using script templates###\\n- [Demo](https://rawgithub.com/obogo/ux-angularjs-datagrid/master/samples/app/index.html#/other/templateData)\\n- [Fiddle](http://jsfiddle.net/m2tRh/1/)\\n\\nAs of 0.6.4 you can also pass a template data object to be used an an option to script templates. To do this you just need to reference an object and pass to the grid options like so.\\n\\n```html\\n    <div data-ux-datagrid=\"items\" class=\"datagrid\" data-options=\"{templateModel:{templates:templates}}\"></div>\\n```\\n\\nThen just define `templates` on your scope. Like so:\\n\\n```js\\n    $scope.templates = [\\n        {\\n            template: \\'<div class=\"row\"><div>{{item.id}}</div></div>\\',\\n            name: \\'default\\',\\n            item: \\'item\\',\\n            base: null\\n        }\\n    ];\\n```\\n\\n**Please note that script templates will override these templates if they have the same name.** Such as if you have a template with the name \\'default\\' and a script template with the data-template-name=\"default\" then the script template will overwrite the other template.\\n\\n## Addons / Plugins ##\\nAddons are like a plugin to the datagrid. It actually becomes a behavior modifier of the datagrid object. Addons are created as factories and applied directly to the datagrid instance. The internals of the datagrid are constructed with addons as well.\\n\\nBecause these addons assign themselves as behaviors to the instance behaviors can be overwritten. So if you need to modify core behavior then go right ahead and add an addon that overwrites those methods.\\n\\n**How to create an addon**\\nAddons are factories that modify the behavior. To create an addon you just need to create the factory and then add it to the DOM.\\n\\n```js\\n\\tangular.module(\\'ux\\').factory(\\'datagridVersion\\', function () {\\n\\t\\treturn function (datagrid) {\\n\\t\\t\\tdatagrid.version = \"0.1.0\";\\n\\t\\t};\\n\\t});\\n```\\n\\nNow we need to add it to the DOM.\\n\\n```html\\n\\t<div ux-datagrid=\"items\" data-addons=\"datagridVersion\">...</div>\\n```\\n\\nNow when this datagrid is created it will call the `datagridVersion` factory and pass to it the datagrid instance so that it can be modified.\\n\\nAny public methods can be overwritten allowing you to change internal behavior. Not all methods are public, but hopefully the ones you need.\\n\\nIt is also handy to have addons that will update based on events. Here is an example of an addon that updates based off of some events that the datagrid will throw. For this example we will assume we are waiting for some data to load asynchronously through a service. So we want a spinner until the data is loaded.\\n\\n```js\\n\\tangular.module(\\'ux\\').factory(\\'listLoader\\', function () {\\n\\t\\treturn function (datagrid) {\\n\\t\\t\\tdatagrid.unwatchers.push(datagrid.scope.$on(ux.datagrid.events.ON_AFTER_UPDATE_WATCHERS, function () {\\n\\t\\t\\t\\tif (datagrid.data.length) {\\n\\t\\t\\t\\t\\talert(\\'loading is complete\\');\\n\\t\\t\\t\\t}\\n\\t\\t\\t}))\\n\\t\\t};\\n\\t})\\n```\\n\\n##Why use iScroll##\\nI had my own version of a scroller. However, datagrid is not a scrolling solution, it is a long list rendering solution. Scrolling can be done with any javascript scrolling solution. iScroll is a popular scroller so I used it to leverage the reuse of other libraries with the addition of addons to make them compatible.\\nAlso notice that I only implemented this for the iOS. Android works well with native scrolling.\\n\\n##Without iScroll##\\nI found that in some really long lists in a project that I was using the datagrid in that iScroll would crash in Safari on mobile devices. These lists were over 7k items and had very complex rows. However, I made an addition so that we have ux-datagrid-scrollBar.js now so you can make your app work without iScroll and avoid the memory leak.\\nI am not sure if the memory leak is the fault of Safari or iScroll, but the combination of the two was crashing with an out of memory error on iOS devices.\\nTo use the scrollbar on iOS devices (Android 4.0 devices do not need an extra addon because they already handle much of the scrolling natively) you need to add to the options {scrollModel:{manual:true}}. This will enable touch events to cause the iOS devices to work with their native scroll and still be able to flick. And of course, don\\'t forget to add the scrollBar addon in your addons.\\n\\n## No JQuery ##\\nAngularJS Datagrid doesn\\'t have any JQuery dependencies. This helps to keep your application light weight.\\n\\n## options.chunks.detachDom mode ##\\nSome browsers cannot handle a large amount of DOM in the page (Cough... IE). So to improve performance in those browsers I added the `detachDom` mode. It still renders the chunks, but will detach the ones out of view.\\nThe number passed to the `detachDom` mode is how many DOM rows to render in each direction of the current visible area. So if your chunks were 10 rows per chunk and you wanted to have one chunk in either direction from the view area then you would set `detachDom = 10`.\\nI have used this in other places to optimize browser responsiveness. Slower devices benefit from this as well.\\n\\n## Running Unit Tests Locally ##\\nYou can run the unit tests and samples locally by running\\n\\n    npm install\\n\\ninside of the app directory. Then starting the server.\\n\\n    node server.js\\n\\nThen you can just pull it up in your browser on \"http://localhost:4000/\".\\n\\n##About Addons##\\n\\n###Addon: disableHoverWhileScrolling (desktop/ux-datagrid-disableHoverWhileScrolling.js) ###\\nThis addon is used to do obviously what it says. This increases performance while scrolling because hover events if there are a lot on the page can affect performance.\\n\\n###Addon: focusManager (desktop/ux-datagrid-focusManager.js) ###\\nWhile this is listed under desktop, it actually has several uses for touch browsers as well. It has built-in functionality to move next and previous through rows selecting similar items.\\n\\nSo for example let\\'s say you have an input in a row. Focus manager on focus would build a selector for that input. Then when you have a button that tells it go to to the next item. It will look up that next item based on the selector from the previous row. If the selector doesn\\'t match it will skip that row. Making it jump over rows that might be headers and such. You can see an example of this in the example app under focus manager.\\nIf you are looking for more of a full focusManager for your whole app you should check out [angular-ux-focusmanager](https://github.com/obogo/angular-ux-focusmanager).\\n\\nTo tell the focus manager to go to the next item you would need to get the datagrid instance from the scope. Let\\'s add an example below of a controller with a datagrid.\\n\\n```html\\n    <div ng-controller=\"myController\" class=\"listA\">\\n        <a href=\"\" ng-click=\"prev()\">Prev</a>\\n        <a href=\"\" ng-click=\"next()\">Next</a>\\n        <!--// this is the datagrid //-->\\n        <div ux-datagrid=\"items\" class=\"datagrid\" data-grouped=\"\\'children\\'\" data-addons=\"gridFocusManager\">\\n            <script type=\"template/html\" data-template-name=\"group\" data-template-item=\"item\">\\n                <div class=\"group {{fake}}\">\\n                    <div class=\"col col1\">{{item.id}}</div>\\n                </div>\\n            </script>\\n            <script type=\"template/html\" data-template-name=\"default\" data-template-item=\"item\">\\n                <div class=\"row\">\\n                    <div class=\"col col1\">{{item.id}}</div>\\n                    <div class=\"col col1\" data-ng-repeat=\"col in item.cols\"><input type=\"text\" data-ng-model=\"col.value\"></div>\\n                    <div class=\"col\"></div>\\n                </div>\\n            </script>\\n        </div>\\n    </div>\\n```\\n\\nUsing the above HTML, and having a controller like the one below we could access the grid like this.\\n\\n```js\\n    function myController($scope) {\\n        // neither of these functions will work unless there is an active focus element within the grid already.\\n        $scope.previous = function () {\\n            // the reason we do this is that the datagrid has it\\'s own scope. So the myController scope needs to get it\\'s child scope to access the datagrid.\\n            var grid = $scope.$$childHead.datagrid;\\n            grid.gridFocusManager.focusToPrevRowElement(document.activeElement);\\n        };\\n        $scope.next = function () {\\n            // the reason we do this is that the datagrid has it\\'s own scope. So the myController scope needs to get it\\'s child scope to access the datagrid.\\n            var grid = $scope.$$childHead.datagrid;\\n            grid.gridFocusManager.focusToNextRowElement(document.activeElement);\\n        };\\n    }\\n```\\n\\nHere is a JSFiddle example of how to make your grid work like tables with columns. [ux-angularjs-datagrid tables](http://jsfiddle.net/wesjones/8r4xP/)\\n\\n###Addon: Collapsible Groups (ux-datagrid-collapsibleGroups.js)###\\nCollapsible groups is meant to work with grouped data. Given an array like the following.\\n\\n```js\\n    [{id:\\'a\\', list:[{id:\\'a.1\\'}, {\\'a.2\\'}]}, {id:\\'b\\', list:[{id:\\'b.1\\'}, {id:\\'b.2\\'}]}]\\n```\\n\\nEach Group has sub groups of list. In the template we pass the data-grouped=\"\\'list\\'\" so that the datagrid knows which child property to normalize.\\nThe datagrid will convert the structure into a single array like the one below.\\n\\n```js\\n    [{id:\\'a}, {id:\\'a.1\\'}, {\\'a.2\\'}, {id:\\'b\\'}, {id:\\'b.1\\'}, {id:\\'b.2\\'}]\\n```\\n\\nThen we have group `a` and group `b` that are now indexed and no longer actual groups. The `collapseGroups` addon will take this new structure and when a group is clicked it will hide all children from that group and update the heights accordingly.\\nThis will essentially hide all children of that group leaving the group header.\\n\\n###Addon: Expandable Groups (ux-datagrid-expandableGroups.js)###\\nWhile this is easy to confuse with collapsible groups this addon performs very differently. It is optimized to remove rows instead of just hiding them like with `collapsibleGroups`. This has pros and cons to it.\\n\\nWhile it will be able to do an `expandAll` and `collapseAll` which the collapsibleGroups cannot do, it cannot change without reloading the data, which means that you can see a flicker of the list. (This is if you are using the built-in styles; if you take the transitions off then the flicker is unnoticeable).\\n\\nIf you need to async load data into expandable groups then this example may work better for you. It shows how to do it without an addon. [jsFiddle Example](http://jsfiddle.net/wesjones/3Wg79/)\\n\\n###Addon: Expanded Rows (ux-datagrid-expandRows.js)###\\nThis one works in a similar way to collapsible groups. It changes the heights of rows to simulate an effect. In this case it makes the rows taller. Collapsible Groups actually changes their heights to 0 and makes them not display.\\nExpand rows work with different templates. So you need to setup some options. Given the following grid, see the options.\\n\\n```html\\n    <div ux-datagrid=\"items\" class=\"datagrid\" data-grouped=\"\\'children\\'\" data-addons=\"iScrollAddon expandRows\"\\n        data-options=\"{chunks:{size:10}, expandRows:[{template:\\'group\\', cls:\\'groupExpand\\'},{template:\\'default\\', cls:\\'expandDefault\\'},{template:\\'sub\\', cls:\\'expandSub\\'}]}\">\\n        <script type=\"template/html\" data-template-name=\"group\" data-template-item=\"item\">\\n            <div class=\"group {{fake}}\" data-ng-click=\"datagrid.expandRows.toggle($index)\">\\n                <div class=\"col col1\">{{item.id}}</div>\\n                <div class=\"col col2\">{{$id}}</div>\\n                <div class=\"col col4\">{{counter}}</div>\\n                <div class=\"col col3\">height 20px</div>\\n                <div class=\"col col5\"></div>\\n            </div>\\n        </script>\\n        <script type=\"template/html\" data-template-name=\"default\" data-template-item=\"item\">\\n            <div class=\"row {{fake}}\" data-ng-click=\"datagrid.expandRows.toggle($index)\">\\n                <div class=\"col col1\">{{item.id}}</div>\\n                <div class=\"col col2\">{{$id}}</div>\\n                <div class=\"col col4\">{{counter}}</div>\\n                <div class=\"col col3\">height 40px</div>\\n                <div class=\"col col5\"><input type=\"text\"></div>\\n            </div>\\n        </script>\\n        <script type=\"template/html\" data-template-name=\"sub\" data-template-item=\"item\">\\n            <div class=\"sub {{fake}}\" data-ng-click=\"datagrid.expandRows.toggle($index)\">\\n                <div class=\"col col1\">{{item.id}}</div>\\n                <div class=\"col col2\">{{$id}}</div>\\n                <div class=\"col col4\">{{counter}}</div>\\n                <div class=\"col col3\">height 30px</div>\\n                <div class=\"col col5\"><input type=\"text\"></div>\\n            </div>\\n        </script>\\n    </div>\\n```\\n\\nNotice that `expandRows` option gives a `template`, and `cls` property. The `template` property is the name of the template to affect, and the `cls` is the CSS class that gets assigned to that row when it is expanded.\\nThen the CSS transitions can be done or just popped open as well. Transitions may suffer from chunks that do not transition as well, so in my examples I have just had them snap open. All I needed to do is add a new height to that CSS class so that when it is added the row expands. The datagrid does the rest.\\n\\n###Addon: Grid Logger (ux-datagrid-gridLogger.js)###\\nThe grid logger is a way to display errors or other log data from the grid. It is set to listen to grid events and log those values. The datagrid doesn\\'t log directly, it throws events for logs.\\nNotice the options. Grid logger can capture events for all addons, or it can capture them for only items specified.\\n\\n```html\\n    <div data-ux-datagrid=\"items\" class=\"datagrid\" data-addons=\"gridLogger\" data-options=\"{debug:{all:1, Flow:0}}\">\\n        <script type=\"template/html\" data-template-name=\"default\" data-template-item=\"item\">\\n            <div class=\"row {{fake}}\">\\n                <div class=\"text\">{{item.id}} {{$id}} {{counter}}</div>\\n            </div>\\n        </script>\\n    </div>\\n```\\n\\nWith `debug:{all: 1}` you\\'re going to get a lot of log data.\\nWith `debug:{scrollModel:1}` you just get events from the scroll model. So when building your addon this can be handy for debugging.\\nYou can also turn logs off. `debug:{all:1, Flow:0}` turns off the flow control logs, but logs everything else. `debug:{all:1, Flow:0, scrollModel: 0}` turns off Flow and scrollModel, but logs the rest.\\n\\n###Addon: Infinite Scroll (ux-datagrid-infiniteScroll.js)###\\nInfinite Scroll needs a couple of hooks to work. First your data to start, then a method that will update the data when it reaches the bottom. This method can be asynchronous because the datagrid watches for its data to change. So once the data changes in the array, it will update.\\nThe `limit` property can be helpful as well. With this it will tell the addon that it should not show the loading row once the limit has reached this value.\\n\\n```html\\n    <div data-ux-datagrid=\"items\" class=\"datagrid\" data-options=\"{infiniteScroll: {limit:200}}\" data-addons=\"iScrollAddon, infiniteScroll, gridLogger\">\\n        <script type=\"template/html\" data-template-name=\"default\" data-template-item=\"item\">\\n            <div class=\"row\">\\n                <div class=\"text\">{{item.id}} {{$id}} {{counter}}</div>\\n            </div>\\n        </script>\\n        <script type=\"template/html\" data-template-name=\"loadingRow\" data-template-item=\"item\">\\n            <div class=\"row loadingRow\"></div>\\n        </script>\\n    </div>\\n```\\n\\n###Addon: Sort Model (ux-datagrid-sortModel.js)###\\nAllows you to sort the datagrid by its columns. This has options to sort grouped data as well. When sorting grouped data you may want to sort the groups or the items inside of the groups. By default it sorts the items inside of the groups. To sort the groups you need to set the option `sortModel:{groupSort:true}`.\\nHere is an example where it has grouped data and you want to sort the groups instead. You can see it setting the options. You then just `toggleSort()` on the `sortModel`.\\n\\n```html\\n    <div class=\"header\">\\n        <div class=\"row\">\\n            <div class=\"col sortCol1\" data-ng-click=\"datagrid.sortModel.toggleSort(\\'id\\')\"><div class=\"{{datagrid.sortModel.getSortStateOf(\\'id\\')}}\">ID</div></div>\\n            <div class=\"col sortCol2\" data-ng-click=\"datagrid.sortModel.toggleSort(\\'name\\')\"><div class=\"{{datagrid.sortModel.getSortStateOf(\\'name\\')}}\">Name</div></div>\\n            <div class=\"col sortCol3\" data-ng-click=\"datagrid.sortModel.toggleSort(\\'description\\')\"><div class=\"{{datagrid.sortModel.getSortStateOf(\\'description\\')}}\">Description</div></div>\\n            <div class=\"col sortCol4\" data-ng-click=\"datagrid.sortModel.toggleSort(\\'type\\')\"><div class=\"{{datagrid.sortModel.getSortStateOf(\\'type\\')}}\">Type</div></div>\\n            <div class=\"col sortCol5\" data-ng-click=\"datagrid.sortModel.toggleSort(\\'weight\\')\"><div class=\"{{datagrid.sortModel.getSortStateOf(\\'weight\\')}}\">oz</div></div>\\n        </div>\\n    </div>\\n    <div class=\"my-container\">\\n        <div class=\"listA\">\\n            <!--// this is the datagrid. Add to the sorts the columns that you want sorted. If not added they will not be sortable. To pass methods for your own sorts, pass an object with asc, and desc properties that are sort functions. //-->\\n            <div data-ux-datagrid=\"datagrid.sortModel.applySorts(items)\" class=\"datagrid\" data-grouped=\"\\'children\\'\" data-addons=\"sortModel\" data-options=\"{sortModel:{groupSort:true, sorts: {id:\\'none\\', name:\\'asc\\', description:\\'none\\', type:\\'none\\', weight:\\'none\\'}}}\">\\n                <script type=\"template/html\" data-template-name=\"group\" data-template-item=\"item\">\\n                    <div class=\"group {{fake}}\">\\n                        <div class=\"col col1\">{{item.id}}</div>\\n                    </div>\\n                </script>\\n                <script type=\"template/html\" data-template-name=\"default\" data-template-item=\"item\">\\n                    <div class=\"row {{fake}}\">\\n                        <div class=\"col sortCol1\">{{item.id}}</div>\\n                        <div class=\"col sortCol2\">{{item.name}}</div>\\n                        <div class=\"col sortCol3\">{{item.description}}</div>\\n                        <div class=\"col sortCol4\">{{item.type}}</div>\\n                        <div class=\"col sortCol5\">{{item.weight}}</div>\\n                    </div>\\n                </script>\\n            </div>\\n        </div>\\n    </div>\\n```\\n\\n###Get a reference to the datagrid from your scope###\\nOften times you want to communicate directly with the datagrid in a directive or a controller.\\nTo get a reference to the datagrid instance you just need to listen for its startup event. (v1.1.1)\\n\\n```js\\n        $scope.$on(ux.datagrid.events.ON_STARTUP_COMPLETE, function (event, inst) {\\n            $scope.datagrid = inst;\\n        });\\n```\\n\\n###ng-show###\\nThe datagrid has an incompatibility with `ng-show` because it needs a height when initialized to calculate how many rows to show. Please do not use an `ng-show`, use an `ng-if` which will create the datagrid when it is shown, where an `ng-show` will create it but not allow it to get a height because of the `display:none` of the parent. See issue [#28](https://github.com/obogo/ux-angularjs-datagrid/issues/28).\\n\\n##IE8 Compatibility##\\nIE8 may work with ux-datagrid by adding some polyfills for emulating missing ES5 features in IE8. First it\\'s required to add [ES5 Shim](https://github.com/es-shims/es5-shim) and also an additional file [Polyfill IE8](/build/latest/IE/Polyfill_IE8.js), located in this repository from this repository.\\n',\r\n17 silly publish   readmeFilename: 'README.md',\r\n17 silly publish   gitHead: '0525769b6abad36b1b24dbab733c6d0ab7f4672a',\r\n17 silly publish   description: '- Release 1.2.6 [Source Code (zip)](https://github.com/obogo/ux-angularjs-datagrid/archive/v1.2.6.zip) | [Source Code (tar.gz)](https://github.com/obogo/ux-angularjs-datagrid/archive/v1.2.6.tar.gz)',\r\n17 silly publish   _id: 'ux-angularjs-datagrid@1.2.6',\r\n17 silly publish   _shasum: '380fdbe7fea084a6fb8e725c04be81322b6b3ae3',\r\n17 silly publish   _from: '.' }\r\n18 silly mapToRegistry name ux-angularjs-datagrid\r\n19 silly mapToRegistry using default registry\r\n20 silly mapToRegistry registry https://registry.npmjs.org/\r\n21 silly mapToRegistry uri https://registry.npmjs.org/ux-angularjs-datagrid\r\n22 verbose publish registryBase https://registry.npmjs.org/\r\n23 silly publish uploading /Users/wes/.npm/ux-angularjs-datagrid/1.2.6/package.tgz\r\n24 verbose request uri https://registry.npmjs.org/ux-angularjs-datagrid\r\n25 verbose request sending authorization for write operation\r\n26 info attempt registry request try #1 at 08:38:15\r\n27 verbose request id b38753683d2f70cf\r\n28 http request PUT https://registry.npmjs.org/ux-angularjs-datagrid\r\n29 http 404 https://registry.npmjs.org/ux-angularjs-datagrid\r\n30 verbose headers { 'content-type': 'application/json',\r\n30 verbose headers   'cache-control': 'max-age=0',\r\n30 verbose headers   'content-length': '21',\r\n30 verbose headers   'accept-ranges': 'bytes',\r\n30 verbose headers   date: 'Fri, 01 May 2015 14:38:18 GMT',\r\n30 verbose headers   via: '1.1 varnish',\r\n30 verbose headers   connection: 'keep-alive',\r\n30 verbose headers   'x-served-by': 'cache-sjc3134-SJC',\r\n30 verbose headers   'x-cache': 'MISS',\r\n30 verbose headers   'x-cache-hits': '0',\r\n30 verbose headers   'x-timer': 'S1430491095.252637,VS0,VE3453' }\r\n31 verbose request invalidating /Users/wes/.npm/registry.npmjs.org/ux-angularjs-datagrid on PUT\r\n32 error publish Failed PUT 404\r\n33 verbose stack Error: Not found : ux-angularjs-datagrid\r\n33 verbose stack     at CachingRegistryClient.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/npm-registry-client/lib/request.js:244:14)\r\n33 verbose stack     at Request._callback (/usr/local/lib/node_modules/npm/node_modules/npm-registry-client/lib/request.js:172:14)\r\n33 verbose stack     at Request.self.callback (/usr/local/lib/node_modules/npm/node_modules/request/request.js:373:22)\r\n33 verbose stack     at Request.emit (events.js:98:17)\r\n33 verbose stack     at Request.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/request/request.js:1318:14)\r\n33 verbose stack     at Request.emit (events.js:117:20)\r\n33 verbose stack     at IncomingMessage.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/request/request.js:1266:12)\r\n33 verbose stack     at IncomingMessage.emit (events.js:117:20)\r\n33 verbose stack     at _stream_readable.js:944:16\r\n33 verbose stack     at process._tickCallback (node.js:442:13)\r\n34 verbose statusCode 404\r\n35 verbose pkgid ux-angularjs-datagrid\r\n36 verbose cwd /Users/wes/PhpstormProjects/wes/webux/ux-datagrid\r\n37 error Darwin 14.3.0\r\n38 error argv \"node\" \"/usr/local/bin/npm\" \"publish\"\r\n39 error node v0.10.35\r\n40 error npm  v2.1.17\r\n41 error code E404\r\n42 error 404 Not found : ux-angularjs-datagrid\r\n42 error 404\r\n42 error 404 'ux-angularjs-datagrid' is not in the npm registry.\r\n42 error 404 You should bug the author to publish it (or use the name yourself!)\r\n42 error 404\r\n42 error 404 Note that you can also install from a\r\n42 error 404 tarball, folder, http url, or git url.\r\n43 verbose exit [ 1, true ]\r\n```"}}