{"_id":"roam","_rev":"26-8f2b17b5acab9061f2d246c76d21a102","name":"roam","description":"XPath-like queries and in-place transformations for JSON documents","dist-tags":{"latest":"0.3.0"},"versions":{"0.0.1":{"name":"roam","version":"0.0.1","author":{"name":"Ketil Øvrebø"},"license":"MIT","repository":{"type":"git","url":"https://github.com/ketilovre/roam"},"main":"dist/roam.js","scripts":{"test":"grunt jasmine_node"},"devDependencies":{"benchmark":"~1.0.0","grunt":"~0.4.5","grunt-karma":"~0.8.3","grunt-contrib-jshint":"~0.10.0","grunt-contrib-uglify":"~0.5.1","karma-jasmine":"~0.1.5","karma-phantomjs-launcher":"~0.1.4","karma-coverage":"~0.2.5","grunt-contrib-watch":"~0.6.1","grunt-jasmine-node":"~0.2.1","time-grunt":"~0.4.0","grunt-release":"~0.7.0"},"description":"[![Build Status](https://travis-ci.org/ketilovre/roam.svg?branch=master)](https://travis-ci.org/ketilovre/roam) [![Code Climate](https://codeclimate.com/github/ketilovre/roam/badges/gpa.svg)](https://codeclimate.com/github/ketilovre/roam) [![Test Coverage","bugs":{"url":"https://github.com/ketilovre/roam/issues"},"_id":"roam@0.0.1","dist":{"shasum":"b7c85e2378868c213ab63dbaff0f81c4b202aa89","tarball":"https://registry.npmjs.org/roam/-/roam-0.0.1.tgz","integrity":"sha512-7PuOKg9IruwzoIAH1fcrFnRPmgAZ8QMCsh4Yyx4OKTXXTeipSA8Y9u4gl8hcTyxWt3/PSwBMEdXNl6QAotCthQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGnmucHbhqXOOYahp0eVdKaidVxVWdBblWId/qv4isPHAiEA43KqtTB3/ErLlmUr2kKkxBu0a7jivMbwqs+BycZsVoM="}]},"_from":".","_npmVersion":"1.3.10","_npmUser":{"name":"ketilovre","email":"ketilovre@gmail.com"},"maintainers":[{"name":"ketilovre","email":"ketilovre@gmail.com"}]},"0.0.2":{"name":"roam","version":"0.0.2","author":{"name":"Ketil Øvrebø"},"license":"MIT","description":"XPath-like queries and in-place transformations for JSON documents","repository":{"type":"git","url":"https://github.com/ketilovre/roam"},"main":"dist/roam.js","scripts":{"test":"grunt jasmine_node"},"devDependencies":{"benchmark":"~1.0.0","grunt":"~0.4.5","grunt-karma":"~0.8.3","grunt-contrib-jshint":"~0.10.0","grunt-contrib-uglify":"~0.5.1","karma-jasmine":"~0.1.5","karma-phantomjs-launcher":"~0.1.4","karma-coverage":"~0.2.5","grunt-contrib-watch":"~0.6.1","grunt-jasmine-node":"~0.2.1","time-grunt":"~0.4.0","grunt-release":"~0.7.0"},"bugs":{"url":"https://github.com/ketilovre/roam/issues"},"_id":"roam@0.0.2","dist":{"shasum":"0fd7b6f7ce004829d97e5e951d1aa6d954213951","tarball":"https://registry.npmjs.org/roam/-/roam-0.0.2.tgz","integrity":"sha512-tPSHeoPhlskAbT84s/ua/uPmBdE7SHNlqJagsii2hBIj/SeJrm8JkaJ6NEuSKgZS4ZsJk9UfPqqhZnhOy9Vemg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBzxXVJoDMueALUsnt+OigBLRPNrulbo1fQ2Uj4T1V9+AiAPHGEZ74rovFBSnVzVBHKaJr2BK255bFtiWXsxMACS4w=="}]},"_from":".","_npmVersion":"1.3.10","_npmUser":{"name":"ketilovre","email":"ketilovre@gmail.com"},"maintainers":[{"name":"ketilovre","email":"ketilovre@gmail.com"}]},"0.0.3":{"name":"roam","version":"0.0.3","author":{"name":"Ketil Øvrebø"},"license":"MIT","description":"XPath-like queries and in-place transformations for JSON documents","repository":{"type":"git","url":"https://github.com/ketilovre/roam"},"main":"dist/roam.js","scripts":{"test":"grunt jasmine_node"},"devDependencies":{"benchmark":"~1.0.0","grunt":"~0.4.5","grunt-karma":"~0.8.3","grunt-contrib-jshint":"~0.10.0","grunt-contrib-uglify":"~0.5.1","karma-jasmine":"~0.1.5","karma-phantomjs-launcher":"~0.1.4","karma-coverage":"~0.2.5","grunt-contrib-watch":"~0.6.1","grunt-jasmine-node":"~0.2.1","time-grunt":"~0.4.0","grunt-release":"~0.7.0"},"bugs":{"url":"https://github.com/ketilovre/roam/issues"},"_id":"roam@0.0.3","dist":{"shasum":"4a78d4372e3ac1c28bd34b6dc0faeb6f29c36d01","tarball":"https://registry.npmjs.org/roam/-/roam-0.0.3.tgz","integrity":"sha512-gVLubK4kVm9jHc+L+Q4Vkw7vrapDgFCW0mrOVqOalTKFl//yp+IE6hDvNcGWMm0xr9zYenTsRLZhDD1ADVfmtg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC/s+cKpzty/S/bsOeg55fbr82r4BdKqPCZhgIK6EJ+XwIhAMdS2N9jBzqfKLTlXXmvaSSflyj8QegUOeHzBxpSH3hP"}]},"_from":".","_npmVersion":"1.3.10","_npmUser":{"name":"ketilovre","email":"ketilovre@gmail.com"},"maintainers":[{"name":"ketilovre","email":"ketilovre@gmail.com"}]},"0.1.0":{"name":"roam","version":"0.1.0","author":{"name":"Ketil Øvrebø"},"license":"MIT","description":"XPath-like queries and in-place transformations for JSON documents","repository":{"type":"git","url":"https://github.com/ketilovre/roam"},"main":"dist/roam.js","scripts":{"test":"grunt jasmine_node"},"keywords":["jpath","xpath","json","transform","search","query"],"devDependencies":{"benchmark":"~1.0.0","grunt":"~0.4.5","grunt-karma":"~0.8.3","grunt-contrib-jshint":"~0.10.0","grunt-contrib-uglify":"~0.5.1","karma-jasmine":"~0.1.5","karma-phantomjs-launcher":"~0.1.4","karma-coverage":"~0.2.5","grunt-contrib-watch":"~0.6.1","grunt-jasmine-node":"~0.2.1","time-grunt":"~0.4.0","grunt-release":"~0.7.0"},"bugs":{"url":"https://github.com/ketilovre/roam/issues"},"_id":"roam@0.1.0","dist":{"shasum":"65730a375c2dbc89a60628c91a662b98fad76220","tarball":"https://registry.npmjs.org/roam/-/roam-0.1.0.tgz","integrity":"sha512-lhEsr/Ab1FWV6bfq2T+t76pw8fKnq8iSDEG7WMtHj/pwQGbXgTsLbxGh0c+DZVHznxaSsQLQG3N3td4r8KOzyg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD+U2lbTr/p5Qef8tdYCotFjUEpf3SpJlTGWHkFu8f87QIgKmMcy4++VJEwvGo24rQkx+NRFfhyuHAFCz89xCwNoYI="}]},"_from":".","_npmVersion":"1.3.10","_npmUser":{"name":"ketilovre","email":"ketilovre@gmail.com"},"maintainers":[{"name":"ketilovre","email":"ketilovre@gmail.com"}]},"0.2.0":{"name":"roam","version":"0.2.0","author":{"name":"Ketil Øvrebø"},"license":"MIT","description":"XPath-like queries and in-place transformations for JSON documents","repository":{"type":"git","url":"https://github.com/ketilovre/roam"},"main":"dist/roam.js","scripts":{"test":"grunt jasmine_node"},"keywords":["jpath","xpath","json","transform","search","query"],"devDependencies":{"benchmark":"~1.0.0","grunt":"~0.4.5","grunt-karma":"~0.8.3","grunt-contrib-jshint":"~0.10.0","grunt-contrib-uglify":"~0.5.1","karma-jasmine":"~0.1.5","karma-phantomjs-launcher":"~0.1.4","karma-coverage":"~0.2.5","grunt-contrib-watch":"~0.6.1","grunt-jasmine-node":"~0.2.1","time-grunt":"~0.4.0","grunt-release":"~0.7.0"},"bugs":{"url":"https://github.com/ketilovre/roam/issues"},"_id":"roam@0.2.0","dist":{"shasum":"73c5b0b1d34866adf77ee78e43db81ede42f3e5c","tarball":"https://registry.npmjs.org/roam/-/roam-0.2.0.tgz","integrity":"sha512-j/AXfMg1L8QZiRawDSBBPJ5qf/zAiwF83ENVkaLD6Ib+NU3iZgndo4seAc/EsCYRLTQV+LKqzQNfCy5KYpnxow==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFdtjUka35SAScJf6ZbbPKpb62vQKKYxRA7n/4jTsxDGAiAxJceCywKQ0xjzQk09trGt3VXY/AOuVSv7kRvDUn9PEQ=="}]},"_from":".","_npmVersion":"1.3.10","_npmUser":{"name":"ketilovre","email":"ketilovre@gmail.com"},"maintainers":[{"name":"ketilovre","email":"ketilovre@gmail.com"}]},"0.3.0":{"name":"roam","version":"0.3.0","author":{"name":"Ketil Øvrebø"},"license":"MIT","description":"XPath-like queries and in-place transformations for JSON documents","repository":{"type":"git","url":"https://github.com/ketilovre/roam"},"main":"dist/roam.js","scripts":{"test":"grunt jasmine_node"},"keywords":["jpath","xpath","json","transform","search","query"],"devDependencies":{"benchmark":"~1.0.0","grunt":"~0.4.5","grunt-karma":"~0.8.3","grunt-contrib-jshint":"~0.10.0","grunt-contrib-uglify":"~0.5.1","karma-jasmine":"~0.1.5","karma-phantomjs-launcher":"~0.1.4","karma-coverage":"~0.2.5","grunt-contrib-watch":"~0.6.1","grunt-jasmine-node":"~0.2.1","time-grunt":"~0.4.0","grunt-release":"~0.7.0","grunt-jsdoc":"~0.5.6"},"bugs":{"url":"https://github.com/ketilovre/roam/issues"},"_id":"roam@0.3.0","dist":{"shasum":"75076e7af1475f11ad5cf6b5f129035dd181c887","tarball":"https://registry.npmjs.org/roam/-/roam-0.3.0.tgz","integrity":"sha512-0OxPl8zofiVtnWZdioioEGQEyR8LfomW83vWHyAkX/OKQs+AfUgbnbhsx5mm7wGKMoRaKR9EcapziIwwP6exuQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBOgCpYDbAN2TBmJ9NL1Dpe3ppetM3B2UFMqJ32iU7CUAiEAjxqvHzWQrQ9jKV1akK5w0EzWdMfy9wUXQB9J4eHkIiI="}]},"_from":".","_npmVersion":"1.3.10","_npmUser":{"name":"ketilovre","email":"ketilovre@gmail.com"},"maintainers":[{"name":"ketilovre","email":"ketilovre@gmail.com"}]}},"readme":"# Roam\n\n[![Build Status](https://travis-ci.org/ketilovre/roam.svg?branch=master)](https://travis-ci.org/ketilovre/roam)\n[![Code Climate](https://codeclimate.com/github/ketilovre/roam/badges/gpa.svg)](https://codeclimate.com/github/ketilovre/roam)\n[![Test Coverage](https://codeclimate.com/github/ketilovre/roam/badges/coverage.svg)](https://codeclimate.com/github/ketilovre/roam)\n\nXPath-like queries and in-place transformations for JSON documents.\n\n## Install\n\n    npm install --save roam\n\nor\n\n    bower install --save roam\n\nIn the browser, Roam can be used with or without RequireJS.\n\n## The basics\n\nGiven the following JSON:\n\n```json\n{\n  \"menu\": {\n    \"id\": \"file\",\n    \"value\": \"File\",\n    \"popup\": {\n      \"menuitem\": [\n        {\"value\": \"New\", \"onclick\": \"CreateNewDoc()\"},\n        {\"value\": \"Open\", \"onclick\": \"OpenDoc()\"},\n        {\"value\": \"Close\", \"onclick\": \"CloseDoc()\"}\n      ]\n    }\n  }\n}\n```\n\nAll of the following, in order of best to worst performance:\n\n```javascript\nroam(json).get('menu.popup.menuitem.onclick')\nroam(json).get('*popup.menuitem.onclick')\nroam(json).get('*menuitem.onclick')\nroam(json).get('*onclick')\n```\n\nWill return:\n\n```json\n[\n  \"CreateNewDoc()\",\n  \"OpenDoc()\",\n  \"CloseDoc()\"\n]\n```\n\n### Roam\n\n- `roam({Object|String})`\n\nConstruct a `roam` object by wrapping a JSON object or string.\n\n### Search\n\nSearch-methods locate and return values based on a given path. Path segments are separated\nby periods.\n\n#### Get\n\n- `.get({String})`\n\n`.get` traverses the document and returns an array of matching values.\n\n` roam(json).get('menu.id') ` returns ` [\"file\"] `\n\n#### One\n\n- `.one({String})`\n\n`.one` immediately returns the first matched property.\n\n`roam(json).one('*menuitem.onclick')` returns `\"CreateNewDoc()\"`\n\n#### Recursive queries\n\nYou can prefix any property with ` * ` to have roam search the document (or current result\nset) recursively for a matching value.\n\n`roam(json).get('*value')` returns `[\"File\", \"New\", \"Open\", \"Close\"]`\n\nbut\n\n`roam(json).get('menu.popup.*value')` returns `[\"New\", \"Open\", \"Close\"]`\n\nIf the first segment is a recursive query, roam *will* traverse the entire document. If at all\npossible, try to narrow down the search area before going recursive.\n\n#### Arrays\n\nYou can also ask for values at specific array indexes. All of these:\n```javascript\nroam(json).get('menu.popup.menuitem.1')\nroam(json).get('*popup.menuitem.1')\nroam(json).get('*menuitem.1')\n```\n\nWill return:\n```json\n[\n  {\n    \"value\": \"Open\",\n    \"onclick\": \"OpenDoc()\"\n  }\n]\n```\n\n### Transform\n\n- `.transform({String}, {Function(value)})`\n\n`.transform` traverses the document, replaces matching values with the return value of the callback,\nand returns the document in its entirety.\n\n```javascript\nroam(json).transform('*value', function(value) {\n  return value.toUpperCase();\n});\n```\n\nReturns:\n\n```json\n{\n  \"menu\": {\n    \"id\": \"file\",\n    \"value\": \"FILE\",\n    \"popup\": {\n      \"menuitem\": [\n        {\"value\": \"NEW\", \"onclick\": \"CreateNewDoc()\"},\n        {\"value\": \"OPEN\", \"onclick\": \"OpenDoc()\"},\n        {\"value\": \"CLOSE\", \"onclick\": \"CloseDoc()\"}\n      ]\n    }\n  }\n}\n```\n\nOr, a slightly sillier example:\n\n```javascript\nroam(json).transform('menu.popup.menuitem.value', function(value) {\n  return value.split(\"\").map(function(letter, index) {\n    return {\n      letter: letter,\n      index: index\n    };\n  });\n});\n```\nReturns:\n```json\n{\n   \"menu\":{\n      \"id\":\"file\",\n      \"value\":\"File\",\n      \"popup\":{\n         \"menuitem\":[\n            {\n               \"value\":[\n                  {\n                     \"letter\":\"N\",\n                     \"index\":0\n                  },\n                  {\n                     \"letter\":\"e\",\n                     \"index\":1\n                  },\n                  {\n                     \"letter\":\"w\",\n                     \"index\":2\n                  }\n               ],\n               \"onclick\":\"CreateNewDoc()\"\n            },\n            {\n               \"value\":[\n                  {\n                     \"letter\":\"O\",\n                     \"index\":0\n                  },\n                  {\n                     \"letter\":\"p\",\n                     \"index\":1\n                  },\n                  {\n                     \"letter\":\"e\",\n                     \"index\":2\n                  },\n                  {\n                     \"letter\":\"n\",\n                     \"index\":3\n                  }\n               ],\n               \"onclick\":\"OpenDoc()\"\n            },\n            {\n               \"value\":[\n                  {\n                     \"letter\":\"C\",\n                     \"index\":0\n                  },\n                  {\n                     \"letter\":\"l\",\n                     \"index\":1\n                  },\n                  {\n                     \"letter\":\"o\",\n                     \"index\":2\n                  },\n                  {\n                     \"letter\":\"s\",\n                     \"index\":3\n                  },\n                  {\n                     \"letter\":\"e\",\n                     \"index\":4\n                  }\n               ],\n               \"onclick\":\"CloseDoc()\"\n            }\n         ]\n      }\n   }\n}\n```\n\n\n### Map\n\n- `.map({String}, {Function(value, index, array)})`\n\n`.map` is a convenience method, equivalent to running `.map` or `_.map` on the returned\narray from a `.get`. Roam's `.map` is significantly faster than JavaScript's native `.map`,\nand roughly equivalent to lodash's `_.map`. For details on how a map function works, see\nthe documentation for [map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map).\n\n```javascript\nroam(json).map('*value', function(val) {\n  return val.toUpperCase();\n});\n```\nReturns:\n```json\n[\n  \"FILE\",\n  \"NEW\",\n  \"OPEN\",\n  \"CLOSE\"\n]\n```\n\n### Filter\n\n- `.filter({String}, {Function(value, index, array)})`\n\n`.filter` is a convenience method in the same vein as map, and shares its performance characteristics.\nFor details on how a filter function works, see the documentation for [filter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter).\n\n```javascript\nroam(json).filter('*value', function(val) {\n  return val.slice(-1) === 'e';\n});\n```\nReturns:\n```json\n[\n  \"File\",\n  \"Close\"\n]\n```\n\n##### A note on map and filter\nNeither map nor filter support binding a custom value to `this` within the callback.\n\n### Utilities\n\n#### Count\n\n- `.count({String})`\n\n`.count` is a wrapper around `.get` and will return the number of matched elements.\n\n#### Has\n\n- `.has({String})`\n\n`.has` is a wrapper around `.one` and will return true or false depending on whether a match\ncould be found.\n","maintainers":[{"name":"ketilovre","email":"ketilovre@gmail.com"}],"time":{"modified":"2022-06-26T13:43:18.965Z","created":"2014-08-10T11:08:15.305Z","0.0.1":"2014-08-10T11:08:17.328Z","0.0.2":"2014-08-10T11:48:53.955Z","0.0.3":"2014-08-11T16:37:59.734Z","0.1.0":"2014-08-12T16:29:29.190Z","0.2.0":"2014-08-14T16:37:57.596Z","0.3.0":"2014-08-22T21:03:26.550Z"},"readmeFilename":"README.md","repository":{"type":"git","url":"https://github.com/ketilovre/roam"},"author":{"name":"Ketil Øvrebø"},"bugs":{"url":"https://github.com/ketilovre/roam/issues"},"license":"MIT","keywords":["jpath","xpath","json","transform","search","query"]}