{"_id":"@artsy/backbone-mixins","_rev":"14-0910031577741d7320669a234f3bfa32","name":"@artsy/backbone-mixins","dist-tags":{"latest":"3.0.0"},"versions":{"2.0.0":{"name":"@artsy/backbone-mixins","version":"2.0.0","keywords":["backbone","helpers","mixins","util"],"author":{"url":"http://craigspaeth.com","name":"Craig Spaeth","email":"craigspaeth@gmail.com"},"_id":"@artsy/backbone-mixins@2.0.0","maintainers":[{"name":"icirellik","email":"icirellik@gmail.com"},{"name":"dblandin","email":"dblandin@gmail.com"},{"name":"sweir27","email":"sweir27@gmail.com"},{"name":"zephraph","email":"zephraph@gmail.com"},{"name":"arjelks","email":"ashley.jelks@artsymail.com"},{"name":"artsy-engineering","email":"opensource@artsymail.com"},{"name":"erikdstock","email":"erik.d.stock@gmail.com"},{"name":"xtina-starr","email":"c.thompsonms@gmail.com"},{"name":"damassi","email":"damassi.pappas@gmail.com"},{"name":"anandaroop","email":"anandaroop.roy+npm@gmail.com"},{"name":"yuki24","email":"yk.nishijima@gmail.com"},{"name":"mzikherman","email":"mzikherman@gmail.com"},{"name":"oxaudo","email":"oxaudo@yahoo.com"},{"name":"eessex","email":"eve@artsymail.com"}],"contributors":[{"url":"http://brennanmoore.com","name":"Brennan Moore","email":"brennanmoore@gmail.com"}],"homepage":"https://github.com/artsy/artsy-backbone-mixins#readme","bugs":{"url":"https://github.com/artsy/artsy-backbone-mixins/issues"},"dist":{"shasum":"8a7cd00c3f961f10fa457249d7c7db42dda1bdc5","tarball":"https://registry.npmjs.org/@artsy/backbone-mixins/-/backbone-mixins-2.0.0.tgz","fileCount":33,"integrity":"sha512-xiz+s4xSItiHAC3gf50lihCj+vUVIq1hp9ZQyTfQMvv8oYhvFE+OVBqwFeQ8CmhOk2ujtVlkmK5TDwdR8OYhNw==","signatures":[{"sig":"MEQCIHx1AboJZG74S9UUWFB6vziY00D15SgvDI1MBsY6/pP5AiAslFOInUpt2M7sfdmacCAliol42Im1YeA2puRVY9kyNw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":82673,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfNfwvCRA9TVsSAnZWagAADfMP/iLlf28JwPCc5Knr+QKY\n9yAGj/JZrcDohFopIKEIuRabN4xw9Q8LwQ+xTIq9dGvLik0iDydV4cfZh5ko\n55p4nWuITWfxyqM8qeR0wyGllzMGlG7OW4/DYDV7f0owAkpWG/YCYFTLK1Sk\nVj61Ir1tb+ZVYkBauGEk2gnylTtpOTu4zDz7FXhxN+jb2dPqdHD7V8eIZU9p\noL46ysfZvwY+ZBaYkYvXjBNH51a2609DQRkQvwB8vKfPdmakFXSaClVlUDez\nL8dLyNqkI+gbm55ccsEshHOxPAe+EOj9J+O2EI/HNOla+Y+V+pIA1pDxVM5U\n/NTWy/XBoyeqerZb76hqAMn7buTyeWFpaKe689T5FbXE2FTcdq5fl3wMMTr1\nDWbh3J/wz231TLbyoJc18R7Ewsj8dvOqLTGpgCVVnb0MwUKf/zVE0JWVUux7\nOBD0zddce3/3nCWu2W8JsnMFbwKYBZOZf0OGWeeoinIt9bgSikDOOSxnKpGF\nfj8fIyseICKoCRa1lHHMzqFFXIpDxd9XBBGxVkoy+N06zRdDbqCBKCqkRSRc\nGNOWgpwhGU9/BINK2Y6FyAaBupUho+51fHlLFDAoSTWyNf5ge67ihXtSmDxr\nPD+lahkSxJhX5R7kVzh0SONMxrzyFbG6wD+RqITrxA4V5B8Dmlrn0JdRxWDt\nsR9k\r\n=0ygk\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"c707ec51ae4dee7289637c1386bcdfd60a4f1818","scripts":{"test":"mocha","build":"coffee -c -o out lib"},"_npmUser":{"name":"icirellik","email":"icirellik@gmail.com"},"repository":{"url":"git+ssh://git@github.com/artsy/artsy-backbone-mixins.git","type":"git"},"_npmVersion":"6.14.4","description":"A library of Backbone mixins that DRY up some common domain logic and Artsy API rabbit holes..","directories":{},"_nodeVersion":"12.16.3","dependencies":{"qs":"5.2.0","ics":"^0.4.1","marked":"*","moment":"^2.11.1","underscore":"*"},"_hasShrinkwrap":false,"devDependencies":{"q":"*","mocha":"*","sinon":"*","should":"*","backbone":"*","antigravity":"git+ssh://git@github.com/artsy/antigravity.git","coffee-script":"*"},"_npmOperationalInternal":{"tmp":"tmp/backbone-mixins_2.0.0_1597373486631_0.02313814615386156","host":"s3://npm-registry-packages"}},"3.0.0":{"name":"@artsy/backbone-mixins","version":"3.0.0","keywords":["backbone","helpers","mixins","util"],"author":{"url":"http://craigspaeth.com","name":"Craig Spaeth","email":"craigspaeth@gmail.com"},"_id":"@artsy/backbone-mixins@3.0.0","maintainers":[{"name":"artsy-engineering","email":"opensource@artsymail.com"},{"name":"erikdstock","email":"erik.d.stock@gmail.com"},{"name":"xtina-starr","email":"c.thompsonms@gmail.com"},{"name":"damassi","email":"damassi.pappas@gmail.com"},{"name":"anandaroop","email":"anandaroop.roy+npm@gmail.com"},{"name":"yuki24","email":"yk.nishijima@gmail.com"},{"name":"mzikherman","email":"mzikherman@gmail.com"},{"name":"oxaudo","email":"oxaudo@yahoo.com"},{"name":"eessex","email":"eve@artsymail.com"},{"name":"arjelks","email":"ashley.jelks@artsymail.com"},{"name":"zephraph","email":"npm@just-be.dev"},{"name":"sweir27","email":"sweir27@gmail.com"},{"name":"dblandin","email":"dblandin@gmail.com"},{"name":"icirellik","email":"icirellik@gmail.com"}],"contributors":[{"url":"http://brennanmoore.com","name":"Brennan Moore","email":"brennanmoore@gmail.com"}],"homepage":"https://github.com/artsy/artsy-backbone-mixins#readme","bugs":{"url":"https://github.com/artsy/artsy-backbone-mixins/issues"},"dist":{"shasum":"e1344f66be7292b909758814d9cce171f475a644","tarball":"https://registry.npmjs.org/@artsy/backbone-mixins/-/backbone-mixins-3.0.0.tgz","fileCount":14,"integrity":"sha512-N5su2OkaIHcRjHV1ECsfiqYrLwvdv+XVb6Sqx8XRJFCIzSBlRSTyE43McJJeHyl+fW9kV8YkZyj8YMMXqdDg3g==","signatures":[{"sig":"MEYCIQDpRLYTEF5BpXnMtPvFTYSz9PYBj038oipP/R0i2eynvgIhANZ3BjfxH4afTtJKPjxMyj4SUCQZOV25gut5bBY1pB6J","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":34145,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhwzh2CRA9TVsSAnZWagAAI2sP+wfKCNiN5px2Y/4p436Q\nLQmRz9R1oiMA5p6WuDzCybLm4rICfdLgI7UAV/pyVY9arh8TeuEJWAAcRjmu\nYR4t+1tOJAiZpdBjbJ+A3UsBYLaAJielenXzSrWIBas2IvbpXoEKQCBCCcxC\nSRsdUPxCIGmaw8arsFBc/I3/ssChSJDM0R+y7fV2HNFpwj30HA4lt2Lnr5Kf\nwSuVziL/cNN47YhhnAFf8hmPzI3rqeSc7BhIOrvsR0PI8eW9yqb0H50EJUcm\nGDoOjSvuMCYM20vSVKa9gPY0heS6pk2d4aIt1iHXq33+j+3YtQJ+RdwJSGzz\njheLHnZzcr+0kZHJrHO+9OokbdlNWoT67L9SNnqvDbvqAFufU1kMUHLF9J7c\nykpiwFYTBGf/7HM/uLqakuKCpfoz4UgIpJ2ERafDwq2LixPevueHxpqpWWD2\nDVRuS30Ava6GNn53vezAYA9x7GU021jbMMG2EdcY1Q1mL5junMO3Jwk65CfQ\n8kE1Of+/TPpKBmdOcaoRJOqVot1ob1qihzEKGde2Ghs3rsSyTOWaRh4oSOb0\nndeOvBVqRpI5FXjizkGBJCtzgsNFJtbOyE49x28T7Xv1S7IfdVDBgjf1f7yW\ndDac4IlfLrQB/RvpXywWDgHGWvEEsVmd8uIiYTl9zPlEuYPI5Kcebo4BzcSG\nHBEX\r\n=hNZx\r\n-----END PGP SIGNATURE-----\r\n"},"gitHead":"61d64a287244cf6a76d75c26229b47a9be078689","scripts":{"test":"mocha --config .mocharc.js test/*.js"},"_npmUser":{"name":"artsy-engineering","email":"opensource@artsymail.com"},"repository":{"url":"git+ssh://git@github.com/artsy/artsy-backbone-mixins.git","type":"git"},"_npmVersion":"6.14.14","description":"A library of Backbone mixins that DRY up some common domain logic and Artsy API rabbit holes..","directories":{},"_nodeVersion":"14.17.5","dependencies":{"qs":"^6.9.6","marked":"^1.2.8","underscore":"^1.12.1"},"_hasShrinkwrap":false,"devDependencies":{"q":"^1.5.1","mocha":"8.1.1","sinon":"^9.0.3","eslint":"^7.30.0","should":"^13.2.3","backbone":"^1.4.0","@artsy/antigravity":"^0.3.0","eslint-plugin-mocha":"^9.0.0"},"_npmOperationalInternal":{"tmp":"tmp/backbone-mixins_3.0.0_1632342491295_0.4832260043584238","host":"s3://npm-registry-packages"}}},"time":{"created":"2020-08-14T02:51:26.390Z","modified":"2025-11-18T23:31:24.648Z","2.0.0":"2020-08-14T02:51:26.766Z","3.0.0":"2021-09-22T20:28:11.470Z"},"bugs":{"url":"https://github.com/artsy/artsy-backbone-mixins/issues"},"author":{"url":"http://craigspaeth.com","name":"Craig Spaeth","email":"craigspaeth@gmail.com"},"homepage":"https://github.com/artsy/artsy-backbone-mixins#readme","keywords":["backbone","helpers","mixins","util"],"repository":{"url":"git+ssh://git@github.com/artsy/artsy-backbone-mixins.git","type":"git"},"description":"A library of Backbone mixins that DRY up some common domain logic and Artsy API rabbit holes..","contributors":[{"url":"http://brennanmoore.com","name":"Brennan Moore","email":"brennanmoore@gmail.com"}],"maintainers":[{"email":"opensource@artsymail.com","name":"artsy-engineering"},{"email":"anandaroop.roy+npm@gmail.com","name":"anandaroop"},{"email":"mzikherman@gmail.com","name":"mzikherman"},{"email":"dblandin@gmail.com","name":"dblandin"},{"email":"joey@artsymail.com","name":"joeyaghion"}],"readme":"# @artsy/backbone-mixins\n\nA library of Backbone mixins that DRY up some common domain logic and Artsy API rabbit holes. Used internally at Artsy, but maybe you'll find some useful patterns here.\n\n## Installation\n\nDepends on your project's version of Backbone so remember to install both.\n\n````\nnpm install backbone --save\nnpm install @artsy/backbone-mixins --save\n````\n\n## Usage\n\nFunctions are namespaced by common sets of functionality such as \"Markdown\", \"Image\", or \"Dimensions\".\n\n````coffeescript\n_ = require 'underscore'\n{ Markdown, Image } = require '@artsy/backbone-mixins'\n\nclass Artwork extends Backbone.Model\n\n  _.extend @prototype, Markdown\n  _.extend @prototype, Image\n````\n\n## Markdown\n\n````coffeescript\n{ Markdown } = require '@artsy/backbone-mixins'\n\nclass Artwork extends Backbone.Model\n\n  _.extend @prototype, Markdown\n\n````\n\n### mdToHtml(attr)\n\nConverts an attribute into markdown\n\n````coffeescript\nartist.mdToHtml('biography')\n````\n\n### mdToHtmlToText(attr)\n\nConverts an attribute into markdown & escapes html.\n\n````coffeescript\nartist.mdToHtmlToText('biography')\n````\n\n### htmlToText(attr)\n\nEscapes html from an attribute.\n\n````coffeescript\nartist.htmlToText('biography')\n````\n\n## Dimensions\n\n````coffeescript\n{ Dimensions } = require '@artsy/backbone-mixins'\n\nclass Artwork extends Backbone.Model\n\n  _.extend @prototype, Dimensions\n\n````\n\n### dimensions([options])\n\nCommonly dimensions in Artsy's API are structured like `{ dimensions: { in: \"10 x 20\" }, metric: \"in\" }`. This provides a convenient method for outputting a formatted dimension string based on this data. Pass in some options for better formatting.\n\n````coffeescript\nartist.set { dimensions: { in: \"10 x 20 in\", cm: '13 1/2 x 24  2/3 cm' }, metric: \"in\" }\nartist.dimensions() # '10 x 20 in'\nartist.dimensions(metric: 'cm') # 13 1/2  x 24 2/3 cm\nartist.dimensions(metric: 'cm', format: 'superscript') # 13 ½  x 24 ⅔ cm\nartist.dimensions(metric: 'cm', format: 'decimal') # 13.5  x 24.33 cm\n````\n\n#### options.metric: ('in' or 'cm') (defaults to `@get('metric')`)\n\n````coffeescript\nartist.dimensions(metric: 'cm')\n````\n\n#### options.format: 'superscript'\n\nTurns 10 3/4 into superscript html like 10 `<sup>3/4</sup>`.\n\n````coffeescript\nartist.dimensions(format: 'superscript')\n````\n\n#### options.format: 'decimal'\n\nConverts porely formatted metric dimensions that appear as fractions into a proper metric decimal formatting.\n\n````coffeescript\nartist.dimensions(format: 'decimal')\n````\n\n## Fetch\n\n_Remember to pass in the artsy url._\n\n````coffeescript\n{ Fetch } = require '@artsy/backbone-mixins'\n{ ARTSY_URL } = require('sharify').data\n\nclass Artworks extends Backbone.Collection\n\n  _.extend @prototype, Fetch(ARTSY_URL)\n\n````\n\n### fetchUntilEnd(options)\n\nFor paginated routes, fetches the collection's url until the endpoint returns 0 results.\n\n````coffeescript\nartworks.fetchUntilEnd success: ->\n  # Phew... I have all the artworks from Artsy\n````\n\nIt respects data params like page (if you fetch page 1 on the server and `fetchUntil` end on the client for example)\n````coffeescript\n# I already rendered page 1 from a `fetch`...\nartworks.fetchUntilEnd\n  data:\n    page: 2\n    size: 20\n  success: ->\n    # I now have artwork 21 - the end\n````\n\n### fetchSetItemsByKey(key, options)\n\nFetches a set by key and populates the collection with the first result.\n\n````coffeescript\nfeaturedLinks.fetchSetItemsByKey 'homepage:featured-sections', success: ->\n  featuredLinks.first().get('name').should.equal 'Magnum Photos'\n````\n\n## AToZ\n\n````coffeescript\n{ AToZ } = require '@artsy/backbone-mixins'\n\nclass Artworks extends Backbone.Collection\n\n  _.extend @prototype, AToZ\n\n````\n\n### groupByAlpha()\n\nSorts a collection groupped alphabetically based on the `alphaSortKey` function on the model. If there is no `alphaSortKey` function on the model it will default to `@get 'sortable_id'`.\n\nSample output:\n\n````\n{\n  '0-9': [ model_instance, model_instance, model_instance ],\n  A: [ model_instance, model_instance, model_instance ],\n  // ...\n  Z: [ model_instance, model_instance, model_instance ]\n}\n````\n\n````coffeescript\nartworks.model.alphaSortKey = -> @get 'title'\nartworks.groupByAlpha()\n````\n\n### groupByAlphaWithColumns([numberOfColumns])\n\nGroups collection output in a format suitable for rendering in an A-Z list with a specified number of columns. The models must implement a `href` and `displayName` method.\n\nSample output:\n\n````\n[\n { letter: '0-9', columns: [ ... ] },\n { letter: 'A', columns: [ ... ] },\n  ...\n { letter: 'Z', columns: [ ... ] }\n]\n// Each column is a 2D array of objects with `href`, and `name` properties:\ncolumns: [\n  [ { href: '...', name: '...' }, ... { href: '...', name: '...' } ],\n  [ { href: '...', name: '...' }, ... { href: '...', name: '...' } ],\n  [ { href: '...', name: '...' }, ... { href: '...', name: '...' } ]\n]\n````\n\n````coffeescript\nartworks.model.href = -> \"/artwork/#{@get 'id'}\"\nartworks.model.displayName = -> @get 'title'\nartworks.groupByAlphaWithColumns()\n````\n\n## Image\n\n````coffeescript\n{ Image } = require '@artsy/backbone-mixins'\n\nclass FeaturedLink extends Backbone.Model\n\n  _.extend @prototype, Image\n\n````\n\n### imageUrl([version])\n\nThe Artsy API often structures image data like `{ image_url: 'foo/bar/:version.jpg' }` this method will return a replaced string with sensible defaults.\n\n````coffeescript\nfeaturedLink.imageUrl('small')\n````\n\n### missingImageUrl()\n\n`imageUrl` uses the `missingImageUrl` on the model to know what image to show when it can't find a version of it in the data. Defaults to `/image/missing_image.png`.\n\n### defaultImageVersion()\n\nTell `imageUrl` which version to look for first. Defaults to the first item in the `image_versions` or `versions` attribute.\n\n### hasImage(version)\n\nChecks the `image_versions` or `versions` attribute for the image version and returns true/false.\n\n### bestImageUrl([versions])\n\nReturn an image URL, preferring the earlier versions in `versions` if available, but degrading to the later ones otherwise. Finally, degrades to `missingImageUrl`.\n\n```coffeescript\nfeature.bestImageUrl(['large', 'medium', 'small'])\n```\n\n## Calendar Urls\n\n````coffeescript\n{ CalendarUrls } = require '@artsy/backbone-mixins'\n\nclass FairEvent extends Backbone.Model\n\n  _.extend @prototype, CalendarUrls({address: 'venue_address', title: 'name'})\n\n````\n\n### googleCalendarUrl()\n\nProduces a url to create a Google calendar event.\n\n````coffeescript\nevent.googleCalendarUrl()\n````\n\n### yahooCalendarUrl()\n\nProduces a url to create a Yahoo calendar event.\n\n````coffeescript\nevent.yahooCalendarUrl()\n````\n\n### ics()\n\nProduces a url to create Outlook and iCal calendar event.\n\n````coffeescript\nevent.ics()\n````\n\n## Contributing\n\nPlease fork the project and submit a pull request with tests. Install node modules `npm install` and run tests with `npm test`.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}