diff --git a/.gitignore b/.gitignore index e43b0f98..18ff1d0c 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .DS_Store +npm-debug.log diff --git a/npm-debug.log b/npm-debug.log deleted file mode 100644 index 426cf332..00000000 --- a/npm-debug.log +++ /dev/null @@ -1,102 +0,0 @@ -0 info it worked if it ends with ok -1 verbose cli [ 'node', '/usr/local/bin/npm', 'publish' ] -2 info using npm@2.15.1 -3 info using node@v0.12.14 -4 verbose publish [ '.' ] -5 silly cache add args [ '.', null ] -6 verbose cache add spec . -7 silly cache add parsed spec { raw: '.', -7 silly cache add scope: null, -7 silly cache add name: null, -7 silly cache add rawSpec: '.', -7 silly cache add spec: '/Users/tgermaneri/git/canvas-datagrid', -7 silly cache add type: 'directory' } -8 verbose addLocalDirectory /Users/tgermaneri/.npm/canvas-datagrid/0.9.3/package.tgz not in flight; packing -9 verbose correctMkdir /Users/tgermaneri/.npm correctMkdir not in flight; initializing -10 verbose tar pack [ '/Users/tgermaneri/.npm/canvas-datagrid/0.9.3/package.tgz', -10 verbose tar pack '/Users/tgermaneri/git/canvas-datagrid' ] -11 verbose tarball /Users/tgermaneri/.npm/canvas-datagrid/0.9.3/package.tgz -12 verbose folder /Users/tgermaneri/git/canvas-datagrid -13 info prepublish canvas-datagrid@0.9.3 -14 verbose addLocalTarball adding from inside cache /Users/tgermaneri/.npm/canvas-datagrid/0.9.3/package.tgz -15 verbose correctMkdir /Users/tgermaneri/.npm correctMkdir not in flight; initializing -16 silly cache afterAdd canvas-datagrid@0.9.3 -17 verbose afterAdd /Users/tgermaneri/.npm/canvas-datagrid/0.9.3/package/package.json not in flight; writing -18 verbose correctMkdir /Users/tgermaneri/.npm correctMkdir not in flight; initializing -19 verbose afterAdd /Users/tgermaneri/.npm/canvas-datagrid/0.9.3/package/package.json written -20 silly publish { name: 'canvas-datagrid', -20 silly publish version: '0.9.3', -20 silly publish description: 'Canvas based data grid', -20 silly publish main: './lib/main.js', -20 silly publish scripts: { test: 'echo "Error: no test specified" && exit 1' }, -20 silly publish repository: -20 silly publish { type: 'git', -20 silly publish url: 'git+https://github.com/TonyGermaneri/canvas-datagrid.git' }, -20 silly publish keywords: [ 'canvas', 'datagrid', 'grid' ], -20 silly publish author: { name: 'Tony Germaneri', email: 'Tony.Germaneri@gmail.com' }, -20 silly publish license: 'BSD-3-Clause', -20 silly publish bugs: { url: 'https://github.com/TonyGermaneri/canvas-datagrid/issues' }, -20 silly publish homepage: 'https://github.com/TonyGermaneri/canvas-datagrid#readme', -20 silly publish readme: 'Canvas Data Grid\n================\n\nLightweight canvas based data grid.\n\n[Demo](https://tonygermaneri.github.io/canvas-datagrid/sample/index.html)\n\nInstantiation\n=============\n\nWorks with require framework or without.\nIf used without require, `canvasDataGrid` is declared in the global scope.\n\nSimple creation and data set.\n\n var grid = canvasDataGrid({\n parentNode: document.getElementById(\'blockElement\'),\n data: data\n });\n\n\nAttributes\n==========\n\nAttributes can be set during instantiation or after\nby accessing `grid.attributes`. If changed after instantiation some attributes\nrequire calling `grid.draw()` to see changes.\n\nshowNewRow: true\n----------------\nWhen true, a row will appear at the bottom of the data set. `schema[].defaultValue`\nwill define a default value for each cell. `defaultValue` can be a `string` or a\n`function`. When a function is used, the arguments `header` and `index` will be passed\nto the function. The value returned by the function will be the value in the new cell.\n\nsaveAppearance: true \n----------------\nWhen true, and the attribute `name` is set, column and row sizes will be saved to the\nbrowser\'s localStore.\n\nselectionFollowsActiveCell: false \n----------------\nWhen true, moving the active cell with keystrokes will also change the selection.\n\nmultiLine: true \n----------------\nWhen true, edit cells will be textareas, when false edit cells will be inputs.\n\neditable: true \n----------------\nWhen true cells can be edited. When false, grid is read only to the user.\n\nallowColumnReordering: true \n----------------\nWhen true columns can be reordered. NOT IMPLEMENTED.\n\nshowFilter: true \n----------------\nWhen true, filter will be an option in the context menu.\n\npageUpDownOverlap: 1 \n----------------\nAmount of rows to overlap when pageup/pagedown is used.\n\npersistantSelectionMode: false \n----------------\nWhen true, selections will behave as if the command/control key is held down at all times.\n\nrowSelectionMode: false \n----------------\nWhen true, clicking on any cell will select the entire row that cell belongs to.\n\nautoResizeColumns: false \n----------------\nWhen true, all columns will be automatically resized to fit the data in them.\nWarning! Expensive for large (>10k ~2 seconds) datasets.\n\nallowRowHeaderResize: true \n----------------\nWhen true, the user can resize the width of the row headers.\n\nallowColumnResize: true \n----------------\nWhen true, the user can resize the width of the columns.\n\nallowRowResize: true \n----------------\nWhen true, the user can resize the row headers increasing the height of the row.\n\n\nallowRowResizeFromCell: false \n----------------\nWhen true, the user can resize the height of the row from the border of the cell.\n\nallowColumnResizeFromCell: false \n----------------\nWhen true, the user can resize the width of the column from the border of the cell.\n\nshowPerformance: false \n----------------\nWhen true, the amount of time taken to draw the grid is shown.\n\nborderResizeZone: 10 \n----------------\nNumber of pixels in total around a border that count as resize zones.\n\nshowHeaders: true \n----------------\nWhen true, headers are shown.\n\nshowRowNumbers: true \n----------------\nWhen true, row numbers are shown in the row headers.\n\nshowRowHeaders: true \n----------------\nWhen true, row headers are shown.\n\n\n\nProperties\n==========\n\nchanges\n-------\nArray of changes and additions made to the grid since last time data was loaded.\nThe data property will change with changes as well, but this is a convince list of all the\nchanges in one spot. Calling `clearChangeLog` will clear this list.\n\ninput\n-----\nReference to the the edit cell when editing. Undefined when not editing.\n\ncontrolInput\n------------\nInput used for key controls on the grid. Any clicks on the grid will cause\nthis input to be focused. This input is hidden behind the canvas.\n\ncurrentCell\n-------------\nConvenience object that represents the object that the mouse moved over last.\n\nheight\n------\nHeight of the grid.\n\nwidth\n-----\nWidth of the grid.\n\nvisibleCells\n------------\nArray of cell drawn.\n\nvisibleRows\n-----------\nArray of visible row indexes.\n\nselections\n----------\nMatrix array of selected cells.\n\nselectionBounds\n---------------\n`rect` object, bounds of current selection.\n\nattributes\n----------\nObject that contains the properties listed in the attributes section.\n\nsizes\n-----\nMutable object that contains `sizes.columns` and `sizes.rows` arrays.\nThese arrays control the sizes of the columns and rows.\nIf there is not an entry for the row or column index it will fall back to\nthe style default.\n\nstyle\n-----\nObject that contains the properties listed in the style section.\n\nresizeMode\n----------\nRepresents the currently displayed resize cursor. Can be `ns-resize`, `ew-resize`, `pointer`, or `inherit`.\n\ncellFormaters\n-------------\nObject that contains a list of formatters for displaying text.\nThe properties in this object match the `schema[].type` property.\nFor example, if the schema for a given column was of the type `date`\nthe grid would look for a formatter called `cellFormatters.date`\nif a formatter cannot be found for a given data type a warning will\nbe logged and the string formatter will be used.\n\nCell formatter function should contain the following arguments.\n\n cellFormatters.date = function (ctx, cell) { return new Date(cell.value).toISOString(); }\n\n| Argument | Description |\n|-----|------|\n| ctx | Canvas context. |\n| cell | Current cell. |\n\nFormatters must return a string value to be displayed in the cell.\n\nfilters\n-------\nObject that contains a list of filters for filtering data.\nThe properties in this object match the `schema[].type` property.\nFor example, if the schema for a given column was of the type `date`\nthe grid would look for a filter called `filters.date`\nif a filter cannot be found for a given data type a warning will\nbe logged and the string/RegExp filter will be used.\n\n filters.number = function (value, filterFor) {\n if (!filterFor) { return true; }\n return value === filterFor;\n };\n\n| Argument | Description |\n|-----|------|\n| value | Value of the data. |\n| filterFor | Value to filter for. |\n\ndata\n----\nThis is how data is set in the grid.\nData must be an array of objects that conform to a schema.\n\n [\n {col1: \'row 1 column 1\', col2: \'row 1 column 2\', col3: \'row 1 column 3\'},\n {col1: \'row 2 column 1\', col2: \'row 2 column 2\', col3: \'row 2 column 3\'}\n ]\n\nschema\n------\nSchema is optional. Schema is an array of column objects.\nIf no schema is provided one will be generated from the\ndata, in that case all data will be assumed to be string data.\n\nEach column object can have the following properties:\n\n| Property | Description |\n|-----|------|\n| name | The name of the column. This is used to match with data and is the only required property. |\n| type | The data type of this column |\n| title | What will be displayed to the user. If not present, name will be used. |\n| width | The default width in pixels of this column.|\n| hidden | When true the column will be hidden. |\n| filter | The filter function to use to filter this column. If no function is provided, type will determine filer. |\n| formatter | The formatter function used display this column. If no function is provided, type will determine formatter.|\n| defaultValue | The default value of this column for new rows. This is a function that takes the arguments `header` and `index` and must return a value for new default cells in this column.|\n\n [\n {\n name: \'col1\'\n },\n {\n name: \'col2\'\n },\n {\n name: \'col3\'\n }\n ]\n\nMethods\n==========\n\nbeginEditAt(x, y)\n-----------------\nBegins editing at cell x, row y\n\nendEdit(abort)\n--------------\nEnds editing, optionally aborting the edit.\n\nclearChangeLog()\n----------------\nClears the change log `grid.changes` that keeps track of changes to the data set.\nThis does not undo changes or alter `grid.data` it is simply a convince array to\nkeep track of changes made to the data.\n\nsetActiveCell(x, y)\n-------------------\nSets the active cell. Requires redrawing.\n\nscrollIntoView(x, y)\n--------------------\nScrolls the cell at cell x, row y into view if it is not already.\n\ngotoToCell(x, y)\n------------------\nScrolls to the cell at cell x, row y.\n\ngotoToRow(y)\n------------\nScrolls to the row y.\n\nfindColumnScrollLeft(columnIndex)\n---------------------------------\nReturns the number of pixels to scroll to the left to line up with column `columnIndex`.\n\nfindRowScrollTop(rowIndex)\n--------------------------\nReturns the number of pixels to scroll down to line up with row `rowIndex`.\n\ngetSelectionBounds()\n--------------------\nGets the bounds of current selection. Returns a `rect` object.\n\nfitColumnToValues(name)\n-----------------------\nResizes a column to fit the longest value in the column. Call without a value to resize all columns.\nWarning, can be slow on very large record sets (100k records ~3-5 seconds on an i7).\n\ngetHeaderByName(name)\n---------------------\nReturns a header from the schema by name.\n\nfindColumnMaxTextLength(name)\n-----------------------------\nReturns the maximum text width for a given column by column name.\n\ndisposeContextMenu()\n--------------------\nRemoves the context menu if it is present.\n\ngetCellAt(x, y)\n-----------------\nGets the cell at grid pixel coordinate x and y.\n\norder(columnName, direction)\n----------------------------\nSets the order of the data.\n\ndraw()\n------\nRedraws the grid. No matter what the change, this is the only method required to refresh everything.\n\nselectArea()\n------------\nAccepts a `rect` object that defines the desired selected area.\n\ngetSchemaFromData()\n-------------------\nReturns schema with auto generated schema based on data structure.\n\nsetFilterValue(column, value)\n----------------------------\nSets the value of the filter.\n\nEvents\n======\n\nselectionchanged\n----------------\nFires when the selection changes.\n\n grid.addEventListener(\'selectionchanged\', function (data, matrix, bounds) { });\n\n| Argument | Description |\n|-----|------|\n| data | Selected data. |\n| matrix | Selections object. 2D matrix of selections. |\n| bounds | `Rectangle` object describing the selection bounds. |\n\nbeforerendercell\n----------------\nFired just before a cell is drawn onto the canvas. `e.preventDefault();` prevents the cell from being drawn.\nYou would only use this if you want to completely stop the cell from being drawn and generally muck up everything.\n\n grid.addEventListener(\'beforerendercell\', function (ctx, value, row, header, x, y) { });\n\n| Argument | Description |\n|-----|------|\n| ctx | Canvas context. |\n| value | Current cell value. |\n| row | Current row data. |\n| header | Current header object. |\n| x | The current cells x coordinate. |\n| y | The current cells y coordinate. |\n\nrendercell\n----------\nFires when a cell is drawn. If you want to change colors, sizes, add content, etc. this is the event to attach to.\nAltering what is drawn by changing the cell object\'s height and width is allowed. Drawing on the canvas is allowed.\nAltering the context of the canvas is allowed.\n\n grid.addEventListener(\'rendercell\', function (ctx, cell) { });\n\n| Argument | Description |\n|-----|------|\n| ctx | Canvas context. |\n| cell | Current cell. |\n\nrendertext\n----------\nFires when text is drawn into a cell. If you want to change the color of the text, this is the event to attach to.\nTo alter what text finally appears in the cell, change the value of `cell.formattedValue`. Keep in mind this\ntext will still be subject to the ellipsis function that truncates text when the width is too long for the cell.\n\nYou cannot alter the cell\'s height or width from this event, use `rendercell` event instead.\n\n grid.addEventListener(\'rendertext\', function (ctx, cell) { });\n\n| Argument | Description |\n|-----|------|\n| ctx | Canvas context. |\n| cell | Current cell. |\n\n\nrenderorderbyarrow\n------------------\nFires when the order by arrow is drawn onto the canvas. This is the only way\nto completely replace the order arrow graphic. Call `e.preventDefault()` to stop the default arrow from being drawn.\n\n grid.addEventListener(\'renderorderbyarrow\', function (ctx, cell) { });\n\n| Argument | Description |\n|-----|------|\n| ctx | Canvas context. |\n| cell | Current cell. |\n\n\nmousemove\n---------\nFires when the mouse moves over the grid.\n\n grid.addEventListener(\'mousemove\', function (e, cell) { });\n\n| Argument | Description |\n|-----|------|\n| 0 | Mouse event. |\n| 1 | Cell under mouse. |\n\n\ncontextmenu\n-----------\nFires when a context menu is requested. The menu item array can be altered to change what items appear on the menu.\n\n grid.addEventListener(\'contextmenu\', function (e, cell, menuItems, contextMenu) { });\n\n| Argument | Description |\n|-----|------|\n| 0 | Mouse event. |\n| 1 | Cell under mouse. |\n| 2 | Mutable list of menu items. |\n| 3 | Context menu HTML element. |\n\nYou can add items to the context menu but they must conform to this object type.\n\n| Property | Description |\n|-----|------|\n| title | The title that will appear in the context menu. If title is a `string` then the string will appear. If title is a `HTMLElement` then it will be appended via `appendChild()` to the context menu row maintaining any events and references. |\n| onclick | Optional function to invoke when this context menu item is clicked. Neglecting to call `e.stopPropagation();` in your function will result in the mouse event bubbling up to the canvas undesirably.|\n\nRemoving all items from the list of menu items will cause the context menu to not appear.\nCalling `e.preventDefault();` will cause the context menu to not appear as well.\n\nbeforeendedit\n-------------\nFires just before edit is complete giving you a chance to validate the input.\n`e.preventDefault();` will cause the edit to not end and row data will not be written back to the `data` array.\n\n grid.addEventListener(\'beforeendedit\', function (value, originalValue, abort, cell, textarea) { });\n\n| Argument | Description |\n|-----|------|\n| value | New value. |\n| originalValue | Original value. |\n| abort | Abort edit function. Call this function to abort the edit. |\n| cell | Cell object. |\n| textarea | Textarea or input HTMLElement depending on `attributes.multiLine`. |\n\n\nendedit\n-------\nFires when the edit has ended. This event gives you a chance to abort the edit\npreserving original row data, or modify the value of the row data prior to being written.\n\n grid.addEventListener(\'endedit\', function (value, abort, cell, textarea) { });\n\n| Argument | Description |\n|-----|------|\n| value | New value. |\n| abort | When true, the edit was aborted. |\n| cell | Cell object. |\n| textarea | Textarea HTMLElement. |\n\n\n\nbeforebeginedit\n---------------\nFires before a edit cell has been created giving you a chance to abort it.\n`e.preventDefault();` will abort the edit cell from being created.\n\n grid.addEventListener(\'beforebeginedit\', function (cell) { });\n\n| Argument | Description |\n|-----|------|\n| cell | Cell object. |\n\n\nbeginedit\n---------\nFires when an editor textarea (or input) has been created.\n\n grid.addEventListener(\'beginedit\', function (cell, textarea) { });\n\n| Argument | Description |\n|-----|------|\n| cell | Cell object. |\n| textarea | Textarea HTMLElement. |\n\n\nclick\n-----\nFires when the grid is clicked.\n\n grid.addEventListener(\'click\', function (e, cell) { });\n\n| Argument | Description |\n|-----|------|\n| e | Mouse event. |\n| cell | Cell object. |\n\n\nresizecolumn\n------------\nFires when a column is about to be resized.\n`e.preventDefault();` will abort the resize.\n\n grid.addEventListener(\'resizecolumn\', function (x, y, cell) { });\n\n| Argument | Description |\n|-----|------|\n| x | x pixel position of the resize. |\n| y | y pixel position of the resize. |\n| cell | The mutable cell to be resized. |\n\n\nmousedown\n---------\nFires when the mouse button is pressed down on the grid.\n`e.preventDefault();` will abort the default grid event.\n\n grid.addEventListener(\'mousedown\', function (e, cell) { });\n\n| Argument | Description |\n|-----|------|\n| e | Mouse event. |\n| cell | Cell object. |\n\nmouseup\n-------\nFires when the mouse button is pressed down on the grid.\n`e.preventDefault();` will abort the default grid event.\n\n grid.addEventListener(\'mouseup\', function (e, cell) { });\n\n| Argument | Description |\n|-----|------|\n| e | Mouse event. |\n| cell | Cell object. |\n\ndblclick\n--------\nFires when the mouse button is double clicked on the grid.\n`e.preventDefault();` will abort the default grid event.\nNote that this will necessarily require 2*`mousedown`, 2*`mouseup` and 2*`click` events to fire prior to the double click.\n\n grid.addEventListener(\'dblclick\', function (e, cell) { });\n\n| Argument | Description |\n|-----|------|\n| e | Mouse event. |\n| cell | Cell object. |\n\n\nkeydown\n-------\nFires when the keyboard button is pressed down on the grid.\n`e.preventDefault();` will abort the default grid event.\n\n grid.addEventListener(\'keydown\', function (e, cell) { });\n\n| Argument | Description |\n|-----|------|\n| e | Key event. |\n| cell | Cell object. |\n\n\nkeyup\n-----\nFires when the keyboard button is released on the grid.\n`e.preventDefault();` will abort the default grid event.\n\n grid.addEventListener(\'keyup\', function (e, cell) { });\n\n| Argument | Description |\n|-----|------|\n| e | Key event. |\n| cell | Cell object. |\n\n\n\nkeypress\n--------\nFires when the keyboard press is completed on the grid.\n`e.preventDefault();` will abort the default grid event.\n\n grid.addEventListener(\'keypress\', function (e, cell) { });\n\n| Argument | Description |\n|-----|------|\n| e | Key event. |\n| cell | Cell object. |\n\n\n\nresize\n------\nFires when grid is being resized.\n`e.preventDefault();` will abort the resizing.\n\n grid.addEventListener(\'resize\', function (e, cell) { });\n\n| Argument | Description |\n|-----|------|\n| 0 | height. |\n| 1 | width. |\n\n\nCommon Objects\n==============\n\ncell\n----\n\nA cell on the grid and all data associated with it.\n\n| Property | Description |\n|-----|------|\n| type | Data type used by this cell as dictated by the column. |\n| style | Visual style of cell. Can be any one of `cell`, `activeCell`, `headerCell`, `cornerCell`, or `headerRowCell`. Prefix of each style name. |\n| x | The x coordinate of this cell on the canvas. |\n| y | The y coordinate of this cell on the canvas. |\n| hovered | When true, this cell is hovered. |\n| selected | When true, this cell is selected. |\n| width | Width of the cell on the canvas. |\n| height | Height of the cell on the canvas. |\n| data | The row of data this cell belongs to. |\n| header | The schema column this cell belongs to. |\n| columnIndex | The column index of the cell. |\n| rowIndex | The row index of the cell. |\n| value | The value of the cell. |\n| formattedValue | The value after passing through any formatters. |\n\nrect\n----\n\nA selection area represented by a `rect`.\nThis object is returned by a number of events, methods and properties, and is passed to the `selectArea` method.\n\n| Property | Description |\n|-----|------|\n| top | First row index. |\n| bottom | Last row index. |\n| left | First column index. |\n| right | Last column index. |\n\n\nStyles\n==========\n\n| Property | Default Value |\n|-----|------|\n| filterTextPrefix | (filtered) |\n| editCellFontSize | 16px |\n| editCellFontFamily | sans-serif |\n| editCellPaddingLeft | 4.5 |\n| contextMenuStyleSheet | false |\n| contextMenuItemMargin | 2px |\n| contextMenuItemBorderRadius | 3px |\n| contextMenuLabelDisplay | inline-block |\n| contextMenuLabelMinWidth | 75px |\n| contextMenuHoverBackground | rgba(182, 205, 250, 1) |\n| contextMenuColor | rgba(43, 48, 43, 1) |\n| contextMenuHoverColor | rgba(43, 48, 153, 1) |\n| contextMenuFontSize | 16px |\n| contextMenuFontFamily | sans-serif |\n| contextMenuBackground | rgba(222, 227, 233, 0.94) |\n| contextMenuBorder | solid 1px rgba(158, 163, 169, 1) |\n| contextMenuPadding | 2px |\n| contextMenuBorderRadius | 3px |\n| contextMenuOpacity | 0.98 |\n| contextMenuFilterInvalidExpresion | rgba(237, 155, 156, 1) |\n| contextMenuMarginTop | 0 |\n| contextMenuMarginLeft | 5 |\n| autosizePadding | 5 |\n| minHeight | 250 |\n| minRowHeight | 10 |\n| minColumnWidth | 10 |\n| columnWidth | 250 |\n| backgroundColor | rgba(240, 240, 240, 1) |\n| headerOrderByArrowHeight | 8 |\n| headerOrderByArrowWidth | 13 |\n| headerOrderByArrowColor | rgba(185, 185, 185, 1) |\n| headerOrderByArrowBorderColor | rgba(195, 199, 202, 1) |\n| headerOrderByArrowBorderWidth | 1 |\n| headerOrderByArrowMarginRight | 5 |\n| headerOrderByArrowMarginLeft | 0 |\n| headerOrderByArrowMarginTop | 6 |\n| cellHeight | 24 |\n| cellFont | 16px sans-serif |\n| cellPaddingTop | 5 |\n| cellPaddingLeft | 5 |\n| cellPaddingRight | 7 |\n| cellAlignment | left |\n| cellColor | rgba(0, 0, 0, 1) |\n| cellBackgroundColor | rgba(240, 240, 240, 1) |\n| cellHoverColor | rgba(0, 0, 0, 1) |\n| cellHoverBackgroundColor | rgba(240, 240, 240, 1) |\n| cellSelectedColor | rgba(43, 48, 153, 1) |\n| cellSelectedBackgroundColor | rgba(182, 205, 250, 1) |\n| cellBorderWidth | 0.5 |\n| cellBorderColor | rgba(195, 199, 202, 1) |\n| activeCellFont | 16px sans-serif |\n| activeCellPaddingTop | 5 |\n| activeCellPaddingLeft | 5 |\n| activeCellPaddingRight | 7 |\n| activeCellAlignment | left |\n| activeCellColor | rgba(43, 48, 153, 1) |\n| activeCellBackgroundColor | rgba(111, 160, 255, 1) |\n| activeCellHoverColor | rgba(43, 48, 153, 1) |\n| activeCellHoverBackgroundColor | rgba(110, 168, 255, 1) |\n| activeCellSelectedColor | rgba(43, 48, 153, 1) |\n| activeCellSelectedBackgroundColor | rgba(110, 168, 255, 1) |\n| activeCellBorderWidth | 0.5 |\n| activeCellBorderColor | rgba(151, 173, 190, 1) |\n| headerCellPaddingTop | 5 |\n| headerCellPaddingLeft | 5 |\n| headerCellPaddingRight | 7 |\n| headerCellHeight | 25 |\n| headerCellBorderWidth | 0.5 |\n| headerCellBorderColor | rgba(172, 175, 179, 1) |\n| headerCellFont | 16px sans-serif |\n| headerCellColor | rgba(50, 50, 50, 1) |\n| headerCellBackgroundColor | rgba(222, 227, 233, 1) |\n| headerCellHoverColor | rgba(43, 48, 153, 1) |\n| headerCellHoverBackgroundColor | rgba(181, 201, 223, 1) |\n| headerRowWidth | 57 |\n| headerRowCellPaddingTop | 5 |\n| headerRowCellPaddingLeft | 5 |\n| headerRowCellPaddingRight | 7 |\n| headerRowCellHeight | 25 |\n| headerRowCellBorderWidth | 0.5 |\n| headerRowCellBorderColor | rgba(172, 175, 179, 1) |\n| headerRowCellFont | 16px sans-serif |\n| headerRowCellColor | rgba(50, 50, 50, 1) |\n| headerRowCellBackgroundColor | rgba(222, 227, 233, 1) |\n| headerRowCellHoverColor | rgba(43, 48, 153, 1) |\n| headerRowCellHoverBackgroundColor | rgba(181, 201, 223, 1) |\n| headerRowCellSelectedColor | rgba(43, 48, 153, 1) |\n| headerRowCellSelectedBackgroundColor\', \'rgba(182, 205, 250, 1)\' |\n', -20 silly publish readmeFilename: 'README.md', -20 silly publish gitHead: '57bdb03001a7a41bbd02a483a5b1bc976e80bae2', -20 silly publish _id: 'canvas-datagrid@0.9.3', -20 silly publish _shasum: '7012f5e6727837b313810dd8bc3cf99db9e5a12a', -20 silly publish _from: '.' } -21 verbose getPublishConfig undefined -22 silly mapToRegistry name canvas-datagrid -23 silly mapToRegistry using default registry -24 silly mapToRegistry registry https://registry.npmjs.org/ -25 silly mapToRegistry data { raw: 'canvas-datagrid', -25 silly mapToRegistry scope: null, -25 silly mapToRegistry name: 'canvas-datagrid', -25 silly mapToRegistry rawSpec: '', -25 silly mapToRegistry spec: 'latest', -25 silly mapToRegistry type: 'tag' } -26 silly mapToRegistry uri https://registry.npmjs.org/canvas-datagrid -27 verbose publish registryBase https://registry.npmjs.org/ -28 silly publish uploading /Users/tgermaneri/.npm/canvas-datagrid/0.9.3/package.tgz -29 verbose request uri https://registry.npmjs.org/canvas-datagrid -30 verbose request sending authorization for write operation -31 info attempt registry request try #1 at 4:22:39 AM -32 verbose request using bearer token for auth -33 verbose request id 7221f72349e98d58 -34 http request PUT https://registry.npmjs.org/canvas-datagrid -35 http 403 https://registry.npmjs.org/canvas-datagrid -36 verbose headers { 'content-type': 'application/json', -36 verbose headers 'cache-control': 'max-age=300', -36 verbose headers 'content-length': '95', -36 verbose headers 'accept-ranges': 'bytes', -36 verbose headers date: 'Thu, 01 Dec 2016 12:22:39 GMT', -36 verbose headers via: '1.1 varnish', -36 verbose headers connection: 'keep-alive', -36 verbose headers 'x-served-by': 'cache-sea1920-SEA', -36 verbose headers 'x-cache': 'MISS', -36 verbose headers 'x-cache-hits': '0', -36 verbose headers 'x-timer': 'S1480594959.295650,VS0,VE223', -36 verbose headers vary: 'Accept-Encoding' } -37 verbose request invalidating /Users/tgermaneri/.npm/registry.npmjs.org/canvas-datagrid on PUT -38 error publish Failed PUT 403 -39 verbose stack Error: "You cannot publish over the previously published version 0.9.3." : canvas-datagrid -39 verbose stack at makeError (/usr/local/lib/node_modules/npm/node_modules/npm-registry-client/lib/request.js:264:12) -39 verbose stack at CachingRegistryClient. (/usr/local/lib/node_modules/npm/node_modules/npm-registry-client/lib/request.js:252:14) -39 verbose stack at Request._callback (/usr/local/lib/node_modules/npm/node_modules/npm-registry-client/lib/request.js:172:14) -39 verbose stack at Request.self.callback (/usr/local/lib/node_modules/npm/node_modules/request/request.js:199:22) -39 verbose stack at Request.emit (events.js:110:17) -39 verbose stack at Request. (/usr/local/lib/node_modules/npm/node_modules/request/request.js:1036:10) -39 verbose stack at Request.emit (events.js:129:20) -39 verbose stack at IncomingMessage. (/usr/local/lib/node_modules/npm/node_modules/request/request.js:963:12) -39 verbose stack at IncomingMessage.emit (events.js:129:20) -39 verbose stack at _stream_readable.js:908:16 -40 verbose statusCode 403 -41 verbose pkgid canvas-datagrid -42 verbose cwd /Users/tgermaneri/git/canvas-datagrid -43 error Darwin 16.1.0 -44 error argv "node" "/usr/local/bin/npm" "publish" -45 error node v0.12.14 -46 error npm v2.15.1 -47 error code E403 -48 error "You cannot publish over the previously published version 0.9.3." : canvas-datagrid -49 error If you need help, you may report this error at: -49 error -50 verbose exit [ 1, true ]