├── .editorconfig ├── .github ├── contributing.md ├── issue_template.md └── pull_request_template.md ├── .gitignore ├── .istanbul.yml ├── .npmignore ├── .nyc_output └── 064ac953-15a4-40be-ab4a-ee88f46c7cec.json ├── .travis.yml ├── CHANGELOG.md ├── LICENSE ├── README.md ├── jest.config.js ├── lib └── index.js ├── mocha.opts ├── package-lock.json ├── package.json ├── setup_arangodb.sh ├── src ├── auto-database.ts ├── index.ts └── queryBuilder.ts ├── tests ├── auto-database.tests.ts └── feathers.tests.ts ├── tsconfig.json └── tslint.json /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /.github/contributing.md: -------------------------------------------------------------------------------- 1 | # Contributing to Feathers 2 | 3 | Thank you for contributing to Feathers! :heart: :tada: 4 | 5 | This repo is the main core and where most issues are reported. Feathers embraces modularity and is broken up across many repos. To make this easier to manage we currently use [Zenhub](https://www.zenhub.com/) for issue triage and visibility. They have a free browser plugin you can install so that you can see what is in flight at any time, but of course you also always see current issues in Github. 6 | 7 | ## Report a bug 8 | 9 | Before creating an issue please make sure you have checked out the docs, specifically the [FAQ](https://docs.feathersjs.com/help/faq.html) section. You might want to also try searching Github. It's pretty likely someone has already asked a similar question. 10 | 11 | If you haven't found your answer please feel free to join our [slack channel](http://slack.feathersjs.com), create an issue on Github, or post on [Stackoverflow](http://stackoverflow.com) using the `feathers` or `feathersjs` tag. We try our best to monitor Stackoverflow but you're likely to get more immediate responses in Slack and Github. 12 | 13 | Issues can be reported in the [issue tracker](https://github.com/feathersjs/feathers/issues). Since feathers combines many modules it can be hard for us to assess the root cause without knowing which modules are being used and what your configuration looks like, so **it helps us immensely if you can link to a simple example that reproduces your issue**. 14 | 15 | ## Report a Security Concern 16 | 17 | We take security very seriously at Feathers. We welcome any peer review of our 100% open source code to ensure nobody's Feathers app is ever compromised or hacked. As a web application developer you are responsible for any security breaches. We do our very best to make sure Feathers is as secure as possible by default. 18 | 19 | In order to give the community time to respond and upgrade we strongly urge you report all security issues to us. Send one of the core team members a PM in [Slack](http://slack.feathersjs.com) or email us at hello@feathersjs.com with details and we will respond ASAP. 20 | 21 | For full details refer to our [Security docs](https://docs.feathersjs.com/SECURITY.html). 22 | 23 | ## Pull Requests 24 | 25 | We :heart: pull requests and we're continually working to make it as easy as possible for people to contribute, including a [Plugin Generator](https://github.com/feathersjs/generator-feathers-plugin) and a [common test suite](https://github.com/feathersjs/feathers-service-tests) for database adapters. 26 | 27 | We prefer small pull requests with minimal code changes. The smaller they are the easier they are to review and merge. A core team member will pick up your PR and review it as soon as they can. They may ask for changes or reject your pull request. This is not a reflection of you as an engineer or a person. Please accept feedback graciously as we will also try to be sensitive when providing it. 28 | 29 | Although we generally accept many PRs they can be rejected for many reasons. We will be as transparent as possible but it may simply be that you do not have the same context or information regarding the roadmap that the core team members have. We value the time you take to put together any contributions so we pledge to always be respectful of that time and will try to be as open as possible so that you don't waste it. :smile: 30 | 31 | **All PRs (except documentation) should be accompanied with tests and pass the linting rules.** 32 | 33 | ### Code style 34 | 35 | Before running the tests from the `test/` folder `npm test` will run ESlint. You can check your code changes individually by running `npm run lint`. 36 | 37 | ### ES6 compilation 38 | 39 | Feathers uses [Babel](https://babeljs.io/) to leverage the latest developments of the JavaScript language. All code and samples are currently written in ES2015. To transpile the code in this repository run 40 | 41 | > npm run compile 42 | 43 | __Note:__ `npm test` will run the compilation automatically before the tests. 44 | 45 | ### Tests 46 | 47 | [Mocha](http://mochajs.org/) tests are located in the `test/` folder and can be run using the `npm run mocha` or `npm test` (with ESLint and code coverage) command. 48 | 49 | ### Documentation 50 | 51 | Feathers documentation is contained in Markdown files in the [feathers-docs](https://github.com/feathersjs/feathers-docs) repository. To change the documentation submit a pull request to that repo, referencing any other PR if applicable, and the docs will be updated with the next release. 52 | 53 | ## External Modules 54 | 55 | If you're written something awesome for Feathers, the Feathers ecosystem, or using Feathers please add it to the [showcase](https://docs.feathersjs.com/why/showcase.html). You also might want to check out the [Plugin Generator](https://github.com/feathersjs/generator-feathers-plugin) that can be used to scaffold plugins to be Feathers compliant from the start. 56 | 57 | If you think it would be a good core module then please contact one of the Feathers core team members in [Slack](http://slack.feathersjs.com) and we can discuss whether it belongs in core and how to get it there. :beers: 58 | 59 | ## Contributor Code of Conduct 60 | 61 | As contributors and maintainers of this project, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities. 62 | 63 | We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion. 64 | 65 | Examples of unacceptable behavior by participants include the use of sexual language or imagery, derogatory comments or personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct. 66 | 67 | Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed from the project team. 68 | 69 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers. 70 | 71 | This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.0.0, available at [http://contributor-covenant.org/version/1/0/0/](http://contributor-covenant.org/version/1/0/0/) 72 | -------------------------------------------------------------------------------- /.github/issue_template.md: -------------------------------------------------------------------------------- 1 | ### Steps to reproduce 2 | 3 | (First please check that this issue is not already solved as [described 4 | here](https://github.com/feathersjs/feathers/blob/master/.github/contributing.md#report-a-bug)) 5 | 6 | - [ ] Tell us what broke. The more detailed the better. 7 | - [ ] If you can, please create a simple example that reproduces the issue and link to a gist, jsbin, repo, etc. 8 | 9 | ### Expected behavior 10 | Tell us what should happen 11 | 12 | ### Actual behavior 13 | Tell us what happens instead 14 | 15 | ### System configuration 16 | 17 | Tell us about the applicable parts of your setup. 18 | 19 | **Module versions** (especially the part that's not working): 20 | 21 | **NodeJS version**: 22 | 23 | **Operating System**: 24 | 25 | **Browser Version**: 26 | 27 | **React Native Version**: 28 | 29 | **Module Loader**: -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | ### Summary 2 | 3 | (If you have not already please refer to the contributing guideline as [described 4 | here](https://github.com/feathersjs/feathers/blob/master/.github/contributing.md#pull-requests)) 5 | 6 | - [ ] Tell us about the problem your pull request is solving. 7 | - [ ] Are there any open issues that are related to this? 8 | - [ ] Is this PR dependent on PRs in other repos? 9 | 10 | If so, please mention them to keep the conversations linked together. 11 | 12 | ### Other Information 13 | 14 | If there's anything else that's important and relevant to your pull 15 | request, mention that information here. This could include 16 | benchmarks, or other information. 17 | 18 | Your PR will be reviewed by a core team member and they will work with you to get your changes merged in a timely manner. If merged your PR will automatically be added to the changelog in the next release. 19 | 20 | If your changes involve documentation updates please mention that and link the appropriate PR in [feathers-docs](https://github.com/feathersjs/feathers-docs). 21 | 22 | Thanks for contributing to Feathers! :heart: -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | # Logs 4 | logs 5 | *.log 6 | 7 | # Runtime data 8 | pids 9 | *.pid 10 | *.seed 11 | 12 | # Directory for instrumented libs generated by jscoverage/JSCover 13 | lib-cov 14 | 15 | # Coverage directory used by tools like istanbul 16 | coverage 17 | 18 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 19 | .grunt 20 | 21 | # Compiled binary addons (http://nodejs.org/api/addons.html) 22 | build/Release 23 | 24 | # Dependency directory 25 | # Commenting this out is preferred by some people, see 26 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git- 27 | node_modules 28 | 29 | # Users Environment Variables 30 | .lock-wscript 31 | 32 | dist/ 33 | lib/ 34 | 35 | .idea/ 36 | -------------------------------------------------------------------------------- /.istanbul.yml: -------------------------------------------------------------------------------- 1 | verbose: false 2 | instrumentation: 3 | root: ./lib/ 4 | include-all-sources: true 5 | reporting: 6 | print: summary 7 | reports: 8 | - html 9 | - text 10 | - lcov 11 | watermarks: 12 | statements: [50, 80] 13 | lines: [50, 80] 14 | functions: [50, 80] 15 | branches: [50, 80] 16 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .editorconfig 2 | .jshintrc 3 | .travis.yml 4 | .istanbul.yml 5 | .babelrc 6 | .idea/ 7 | .vscode/ 8 | test/ 9 | coverage/ 10 | .github/ 11 | -------------------------------------------------------------------------------- /.nyc_output/064ac953-15a4-40be-ab4a-ee88f46c7cec.json: -------------------------------------------------------------------------------- 1 | {"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/index.js":{"path":"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/index.js","statementMap":{"0":{"start":{"line":2,"column":0},"end":{"line":2,"column":27}},"1":{"start":{"line":5,"column":0},"end":{"line":5,"column":33}},"2":{"start":{"line":8,"column":0},"end":{"line":8,"column":34}},"3":{"start":{"line":9,"column":0},"end":{"line":9,"column":33}},"4":{"start":{"line":10,"column":0},"end":{"line":10,"column":33}},"5":{"start":{"line":11,"column":0},"end":{"line":11,"column":33}},"6":{"start":{"line":12,"column":0},"end":{"line":12,"column":34}},"7":{"start":{"line":13,"column":0},"end":{"line":13,"column":33}},"8":{"start":{"line":14,"column":0},"end":{"line":14,"column":35}},"9":{"start":{"line":15,"column":0},"end":{"line":15,"column":33}},"10":{"start":{"line":16,"column":0},"end":{"line":16,"column":33}},"11":{"start":{"line":17,"column":0},"end":{"line":17,"column":34}},"12":{"start":{"line":18,"column":0},"end":{"line":18,"column":32}},"13":{"start":{"line":21,"column":0},"end":{"line":21,"column":33}},"14":{"start":{"line":23,"column":0},"end":{"line":23,"column":48}},"15":{"start":{"line":24,"column":0},"end":{"line":24,"column":74}},"16":{"start":{"line":25,"column":0},"end":{"line":25,"column":64}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1},"f":{},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"507b11052fabdb0e5a10915dea2dcdd247377184","contentHash":"274c04dbde5e8cf32b23dfed02cf0ea3"},"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/lib/normalize.js":{"path":"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/lib/normalize.js","statementMap":{"0":{"start":{"line":4,"column":0},"end":{"line":9,"column":1}},"1":{"start":{"line":5,"column":2},"end":{"line":5,"column":33}},"2":{"start":{"line":6,"column":2},"end":{"line":8,"column":4}},"3":{"start":{"line":7,"column":4},"end":{"line":7,"column":17}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":18},"end":{"line":5,"column":19}},"loc":{"start":{"line":5,"column":30},"end":{"line":5,"column":32}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":6,"column":27},"end":{"line":6,"column":28}},"loc":{"start":{"line":6,"column":39},"end":{"line":8,"column":3}},"line":6}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":0},"end":{"line":9,"column":1}},"type":"if","locations":[{"start":{"line":4,"column":0},"end":{"line":9,"column":1}},{"start":{"line":4,"column":0},"end":{"line":9,"column":1}}],"line":4}},"s":{"0":1,"1":0,"2":0,"3":0},"f":{"0":0,"1":0},"b":{"0":[0,1]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"246af856209a5d8d85fec59a8218059c5caf43b8","contentHash":"45a4d1d226acd6264db7c2e3b37c7d09"},"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/helpers/query-types.js":{"path":"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/helpers/query-types.js","statementMap":{"0":{"start":{"line":2,"column":17},"end":{"line":2,"column":46}},"1":{"start":{"line":4,"column":0},"end":{"line":8,"column":13}},"2":{"start":{"line":10,"column":0},"end":{"line":10,"column":130}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1},"f":{},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"a3e80054daf10e26d75e185c7c2eea8535ba0e22","contentHash":"500561f36a2e6850231121486cdb112c"},"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/lib/query-types.js":{"path":"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/lib/query-types.js","statementMap":{"0":{"start":{"line":2,"column":12},"end":{"line":2,"column":14}},"1":{"start":{"line":4,"column":0},"end":{"line":6,"column":2}},"2":{"start":{"line":5,"column":2},"end":{"line":5,"column":22}},"3":{"start":{"line":8,"column":0},"end":{"line":10,"column":2}},"4":{"start":{"line":9,"column":2},"end":{"line":9,"column":21}},"5":{"start":{"line":12,"column":0},"end":{"line":14,"column":2}},"6":{"start":{"line":13,"column":2},"end":{"line":13,"column":36}},"7":{"start":{"line":16,"column":0},"end":{"line":20,"column":3}},"8":{"start":{"line":18,"column":4},"end":{"line":18,"column":30}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":21},"end":{"line":4,"column":22}},"loc":{"start":{"line":4,"column":44},"end":{"line":6,"column":1}},"line":4},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":21},"end":{"line":8,"column":22}},"loc":{"start":{"line":8,"column":37},"end":{"line":10,"column":1}},"line":8},"2":{"name":"(anonymous_2)","decl":{"start":{"line":12,"column":21},"end":{"line":12,"column":22}},"loc":{"start":{"line":12,"column":37},"end":{"line":14,"column":1}},"line":12},"3":{"name":"(anonymous_3)","decl":{"start":{"line":17,"column":7},"end":{"line":17,"column":8}},"loc":{"start":{"line":17,"column":19},"end":{"line":19,"column":3}},"line":17}},"branchMap":{},"s":{"0":1,"1":1,"2":2,"3":1,"4":151,"5":1,"6":151,"7":1,"8":0},"f":{"0":2,"1":151,"2":151,"3":0},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"f63eebb1439fa3fbb56e654a6a212b9b7b57f071","contentHash":"181685254185f4edd7b0e4dcacb54e25"},"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/helpers/query/values.js":{"path":"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/helpers/query/values.js","statementMap":{"0":{"start":{"line":1,"column":14},"end":{"line":1,"column":48}},"1":{"start":{"line":2,"column":19},"end":{"line":2,"column":53}},"2":{"start":{"line":4,"column":0},"end":{"line":38,"column":3}},"3":{"start":{"line":5,"column":2},"end":{"line":5,"column":94}},"4":{"start":{"line":5,"column":34},"end":{"line":5,"column":94}},"5":{"start":{"line":7,"column":2},"end":{"line":7,"column":96}},"6":{"start":{"line":7,"column":33},"end":{"line":7,"column":94}},"7":{"start":{"line":9,"column":2},"end":{"line":9,"column":50}},"8":{"start":{"line":9,"column":30},"end":{"line":9,"column":50}},"9":{"start":{"line":11,"column":2},"end":{"line":11,"column":105}},"10":{"start":{"line":11,"column":27},"end":{"line":11,"column":105}},"11":{"start":{"line":14,"column":13},"end":{"line":14,"column":15}},"12":{"start":{"line":14,"column":29},"end":{"line":17,"column":3}},"13":{"start":{"line":15,"column":4},"end":{"line":15,"column":37}},"14":{"start":{"line":15,"column":30},"end":{"line":15,"column":37}},"15":{"start":{"line":16,"column":4},"end":{"line":16,"column":17}},"16":{"start":{"line":19,"column":2},"end":{"line":21,"column":3}},"17":{"start":{"line":20,"column":4},"end":{"line":20,"column":46}},"18":{"start":{"line":23,"column":18},"end":{"line":35,"column":15}},"19":{"start":{"line":24,"column":17},"end":{"line":24,"column":19}},"20":{"start":{"line":25,"column":4},"end":{"line":33,"column":5}},"21":{"start":{"line":26,"column":6},"end":{"line":32,"column":7}},"22":{"start":{"line":27,"column":8},"end":{"line":27,"column":28}},"23":{"start":{"line":28,"column":13},"end":{"line":32,"column":7}},"24":{"start":{"line":29,"column":8},"end":{"line":29,"column":77}},"25":{"start":{"line":31,"column":8},"end":{"line":31,"column":60}},"26":{"start":{"line":34,"column":4},"end":{"line":34,"column":41}},"27":{"start":{"line":37,"column":2},"end":{"line":37,"column":61}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":27},"end":{"line":4,"column":28}},"loc":{"start":{"line":4,"column":65},"end":{"line":38,"column":1}},"line":4},"1":{"name":"(anonymous_1)","decl":{"start":{"line":14,"column":29},"end":{"line":14,"column":30}},"loc":{"start":{"line":14,"column":42},"end":{"line":17,"column":3}},"line":14},"2":{"name":"(anonymous_2)","decl":{"start":{"line":23,"column":29},"end":{"line":23,"column":30}},"loc":{"start":{"line":23,"column":46},"end":{"line":35,"column":3}},"line":23}},"branchMap":{"0":{"loc":{"start":{"line":5,"column":2},"end":{"line":5,"column":94}},"type":"if","locations":[{"start":{"line":5,"column":2},"end":{"line":5,"column":94}},{"start":{"line":5,"column":2},"end":{"line":5,"column":94}}],"line":5},"1":{"loc":{"start":{"line":7,"column":2},"end":{"line":7,"column":96}},"type":"if","locations":[{"start":{"line":7,"column":2},"end":{"line":7,"column":96}},{"start":{"line":7,"column":2},"end":{"line":7,"column":96}}],"line":7},"2":{"loc":{"start":{"line":9,"column":2},"end":{"line":9,"column":50}},"type":"if","locations":[{"start":{"line":9,"column":2},"end":{"line":9,"column":50}},{"start":{"line":9,"column":2},"end":{"line":9,"column":50}}],"line":9},"3":{"loc":{"start":{"line":11,"column":2},"end":{"line":11,"column":105}},"type":"if","locations":[{"start":{"line":11,"column":2},"end":{"line":11,"column":105}},{"start":{"line":11,"column":2},"end":{"line":11,"column":105}}],"line":11},"4":{"loc":{"start":{"line":15,"column":4},"end":{"line":15,"column":37}},"type":"if","locations":[{"start":{"line":15,"column":4},"end":{"line":15,"column":37}},{"start":{"line":15,"column":4},"end":{"line":15,"column":37}}],"line":15},"5":{"loc":{"start":{"line":26,"column":6},"end":{"line":32,"column":7}},"type":"if","locations":[{"start":{"line":26,"column":6},"end":{"line":32,"column":7}},{"start":{"line":26,"column":6},"end":{"line":32,"column":7}}],"line":26},"6":{"loc":{"start":{"line":26,"column":10},"end":{"line":26,"column":69}},"type":"binary-expr","locations":[{"start":{"line":26,"column":10},"end":{"line":26,"column":35}},{"start":{"line":26,"column":39},"end":{"line":26,"column":69}}],"line":26},"7":{"loc":{"start":{"line":28,"column":13},"end":{"line":32,"column":7}},"type":"if","locations":[{"start":{"line":28,"column":13},"end":{"line":32,"column":7}},{"start":{"line":28,"column":13},"end":{"line":32,"column":7}}],"line":28},"8":{"loc":{"start":{"line":28,"column":17},"end":{"line":28,"column":83}},"type":"binary-expr","locations":[{"start":{"line":28,"column":17},"end":{"line":28,"column":53}},{"start":{"line":28,"column":57},"end":{"line":28,"column":83}}],"line":28}},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0},"f":{"0":0,"1":0,"2":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"b22d806fef1a534f8cd6ac7e1052b831c658fee5","contentHash":"d93857e2b447b9e2a1c25e748ffecd22"},"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/lib/query-helpers.js":{"path":"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/lib/query-helpers.js","statementMap":{"0":{"start":{"line":2,"column":20},"end":{"line":2,"column":47}},"1":{"start":{"line":4,"column":0},"end":{"line":4,"column":37}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1},"f":{},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"d97d97a5d360ae9d4ade68c4824ebede8308ca57","contentHash":"9f03ca3d71d867558dc8fa2d8667d7a7"},"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/lib/helper-manager.js":{"path":"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/lib/helper-manager.js","statementMap":{"0":{"start":{"line":2,"column":20},"end":{"line":6,"column":1}},"1":{"start":{"line":3,"column":2},"end":{"line":3,"column":33}},"2":{"start":{"line":4,"column":2},"end":{"line":4,"column":20}},"3":{"start":{"line":5,"column":2},"end":{"line":5,"column":14}},"4":{"start":{"line":8,"column":0},"end":{"line":11,"column":2}},"5":{"start":{"line":9,"column":2},"end":{"line":9,"column":70}},"6":{"start":{"line":9,"column":23},"end":{"line":9,"column":70}},"7":{"start":{"line":10,"column":2},"end":{"line":10,"column":28}},"8":{"start":{"line":13,"column":0},"end":{"line":15,"column":2}},"9":{"start":{"line":14,"column":2},"end":{"line":14,"column":43}},"10":{"start":{"line":17,"column":0},"end":{"line":32,"column":2}},"11":{"start":{"line":18,"column":2},"end":{"line":21,"column":3}},"12":{"start":{"line":19,"column":4},"end":{"line":19,"column":17}},"13":{"start":{"line":20,"column":4},"end":{"line":20,"column":17}},"14":{"start":{"line":23,"column":2},"end":{"line":23,"column":26}},"15":{"start":{"line":25,"column":2},"end":{"line":27,"column":3}},"16":{"start":{"line":26,"column":4},"end":{"line":26,"column":61}},"17":{"start":{"line":26,"column":27},"end":{"line":26,"column":61}},"18":{"start":{"line":29,"column":2},"end":{"line":29,"column":52}},"19":{"start":{"line":31,"column":2},"end":{"line":31,"column":14}},"20":{"start":{"line":34,"column":0},"end":{"line":36,"column":2}},"21":{"start":{"line":35,"column":2},"end":{"line":35,"column":37}},"22":{"start":{"line":38,"column":0},"end":{"line":38,"column":31}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":2,"column":20},"end":{"line":2,"column":21}},"loc":{"start":{"line":2,"column":40},"end":{"line":6,"column":1}},"line":2},"1":{"name":"(anonymous_1)","decl":{"start":{"line":8,"column":30},"end":{"line":8,"column":31}},"loc":{"start":{"line":8,"column":46},"end":{"line":11,"column":1}},"line":8},"2":{"name":"(anonymous_2)","decl":{"start":{"line":13,"column":30},"end":{"line":13,"column":31}},"loc":{"start":{"line":13,"column":46},"end":{"line":15,"column":1}},"line":13},"3":{"name":"(anonymous_3)","decl":{"start":{"line":17,"column":30},"end":{"line":17,"column":31}},"loc":{"start":{"line":17,"column":59},"end":{"line":32,"column":1}},"line":17},"4":{"name":"(anonymous_4)","decl":{"start":{"line":34,"column":35},"end":{"line":34,"column":36}},"loc":{"start":{"line":34,"column":64},"end":{"line":36,"column":1}},"line":34}},"branchMap":{"0":{"loc":{"start":{"line":3,"column":18},"end":{"line":3,"column":32}},"type":"binary-expr","locations":[{"start":{"line":3,"column":18},"end":{"line":3,"column":26}},{"start":{"line":3,"column":30},"end":{"line":3,"column":32}}],"line":3},"1":{"loc":{"start":{"line":9,"column":2},"end":{"line":9,"column":70}},"type":"if","locations":[{"start":{"line":9,"column":2},"end":{"line":9,"column":70}},{"start":{"line":9,"column":2},"end":{"line":9,"column":70}}],"line":9},"2":{"loc":{"start":{"line":18,"column":2},"end":{"line":21,"column":3}},"type":"if","locations":[{"start":{"line":18,"column":2},"end":{"line":21,"column":3}},{"start":{"line":18,"column":2},"end":{"line":21,"column":3}}],"line":18},"3":{"loc":{"start":{"line":23,"column":12},"end":{"line":23,"column":25}},"type":"binary-expr","locations":[{"start":{"line":23,"column":12},"end":{"line":23,"column":19}},{"start":{"line":23,"column":23},"end":{"line":23,"column":25}}],"line":23},"4":{"loc":{"start":{"line":26,"column":4},"end":{"line":26,"column":61}},"type":"if","locations":[{"start":{"line":26,"column":4},"end":{"line":26,"column":61}},{"start":{"line":26,"column":4},"end":{"line":26,"column":61}}],"line":26}},"s":{"0":1,"1":2,"2":2,"3":2,"4":1,"5":797,"6":0,"7":797,"8":1,"9":2096,"10":1,"11":31,"12":25,"13":25,"14":31,"15":31,"16":18,"17":12,"18":31,"19":31,"20":1,"21":13,"22":1},"f":{"0":2,"1":797,"2":2096,"3":31,"4":13},"b":{"0":[2,1],"1":[0,797],"2":[25,6],"3":[31,0],"4":[12,6]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"aab95aae0ca1b98476cebc0c0a885dc61409852b","contentHash":"5edbc0fe39fa49def2f5acea4f78851a"},"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/lib/query-builder.js":{"path":"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/lib/query-builder.js","statementMap":{"0":{"start":{"line":2,"column":17},"end":{"line":2,"column":41}},"1":{"start":{"line":3,"column":19},"end":{"line":3,"column":45}},"2":{"start":{"line":4,"column":12},"end":{"line":4,"column":30}},"3":{"start":{"line":6,"column":0},"end":{"line":109,"column":2}},"4":{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},"5":{"start":{"line":10,"column":4},"end":{"line":10,"column":57}},"6":{"start":{"line":13,"column":2},"end":{"line":15,"column":3}},"7":{"start":{"line":14,"column":4},"end":{"line":14,"column":35}},"8":{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},"9":{"start":{"line":18,"column":4},"end":{"line":18,"column":35}},"10":{"start":{"line":21,"column":2},"end":{"line":23,"column":3}},"11":{"start":{"line":22,"column":4},"end":{"line":22,"column":49}},"12":{"start":{"line":27,"column":2},"end":{"line":27,"column":33}},"13":{"start":{"line":29,"column":2},"end":{"line":36,"column":3}},"14":{"start":{"line":30,"column":4},"end":{"line":35,"column":5}},"15":{"start":{"line":31,"column":6},"end":{"line":31,"column":30}},"16":{"start":{"line":33,"column":6},"end":{"line":33,"column":27}},"17":{"start":{"line":34,"column":6},"end":{"line":34,"column":17}},"18":{"start":{"line":38,"column":2},"end":{"line":40,"column":3}},"19":{"start":{"line":39,"column":4},"end":{"line":39,"column":14}},"20":{"start":{"line":43,"column":2},"end":{"line":106,"column":3}},"21":{"start":{"line":44,"column":4},"end":{"line":48,"column":6}},"22":{"start":{"line":51,"column":4},"end":{"line":62,"column":5}},"23":{"start":{"line":52,"column":6},"end":{"line":61,"column":7}},"24":{"start":{"line":53,"column":8},"end":{"line":53,"column":47}},"25":{"start":{"line":54,"column":8},"end":{"line":54,"column":31}},"26":{"start":{"line":55,"column":13},"end":{"line":61,"column":7}},"27":{"start":{"line":56,"column":8},"end":{"line":56,"column":46}},"28":{"start":{"line":57,"column":8},"end":{"line":57,"column":31}},"29":{"start":{"line":58,"column":13},"end":{"line":61,"column":7}},"30":{"start":{"line":59,"column":8},"end":{"line":59,"column":46}},"31":{"start":{"line":60,"column":8},"end":{"line":60,"column":31}},"32":{"start":{"line":64,"column":4},"end":{"line":64,"column":22}},"33":{"start":{"line":66,"column":4},"end":{"line":71,"column":5}},"34":{"start":{"line":67,"column":6},"end":{"line":70,"column":7}},"35":{"start":{"line":68,"column":8},"end":{"line":68,"column":35}},"36":{"start":{"line":69,"column":8},"end":{"line":69,"column":25}},"37":{"start":{"line":74,"column":4},"end":{"line":74,"column":23}},"38":{"start":{"line":76,"column":4},"end":{"line":81,"column":6}},"39":{"start":{"line":84,"column":4},"end":{"line":102,"column":5}},"40":{"start":{"line":85,"column":6},"end":{"line":101,"column":7}},"41":{"start":{"line":86,"column":8},"end":{"line":86,"column":35}},"42":{"start":{"line":87,"column":8},"end":{"line":87,"column":25}},"43":{"start":{"line":88,"column":13},"end":{"line":101,"column":7}},"44":{"start":{"line":89,"column":8},"end":{"line":94,"column":9}},"45":{"start":{"line":90,"column":10},"end":{"line":90,"column":56}},"46":{"start":{"line":91,"column":10},"end":{"line":91,"column":31}},"47":{"start":{"line":93,"column":10},"end":{"line":93,"column":37}},"48":{"start":{"line":96,"column":8},"end":{"line":96,"column":25}},"49":{"start":{"line":97,"column":13},"end":{"line":101,"column":7}},"50":{"start":{"line":98,"column":8},"end":{"line":98,"column":40}},"51":{"start":{"line":99,"column":8},"end":{"line":99,"column":75}},"52":{"start":{"line":100,"column":8},"end":{"line":100,"column":25}},"53":{"start":{"line":105,"column":4},"end":{"line":105,"column":23}},"54":{"start":{"line":108,"column":2},"end":{"line":108,"column":22}},"55":{"start":{"line":118,"column":2},"end":{"line":123,"column":3}},"56":{"start":{"line":119,"column":4},"end":{"line":119,"column":30}},"57":{"start":{"line":120,"column":9},"end":{"line":123,"column":3}},"58":{"start":{"line":121,"column":4},"end":{"line":121,"column":32}},"59":{"start":{"line":122,"column":4},"end":{"line":122,"column":28}},"60":{"start":{"line":126,"column":11},"end":{"line":126,"column":37}},"61":{"start":{"line":127,"column":14},"end":{"line":127,"column":39}},"62":{"start":{"line":129,"column":2},"end":{"line":129,"column":24}},"63":{"start":{"line":130,"column":2},"end":{"line":130,"column":37}},"64":{"start":{"line":131,"column":2},"end":{"line":131,"column":24}},"65":{"start":{"line":133,"column":2},"end":{"line":142,"column":3}},"66":{"start":{"line":137,"column":4},"end":{"line":141,"column":6}},"67":{"start":{"line":144,"column":15},"end":{"line":147,"column":3}},"68":{"start":{"line":150,"column":2},"end":{"line":150,"column":16}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":17},"end":{"line":6,"column":18}},"loc":{"start":{"line":6,"column":45},"end":{"line":109,"column":1}},"line":6},"1":{"name":"build","decl":{"start":{"line":117,"column":9},"end":{"line":117,"column":14}},"loc":{"start":{"line":117,"column":31},"end":{"line":151,"column":1}},"line":117}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},"type":"if","locations":[{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},{"start":{"line":9,"column":2},"end":{"line":11,"column":3}}],"line":9},"1":{"loc":{"start":{"line":9,"column":6},"end":{"line":9,"column":73}},"type":"binary-expr","locations":[{"start":{"line":9,"column":6},"end":{"line":9,"column":36}},{"start":{"line":9,"column":40},"end":{"line":9,"column":51}},{"start":{"line":9,"column":55},"end":{"line":9,"column":73}}],"line":9},"2":{"loc":{"start":{"line":13,"column":2},"end":{"line":15,"column":3}},"type":"if","locations":[{"start":{"line":13,"column":2},"end":{"line":15,"column":3}},{"start":{"line":13,"column":2},"end":{"line":15,"column":3}}],"line":13},"3":{"loc":{"start":{"line":13,"column":6},"end":{"line":13,"column":40}},"type":"binary-expr","locations":[{"start":{"line":13,"column":6},"end":{"line":13,"column":31}},{"start":{"line":13,"column":35},"end":{"line":13,"column":40}}],"line":13},"4":{"loc":{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},"type":"if","locations":[{"start":{"line":17,"column":2},"end":{"line":19,"column":3}},{"start":{"line":17,"column":2},"end":{"line":19,"column":3}}],"line":17},"5":{"loc":{"start":{"line":17,"column":6},"end":{"line":17,"column":40}},"type":"binary-expr","locations":[{"start":{"line":17,"column":6},"end":{"line":17,"column":31}},{"start":{"line":17,"column":35},"end":{"line":17,"column":40}}],"line":17},"6":{"loc":{"start":{"line":21,"column":2},"end":{"line":23,"column":3}},"type":"if","locations":[{"start":{"line":21,"column":2},"end":{"line":23,"column":3}},{"start":{"line":21,"column":2},"end":{"line":23,"column":3}}],"line":21},"7":{"loc":{"start":{"line":29,"column":2},"end":{"line":36,"column":3}},"type":"if","locations":[{"start":{"line":29,"column":2},"end":{"line":36,"column":3}},{"start":{"line":29,"column":2},"end":{"line":36,"column":3}}],"line":29},"8":{"loc":{"start":{"line":38,"column":2},"end":{"line":40,"column":3}},"type":"if","locations":[{"start":{"line":38,"column":2},"end":{"line":40,"column":3}},{"start":{"line":38,"column":2},"end":{"line":40,"column":3}}],"line":38},"9":{"loc":{"start":{"line":43,"column":2},"end":{"line":106,"column":3}},"type":"if","locations":[{"start":{"line":43,"column":2},"end":{"line":106,"column":3}},{"start":{"line":43,"column":2},"end":{"line":106,"column":3}}],"line":43},"10":{"loc":{"start":{"line":52,"column":6},"end":{"line":61,"column":7}},"type":"if","locations":[{"start":{"line":52,"column":6},"end":{"line":61,"column":7}},{"start":{"line":52,"column":6},"end":{"line":61,"column":7}}],"line":52},"11":{"loc":{"start":{"line":55,"column":13},"end":{"line":61,"column":7}},"type":"if","locations":[{"start":{"line":55,"column":13},"end":{"line":61,"column":7}},{"start":{"line":55,"column":13},"end":{"line":61,"column":7}}],"line":55},"12":{"loc":{"start":{"line":58,"column":13},"end":{"line":61,"column":7}},"type":"if","locations":[{"start":{"line":58,"column":13},"end":{"line":61,"column":7}},{"start":{"line":58,"column":13},"end":{"line":61,"column":7}}],"line":58},"13":{"loc":{"start":{"line":67,"column":6},"end":{"line":70,"column":7}},"type":"if","locations":[{"start":{"line":67,"column":6},"end":{"line":70,"column":7}},{"start":{"line":67,"column":6},"end":{"line":70,"column":7}}],"line":67},"14":{"loc":{"start":{"line":85,"column":6},"end":{"line":101,"column":7}},"type":"if","locations":[{"start":{"line":85,"column":6},"end":{"line":101,"column":7}},{"start":{"line":85,"column":6},"end":{"line":101,"column":7}}],"line":85},"15":{"loc":{"start":{"line":88,"column":13},"end":{"line":101,"column":7}},"type":"if","locations":[{"start":{"line":88,"column":13},"end":{"line":101,"column":7}},{"start":{"line":88,"column":13},"end":{"line":101,"column":7}}],"line":88},"16":{"loc":{"start":{"line":89,"column":8},"end":{"line":94,"column":9}},"type":"if","locations":[{"start":{"line":89,"column":8},"end":{"line":94,"column":9}},{"start":{"line":89,"column":8},"end":{"line":94,"column":9}}],"line":89},"17":{"loc":{"start":{"line":97,"column":13},"end":{"line":101,"column":7}},"type":"if","locations":[{"start":{"line":97,"column":13},"end":{"line":101,"column":7}},{"start":{"line":97,"column":13},"end":{"line":101,"column":7}}],"line":97},"18":{"loc":{"start":{"line":98,"column":22},"end":{"line":98,"column":39}},"type":"binary-expr","locations":[{"start":{"line":98,"column":22},"end":{"line":98,"column":33}},{"start":{"line":98,"column":37},"end":{"line":98,"column":39}}],"line":98},"19":{"loc":{"start":{"line":118,"column":2},"end":{"line":123,"column":3}},"type":"if","locations":[{"start":{"line":118,"column":2},"end":{"line":123,"column":3}},{"start":{"line":118,"column":2},"end":{"line":123,"column":3}}],"line":118},"20":{"loc":{"start":{"line":120,"column":9},"end":{"line":123,"column":3}},"type":"if","locations":[{"start":{"line":120,"column":9},"end":{"line":123,"column":3}},{"start":{"line":120,"column":9},"end":{"line":123,"column":3}}],"line":120},"21":{"loc":{"start":{"line":129,"column":11},"end":{"line":129,"column":23}},"type":"binary-expr","locations":[{"start":{"line":129,"column":11},"end":{"line":129,"column":17}},{"start":{"line":129,"column":21},"end":{"line":129,"column":23}}],"line":129},"22":{"loc":{"start":{"line":139,"column":8},"end":{"line":140,"column":66}},"type":"cond-expr","locations":[{"start":{"line":140,"column":10},"end":{"line":140,"column":61}},{"start":{"line":140,"column":64},"end":{"line":140,"column":66}}],"line":139},"23":{"loc":{"start":{"line":139,"column":8},"end":{"line":139,"column":96}},"type":"binary-expr","locations":[{"start":{"line":139,"column":8},"end":{"line":139,"column":82}},{"start":{"line":139,"column":86},"end":{"line":139,"column":96}}],"line":139}},"s":{"0":1,"1":1,"2":1,"3":1,"4":151,"5":0,"6":151,"7":0,"8":151,"9":0,"10":151,"11":0,"12":151,"13":151,"14":0,"15":0,"16":0,"17":0,"18":151,"19":0,"20":151,"21":2,"22":2,"23":6,"24":2,"25":2,"26":4,"27":2,"28":2,"29":2,"30":2,"31":2,"32":2,"33":2,"34":3,"35":1,"36":1,"37":2,"38":149,"39":149,"40":140,"41":19,"42":19,"43":121,"44":10,"45":4,"46":4,"47":6,"48":10,"49":111,"50":0,"51":0,"52":0,"53":149,"54":151,"55":151,"56":0,"57":151,"58":0,"59":0,"60":151,"61":151,"62":151,"63":151,"64":151,"65":151,"66":1059,"67":151,"68":151},"f":{"0":151,"1":151},"b":{"0":[0,151],"1":[151,151,151],"2":[0,151],"3":[151,151],"4":[0,151],"5":[151,151],"6":[0,151],"7":[0,151],"8":[0,151],"9":[2,149],"10":[2,4],"11":[2,2],"12":[2,0],"13":[1,2],"14":[19,121],"15":[10,111],"16":[4,6],"17":[0,111],"18":[0,0],"19":[0,151],"20":[0,151],"21":[151,151],"22":[640,419],"23":[1059,1059]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"90dc20e65cb06f241df60ea5724bf6c62c895cc0","contentHash":"83661959a4b12445f6e916bfc584cddb"},"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/lib/utils.js":{"path":"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/lib/utils.js","statementMap":{"0":{"start":{"line":2,"column":12},"end":{"line":2,"column":31}},"1":{"start":{"line":3,"column":11},"end":{"line":6,"column":1}},"2":{"start":{"line":8,"column":0},"end":{"line":23,"column":2}},"3":{"start":{"line":9,"column":2},"end":{"line":9,"column":24}},"4":{"start":{"line":11,"column":2},"end":{"line":22,"column":3}},"5":{"start":{"line":12,"column":4},"end":{"line":12,"column":13}},"6":{"start":{"line":13,"column":4},"end":{"line":15,"column":5}},"7":{"start":{"line":14,"column":6},"end":{"line":14,"column":55}},"8":{"start":{"line":17,"column":4},"end":{"line":17,"column":25}},"9":{"start":{"line":19,"column":18},"end":{"line":19,"column":59}},"10":{"start":{"line":20,"column":4},"end":{"line":20,"column":123}},"11":{"start":{"line":21,"column":4},"end":{"line":21,"column":25}},"12":{"start":{"line":25,"column":0},"end":{"line":32,"column":2}},"13":{"start":{"line":26,"column":2},"end":{"line":26,"column":24}},"14":{"start":{"line":28,"column":16},"end":{"line":28,"column":58}},"15":{"start":{"line":29,"column":2},"end":{"line":29,"column":121}},"16":{"start":{"line":31,"column":2},"end":{"line":31,"column":23}},"17":{"start":{"line":34,"column":0},"end":{"line":41,"column":2}},"18":{"start":{"line":35,"column":2},"end":{"line":35,"column":24}},"19":{"start":{"line":37,"column":16},"end":{"line":37,"column":57}},"20":{"start":{"line":38,"column":2},"end":{"line":38,"column":26}},"21":{"start":{"line":40,"column":2},"end":{"line":40,"column":23}},"22":{"start":{"line":43,"column":0},"end":{"line":50,"column":2}},"23":{"start":{"line":44,"column":2},"end":{"line":44,"column":66}},"24":{"start":{"line":44,"column":34},"end":{"line":44,"column":66}},"25":{"start":{"line":46,"column":2},"end":{"line":46,"column":64}},"26":{"start":{"line":47,"column":2},"end":{"line":47,"column":85}},"27":{"start":{"line":47,"column":23},"end":{"line":47,"column":85}},"28":{"start":{"line":48,"column":2},"end":{"line":48,"column":64}},"29":{"start":{"line":48,"column":38},"end":{"line":48,"column":64}},"30":{"start":{"line":49,"column":2},"end":{"line":49,"column":65}},"31":{"start":{"line":52,"column":0},"end":{"line":116,"column":2}},"32":{"start":{"line":54,"column":13},"end":{"line":54,"column":53}},"33":{"start":{"line":59,"column":19},"end":{"line":59,"column":40}},"34":{"start":{"line":62,"column":2},"end":{"line":70,"column":3}},"35":{"start":{"line":63,"column":4},"end":{"line":69,"column":5}},"36":{"start":{"line":64,"column":6},"end":{"line":64,"column":33}},"37":{"start":{"line":65,"column":6},"end":{"line":65,"column":24}},"38":{"start":{"line":66,"column":6},"end":{"line":68,"column":9}},"39":{"start":{"line":67,"column":8},"end":{"line":67,"column":29}},"40":{"start":{"line":73,"column":2},"end":{"line":78,"column":3}},"41":{"start":{"line":74,"column":4},"end":{"line":77,"column":40}},"42":{"start":{"line":81,"column":2},"end":{"line":100,"column":3}},"43":{"start":{"line":82,"column":20},"end":{"line":82,"column":58}},"44":{"start":{"line":85,"column":4},"end":{"line":99,"column":7}},"45":{"start":{"line":89,"column":6},"end":{"line":89,"column":79}},"46":{"start":{"line":89,"column":19},"end":{"line":89,"column":79}},"47":{"start":{"line":91,"column":6},"end":{"line":93,"column":7}},"48":{"start":{"line":92,"column":8},"end":{"line":92,"column":32}},"49":{"start":{"line":95,"column":6},"end":{"line":95,"column":18}},"50":{"start":{"line":98,"column":6},"end":{"line":98,"column":47}},"51":{"start":{"line":103,"column":2},"end":{"line":115,"column":64}},"52":{"start":{"line":103,"column":48},"end":{"line":103,"column":98}},"53":{"start":{"line":106,"column":7},"end":{"line":115,"column":64}},"54":{"start":{"line":106,"column":40},"end":{"line":106,"column":53}},"55":{"start":{"line":109,"column":7},"end":{"line":115,"column":64}},"56":{"start":{"line":109,"column":39},"end":{"line":109,"column":80}},"57":{"start":{"line":112,"column":7},"end":{"line":115,"column":64}},"58":{"start":{"line":112,"column":40},"end":{"line":112,"column":107}},"59":{"start":{"line":115,"column":9},"end":{"line":115,"column":62}},"60":{"start":{"line":118,"column":0},"end":{"line":121,"column":2}},"61":{"start":{"line":119,"column":12},"end":{"line":119,"column":27}},"62":{"start":{"line":119,"column":38},"end":{"line":119,"column":85}},"63":{"start":{"line":120,"column":2},"end":{"line":120,"column":45}},"64":{"start":{"line":127,"column":0},"end":{"line":130,"column":2}},"65":{"start":{"line":128,"column":13},"end":{"line":128,"column":53}},"66":{"start":{"line":129,"column":2},"end":{"line":129,"column":45}},"67":{"start":{"line":129,"column":23},"end":{"line":129,"column":42}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":8,"column":15},"end":{"line":8,"column":16}},"loc":{"start":{"line":8,"column":64},"end":{"line":23,"column":1}},"line":8},"1":{"name":"(anonymous_1)","decl":{"start":{"line":25,"column":20},"end":{"line":25,"column":21}},"loc":{"start":{"line":25,"column":69},"end":{"line":32,"column":1}},"line":25},"2":{"name":"(anonymous_2)","decl":{"start":{"line":34,"column":20},"end":{"line":34,"column":21}},"loc":{"start":{"line":34,"column":53},"end":{"line":41,"column":1}},"line":34},"3":{"name":"(anonymous_3)","decl":{"start":{"line":43,"column":21},"end":{"line":43,"column":22}},"loc":{"start":{"line":43,"column":62},"end":{"line":50,"column":1}},"line":43},"4":{"name":"(anonymous_4)","decl":{"start":{"line":52,"column":40},"end":{"line":52,"column":41}},"loc":{"start":{"line":52,"column":69},"end":{"line":116,"column":1}},"line":52},"5":{"name":"(anonymous_5)","decl":{"start":{"line":66,"column":20},"end":{"line":66,"column":21}},"loc":{"start":{"line":66,"column":33},"end":{"line":68,"column":7}},"line":66},"6":{"name":"(anonymous_6)","decl":{"start":{"line":88,"column":10},"end":{"line":88,"column":11}},"loc":{"start":{"line":88,"column":29},"end":{"line":97,"column":5}},"line":88},"7":{"name":"(anonymous_7)","decl":{"start":{"line":97,"column":14},"end":{"line":97,"column":15}},"loc":{"start":{"line":97,"column":33},"end":{"line":99,"column":5}},"line":97},"8":{"name":"(anonymous_8)","decl":{"start":{"line":118,"column":19},"end":{"line":118,"column":20}},"loc":{"start":{"line":118,"column":36},"end":{"line":121,"column":1}},"line":118},"9":{"name":"(anonymous_9)","decl":{"start":{"line":127,"column":13},"end":{"line":127,"column":14}},"loc":{"start":{"line":127,"column":27},"end":{"line":130,"column":1}},"line":127},"10":{"name":"(anonymous_10)","decl":{"start":{"line":129,"column":9},"end":{"line":129,"column":10}},"loc":{"start":{"line":129,"column":21},"end":{"line":129,"column":44}},"line":129}},"branchMap":{"0":{"loc":{"start":{"line":9,"column":11},"end":{"line":9,"column":23}},"type":"binary-expr","locations":[{"start":{"line":9,"column":11},"end":{"line":9,"column":17}},{"start":{"line":9,"column":21},"end":{"line":9,"column":23}}],"line":9},"1":{"loc":{"start":{"line":11,"column":2},"end":{"line":22,"column":3}},"type":"if","locations":[{"start":{"line":11,"column":2},"end":{"line":22,"column":3}},{"start":{"line":11,"column":2},"end":{"line":22,"column":3}}],"line":11},"2":{"loc":{"start":{"line":20,"column":22},"end":{"line":20,"column":122}},"type":"cond-expr","locations":[{"start":{"line":20,"column":98},"end":{"line":20,"column":114}},{"start":{"line":20,"column":117},"end":{"line":20,"column":122}}],"line":20},"3":{"loc":{"start":{"line":20,"column":22},"end":{"line":20,"column":95}},"type":"binary-expr","locations":[{"start":{"line":20,"column":22},"end":{"line":20,"column":37}},{"start":{"line":20,"column":41},"end":{"line":20,"column":66}},{"start":{"line":20,"column":70},"end":{"line":20,"column":95}}],"line":20},"4":{"loc":{"start":{"line":26,"column":11},"end":{"line":26,"column":23}},"type":"binary-expr","locations":[{"start":{"line":26,"column":11},"end":{"line":26,"column":17}},{"start":{"line":26,"column":21},"end":{"line":26,"column":23}}],"line":26},"5":{"loc":{"start":{"line":29,"column":20},"end":{"line":29,"column":120}},"type":"cond-expr","locations":[{"start":{"line":29,"column":96},"end":{"line":29,"column":112}},{"start":{"line":29,"column":115},"end":{"line":29,"column":120}}],"line":29},"6":{"loc":{"start":{"line":29,"column":20},"end":{"line":29,"column":93}},"type":"binary-expr","locations":[{"start":{"line":29,"column":20},"end":{"line":29,"column":35}},{"start":{"line":29,"column":39},"end":{"line":29,"column":64}},{"start":{"line":29,"column":68},"end":{"line":29,"column":93}}],"line":29},"7":{"loc":{"start":{"line":35,"column":11},"end":{"line":35,"column":23}},"type":"binary-expr","locations":[{"start":{"line":35,"column":11},"end":{"line":35,"column":17}},{"start":{"line":35,"column":21},"end":{"line":35,"column":23}}],"line":35},"8":{"loc":{"start":{"line":44,"column":2},"end":{"line":44,"column":66}},"type":"if","locations":[{"start":{"line":44,"column":2},"end":{"line":44,"column":66}},{"start":{"line":44,"column":2},"end":{"line":44,"column":66}}],"line":44},"9":{"loc":{"start":{"line":44,"column":41},"end":{"line":44,"column":65}},"type":"cond-expr","locations":[{"start":{"line":44,"column":49},"end":{"line":44,"column":55}},{"start":{"line":44,"column":58},"end":{"line":44,"column":65}}],"line":44},"10":{"loc":{"start":{"line":47,"column":2},"end":{"line":47,"column":85}},"type":"if","locations":[{"start":{"line":47,"column":2},"end":{"line":47,"column":85}},{"start":{"line":47,"column":2},"end":{"line":47,"column":85}}],"line":47},"11":{"loc":{"start":{"line":48,"column":2},"end":{"line":48,"column":64}},"type":"if","locations":[{"start":{"line":48,"column":2},"end":{"line":48,"column":64}},{"start":{"line":48,"column":2},"end":{"line":48,"column":64}}],"line":48},"12":{"loc":{"start":{"line":59,"column":19},"end":{"line":59,"column":40}},"type":"binary-expr","locations":[{"start":{"line":59,"column":19},"end":{"line":59,"column":31}},{"start":{"line":59,"column":35},"end":{"line":59,"column":40}}],"line":59},"13":{"loc":{"start":{"line":63,"column":4},"end":{"line":69,"column":5}},"type":"if","locations":[{"start":{"line":63,"column":4},"end":{"line":69,"column":5}},{"start":{"line":63,"column":4},"end":{"line":69,"column":5}}],"line":63},"14":{"loc":{"start":{"line":73,"column":2},"end":{"line":78,"column":3}},"type":"if","locations":[{"start":{"line":73,"column":2},"end":{"line":78,"column":3}},{"start":{"line":73,"column":2},"end":{"line":78,"column":3}}],"line":73},"15":{"loc":{"start":{"line":81,"column":2},"end":{"line":100,"column":3}},"type":"if","locations":[{"start":{"line":81,"column":2},"end":{"line":100,"column":3}},{"start":{"line":81,"column":2},"end":{"line":100,"column":3}}],"line":81},"16":{"loc":{"start":{"line":89,"column":6},"end":{"line":89,"column":79}},"type":"if","locations":[{"start":{"line":89,"column":6},"end":{"line":89,"column":79}},{"start":{"line":89,"column":6},"end":{"line":89,"column":79}}],"line":89},"17":{"loc":{"start":{"line":91,"column":6},"end":{"line":93,"column":7}},"type":"if","locations":[{"start":{"line":91,"column":6},"end":{"line":93,"column":7}},{"start":{"line":91,"column":6},"end":{"line":93,"column":7}}],"line":91},"18":{"loc":{"start":{"line":91,"column":10},"end":{"line":91,"column":64}},"type":"binary-expr","locations":[{"start":{"line":91,"column":10},"end":{"line":91,"column":36}},{"start":{"line":91,"column":40},"end":{"line":91,"column":64}}],"line":91},"19":{"loc":{"start":{"line":103,"column":2},"end":{"line":115,"column":64}},"type":"if","locations":[{"start":{"line":103,"column":2},"end":{"line":115,"column":64}},{"start":{"line":103,"column":2},"end":{"line":115,"column":64}}],"line":103},"20":{"loc":{"start":{"line":103,"column":6},"end":{"line":103,"column":44}},"type":"binary-expr","locations":[{"start":{"line":103,"column":6},"end":{"line":103,"column":30}},{"start":{"line":103,"column":34},"end":{"line":103,"column":44}}],"line":103},"21":{"loc":{"start":{"line":106,"column":7},"end":{"line":115,"column":64}},"type":"if","locations":[{"start":{"line":106,"column":7},"end":{"line":115,"column":64}},{"start":{"line":106,"column":7},"end":{"line":115,"column":64}}],"line":106},"22":{"loc":{"start":{"line":109,"column":7},"end":{"line":115,"column":64}},"type":"if","locations":[{"start":{"line":109,"column":7},"end":{"line":115,"column":64}},{"start":{"line":109,"column":7},"end":{"line":115,"column":64}}],"line":109},"23":{"loc":{"start":{"line":112,"column":7},"end":{"line":115,"column":64}},"type":"if","locations":[{"start":{"line":112,"column":7},"end":{"line":115,"column":64}},{"start":{"line":112,"column":7},"end":{"line":115,"column":64}}],"line":112},"24":{"loc":{"start":{"line":119,"column":38},"end":{"line":119,"column":85}},"type":"binary-expr","locations":[{"start":{"line":119,"column":38},"end":{"line":119,"column":61}},{"start":{"line":119,"column":66},"end":{"line":119,"column":73}},{"start":{"line":119,"column":77},"end":{"line":119,"column":84}}],"line":119},"25":{"loc":{"start":{"line":120,"column":9},"end":{"line":120,"column":44}},"type":"cond-expr","locations":[{"start":{"line":120,"column":17},"end":{"line":120,"column":22}},{"start":{"line":120,"column":25},"end":{"line":120,"column":44}}],"line":120}},"s":{"0":1,"1":1,"2":1,"3":351,"4":351,"5":55,"6":55,"7":61,"8":55,"9":296,"10":296,"11":296,"12":1,"13":151,"14":151,"15":151,"16":151,"17":1,"18":10,"19":10,"20":10,"21":10,"22":1,"23":197,"24":14,"25":183,"26":0,"27":0,"28":0,"29":0,"30":0,"31":1,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":1,"61":0,"62":0,"63":0,"64":1,"65":0,"66":0,"67":0},"f":{"0":351,"1":151,"2":10,"3":197,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0},"b":{"0":[351,351],"1":[55,296],"2":[0,296],"3":[296,185,169],"4":[151,151],"5":[0,151],"6":[151,151,151],"7":[10,10],"8":[14,183],"9":[12,2],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0],"18":[0,0],"19":[0,0],"20":[0,0],"21":[0,0],"22":[0,0],"23":[0,0],"24":[0,0,0],"25":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"21f40f87a6bc6a48bf1216aa293319e0ef6fd941","contentHash":"5b5aff56104a11390c28785a92c446bb"},"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/helpers/query/order.js":{"path":"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/helpers/query/order.js","statementMap":{"0":{"start":{"line":1,"column":14},"end":{"line":1,"column":48}},"1":{"start":{"line":2,"column":12},"end":{"line":2,"column":38}},"2":{"start":{"line":4,"column":0},"end":{"line":18,"column":3}},"3":{"start":{"line":5,"column":2},"end":{"line":7,"column":3}},"4":{"start":{"line":6,"column":4},"end":{"line":6,"column":91}},"5":{"start":{"line":9,"column":15},"end":{"line":9,"column":22}},"6":{"start":{"line":11,"column":2},"end":{"line":13,"column":3}},"7":{"start":{"line":12,"column":4},"end":{"line":12,"column":120}},"8":{"start":{"line":15,"column":2},"end":{"line":15,"column":36}},"9":{"start":{"line":15,"column":26},"end":{"line":15,"column":36}},"10":{"start":{"line":17,"column":2},"end":{"line":17,"column":48}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":26},"end":{"line":4,"column":27}},"loc":{"start":{"line":4,"column":58},"end":{"line":18,"column":1}},"line":4}},"branchMap":{"0":{"loc":{"start":{"line":5,"column":2},"end":{"line":7,"column":3}},"type":"if","locations":[{"start":{"line":5,"column":2},"end":{"line":7,"column":3}},{"start":{"line":5,"column":2},"end":{"line":7,"column":3}}],"line":5},"1":{"loc":{"start":{"line":12,"column":78},"end":{"line":12,"column":111}},"type":"cond-expr","locations":[{"start":{"line":12,"column":97},"end":{"line":12,"column":102}},{"start":{"line":12,"column":105},"end":{"line":12,"column":111}}],"line":12},"2":{"loc":{"start":{"line":15,"column":2},"end":{"line":15,"column":36}},"type":"if","locations":[{"start":{"line":15,"column":2},"end":{"line":15,"column":36}},{"start":{"line":15,"column":2},"end":{"line":15,"column":36}}],"line":15}},"s":{"0":1,"1":1,"2":1,"3":20,"4":0,"5":20,"6":20,"7":20,"8":20,"9":0,"10":20},"f":{"0":20},"b":{"0":[0,20],"1":[14,6],"2":[0,20]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"aca19b4d4282ed546223c6920284b2e353a8d0dd","contentHash":"7fcd3a8fc98cf0283af3cfcc1939d818"},"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/helpers/query/limit.js":{"path":"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/helpers/query/limit.js","statementMap":{"0":{"start":{"line":2,"column":14},"end":{"line":2,"column":48}},"1":{"start":{"line":3,"column":12},"end":{"line":3,"column":38}},"2":{"start":{"line":5,"column":0},"end":{"line":9,"column":3}},"3":{"start":{"line":6,"column":2},"end":{"line":8,"column":220}},"4":{"start":{"line":7,"column":4},"end":{"line":7,"column":94}},"5":{"start":{"line":8,"column":9},"end":{"line":8,"column":220}},"6":{"start":{"line":8,"column":42},"end":{"line":8,"column":89}},"7":{"start":{"line":8,"column":99},"end":{"line":8,"column":218}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":26},"end":{"line":5,"column":27}},"loc":{"start":{"line":5,"column":58},"end":{"line":9,"column":1}},"line":5}},"branchMap":{"0":{"loc":{"start":{"line":6,"column":2},"end":{"line":8,"column":220}},"type":"if","locations":[{"start":{"line":6,"column":2},"end":{"line":8,"column":220}},{"start":{"line":6,"column":2},"end":{"line":8,"column":220}}],"line":6},"1":{"loc":{"start":{"line":6,"column":6},"end":{"line":6,"column":112}},"type":"binary-expr","locations":[{"start":{"line":6,"column":6},"end":{"line":6,"column":26}},{"start":{"line":6,"column":30},"end":{"line":6,"column":48}},{"start":{"line":6,"column":52},"end":{"line":6,"column":80}},{"start":{"line":6,"column":84},"end":{"line":6,"column":112}}],"line":6},"2":{"loc":{"start":{"line":8,"column":9},"end":{"line":8,"column":220}},"type":"if","locations":[{"start":{"line":8,"column":9},"end":{"line":8,"column":220}},{"start":{"line":8,"column":9},"end":{"line":8,"column":220}}],"line":8}},"s":{"0":1,"1":1,"2":1,"3":10,"4":4,"5":6,"6":6,"7":0},"f":{"0":10},"b":{"0":[4,6],"1":[10,4,4,4],"2":[6,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"3b27d4b00983edcb60b4038342993d8fa5a0f097","contentHash":"c10904e3c426ed441f21422d4afd63e7"},"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/helpers/query/embed.js":{"path":"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/helpers/query/embed.js","statementMap":{"0":{"start":{"line":2,"column":16},"end":{"line":2,"column":50}},"1":{"start":{"line":3,"column":14},"end":{"line":3,"column":40}},"2":{"start":{"line":5,"column":0},"end":{"line":17,"column":3}},"3":{"start":{"line":6,"column":12},"end":{"line":6,"column":14}},"4":{"start":{"line":8,"column":2},"end":{"line":14,"column":3}},"5":{"start":{"line":9,"column":4},"end":{"line":13,"column":5}},"6":{"start":{"line":10,"column":6},"end":{"line":10,"column":31}},"7":{"start":{"line":11,"column":6},"end":{"line":11,"column":56}},"8":{"start":{"line":12,"column":6},"end":{"line":12,"column":161}},"9":{"start":{"line":16,"column":2},"end":{"line":16,"column":13}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":26},"end":{"line":5,"column":27}},"loc":{"start":{"line":5,"column":58},"end":{"line":17,"column":1}},"line":5}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":2},"end":{"line":14,"column":3}},"type":"if","locations":[{"start":{"line":8,"column":2},"end":{"line":14,"column":3}},{"start":{"line":8,"column":2},"end":{"line":14,"column":3}}],"line":8},"1":{"loc":{"start":{"line":8,"column":6},"end":{"line":8,"column":27}},"type":"binary-expr","locations":[{"start":{"line":8,"column":6},"end":{"line":8,"column":11}},{"start":{"line":8,"column":15},"end":{"line":8,"column":27}}],"line":8}},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0},"f":{"0":0},"b":{"0":[0,0],"1":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"69768107540e2f9edf454529ad2eab0fed6e6862","contentHash":"de2a6b6cd3fdd001b3e4448c774c075c"},"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/helpers/query/offset.js":{"path":"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/helpers/query/offset.js","statementMap":{"0":{"start":{"line":2,"column":14},"end":{"line":2,"column":48}},"1":{"start":{"line":4,"column":0},"end":{"line":6,"column":3}},"2":{"start":{"line":5,"column":2},"end":{"line":5,"column":43}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":27},"end":{"line":4,"column":28}},"loc":{"start":{"line":4,"column":53},"end":{"line":6,"column":1}},"line":4}},"branchMap":{},"s":{"0":1,"1":1,"2":0},"f":{"0":0},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"faa4dde26fee5d157b752d8277bbbd42b18809c4","contentHash":"e663a7236435d248c06b24e08ee6443e"},"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/helpers/query/alias.js":{"path":"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/helpers/query/alias.js","statementMap":{"0":{"start":{"line":10,"column":14},"end":{"line":10,"column":48}},"1":{"start":{"line":14,"column":0},"end":{"line":17,"column":3}},"2":{"start":{"line":15,"column":2},"end":{"line":15,"column":37}},"3":{"start":{"line":16,"column":2},"end":{"line":16,"column":15}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":14,"column":26},"end":{"line":14,"column":27}},"loc":{"start":{"line":14,"column":58},"end":{"line":17,"column":1}},"line":14}},"branchMap":{},"s":{"0":1,"1":1,"2":153,"3":153},"f":{"0":153},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"ccf17aee4398499faeb36317a8f1ac93d8703b5d","contentHash":"4176c40a93e1a7d324293c802d60c38c"},"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/helpers/query/columns.js":{"path":"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/helpers/query/columns.js","statementMap":{"0":{"start":{"line":2,"column":19},"end":{"line":2,"column":53}},"1":{"start":{"line":3,"column":14},"end":{"line":3,"column":48}},"2":{"start":{"line":4,"column":12},"end":{"line":4,"column":38}},"3":{"start":{"line":6,"column":0},"end":{"line":41,"column":3}},"4":{"start":{"line":7,"column":2},"end":{"line":7,"column":96}},"5":{"start":{"line":7,"column":35},"end":{"line":7,"column":96}},"6":{"start":{"line":9,"column":2},"end":{"line":13,"column":3}},"7":{"start":{"line":10,"column":4},"end":{"line":12,"column":24}},"8":{"start":{"line":11,"column":6},"end":{"line":11,"column":36}},"9":{"start":{"line":15,"column":15},"end":{"line":15,"column":17}},"10":{"start":{"line":17,"column":2},"end":{"line":36,"column":3}},"11":{"start":{"line":18,"column":4},"end":{"line":24,"column":5}},"12":{"start":{"line":19,"column":6},"end":{"line":19,"column":569}},"13":{"start":{"line":19,"column":101},"end":{"line":19,"column":167}},"14":{"start":{"line":19,"column":175},"end":{"line":19,"column":569}},"15":{"start":{"line":19,"column":243},"end":{"line":19,"column":297}},"16":{"start":{"line":19,"column":305},"end":{"line":19,"column":569}},"17":{"start":{"line":19,"column":343},"end":{"line":19,"column":430}},"18":{"start":{"line":19,"column":438},"end":{"line":19,"column":569}},"19":{"start":{"line":19,"column":474},"end":{"line":19,"column":495}},"20":{"start":{"line":19,"column":505},"end":{"line":19,"column":567}},"21":{"start":{"line":21,"column":6},"end":{"line":21,"column":157}},"22":{"start":{"line":21,"column":93},"end":{"line":21,"column":155}},"23":{"start":{"line":23,"column":6},"end":{"line":23,"column":21}},"24":{"start":{"line":26,"column":4},"end":{"line":35,"column":5}},"25":{"start":{"line":27,"column":6},"end":{"line":34,"column":7}},"26":{"start":{"line":27,"column":35},"end":{"line":27,"column":56}},"27":{"start":{"line":28,"column":8},"end":{"line":33,"column":92}},"28":{"start":{"line":38,"column":2},"end":{"line":38,"column":73}},"29":{"start":{"line":38,"column":25},"end":{"line":38,"column":73}},"30":{"start":{"line":40,"column":2},"end":{"line":40,"column":16}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":28},"end":{"line":6,"column":29}},"loc":{"start":{"line":6,"column":62},"end":{"line":41,"column":1}},"line":6},"1":{"name":"(anonymous_1)","decl":{"start":{"line":10,"column":29},"end":{"line":10,"column":30}},"loc":{"start":{"line":10,"column":44},"end":{"line":12,"column":5}},"line":10}},"branchMap":{"0":{"loc":{"start":{"line":7,"column":2},"end":{"line":7,"column":96}},"type":"if","locations":[{"start":{"line":7,"column":2},"end":{"line":7,"column":96}},{"start":{"line":7,"column":2},"end":{"line":7,"column":96}}],"line":7},"1":{"loc":{"start":{"line":9,"column":2},"end":{"line":13,"column":3}},"type":"if","locations":[{"start":{"line":9,"column":2},"end":{"line":13,"column":3}},{"start":{"line":9,"column":2},"end":{"line":13,"column":3}}],"line":9},"2":{"loc":{"start":{"line":17,"column":2},"end":{"line":36,"column":3}},"type":"if","locations":[{"start":{"line":17,"column":2},"end":{"line":36,"column":3}},{"start":{"line":17,"column":2},"end":{"line":36,"column":3}}],"line":17},"3":{"loc":{"start":{"line":19,"column":6},"end":{"line":19,"column":569}},"type":"if","locations":[{"start":{"line":19,"column":6},"end":{"line":19,"column":569}},{"start":{"line":19,"column":6},"end":{"line":19,"column":569}}],"line":19},"4":{"loc":{"start":{"line":19,"column":10},"end":{"line":19,"column":97}},"type":"binary-expr","locations":[{"start":{"line":19,"column":10},"end":{"line":19,"column":40}},{"start":{"line":19,"column":44},"end":{"line":19,"column":64}},{"start":{"line":19,"column":68},"end":{"line":19,"column":97}}],"line":19},"5":{"loc":{"start":{"line":19,"column":175},"end":{"line":19,"column":569}},"type":"if","locations":[{"start":{"line":19,"column":175},"end":{"line":19,"column":569}},{"start":{"line":19,"column":175},"end":{"line":19,"column":569}}],"line":19},"6":{"loc":{"start":{"line":19,"column":179},"end":{"line":19,"column":239}},"type":"binary-expr","locations":[{"start":{"line":19,"column":179},"end":{"line":19,"column":209}},{"start":{"line":19,"column":213},"end":{"line":19,"column":239}}],"line":19},"7":{"loc":{"start":{"line":19,"column":305},"end":{"line":19,"column":569}},"type":"if","locations":[{"start":{"line":19,"column":305},"end":{"line":19,"column":569}},{"start":{"line":19,"column":305},"end":{"line":19,"column":569}}],"line":19},"8":{"loc":{"start":{"line":19,"column":388},"end":{"line":19,"column":428}},"type":"binary-expr","locations":[{"start":{"line":19,"column":388},"end":{"line":19,"column":404}},{"start":{"line":19,"column":408},"end":{"line":19,"column":428}}],"line":19},"9":{"loc":{"start":{"line":19,"column":438},"end":{"line":19,"column":569}},"type":"if","locations":[{"start":{"line":19,"column":438},"end":{"line":19,"column":569}},{"start":{"line":19,"column":438},"end":{"line":19,"column":569}}],"line":19},"10":{"loc":{"start":{"line":21,"column":6},"end":{"line":21,"column":157}},"type":"if","locations":[{"start":{"line":21,"column":6},"end":{"line":21,"column":157}},{"start":{"line":21,"column":6},"end":{"line":21,"column":157}}],"line":21},"11":{"loc":{"start":{"line":21,"column":10},"end":{"line":21,"column":89}},"type":"binary-expr","locations":[{"start":{"line":21,"column":10},"end":{"line":21,"column":40}},{"start":{"line":21,"column":45},"end":{"line":21,"column":63}},{"start":{"line":21,"column":67},"end":{"line":21,"column":88}}],"line":21},"12":{"loc":{"start":{"line":21,"column":114},"end":{"line":21,"column":147}},"type":"binary-expr","locations":[{"start":{"line":21,"column":114},"end":{"line":21,"column":127}},{"start":{"line":21,"column":131},"end":{"line":21,"column":147}}],"line":21},"13":{"loc":{"start":{"line":27,"column":6},"end":{"line":34,"column":7}},"type":"if","locations":[{"start":{"line":27,"column":6},"end":{"line":34,"column":7}},{"start":{"line":27,"column":6},"end":{"line":34,"column":7}}],"line":27},"14":{"loc":{"start":{"line":28,"column":18},"end":{"line":33,"column":91}},"type":"cond-expr","locations":[{"start":{"line":30,"column":12},"end":{"line":30,"column":88}},{"start":{"line":31,"column":12},"end":{"line":33,"column":91}}],"line":28},"15":{"loc":{"start":{"line":29,"column":10},"end":{"line":29,"column":71}},"type":"binary-expr","locations":[{"start":{"line":29,"column":10},"end":{"line":29,"column":42}},{"start":{"line":29,"column":47},"end":{"line":29,"column":70}}],"line":29},"16":{"loc":{"start":{"line":31,"column":12},"end":{"line":33,"column":91}},"type":"cond-expr","locations":[{"start":{"line":32,"column":14},"end":{"line":32,"column":83}},{"start":{"line":33,"column":14},"end":{"line":33,"column":91}}],"line":31},"17":{"loc":{"start":{"line":31,"column":12},"end":{"line":31,"column":72}},"type":"binary-expr","locations":[{"start":{"line":31,"column":12},"end":{"line":31,"column":44}},{"start":{"line":31,"column":49},"end":{"line":31,"column":71}}],"line":31},"18":{"loc":{"start":{"line":38,"column":2},"end":{"line":38,"column":73}},"type":"if","locations":[{"start":{"line":38,"column":2},"end":{"line":38,"column":73}},{"start":{"line":38,"column":2},"end":{"line":38,"column":73}}],"line":38}},"s":{"0":1,"1":1,"2":1,"3":1,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0},"f":{"0":0,"1":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0,0],"12":[0,0],"13":[0,0],"14":[0,0],"15":[0,0],"16":[0,0],"17":[0,0],"18":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"ed0c891a03d78382f5189191c6d69de2b8820cd0","contentHash":"6dcb1d986ed128801bbb6d22561f5477"},"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/helpers/query/table.js":{"path":"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/helpers/query/table.js","statementMap":{"0":{"start":{"line":2,"column":14},"end":{"line":2,"column":48}},"1":{"start":{"line":3,"column":19},"end":{"line":3,"column":53}},"2":{"start":{"line":4,"column":12},"end":{"line":4,"column":38}},"3":{"start":{"line":6,"column":0},"end":{"line":12,"column":3}},"4":{"start":{"line":7,"column":11},"end":{"line":7,"column":37}},"5":{"start":{"line":8,"column":2},"end":{"line":8,"column":88}},"6":{"start":{"line":8,"column":33},"end":{"line":8,"column":88}},"7":{"start":{"line":9,"column":2},"end":{"line":9,"column":88}},"8":{"start":{"line":9,"column":23},"end":{"line":9,"column":88}},"9":{"start":{"line":11,"column":2},"end":{"line":11,"column":83}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":26},"end":{"line":6,"column":27}},"loc":{"start":{"line":6,"column":58},"end":{"line":12,"column":1}},"line":6}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":2},"end":{"line":8,"column":88}},"type":"if","locations":[{"start":{"line":8,"column":2},"end":{"line":8,"column":88}},{"start":{"line":8,"column":2},"end":{"line":8,"column":88}}],"line":8},"1":{"loc":{"start":{"line":9,"column":2},"end":{"line":9,"column":88}},"type":"if","locations":[{"start":{"line":9,"column":2},"end":{"line":9,"column":88}},{"start":{"line":9,"column":2},"end":{"line":9,"column":88}}],"line":9},"2":{"loc":{"start":{"line":11,"column":10},"end":{"line":11,"column":46}},"type":"cond-expr","locations":[{"start":{"line":11,"column":36},"end":{"line":11,"column":41}},{"start":{"line":11,"column":44},"end":{"line":11,"column":46}}],"line":11}},"s":{"0":1,"1":1,"2":1,"3":1,"4":151,"5":151,"6":0,"7":151,"8":0,"9":151},"f":{"0":151},"b":{"0":[0,151],"1":[0,151],"2":[149,2]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"7e2de71f76efb8ea182132e762b56b31f256b7dc","contentHash":"6738f1faa524ef2ecb32e6ab9cec494f"},"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/helpers/query/where.js":{"path":"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/helpers/query/where.js","statementMap":{"0":{"start":{"line":2,"column":14},"end":{"line":2,"column":48}},"1":{"start":{"line":3,"column":23},"end":{"line":3,"column":61}},"2":{"start":{"line":5,"column":0},"end":{"line":9,"column":3}},"3":{"start":{"line":6,"column":15},"end":{"line":6,"column":68}},"4":{"start":{"line":7,"column":2},"end":{"line":7,"column":53}},"5":{"start":{"line":7,"column":25},"end":{"line":7,"column":53}},"6":{"start":{"line":8,"column":2},"end":{"line":8,"column":16}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":26},"end":{"line":5,"column":27}},"loc":{"start":{"line":5,"column":58},"end":{"line":9,"column":1}},"line":5}},"branchMap":{"0":{"loc":{"start":{"line":7,"column":2},"end":{"line":7,"column":53}},"type":"if","locations":[{"start":{"line":7,"column":2},"end":{"line":7,"column":53}},{"start":{"line":7,"column":2},"end":{"line":7,"column":53}}],"line":7}},"s":{"0":1,"1":1,"2":1,"3":151,"4":151,"5":103,"6":151},"f":{"0":151},"b":{"0":[103,48]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"89634f1a6a895c881d8c559628f1caea59010bf2","contentHash":"9e388a9b145812dc79337d9fabad5139"},"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/lib/condition-builder.js":{"path":"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/lib/condition-builder.js","statementMap":{"0":{"start":{"line":2,"column":10},"end":{"line":2,"column":28}},"1":{"start":{"line":3,"column":12},"end":{"line":3,"column":44}},"2":{"start":{"line":6,"column":0},"end":{"line":128,"column":2}},"3":{"start":{"line":7,"column":24},"end":{"line":121,"column":3}},"4":{"start":{"line":8,"column":4},"end":{"line":8,"column":30}},"5":{"start":{"line":9,"column":4},"end":{"line":9,"column":26}},"6":{"start":{"line":15,"column":21},"end":{"line":15,"column":23}},"7":{"start":{"line":17,"column":4},"end":{"line":117,"column":5}},"8":{"start":{"line":19,"column":6},"end":{"line":24,"column":7}},"9":{"start":{"line":20,"column":18},"end":{"line":20,"column":20}},"10":{"start":{"line":21,"column":8},"end":{"line":21,"column":43}},"11":{"start":{"line":22,"column":8},"end":{"line":22,"column":73}},"12":{"start":{"line":23,"column":8},"end":{"line":23,"column":17}},"13":{"start":{"line":26,"column":6},"end":{"line":48,"column":7}},"14":{"start":{"line":28,"column":8},"end":{"line":45,"column":9}},"15":{"start":{"line":32,"column":10},"end":{"line":32,"column":262}},"16":{"start":{"line":32,"column":50},"end":{"line":32,"column":145}},"17":{"start":{"line":32,"column":155},"end":{"line":32,"column":260}},"18":{"start":{"line":36,"column":13},"end":{"line":45,"column":9}},"19":{"start":{"line":36,"column":33},"end":{"line":36,"column":134}},"20":{"start":{"line":36,"column":142},"end":{"line":45,"column":9}},"21":{"start":{"line":36,"column":163},"end":{"line":36,"column":264}},"22":{"start":{"line":39,"column":13},"end":{"line":45,"column":9}},"23":{"start":{"line":39,"column":30},"end":{"line":39,"column":131}},"24":{"start":{"line":44,"column":10},"end":{"line":44,"column":118}},"25":{"start":{"line":47,"column":8},"end":{"line":47,"column":17}},"26":{"start":{"line":52,"column":6},"end":{"line":116,"column":7}},"27":{"start":{"line":53,"column":23},"end":{"line":53,"column":27}},"28":{"start":{"line":55,"column":8},"end":{"line":59,"column":9}},"29":{"start":{"line":56,"column":10},"end":{"line":56,"column":59}},"30":{"start":{"line":57,"column":15},"end":{"line":59,"column":9}},"31":{"start":{"line":58,"column":10},"end":{"line":58,"column":59}},"32":{"start":{"line":61,"column":8},"end":{"line":67,"column":9}},"33":{"start":{"line":62,"column":10},"end":{"line":64,"column":11}},"34":{"start":{"line":63,"column":12},"end":{"line":63,"column":24}},"35":{"start":{"line":66,"column":10},"end":{"line":66,"column":69}},"36":{"start":{"line":69,"column":8},"end":{"line":77,"column":10}},"37":{"start":{"line":80,"column":11},"end":{"line":116,"column":7}},"38":{"start":{"line":81,"column":8},"end":{"line":89,"column":10}},"39":{"start":{"line":93,"column":11},"end":{"line":116,"column":7}},"40":{"start":{"line":94,"column":8},"end":{"line":102,"column":10}},"41":{"start":{"line":107,"column":8},"end":{"line":115,"column":10}},"42":{"start":{"line":119,"column":4},"end":{"line":119,"column":74}},"43":{"start":{"line":119,"column":31},"end":{"line":119,"column":74}},"44":{"start":{"line":120,"column":4},"end":{"line":120,"column":53}},"45":{"start":{"line":120,"column":32},"end":{"line":120,"column":53}},"46":{"start":{"line":124,"column":15},"end":{"line":124,"column":48}},"47":{"start":{"line":125,"column":2},"end":{"line":125,"column":25}},"48":{"start":{"line":125,"column":15},"end":{"line":125,"column":25}},"49":{"start":{"line":126,"column":2},"end":{"line":126,"column":70}},"50":{"start":{"line":126,"column":24},"end":{"line":126,"column":70}},"51":{"start":{"line":127,"column":2},"end":{"line":127,"column":16}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":17},"end":{"line":6,"column":18}},"loc":{"start":{"line":6,"column":49},"end":{"line":128,"column":1}},"line":6},"1":{"name":"(anonymous_1)","decl":{"start":{"line":7,"column":24},"end":{"line":7,"column":25}},"loc":{"start":{"line":7,"column":76},"end":{"line":121,"column":3}},"line":7}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":13},"end":{"line":8,"column":29}},"type":"binary-expr","locations":[{"start":{"line":8,"column":13},"end":{"line":8,"column":19}},{"start":{"line":8,"column":23},"end":{"line":8,"column":29}}],"line":8},"1":{"loc":{"start":{"line":9,"column":13},"end":{"line":9,"column":25}},"type":"binary-expr","locations":[{"start":{"line":9,"column":13},"end":{"line":9,"column":19}},{"start":{"line":9,"column":23},"end":{"line":9,"column":25}}],"line":9},"2":{"loc":{"start":{"line":19,"column":6},"end":{"line":24,"column":7}},"type":"if","locations":[{"start":{"line":19,"column":6},"end":{"line":24,"column":7}},{"start":{"line":19,"column":6},"end":{"line":24,"column":7}}],"line":19},"3":{"loc":{"start":{"line":26,"column":6},"end":{"line":48,"column":7}},"type":"if","locations":[{"start":{"line":26,"column":6},"end":{"line":48,"column":7}},{"start":{"line":26,"column":6},"end":{"line":48,"column":7}}],"line":26},"4":{"loc":{"start":{"line":26,"column":10},"end":{"line":26,"column":105}},"type":"binary-expr","locations":[{"start":{"line":26,"column":10},"end":{"line":26,"column":40}},{"start":{"line":26,"column":44},"end":{"line":26,"column":73}},{"start":{"line":26,"column":77},"end":{"line":26,"column":105}}],"line":26},"5":{"loc":{"start":{"line":28,"column":8},"end":{"line":45,"column":9}},"type":"if","locations":[{"start":{"line":28,"column":8},"end":{"line":45,"column":9}},{"start":{"line":28,"column":8},"end":{"line":45,"column":9}}],"line":28},"6":{"loc":{"start":{"line":32,"column":10},"end":{"line":32,"column":262}},"type":"if","locations":[{"start":{"line":32,"column":10},"end":{"line":32,"column":262}},{"start":{"line":32,"column":10},"end":{"line":32,"column":262}}],"line":32},"7":{"loc":{"start":{"line":32,"column":50},"end":{"line":32,"column":144}},"type":"binary-expr","locations":[{"start":{"line":32,"column":51},"end":{"line":32,"column":116}},{"start":{"line":32,"column":121},"end":{"line":32,"column":144}}],"line":32},"8":{"loc":{"start":{"line":32,"column":155},"end":{"line":32,"column":259}},"type":"binary-expr","locations":[{"start":{"line":32,"column":156},"end":{"line":32,"column":231}},{"start":{"line":32,"column":236},"end":{"line":32,"column":259}}],"line":32},"9":{"loc":{"start":{"line":36,"column":13},"end":{"line":45,"column":9}},"type":"if","locations":[{"start":{"line":36,"column":13},"end":{"line":45,"column":9}},{"start":{"line":36,"column":13},"end":{"line":45,"column":9}}],"line":36},"10":{"loc":{"start":{"line":36,"column":33},"end":{"line":36,"column":133}},"type":"binary-expr","locations":[{"start":{"line":36,"column":34},"end":{"line":36,"column":105}},{"start":{"line":36,"column":110},"end":{"line":36,"column":133}}],"line":36},"11":{"loc":{"start":{"line":36,"column":142},"end":{"line":45,"column":9}},"type":"if","locations":[{"start":{"line":36,"column":142},"end":{"line":45,"column":9}},{"start":{"line":36,"column":142},"end":{"line":45,"column":9}}],"line":36},"12":{"loc":{"start":{"line":36,"column":163},"end":{"line":36,"column":263}},"type":"binary-expr","locations":[{"start":{"line":36,"column":164},"end":{"line":36,"column":235}},{"start":{"line":36,"column":240},"end":{"line":36,"column":263}}],"line":36},"13":{"loc":{"start":{"line":39,"column":13},"end":{"line":45,"column":9}},"type":"if","locations":[{"start":{"line":39,"column":13},"end":{"line":45,"column":9}},{"start":{"line":39,"column":13},"end":{"line":45,"column":9}}],"line":39},"14":{"loc":{"start":{"line":39,"column":30},"end":{"line":39,"column":130}},"type":"binary-expr","locations":[{"start":{"line":39,"column":31},"end":{"line":39,"column":102}},{"start":{"line":39,"column":107},"end":{"line":39,"column":130}}],"line":39},"15":{"loc":{"start":{"line":44,"column":10},"end":{"line":44,"column":117}},"type":"binary-expr","locations":[{"start":{"line":44,"column":11},"end":{"line":44,"column":89}},{"start":{"line":44,"column":94},"end":{"line":44,"column":117}}],"line":44},"16":{"loc":{"start":{"line":52,"column":6},"end":{"line":116,"column":7}},"type":"if","locations":[{"start":{"line":52,"column":6},"end":{"line":116,"column":7}},{"start":{"line":52,"column":6},"end":{"line":116,"column":7}}],"line":52},"17":{"loc":{"start":{"line":55,"column":8},"end":{"line":59,"column":9}},"type":"if","locations":[{"start":{"line":55,"column":8},"end":{"line":59,"column":9}},{"start":{"line":55,"column":8},"end":{"line":59,"column":9}}],"line":55},"18":{"loc":{"start":{"line":57,"column":15},"end":{"line":59,"column":9}},"type":"if","locations":[{"start":{"line":57,"column":15},"end":{"line":59,"column":9}},{"start":{"line":57,"column":15},"end":{"line":59,"column":9}}],"line":57},"19":{"loc":{"start":{"line":61,"column":8},"end":{"line":67,"column":9}},"type":"if","locations":[{"start":{"line":61,"column":8},"end":{"line":67,"column":9}},{"start":{"line":61,"column":8},"end":{"line":67,"column":9}}],"line":61},"20":{"loc":{"start":{"line":62,"column":10},"end":{"line":64,"column":11}},"type":"if","locations":[{"start":{"line":62,"column":10},"end":{"line":64,"column":11}},{"start":{"line":62,"column":10},"end":{"line":64,"column":11}}],"line":62},"21":{"loc":{"start":{"line":80,"column":11},"end":{"line":116,"column":7}},"type":"if","locations":[{"start":{"line":80,"column":11},"end":{"line":116,"column":7}},{"start":{"line":80,"column":11},"end":{"line":116,"column":7}}],"line":80},"22":{"loc":{"start":{"line":83,"column":27},"end":{"line":83,"column":102}},"type":"cond-expr","locations":[{"start":{"line":83,"column":43},"end":{"line":83,"column":71}},{"start":{"line":83,"column":74},"end":{"line":83,"column":102}}],"line":83},"23":{"loc":{"start":{"line":93,"column":11},"end":{"line":116,"column":7}},"type":"if","locations":[{"start":{"line":93,"column":11},"end":{"line":116,"column":7}},{"start":{"line":93,"column":11},"end":{"line":116,"column":7}}],"line":93},"24":{"loc":{"start":{"line":96,"column":27},"end":{"line":96,"column":102}},"type":"cond-expr","locations":[{"start":{"line":96,"column":43},"end":{"line":96,"column":71}},{"start":{"line":96,"column":74},"end":{"line":96,"column":102}}],"line":96},"25":{"loc":{"start":{"line":109,"column":21},"end":{"line":109,"column":76}},"type":"cond-expr","locations":[{"start":{"line":109,"column":37},"end":{"line":109,"column":71}},{"start":{"line":109,"column":74},"end":{"line":109,"column":76}}],"line":109},"26":{"loc":{"start":{"line":119,"column":4},"end":{"line":119,"column":74}},"type":"if","locations":[{"start":{"line":119,"column":4},"end":{"line":119,"column":74}},{"start":{"line":119,"column":4},"end":{"line":119,"column":74}}],"line":119},"27":{"loc":{"start":{"line":120,"column":4},"end":{"line":120,"column":53}},"type":"if","locations":[{"start":{"line":120,"column":4},"end":{"line":120,"column":53}},{"start":{"line":120,"column":4},"end":{"line":120,"column":53}}],"line":120},"28":{"loc":{"start":{"line":125,"column":2},"end":{"line":125,"column":25}},"type":"if","locations":[{"start":{"line":125,"column":2},"end":{"line":125,"column":25}},{"start":{"line":125,"column":2},"end":{"line":125,"column":25}}],"line":125},"29":{"loc":{"start":{"line":126,"column":2},"end":{"line":126,"column":70}},"type":"if","locations":[{"start":{"line":126,"column":2},"end":{"line":126,"column":70}},{"start":{"line":126,"column":2},"end":{"line":126,"column":70}}],"line":126}},"s":{"0":1,"1":1,"2":1,"3":151,"4":262,"5":262,"6":262,"7":262,"8":249,"9":2,"10":2,"11":2,"12":2,"13":247,"14":119,"15":19,"16":9,"17":10,"18":100,"19":12,"20":88,"21":2,"22":86,"23":29,"24":57,"25":119,"26":128,"27":7,"28":7,"29":0,"30":7,"31":0,"32":7,"33":7,"34":7,"35":7,"36":7,"37":121,"38":50,"39":71,"40":2,"41":69,"42":262,"43":34,"44":228,"45":180,"46":151,"47":151,"48":48,"49":103,"50":36,"51":67},"f":{"0":151,"1":262},"b":{"0":[262,208],"1":[262,153],"2":[2,247],"3":[119,128],"4":[247,119,119],"5":[19,100],"6":[9,10],"7":[9,9],"8":[10,10],"9":[12,88],"10":[12,12],"11":[2,86],"12":[2,2],"13":[29,57],"14":[29,29],"15":[57,57],"16":[7,121],"17":[0,7],"18":[0,7],"19":[7,0],"20":[7,0],"21":[50,71],"22":[48,2],"23":[2,69],"24":[2,0],"25":[5,64],"26":[34,228],"27":[180,48],"28":[48,103],"29":[36,67]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"819c3d6bb221ed8b86ac5ba19ba347080b529ba4","contentHash":"5056bf902d3be0cb6438f70fa23aedad"},"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/lib/conditional-helpers.js":{"path":"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/lib/conditional-helpers.js","statementMap":{"0":{"start":{"line":2,"column":20},"end":{"line":2,"column":47}},"1":{"start":{"line":4,"column":0},"end":{"line":4,"column":54}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1},"f":{},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"a3bc162604a155e05998ef9fdb61d56745fd8c43","contentHash":"36262d8d95b7d02b565d0843fefb532a"},"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/helpers/query/return.js":{"path":"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/helpers/query/return.js","statementMap":{"0":{"start":{"line":2,"column":14},"end":{"line":2,"column":48}},"1":{"start":{"line":4,"column":0},"end":{"line":20,"column":3}},"2":{"start":{"line":5,"column":14},"end":{"line":5,"column":25}},"3":{"start":{"line":6,"column":2},"end":{"line":6,"column":18}},"4":{"start":{"line":8,"column":2},"end":{"line":17,"column":3}},"5":{"start":{"line":9,"column":4},"end":{"line":9,"column":43}},"6":{"start":{"line":11,"column":4},"end":{"line":13,"column":5}},"7":{"start":{"line":12,"column":6},"end":{"line":12,"column":66}},"8":{"start":{"line":14,"column":4},"end":{"line":14,"column":15}},"9":{"start":{"line":16,"column":4},"end":{"line":16,"column":32}},"10":{"start":{"line":19,"column":2},"end":{"line":19,"column":13}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":27},"end":{"line":4,"column":28}},"loc":{"start":{"line":4,"column":59},"end":{"line":20,"column":1}},"line":4}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":2},"end":{"line":17,"column":3}},"type":"if","locations":[{"start":{"line":8,"column":2},"end":{"line":17,"column":3}},{"start":{"line":8,"column":2},"end":{"line":17,"column":3}}],"line":8},"1":{"loc":{"start":{"line":8,"column":6},"end":{"line":8,"column":27}},"type":"binary-expr","locations":[{"start":{"line":8,"column":6},"end":{"line":8,"column":11}},{"start":{"line":8,"column":15},"end":{"line":8,"column":27}}],"line":8}},"s":{"0":1,"1":1,"2":149,"3":149,"4":149,"5":0,"6":0,"7":0,"8":0,"9":149,"10":149},"f":{"0":149},"b":{"0":[0,149],"1":[149,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"c64efa9084c26a5a2a448b7d047c40b37a501ea5","contentHash":"4f4eea1a4c64d01950b775a80b034373"},"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/helpers/query/text.js":{"path":"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/helpers/query/text.js","statementMap":{"0":{"start":{"line":2,"column":14},"end":{"line":2,"column":48}},"1":{"start":{"line":3,"column":12},"end":{"line":3,"column":38}},"2":{"start":{"line":5,"column":0},"end":{"line":7,"column":3}},"3":{"start":{"line":6,"column":2},"end":{"line":6,"column":59}},"4":{"start":{"line":9,"column":0},"end":{"line":11,"column":3}},"5":{"start":{"line":10,"column":2},"end":{"line":10,"column":42}},"6":{"start":{"line":13,"column":0},"end":{"line":15,"column":3}},"7":{"start":{"line":14,"column":2},"end":{"line":14,"column":52}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":5,"column":31},"end":{"line":5,"column":32}},"loc":{"start":{"line":5,"column":54},"end":{"line":7,"column":1}},"line":5},"1":{"name":"(anonymous_1)","decl":{"start":{"line":9,"column":31},"end":{"line":9,"column":32}},"loc":{"start":{"line":9,"column":54},"end":{"line":11,"column":1}},"line":9},"2":{"name":"(anonymous_2)","decl":{"start":{"line":13,"column":32},"end":{"line":13,"column":33}},"loc":{"start":{"line":13,"column":55},"end":{"line":15,"column":1}},"line":13}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":2,"4":1,"5":2,"6":1,"7":2},"f":{"0":2,"1":2,"2":2},"b":{},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"d0b2a415de68f8ec28d0d71872674b227a9c2218","contentHash":"524855543d677c61b8a0a9794ed96ce8"},"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/helpers/conditional.js":{"path":"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/helpers/conditional.js","statementMap":{"0":{"start":{"line":7,"column":19},"end":{"line":7,"column":56}},"1":{"start":{"line":9,"column":12},"end":{"line":9,"column":35}},"2":{"start":{"line":16,"column":0},"end":{"line":18,"column":3}},"3":{"start":{"line":17,"column":2},"end":{"line":17,"column":33}},"4":{"start":{"line":20,"column":0},"end":{"line":22,"column":3}},"5":{"start":{"line":21,"column":2},"end":{"line":21,"column":33}},"6":{"start":{"line":29,"column":0},"end":{"line":31,"column":3}},"7":{"start":{"line":30,"column":2},"end":{"line":30,"column":33}},"8":{"start":{"line":38,"column":0},"end":{"line":40,"column":3}},"9":{"start":{"line":39,"column":2},"end":{"line":39,"column":32}},"10":{"start":{"line":47,"column":0},"end":{"line":49,"column":3}},"11":{"start":{"line":48,"column":2},"end":{"line":48,"column":33}},"12":{"start":{"line":56,"column":0},"end":{"line":58,"column":3}},"13":{"start":{"line":57,"column":2},"end":{"line":57,"column":32}},"14":{"start":{"line":65,"column":0},"end":{"line":67,"column":3}},"15":{"start":{"line":66,"column":2},"end":{"line":66,"column":33}},"16":{"start":{"line":73,"column":0},"end":{"line":75,"column":3}},"17":{"start":{"line":74,"column":2},"end":{"line":74,"column":70}},"18":{"start":{"line":81,"column":0},"end":{"line":83,"column":3}},"19":{"start":{"line":82,"column":2},"end":{"line":82,"column":70}},"20":{"start":{"line":90,"column":0},"end":{"line":92,"column":3}},"21":{"start":{"line":91,"column":2},"end":{"line":91,"column":35}},"22":{"start":{"line":99,"column":0},"end":{"line":101,"column":3}},"23":{"start":{"line":100,"column":2},"end":{"line":100,"column":36}},"24":{"start":{"line":115,"column":0},"end":{"line":123,"column":3}},"25":{"start":{"line":116,"column":2},"end":{"line":122,"column":3}},"26":{"start":{"line":117,"column":12},"end":{"line":117,"column":59}},"27":{"start":{"line":118,"column":12},"end":{"line":118,"column":42}},"28":{"start":{"line":119,"column":4},"end":{"line":119,"column":38}},"29":{"start":{"line":121,"column":4},"end":{"line":121,"column":14}},"30":{"start":{"line":125,"column":0},"end":{"line":127,"column":3}},"31":{"start":{"line":126,"column":2},"end":{"line":126,"column":43}},"32":{"start":{"line":134,"column":0},"end":{"line":142,"column":3}},"33":{"start":{"line":135,"column":2},"end":{"line":141,"column":3}},"34":{"start":{"line":136,"column":12},"end":{"line":136,"column":59}},"35":{"start":{"line":137,"column":12},"end":{"line":137,"column":42}},"36":{"start":{"line":138,"column":4},"end":{"line":138,"column":42}},"37":{"start":{"line":140,"column":4},"end":{"line":140,"column":14}},"38":{"start":{"line":158,"column":0},"end":{"line":166,"column":3}},"39":{"start":{"line":159,"column":2},"end":{"line":165,"column":3}},"40":{"start":{"line":160,"column":12},"end":{"line":160,"column":59}},"41":{"start":{"line":161,"column":12},"end":{"line":161,"column":42}},"42":{"start":{"line":162,"column":4},"end":{"line":162,"column":42}},"43":{"start":{"line":164,"column":4},"end":{"line":164,"column":14}},"44":{"start":{"line":168,"column":0},"end":{"line":176,"column":3}},"45":{"start":{"line":169,"column":2},"end":{"line":175,"column":3}},"46":{"start":{"line":170,"column":12},"end":{"line":170,"column":59}},"47":{"start":{"line":171,"column":12},"end":{"line":171,"column":42}},"48":{"start":{"line":172,"column":4},"end":{"line":172,"column":42}},"49":{"start":{"line":174,"column":4},"end":{"line":174,"column":14}},"50":{"start":{"line":181,"column":0},"end":{"line":189,"column":3}},"51":{"start":{"line":182,"column":2},"end":{"line":188,"column":3}},"52":{"start":{"line":183,"column":12},"end":{"line":183,"column":59}},"53":{"start":{"line":184,"column":12},"end":{"line":184,"column":42}},"54":{"start":{"line":185,"column":4},"end":{"line":185,"column":43}},"55":{"start":{"line":187,"column":4},"end":{"line":187,"column":14}},"56":{"start":{"line":191,"column":0},"end":{"line":193,"column":3}},"57":{"start":{"line":192,"column":2},"end":{"line":192,"column":36}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":16,"column":28},"end":{"line":16,"column":29}},"loc":{"start":{"line":16,"column":83},"end":{"line":18,"column":1}},"line":16},"1":{"name":"(anonymous_1)","decl":{"start":{"line":20,"column":24},"end":{"line":20,"column":25}},"loc":{"start":{"line":20,"column":79},"end":{"line":22,"column":1}},"line":20},"2":{"name":"(anonymous_2)","decl":{"start":{"line":29,"column":24},"end":{"line":29,"column":25}},"loc":{"start":{"line":29,"column":79},"end":{"line":31,"column":1}},"line":29},"3":{"name":"(anonymous_3)","decl":{"start":{"line":38,"column":24},"end":{"line":38,"column":25}},"loc":{"start":{"line":38,"column":79},"end":{"line":40,"column":1}},"line":38},"4":{"name":"(anonymous_4)","decl":{"start":{"line":47,"column":25},"end":{"line":47,"column":26}},"loc":{"start":{"line":47,"column":80},"end":{"line":49,"column":1}},"line":47},"5":{"name":"(anonymous_5)","decl":{"start":{"line":56,"column":24},"end":{"line":56,"column":25}},"loc":{"start":{"line":56,"column":79},"end":{"line":58,"column":1}},"line":56},"6":{"name":"(anonymous_6)","decl":{"start":{"line":65,"column":25},"end":{"line":65,"column":26}},"loc":{"start":{"line":65,"column":80},"end":{"line":67,"column":1}},"line":65},"7":{"name":"(anonymous_7)","decl":{"start":{"line":73,"column":26},"end":{"line":73,"column":27}},"loc":{"start":{"line":73,"column":81},"end":{"line":75,"column":1}},"line":73},"8":{"name":"(anonymous_8)","decl":{"start":{"line":81,"column":29},"end":{"line":81,"column":30}},"loc":{"start":{"line":81,"column":84},"end":{"line":83,"column":1}},"line":81},"9":{"name":"(anonymous_9)","decl":{"start":{"line":90,"column":26},"end":{"line":90,"column":27}},"loc":{"start":{"line":90,"column":81},"end":{"line":92,"column":1}},"line":90},"10":{"name":"(anonymous_10)","decl":{"start":{"line":99,"column":27},"end":{"line":99,"column":28}},"loc":{"start":{"line":99,"column":82},"end":{"line":101,"column":1}},"line":99},"11":{"name":"(anonymous_11)","decl":{"start":{"line":115,"column":44},"end":{"line":115,"column":45}},"loc":{"start":{"line":115,"column":97},"end":{"line":123,"column":1}},"line":115},"12":{"name":"(anonymous_12)","decl":{"start":{"line":125,"column":51},"end":{"line":125,"column":52}},"loc":{"start":{"line":125,"column":104},"end":{"line":127,"column":1}},"line":125},"13":{"name":"(anonymous_13)","decl":{"start":{"line":134,"column":49},"end":{"line":134,"column":50}},"loc":{"start":{"line":134,"column":102},"end":{"line":142,"column":1}},"line":134},"14":{"name":"(anonymous_14)","decl":{"start":{"line":158,"column":47},"end":{"line":158,"column":48}},"loc":{"start":{"line":158,"column":100},"end":{"line":166,"column":1}},"line":158},"15":{"name":"(anonymous_15)","decl":{"start":{"line":168,"column":45},"end":{"line":168,"column":46}},"loc":{"start":{"line":168,"column":98},"end":{"line":176,"column":1}},"line":168},"16":{"name":"(anonymous_16)","decl":{"start":{"line":181,"column":52},"end":{"line":181,"column":53}},"loc":{"start":{"line":181,"column":105},"end":{"line":189,"column":1}},"line":181},"17":{"name":"(anonymous_17)","decl":{"start":{"line":191,"column":28},"end":{"line":191,"column":29}},"loc":{"start":{"line":191,"column":83},"end":{"line":193,"column":1}},"line":191}},"branchMap":{"0":{"loc":{"start":{"line":74,"column":25},"end":{"line":74,"column":58}},"type":"cond-expr","locations":[{"start":{"line":74,"column":46},"end":{"line":74,"column":51}},{"start":{"line":74,"column":54},"end":{"line":74,"column":58}}],"line":74},"1":{"loc":{"start":{"line":82,"column":25},"end":{"line":82,"column":58}},"type":"cond-expr","locations":[{"start":{"line":82,"column":46},"end":{"line":82,"column":50}},{"start":{"line":82,"column":53},"end":{"line":82,"column":58}}],"line":82},"2":{"loc":{"start":{"line":116,"column":2},"end":{"line":122,"column":3}},"type":"if","locations":[{"start":{"line":116,"column":2},"end":{"line":122,"column":3}},{"start":{"line":116,"column":2},"end":{"line":122,"column":3}}],"line":116},"3":{"loc":{"start":{"line":135,"column":2},"end":{"line":141,"column":3}},"type":"if","locations":[{"start":{"line":135,"column":2},"end":{"line":141,"column":3}},{"start":{"line":135,"column":2},"end":{"line":141,"column":3}}],"line":135},"4":{"loc":{"start":{"line":159,"column":2},"end":{"line":165,"column":3}},"type":"if","locations":[{"start":{"line":159,"column":2},"end":{"line":165,"column":3}},{"start":{"line":159,"column":2},"end":{"line":165,"column":3}}],"line":159},"5":{"loc":{"start":{"line":169,"column":2},"end":{"line":175,"column":3}},"type":"if","locations":[{"start":{"line":169,"column":2},"end":{"line":175,"column":3}},{"start":{"line":169,"column":2},"end":{"line":175,"column":3}}],"line":169},"6":{"loc":{"start":{"line":182,"column":2},"end":{"line":188,"column":3}},"type":"if","locations":[{"start":{"line":182,"column":2},"end":{"line":188,"column":3}},{"start":{"line":182,"column":2},"end":{"line":188,"column":3}}],"line":182}},"s":{"0":1,"1":1,"2":1,"3":63,"4":1,"5":0,"6":1,"7":6,"8":1,"9":13,"10":1,"11":11,"12":1,"13":22,"14":1,"15":4,"16":1,"17":2,"18":1,"19":0,"20":1,"21":0,"22":1,"23":0,"24":1,"25":6,"26":6,"27":6,"28":6,"29":0,"30":1,"31":0,"32":1,"33":0,"34":0,"35":0,"36":0,"37":0,"38":1,"39":0,"40":0,"41":0,"42":0,"43":0,"44":1,"45":4,"46":4,"47":4,"48":4,"49":0,"50":1,"51":0,"52":0,"53":0,"54":0,"55":0,"56":1,"57":7},"f":{"0":63,"1":0,"2":6,"3":13,"4":11,"5":22,"6":4,"7":2,"8":0,"9":0,"10":0,"11":6,"12":0,"13":0,"14":0,"15":4,"16":0,"17":7},"b":{"0":[2,0],"1":[0,0],"2":[6,0],"3":[0,0],"4":[0,0],"5":[4,0],"6":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"f7fc47ca7426198caa4a6077627c9b7f58b2c6da","contentHash":"7e24a8c292fad9f6709ae405978333a0"},"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/lib/query-builder-graph.js":{"path":"/Users/brianmcbride/Development/me/feathers-arangodb/lib/mongo-aql/lib/query-builder-graph.js","statementMap":{"0":{"start":{"line":1,"column":12},"end":{"line":1,"column":30}},"1":{"start":{"line":2,"column":19},"end":{"line":2,"column":45}},"2":{"start":{"line":8,"column":16},"end":{"line":12,"column":1}},"3":{"start":{"line":15,"column":11},"end":{"line":15,"column":37}},"4":{"start":{"line":17,"column":2},"end":{"line":17,"column":80}},"5":{"start":{"line":17,"column":25},"end":{"line":17,"column":80}},"6":{"start":{"line":21,"column":11},"end":{"line":21,"column":70}},"7":{"start":{"line":23,"column":2},"end":{"line":23,"column":103}},"8":{"start":{"line":23,"column":44},"end":{"line":23,"column":103}},"9":{"start":{"line":27,"column":12},"end":{"line":30,"column":3}},"10":{"start":{"line":32,"column":2},"end":{"line":32,"column":130}},"11":{"start":{"line":35,"column":0},"end":{"line":57,"column":2}},"12":{"start":{"line":36,"column":2},"end":{"line":36,"column":28}},"13":{"start":{"line":39,"column":15},"end":{"line":39,"column":51}},"14":{"start":{"line":40,"column":12},"end":{"line":40,"column":168}},"15":{"start":{"line":43,"column":2},"end":{"line":47,"column":3}},"16":{"start":{"line":44,"column":4},"end":{"line":46,"column":5}},"17":{"start":{"line":45,"column":6},"end":{"line":45,"column":118}},"18":{"start":{"line":49,"column":2},"end":{"line":49,"column":32}},"19":{"start":{"line":51,"column":15},"end":{"line":54,"column":3}},"20":{"start":{"line":56,"column":2},"end":{"line":56,"column":16}},"21":{"start":{"line":59,"column":0},"end":{"line":111,"column":2}},"22":{"start":{"line":60,"column":2},"end":{"line":60,"column":28}},"23":{"start":{"line":61,"column":2},"end":{"line":61,"column":36}},"24":{"start":{"line":63,"column":2},"end":{"line":103,"column":3}},"25":{"start":{"line":64,"column":16},"end":{"line":64,"column":150}},"26":{"start":{"line":65,"column":15},"end":{"line":65,"column":69}},"27":{"start":{"line":69,"column":4},"end":{"line":71,"column":5}},"28":{"start":{"line":70,"column":6},"end":{"line":70,"column":118}},"29":{"start":{"line":73,"column":4},"end":{"line":81,"column":5}},"30":{"start":{"line":74,"column":6},"end":{"line":74,"column":24}},"31":{"start":{"line":76,"column":6},"end":{"line":78,"column":7}},"32":{"start":{"line":77,"column":8},"end":{"line":77,"column":37}},"33":{"start":{"line":80,"column":6},"end":{"line":80,"column":36}},"34":{"start":{"line":83,"column":4},"end":{"line":83,"column":34}},"35":{"start":{"line":85,"column":16},"end":{"line":85,"column":150}},"36":{"start":{"line":86,"column":15},"end":{"line":86,"column":69}},"37":{"start":{"line":88,"column":4},"end":{"line":90,"column":5}},"38":{"start":{"line":89,"column":6},"end":{"line":89,"column":95}},"39":{"start":{"line":92,"column":4},"end":{"line":100,"column":5}},"40":{"start":{"line":93,"column":6},"end":{"line":93,"column":25}},"41":{"start":{"line":95,"column":6},"end":{"line":97,"column":7}},"42":{"start":{"line":96,"column":8},"end":{"line":96,"column":37}},"43":{"start":{"line":99,"column":6},"end":{"line":99,"column":36}},"44":{"start":{"line":102,"column":4},"end":{"line":102,"column":34}},"45":{"start":{"line":105,"column":15},"end":{"line":108,"column":3}},"46":{"start":{"line":110,"column":2},"end":{"line":110,"column":16}}},"fnMap":{"0":{"name":"checkGraphName","decl":{"start":{"line":14,"column":9},"end":{"line":14,"column":23}},"loc":{"start":{"line":14,"column":28},"end":{"line":18,"column":1}},"line":14},"1":{"name":"checkVertexExample","decl":{"start":{"line":20,"column":9},"end":{"line":20,"column":27}},"loc":{"start":{"line":20,"column":32},"end":{"line":24,"column":1}},"line":20},"2":{"name":"returnQuery","decl":{"start":{"line":26,"column":9},"end":{"line":26,"column":20}},"loc":{"start":{"line":26,"column":31},"end":{"line":33,"column":1}},"line":26},"3":{"name":"(anonymous_3)","decl":{"start":{"line":35,"column":22},"end":{"line":35,"column":23}},"loc":{"start":{"line":35,"column":75},"end":{"line":57,"column":1}},"line":35},"4":{"name":"(anonymous_4)","decl":{"start":{"line":59,"column":27},"end":{"line":59,"column":28}},"loc":{"start":{"line":59,"column":85},"end":{"line":111,"column":1}},"line":59}},"branchMap":{"0":{"loc":{"start":{"line":17,"column":2},"end":{"line":17,"column":80}},"type":"if","locations":[{"start":{"line":17,"column":2},"end":{"line":17,"column":80}},{"start":{"line":17,"column":2},"end":{"line":17,"column":80}}],"line":17},"1":{"loc":{"start":{"line":17,"column":6},"end":{"line":17,"column":23}},"type":"binary-expr","locations":[{"start":{"line":17,"column":6},"end":{"line":17,"column":8}},{"start":{"line":17,"column":12},"end":{"line":17,"column":23}}],"line":17},"2":{"loc":{"start":{"line":23,"column":2},"end":{"line":23,"column":103}},"type":"if","locations":[{"start":{"line":23,"column":2},"end":{"line":23,"column":103}},{"start":{"line":23,"column":2},"end":{"line":23,"column":103}}],"line":23},"3":{"loc":{"start":{"line":23,"column":6},"end":{"line":23,"column":42}},"type":"binary-expr","locations":[{"start":{"line":23,"column":6},"end":{"line":23,"column":27}},{"start":{"line":23,"column":31},"end":{"line":23,"column":42}}],"line":23},"4":{"loc":{"start":{"line":32,"column":28},"end":{"line":32,"column":60}},"type":"binary-expr","locations":[{"start":{"line":32,"column":28},"end":{"line":32,"column":53}},{"start":{"line":32,"column":57},"end":{"line":32,"column":60}}],"line":32},"5":{"loc":{"start":{"line":40,"column":33},"end":{"line":40,"column":83}},"type":"binary-expr","locations":[{"start":{"line":40,"column":33},"end":{"line":40,"column":61}},{"start":{"line":40,"column":65},"end":{"line":40,"column":83}}],"line":40},"6":{"loc":{"start":{"line":43,"column":2},"end":{"line":47,"column":3}},"type":"if","locations":[{"start":{"line":43,"column":2},"end":{"line":47,"column":3}},{"start":{"line":43,"column":2},"end":{"line":47,"column":3}}],"line":43},"7":{"loc":{"start":{"line":63,"column":2},"end":{"line":103,"column":3}},"type":"if","locations":[{"start":{"line":63,"column":2},"end":{"line":103,"column":3}},{"start":{"line":63,"column":2},"end":{"line":103,"column":3}}],"line":63},"8":{"loc":{"start":{"line":64,"column":37},"end":{"line":64,"column":82}},"type":"binary-expr","locations":[{"start":{"line":64,"column":37},"end":{"line":64,"column":65}},{"start":{"line":64,"column":69},"end":{"line":64,"column":82}}],"line":64},"9":{"loc":{"start":{"line":73,"column":4},"end":{"line":81,"column":5}},"type":"if","locations":[{"start":{"line":73,"column":4},"end":{"line":81,"column":5}},{"start":{"line":73,"column":4},"end":{"line":81,"column":5}}],"line":73},"10":{"loc":{"start":{"line":76,"column":6},"end":{"line":78,"column":7}},"type":"if","locations":[{"start":{"line":76,"column":6},"end":{"line":78,"column":7}},{"start":{"line":76,"column":6},"end":{"line":78,"column":7}}],"line":76},"11":{"loc":{"start":{"line":85,"column":37},"end":{"line":85,"column":82}},"type":"binary-expr","locations":[{"start":{"line":85,"column":37},"end":{"line":85,"column":65}},{"start":{"line":85,"column":69},"end":{"line":85,"column":82}}],"line":85},"12":{"loc":{"start":{"line":88,"column":4},"end":{"line":90,"column":5}},"type":"if","locations":[{"start":{"line":88,"column":4},"end":{"line":90,"column":5}},{"start":{"line":88,"column":4},"end":{"line":90,"column":5}}],"line":88},"13":{"loc":{"start":{"line":92,"column":4},"end":{"line":100,"column":5}},"type":"if","locations":[{"start":{"line":92,"column":4},"end":{"line":100,"column":5}},{"start":{"line":92,"column":4},"end":{"line":100,"column":5}}],"line":92},"14":{"loc":{"start":{"line":95,"column":6},"end":{"line":97,"column":7}},"type":"if","locations":[{"start":{"line":95,"column":6},"end":{"line":97,"column":7}},{"start":{"line":95,"column":6},"end":{"line":97,"column":7}}],"line":95}},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":1,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":1,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0},"f":{"0":0,"1":0,"2":0,"3":0,"4":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0,0],"8":[0,0],"9":[0,0],"10":[0,0],"11":[0,0],"12":[0,0],"13":[0,0],"14":[0,0]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"90144cabb3b8d739663f95cafad9084f1ffdef64","contentHash":"d4b5ab94b75603a9aa0d79bf5720287d"},"/Users/brianmcbride/Development/me/feathers-arangodb/lib/index.js":{"path":"/Users/brianmcbride/Development/me/feathers-arangodb/lib/index.js","statementMap":{"0":{"start":{"line":1,"column":14},"end":{"line":1,"column":34}},"1":{"start":{"line":2,"column":15},"end":{"line":2,"column":44}},"2":{"start":{"line":3,"column":18},"end":{"line":3,"column":39}},"3":{"start":{"line":4,"column":12},"end":{"line":4,"column":35}},"4":{"start":{"line":5,"column":15},"end":{"line":5,"column":33}},"5":{"start":{"line":6,"column":17},"end":{"line":6,"column":39}},"6":{"start":{"line":8,"column":21},"end":{"line":8,"column":47}},"7":{"start":{"line":10,"column":33},"end":{"line":10,"column":63}},"8":{"start":{"line":14,"column":4},"end":{"line":16,"column":5}},"9":{"start":{"line":15,"column":6},"end":{"line":15,"column":62}},"10":{"start":{"line":18,"column":4},"end":{"line":18,"column":43}},"11":{"start":{"line":19,"column":4},"end":{"line":19,"column":64}},"12":{"start":{"line":21,"column":4},"end":{"line":21,"column":37}},"13":{"start":{"line":22,"column":4},"end":{"line":22,"column":39}},"14":{"start":{"line":25,"column":4},"end":{"line":25,"column":39}},"15":{"start":{"line":26,"column":4},"end":{"line":26,"column":26}},"16":{"start":{"line":30,"column":4},"end":{"line":30,"column":35}},"17":{"start":{"line":34,"column":4},"end":{"line":34,"column":17}},"18":{"start":{"line":35,"column":4},"end":{"line":35,"column":25}},"19":{"start":{"line":36,"column":4},"end":{"line":36,"column":43}},"20":{"start":{"line":38,"column":4},"end":{"line":56,"column":7}},"21":{"start":{"line":39,"column":6},"end":{"line":55,"column":11}},"22":{"start":{"line":41,"column":10},"end":{"line":41,"column":22}},"23":{"start":{"line":44,"column":10},"end":{"line":54,"column":11}},"24":{"start":{"line":45,"column":12},"end":{"line":51,"column":17}},"25":{"start":{"line":47,"column":16},"end":{"line":47,"column":28}},"26":{"start":{"line":50,"column":16},"end":{"line":50,"column":31}},"27":{"start":{"line":53,"column":12},"end":{"line":53,"column":24}},"28":{"start":{"line":60,"column":16},"end":{"line":60,"column":30}},"29":{"start":{"line":61,"column":4},"end":{"line":61,"column":33}},"30":{"start":{"line":62,"column":4},"end":{"line":62,"column":22}},"31":{"start":{"line":63,"column":4},"end":{"line":63,"column":22}},"32":{"start":{"line":64,"column":4},"end":{"line":64,"column":43}},"33":{"start":{"line":68,"column":4},"end":{"line":74,"column":5}},"34":{"start":{"line":69,"column":19},"end":{"line":69,"column":21}},"35":{"start":{"line":70,"column":6},"end":{"line":72,"column":9}},"36":{"start":{"line":71,"column":8},"end":{"line":71,"column":25}},"37":{"start":{"line":73,"column":6},"end":{"line":73,"column":20}},"38":{"start":{"line":76,"column":4},"end":{"line":76,"column":18}},"39":{"start":{"line":82,"column":27},"end":{"line":82,"column":56}},"40":{"start":{"line":83,"column":20},"end":{"line":83,"column":25}},"41":{"start":{"line":85,"column":4},"end":{"line":89,"column":5}},"42":{"start":{"line":86,"column":6},"end":{"line":86,"column":23}},"43":{"start":{"line":87,"column":6},"end":{"line":87,"column":28}},"44":{"start":{"line":88,"column":6},"end":{"line":88,"column":27}},"45":{"start":{"line":91,"column":4},"end":{"line":95,"column":7}},"46":{"start":{"line":92,"column":6},"end":{"line":94,"column":7}},"47":{"start":{"line":93,"column":8},"end":{"line":93,"column":28}},"48":{"start":{"line":98,"column":4},"end":{"line":100,"column":5}},"49":{"start":{"line":99,"column":6},"end":{"line":99,"column":30}},"50":{"start":{"line":102,"column":4},"end":{"line":105,"column":5}},"51":{"start":{"line":103,"column":6},"end":{"line":103,"column":39}},"52":{"start":{"line":104,"column":6},"end":{"line":104,"column":27}},"53":{"start":{"line":107,"column":17},"end":{"line":107,"column":59}},"54":{"start":{"line":108,"column":4},"end":{"line":108,"column":27}},"55":{"start":{"line":110,"column":22},"end":{"line":110,"column":55}},"56":{"start":{"line":111,"column":21},"end":{"line":111,"column":45}},"57":{"start":{"line":113,"column":19},"end":{"line":113,"column":55}},"58":{"start":{"line":114,"column":24},"end":{"line":114,"column":59}},"59":{"start":{"line":117,"column":4},"end":{"line":131,"column":5}},"60":{"start":{"line":118,"column":23},"end":{"line":118,"column":33}},"61":{"start":{"line":119,"column":6},"end":{"line":129,"column":7}},"62":{"start":{"line":120,"column":8},"end":{"line":125,"column":11}},"63":{"start":{"line":121,"column":10},"end":{"line":121,"column":46}},"64":{"start":{"line":122,"column":10},"end":{"line":124,"column":11}},"65":{"start":{"line":123,"column":12},"end":{"line":123,"column":30}},"66":{"start":{"line":126,"column":8},"end":{"line":126,"column":27}},"67":{"start":{"line":128,"column":8},"end":{"line":128,"column":50}},"68":{"start":{"line":130,"column":6},"end":{"line":130,"column":70}},"69":{"start":{"line":133,"column":4},"end":{"line":153,"column":29}},"70":{"start":{"line":135,"column":8},"end":{"line":152,"column":9}},"71":{"start":{"line":136,"column":10},"end":{"line":141,"column":13}},"72":{"start":{"line":143,"column":10},"end":{"line":151,"column":32}},"73":{"start":{"line":143,"column":79},"end":{"line":150,"column":12}},"74":{"start":{"line":144,"column":12},"end":{"line":149,"column":15}},"75":{"start":{"line":148,"column":38},"end":{"line":148,"column":70}},"76":{"start":{"line":157,"column":4},"end":{"line":157,"column":48}},"77":{"start":{"line":161,"column":21},"end":{"line":161,"column":93}},"78":{"start":{"line":163,"column":19},"end":{"line":163,"column":76}},"79":{"start":{"line":163,"column":47},"end":{"line":163,"column":75}},"80":{"start":{"line":165,"column":4},"end":{"line":167,"column":5}},"81":{"start":{"line":166,"column":6},"end":{"line":166,"column":44}},"82":{"start":{"line":166,"column":33},"end":{"line":166,"column":42}},"83":{"start":{"line":169,"column":4},"end":{"line":169,"column":18}},"84":{"start":{"line":173,"column":23},"end":{"line":173,"column":47}},"85":{"start":{"line":174,"column":4},"end":{"line":181,"column":28}},"86":{"start":{"line":176,"column":22},"end":{"line":181,"column":6}},"87":{"start":{"line":177,"column":6},"end":{"line":179,"column":7}},"88":{"start":{"line":178,"column":8},"end":{"line":178,"column":68}},"89":{"start":{"line":180,"column":6},"end":{"line":180,"column":46}},"90":{"start":{"line":186,"column":13},"end":{"line":186,"column":39}},"91":{"start":{"line":187,"column":18},"end":{"line":187,"column":76}},"92":{"start":{"line":189,"column":4},"end":{"line":193,"column":103}},"93":{"start":{"line":193,"column":22},"end":{"line":193,"column":81}},"94":{"start":{"line":193,"column":48},"end":{"line":193,"column":80}},"95":{"start":{"line":197,"column":4},"end":{"line":199,"column":5}},"96":{"start":{"line":198,"column":6},"end":{"line":198,"column":69}},"97":{"start":{"line":198,"column":45},"end":{"line":198,"column":66}},"98":{"start":{"line":201,"column":4},"end":{"line":201,"column":38}},"99":{"start":{"line":206,"column":23},"end":{"line":206,"column":47}},"100":{"start":{"line":207,"column":20},"end":{"line":207,"column":65}},"101":{"start":{"line":208,"column":4},"end":{"line":217,"column":9}},"102":{"start":{"line":213,"column":22},"end":{"line":213,"column":81}},"103":{"start":{"line":213,"column":48},"end":{"line":213,"column":80}},"104":{"start":{"line":215,"column":8},"end":{"line":215,"column":137}},"105":{"start":{"line":215,"column":60},"end":{"line":215,"column":137}},"106":{"start":{"line":216,"column":8},"end":{"line":216,"column":26}},"107":{"start":{"line":221,"column":4},"end":{"line":225,"column":5}},"108":{"start":{"line":222,"column":6},"end":{"line":224,"column":9}},"109":{"start":{"line":227,"column":4},"end":{"line":227,"column":42}},"110":{"start":{"line":232,"column":23},"end":{"line":232,"column":47}},"111":{"start":{"line":233,"column":20},"end":{"line":233,"column":65}},"112":{"start":{"line":234,"column":4},"end":{"line":243,"column":9}},"113":{"start":{"line":239,"column":22},"end":{"line":239,"column":81}},"114":{"start":{"line":239,"column":48},"end":{"line":239,"column":80}},"115":{"start":{"line":241,"column":8},"end":{"line":241,"column":137}},"116":{"start":{"line":241,"column":60},"end":{"line":241,"column":137}},"117":{"start":{"line":242,"column":8},"end":{"line":242,"column":26}},"118":{"start":{"line":247,"column":4},"end":{"line":253,"column":5}},"119":{"start":{"line":248,"column":6},"end":{"line":252,"column":9}},"120":{"start":{"line":249,"column":8},"end":{"line":251,"column":10}},"121":{"start":{"line":250,"column":21},"end":{"line":250,"column":65}},"122":{"start":{"line":255,"column":4},"end":{"line":255,"column":41}},"123":{"start":{"line":260,"column":23},"end":{"line":260,"column":47}},"124":{"start":{"line":261,"column":4},"end":{"line":271,"column":9}},"125":{"start":{"line":267,"column":22},"end":{"line":267,"column":81}},"126":{"start":{"line":267,"column":48},"end":{"line":267,"column":80}},"127":{"start":{"line":269,"column":8},"end":{"line":269,"column":137}},"128":{"start":{"line":269,"column":60},"end":{"line":269,"column":137}},"129":{"start":{"line":270,"column":8},"end":{"line":270,"column":26}},"130":{"start":{"line":275,"column":4},"end":{"line":281,"column":5}},"131":{"start":{"line":276,"column":6},"end":{"line":280,"column":12}},"132":{"start":{"line":277,"column":8},"end":{"line":280,"column":10}},"133":{"start":{"line":278,"column":10},"end":{"line":279,"column":11}},"134":{"start":{"line":283,"column":4},"end":{"line":283,"column":36}},"135":{"start":{"line":287,"column":0},"end":{"line":289,"column":2}},"136":{"start":{"line":288,"column":2},"end":{"line":288,"column":30}},"137":{"start":{"line":291,"column":0},"end":{"line":291,"column":33}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":13,"column":2},"end":{"line":13,"column":3}},"loc":{"start":{"line":13,"column":24},"end":{"line":27,"column":3}},"line":13},"1":{"name":"(anonymous_1)","decl":{"start":{"line":29,"column":2},"end":{"line":29,"column":3}},"loc":{"start":{"line":29,"column":15},"end":{"line":31,"column":3}},"line":29},"2":{"name":"(anonymous_2)","decl":{"start":{"line":33,"column":2},"end":{"line":33,"column":3}},"loc":{"start":{"line":33,"column":45},"end":{"line":57,"column":3}},"line":33},"3":{"name":"(anonymous_3)","decl":{"start":{"line":38,"column":23},"end":{"line":38,"column":24}},"loc":{"start":{"line":38,"column":44},"end":{"line":56,"column":5}},"line":38},"4":{"name":"(anonymous_4)","decl":{"start":{"line":40,"column":14},"end":{"line":40,"column":15}},"loc":{"start":{"line":40,"column":20},"end":{"line":42,"column":9}},"line":40},"5":{"name":"(anonymous_5)","decl":{"start":{"line":43,"column":15},"end":{"line":43,"column":16}},"loc":{"start":{"line":43,"column":22},"end":{"line":55,"column":9}},"line":43},"6":{"name":"(anonymous_6)","decl":{"start":{"line":46,"column":20},"end":{"line":46,"column":21}},"loc":{"start":{"line":46,"column":26},"end":{"line":48,"column":15}},"line":46},"7":{"name":"(anonymous_7)","decl":{"start":{"line":49,"column":21},"end":{"line":49,"column":22}},"loc":{"start":{"line":49,"column":31},"end":{"line":51,"column":15}},"line":49},"8":{"name":"(anonymous_8)","decl":{"start":{"line":59,"column":2},"end":{"line":59,"column":3}},"loc":{"start":{"line":59,"column":31},"end":{"line":65,"column":3}},"line":59},"9":{"name":"(anonymous_9)","decl":{"start":{"line":67,"column":2},"end":{"line":67,"column":3}},"loc":{"start":{"line":67,"column":22},"end":{"line":77,"column":3}},"line":67},"10":{"name":"(anonymous_10)","decl":{"start":{"line":70,"column":21},"end":{"line":70,"column":22}},"loc":{"start":{"line":70,"column":29},"end":{"line":72,"column":7}},"line":70},"11":{"name":"(anonymous_11)","decl":{"start":{"line":81,"column":2},"end":{"line":81,"column":3}},"loc":{"start":{"line":81,"column":42},"end":{"line":154,"column":3}},"line":81},"12":{"name":"(anonymous_12)","decl":{"start":{"line":91,"column":33},"end":{"line":91,"column":34}},"loc":{"start":{"line":91,"column":40},"end":{"line":95,"column":5}},"line":91},"13":{"name":"(anonymous_13)","decl":{"start":{"line":120,"column":23},"end":{"line":120,"column":24}},"loc":{"start":{"line":120,"column":40},"end":{"line":125,"column":9}},"line":120},"14":{"name":"(anonymous_14)","decl":{"start":{"line":134,"column":12},"end":{"line":134,"column":13}},"loc":{"start":{"line":134,"column":27},"end":{"line":153,"column":7}},"line":134},"15":{"name":"(anonymous_15)","decl":{"start":{"line":143,"column":69},"end":{"line":143,"column":70}},"loc":{"start":{"line":143,"column":79},"end":{"line":150,"column":12}},"line":143},"16":{"name":"(anonymous_16)","decl":{"start":{"line":143,"column":97},"end":{"line":143,"column":98}},"loc":{"start":{"line":143,"column":107},"end":{"line":150,"column":11}},"line":143},"17":{"name":"(anonymous_17)","decl":{"start":{"line":148,"column":31},"end":{"line":148,"column":32}},"loc":{"start":{"line":148,"column":38},"end":{"line":148,"column":70}},"line":148},"18":{"name":"(anonymous_18)","decl":{"start":{"line":156,"column":2},"end":{"line":156,"column":3}},"loc":{"start":{"line":156,"column":32},"end":{"line":158,"column":3}},"line":156},"19":{"name":"(anonymous_19)","decl":{"start":{"line":160,"column":2},"end":{"line":160,"column":3}},"loc":{"start":{"line":160,"column":16},"end":{"line":170,"column":3}},"line":160},"20":{"name":"(anonymous_20)","decl":{"start":{"line":163,"column":38},"end":{"line":163,"column":39}},"loc":{"start":{"line":163,"column":47},"end":{"line":163,"column":75}},"line":163},"21":{"name":"(anonymous_21)","decl":{"start":{"line":166,"column":25},"end":{"line":166,"column":26}},"loc":{"start":{"line":166,"column":33},"end":{"line":166,"column":42}},"line":166},"22":{"name":"(anonymous_22)","decl":{"start":{"line":172,"column":2},"end":{"line":172,"column":3}},"loc":{"start":{"line":172,"column":19},"end":{"line":182,"column":3}},"line":172},"23":{"name":"(anonymous_23)","decl":{"start":{"line":176,"column":12},"end":{"line":176,"column":13}},"loc":{"start":{"line":176,"column":22},"end":{"line":181,"column":6}},"line":176},"24":{"name":"(anonymous_24)","decl":{"start":{"line":176,"column":41},"end":{"line":176,"column":42}},"loc":{"start":{"line":176,"column":48},"end":{"line":181,"column":5}},"line":176},"25":{"name":"(anonymous_25)","decl":{"start":{"line":185,"column":2},"end":{"line":185,"column":3}},"loc":{"start":{"line":185,"column":25},"end":{"line":194,"column":3}},"line":185},"26":{"name":"(anonymous_26)","decl":{"start":{"line":193,"column":12},"end":{"line":193,"column":13}},"loc":{"start":{"line":193,"column":22},"end":{"line":193,"column":81}},"line":193},"27":{"name":"(anonymous_27)","decl":{"start":{"line":193,"column":41},"end":{"line":193,"column":42}},"loc":{"start":{"line":193,"column":48},"end":{"line":193,"column":80}},"line":193},"28":{"name":"(anonymous_28)","decl":{"start":{"line":196,"column":2},"end":{"line":196,"column":3}},"loc":{"start":{"line":196,"column":24},"end":{"line":202,"column":3}},"line":196},"29":{"name":"(anonymous_29)","decl":{"start":{"line":198,"column":34},"end":{"line":198,"column":35}},"loc":{"start":{"line":198,"column":45},"end":{"line":198,"column":66}},"line":198},"30":{"name":"(anonymous_30)","decl":{"start":{"line":205,"column":2},"end":{"line":205,"column":3}},"loc":{"start":{"line":205,"column":29},"end":{"line":218,"column":3}},"line":205},"31":{"name":"(anonymous_31)","decl":{"start":{"line":213,"column":12},"end":{"line":213,"column":13}},"loc":{"start":{"line":213,"column":22},"end":{"line":213,"column":81}},"line":213},"32":{"name":"(anonymous_32)","decl":{"start":{"line":213,"column":41},"end":{"line":213,"column":42}},"loc":{"start":{"line":213,"column":48},"end":{"line":213,"column":80}},"line":213},"33":{"name":"(anonymous_33)","decl":{"start":{"line":214,"column":13},"end":{"line":214,"column":14}},"loc":{"start":{"line":214,"column":20},"end":{"line":217,"column":7}},"line":214},"34":{"name":"(anonymous_34)","decl":{"start":{"line":220,"column":2},"end":{"line":220,"column":3}},"loc":{"start":{"line":220,"column":28},"end":{"line":228,"column":3}},"line":220},"35":{"name":"(anonymous_35)","decl":{"start":{"line":231,"column":2},"end":{"line":231,"column":3}},"loc":{"start":{"line":231,"column":28},"end":{"line":244,"column":3}},"line":231},"36":{"name":"(anonymous_36)","decl":{"start":{"line":239,"column":12},"end":{"line":239,"column":13}},"loc":{"start":{"line":239,"column":22},"end":{"line":239,"column":81}},"line":239},"37":{"name":"(anonymous_37)","decl":{"start":{"line":239,"column":41},"end":{"line":239,"column":42}},"loc":{"start":{"line":239,"column":48},"end":{"line":239,"column":80}},"line":239},"38":{"name":"(anonymous_38)","decl":{"start":{"line":240,"column":13},"end":{"line":240,"column":14}},"loc":{"start":{"line":240,"column":20},"end":{"line":243,"column":7}},"line":240},"39":{"name":"(anonymous_39)","decl":{"start":{"line":246,"column":2},"end":{"line":246,"column":3}},"loc":{"start":{"line":246,"column":27},"end":{"line":256,"column":3}},"line":246},"40":{"name":"(anonymous_40)","decl":{"start":{"line":248,"column":37},"end":{"line":248,"column":38}},"loc":{"start":{"line":248,"column":45},"end":{"line":252,"column":7}},"line":248},"41":{"name":"(anonymous_41)","decl":{"start":{"line":250,"column":10},"end":{"line":250,"column":11}},"loc":{"start":{"line":250,"column":21},"end":{"line":250,"column":65}},"line":250},"42":{"name":"(anonymous_42)","decl":{"start":{"line":259,"column":2},"end":{"line":259,"column":3}},"loc":{"start":{"line":259,"column":23},"end":{"line":272,"column":3}},"line":259},"43":{"name":"(anonymous_43)","decl":{"start":{"line":267,"column":12},"end":{"line":267,"column":13}},"loc":{"start":{"line":267,"column":22},"end":{"line":267,"column":81}},"line":267},"44":{"name":"(anonymous_44)","decl":{"start":{"line":267,"column":41},"end":{"line":267,"column":42}},"loc":{"start":{"line":267,"column":48},"end":{"line":267,"column":80}},"line":267},"45":{"name":"(anonymous_45)","decl":{"start":{"line":268,"column":13},"end":{"line":268,"column":14}},"loc":{"start":{"line":268,"column":20},"end":{"line":271,"column":7}},"line":268},"46":{"name":"(anonymous_46)","decl":{"start":{"line":274,"column":2},"end":{"line":274,"column":3}},"loc":{"start":{"line":274,"column":22},"end":{"line":284,"column":3}},"line":274},"47":{"name":"(anonymous_47)","decl":{"start":{"line":276,"column":37},"end":{"line":276,"column":38}},"loc":{"start":{"line":277,"column":8},"end":{"line":280,"column":10}},"line":277},"48":{"name":"(anonymous_48)","decl":{"start":{"line":277,"column":34},"end":{"line":277,"column":35}},"loc":{"start":{"line":278,"column":10},"end":{"line":279,"column":11}},"line":278},"49":{"name":"init","decl":{"start":{"line":287,"column":26},"end":{"line":287,"column":30}},"loc":{"start":{"line":287,"column":41},"end":{"line":289,"column":1}},"line":287}},"branchMap":{"0":{"loc":{"start":{"line":14,"column":4},"end":{"line":16,"column":5}},"type":"if","locations":[{"start":{"line":14,"column":4},"end":{"line":16,"column":5}},{"start":{"line":14,"column":4},"end":{"line":16,"column":5}}],"line":14},"1":{"loc":{"start":{"line":18,"column":20},"end":{"line":18,"column":42}},"type":"binary-expr","locations":[{"start":{"line":18,"column":20},"end":{"line":18,"column":36}},{"start":{"line":18,"column":40},"end":{"line":18,"column":42}}],"line":18},"2":{"loc":{"start":{"line":19,"column":25},"end":{"line":19,"column":63}},"type":"binary-expr","locations":[{"start":{"line":19,"column":25},"end":{"line":19,"column":40}},{"start":{"line":19,"column":44},"end":{"line":19,"column":54}},{"start":{"line":19,"column":58},"end":{"line":19,"column":63}}],"line":19},"3":{"loc":{"start":{"line":21,"column":17},"end":{"line":21,"column":36}},"type":"binary-expr","locations":[{"start":{"line":21,"column":17},"end":{"line":21,"column":30}},{"start":{"line":21,"column":34},"end":{"line":21,"column":36}}],"line":21},"4":{"loc":{"start":{"line":22,"column":18},"end":{"line":22,"column":38}},"type":"binary-expr","locations":[{"start":{"line":22,"column":18},"end":{"line":22,"column":32}},{"start":{"line":22,"column":36},"end":{"line":22,"column":38}}],"line":22},"5":{"loc":{"start":{"line":33,"column":8},"end":{"line":33,"column":21}},"type":"default-arg","locations":[{"start":{"line":33,"column":13},"end":{"line":33,"column":21}}],"line":33},"6":{"loc":{"start":{"line":33,"column":23},"end":{"line":33,"column":43}},"type":"default-arg","locations":[{"start":{"line":33,"column":30},"end":{"line":33,"column":43}}],"line":33},"7":{"loc":{"start":{"line":44,"column":10},"end":{"line":54,"column":11}},"type":"if","locations":[{"start":{"line":44,"column":10},"end":{"line":54,"column":11}},{"start":{"line":44,"column":10},"end":{"line":54,"column":11}}],"line":44},"8":{"loc":{"start":{"line":44,"column":14},"end":{"line":44,"column":77}},"type":"binary-expr","locations":[{"start":{"line":44,"column":14},"end":{"line":44,"column":35}},{"start":{"line":44,"column":39},"end":{"line":44,"column":77}}],"line":44},"9":{"loc":{"start":{"line":68,"column":4},"end":{"line":74,"column":5}},"type":"if","locations":[{"start":{"line":68,"column":4},"end":{"line":74,"column":5}},{"start":{"line":68,"column":4},"end":{"line":74,"column":5}}],"line":68},"10":{"loc":{"start":{"line":81,"column":17},"end":{"line":81,"column":40}},"type":"default-arg","locations":[{"start":{"line":81,"column":29},"end":{"line":81,"column":40}}],"line":81},"11":{"loc":{"start":{"line":82,"column":37},"end":{"line":82,"column":55}},"type":"binary-expr","locations":[{"start":{"line":82,"column":37},"end":{"line":82,"column":49}},{"start":{"line":82,"column":53},"end":{"line":82,"column":55}}],"line":82},"12":{"loc":{"start":{"line":85,"column":4},"end":{"line":89,"column":5}},"type":"if","locations":[{"start":{"line":85,"column":4},"end":{"line":89,"column":5}},{"start":{"line":85,"column":4},"end":{"line":89,"column":5}}],"line":85},"13":{"loc":{"start":{"line":92,"column":6},"end":{"line":94,"column":7}},"type":"if","locations":[{"start":{"line":92,"column":6},"end":{"line":94,"column":7}},{"start":{"line":92,"column":6},"end":{"line":94,"column":7}}],"line":92},"14":{"loc":{"start":{"line":98,"column":4},"end":{"line":100,"column":5}},"type":"if","locations":[{"start":{"line":98,"column":4},"end":{"line":100,"column":5}},{"start":{"line":98,"column":4},"end":{"line":100,"column":5}}],"line":98},"15":{"loc":{"start":{"line":98,"column":8},"end":{"line":98,"column":40}},"type":"binary-expr","locations":[{"start":{"line":98,"column":8},"end":{"line":98,"column":21}},{"start":{"line":98,"column":25},"end":{"line":98,"column":40}}],"line":98},"16":{"loc":{"start":{"line":102,"column":4},"end":{"line":105,"column":5}},"type":"if","locations":[{"start":{"line":102,"column":4},"end":{"line":105,"column":5}},{"start":{"line":102,"column":4},"end":{"line":105,"column":5}}],"line":102},"17":{"loc":{"start":{"line":107,"column":17},"end":{"line":107,"column":59}},"type":"cond-expr","locations":[{"start":{"line":107,"column":37},"end":{"line":107,"column":52}},{"start":{"line":107,"column":55},"end":{"line":107,"column":59}}],"line":107},"18":{"loc":{"start":{"line":117,"column":4},"end":{"line":131,"column":5}},"type":"if","locations":[{"start":{"line":117,"column":4},"end":{"line":131,"column":5}},{"start":{"line":117,"column":4},"end":{"line":131,"column":5}}],"line":117},"19":{"loc":{"start":{"line":117,"column":8},"end":{"line":117,"column":32}},"type":"binary-expr","locations":[{"start":{"line":117,"column":8},"end":{"line":117,"column":22}},{"start":{"line":117,"column":26},"end":{"line":117,"column":32}}],"line":117},"20":{"loc":{"start":{"line":119,"column":6},"end":{"line":129,"column":7}},"type":"if","locations":[{"start":{"line":119,"column":6},"end":{"line":129,"column":7}},{"start":{"line":119,"column":6},"end":{"line":129,"column":7}}],"line":119},"21":{"loc":{"start":{"line":122,"column":10},"end":{"line":124,"column":11}},"type":"if","locations":[{"start":{"line":122,"column":10},"end":{"line":124,"column":11}},{"start":{"line":122,"column":10},"end":{"line":124,"column":11}}],"line":122},"22":{"loc":{"start":{"line":135,"column":8},"end":{"line":152,"column":9}},"type":"if","locations":[{"start":{"line":135,"column":8},"end":{"line":152,"column":9}},{"start":{"line":135,"column":8},"end":{"line":152,"column":9}}],"line":135},"23":{"loc":{"start":{"line":138,"column":19},"end":{"line":138,"column":38}},"type":"binary-expr","locations":[{"start":{"line":138,"column":19},"end":{"line":138,"column":33}},{"start":{"line":138,"column":37},"end":{"line":138,"column":38}}],"line":138},"24":{"loc":{"start":{"line":139,"column":18},"end":{"line":139,"column":36}},"type":"binary-expr","locations":[{"start":{"line":139,"column":18},"end":{"line":139,"column":31}},{"start":{"line":139,"column":35},"end":{"line":139,"column":36}}],"line":139},"25":{"loc":{"start":{"line":147,"column":20},"end":{"line":147,"column":38}},"type":"binary-expr","locations":[{"start":{"line":147,"column":20},"end":{"line":147,"column":33}},{"start":{"line":147,"column":37},"end":{"line":147,"column":38}}],"line":147},"26":{"loc":{"start":{"line":161,"column":21},"end":{"line":161,"column":93}},"type":"cond-expr","locations":[{"start":{"line":161,"column":62},"end":{"line":161,"column":77}},{"start":{"line":161,"column":80},"end":{"line":161,"column":93}}],"line":161},"27":{"loc":{"start":{"line":165,"column":4},"end":{"line":167,"column":5}},"type":"if","locations":[{"start":{"line":165,"column":4},"end":{"line":167,"column":5}},{"start":{"line":165,"column":4},"end":{"line":167,"column":5}}],"line":165},"28":{"loc":{"start":{"line":177,"column":6},"end":{"line":179,"column":7}},"type":"if","locations":[{"start":{"line":177,"column":6},"end":{"line":179,"column":7}},{"start":{"line":177,"column":6},"end":{"line":179,"column":7}}],"line":177},"29":{"loc":{"start":{"line":186,"column":13},"end":{"line":186,"column":39}},"type":"binary-expr","locations":[{"start":{"line":186,"column":13},"end":{"line":186,"column":27}},{"start":{"line":186,"column":31},"end":{"line":186,"column":39}}],"line":186},"30":{"loc":{"start":{"line":197,"column":4},"end":{"line":199,"column":5}},"type":"if","locations":[{"start":{"line":197,"column":4},"end":{"line":199,"column":5}},{"start":{"line":197,"column":4},"end":{"line":199,"column":5}}],"line":197},"31":{"loc":{"start":{"line":215,"column":8},"end":{"line":215,"column":137}},"type":"if","locations":[{"start":{"line":215,"column":8},"end":{"line":215,"column":137}},{"start":{"line":215,"column":8},"end":{"line":215,"column":137}}],"line":215},"32":{"loc":{"start":{"line":215,"column":12},"end":{"line":215,"column":58}},"type":"binary-expr","locations":[{"start":{"line":215,"column":12},"end":{"line":215,"column":33}},{"start":{"line":215,"column":37},"end":{"line":215,"column":58}}],"line":215},"33":{"loc":{"start":{"line":221,"column":4},"end":{"line":225,"column":5}},"type":"if","locations":[{"start":{"line":221,"column":4},"end":{"line":225,"column":5}},{"start":{"line":221,"column":4},"end":{"line":225,"column":5}}],"line":221},"34":{"loc":{"start":{"line":221,"column":8},"end":{"line":221,"column":42}},"type":"binary-expr","locations":[{"start":{"line":221,"column":8},"end":{"line":221,"column":19}},{"start":{"line":221,"column":23},"end":{"line":221,"column":42}}],"line":221},"35":{"loc":{"start":{"line":241,"column":8},"end":{"line":241,"column":137}},"type":"if","locations":[{"start":{"line":241,"column":8},"end":{"line":241,"column":137}},{"start":{"line":241,"column":8},"end":{"line":241,"column":137}}],"line":241},"36":{"loc":{"start":{"line":241,"column":12},"end":{"line":241,"column":58}},"type":"binary-expr","locations":[{"start":{"line":241,"column":12},"end":{"line":241,"column":33}},{"start":{"line":241,"column":37},"end":{"line":241,"column":58}}],"line":241},"37":{"loc":{"start":{"line":247,"column":4},"end":{"line":253,"column":5}},"type":"if","locations":[{"start":{"line":247,"column":4},"end":{"line":253,"column":5}},{"start":{"line":247,"column":4},"end":{"line":253,"column":5}}],"line":247},"38":{"loc":{"start":{"line":269,"column":8},"end":{"line":269,"column":137}},"type":"if","locations":[{"start":{"line":269,"column":8},"end":{"line":269,"column":137}},{"start":{"line":269,"column":8},"end":{"line":269,"column":137}}],"line":269},"39":{"loc":{"start":{"line":269,"column":12},"end":{"line":269,"column":58}},"type":"binary-expr","locations":[{"start":{"line":269,"column":12},"end":{"line":269,"column":33}},{"start":{"line":269,"column":37},"end":{"line":269,"column":58}}],"line":269},"40":{"loc":{"start":{"line":275,"column":4},"end":{"line":281,"column":5}},"type":"if","locations":[{"start":{"line":275,"column":4},"end":{"line":281,"column":5}},{"start":{"line":275,"column":4},"end":{"line":281,"column":5}}],"line":275}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":5,"9":1,"10":4,"11":4,"12":4,"13":4,"14":4,"15":4,"16":4,"17":2,"18":2,"19":2,"20":2,"21":2,"22":0,"23":2,"24":2,"25":2,"26":0,"27":0,"28":592,"29":592,"30":592,"31":592,"32":592,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":64,"40":64,"41":64,"42":4,"43":4,"44":4,"45":64,"46":312,"47":280,"48":64,"49":2,"50":64,"51":18,"52":18,"53":64,"54":64,"55":64,"56":64,"57":64,"58":64,"59":64,"60":2,"61":2,"62":2,"63":2,"64":2,"65":0,"66":2,"67":0,"68":2,"69":64,"70":64,"71":4,"72":60,"73":60,"74":60,"75":124,"76":1,"77":50,"78":50,"79":50,"80":50,"81":42,"82":42,"83":8,"84":8,"85":8,"86":8,"87":8,"88":2,"89":6,"90":224,"91":224,"92":224,"93":224,"94":224,"95":218,"96":4,"97":10,"98":214,"99":8,"100":8,"101":8,"102":6,"103":6,"104":2,"105":2,"106":0,"107":8,"108":0,"109":8,"110":20,"111":20,"112":20,"113":18,"114":18,"115":2,"116":2,"117":0,"118":14,"119":6,"120":6,"121":12,"122":8,"123":220,"124":220,"125":214,"126":214,"127":6,"128":6,"129":0,"130":210,"131":8,"132":8,"133":18,"134":202,"135":1,"136":5,"137":1},"f":{"0":5,"1":4,"2":2,"3":2,"4":0,"5":2,"6":2,"7":0,"8":592,"9":0,"10":0,"11":64,"12":312,"13":2,"14":64,"15":60,"16":60,"17":124,"18":1,"19":50,"20":50,"21":42,"22":8,"23":8,"24":8,"25":224,"26":224,"27":224,"28":218,"29":10,"30":8,"31":6,"32":6,"33":2,"34":8,"35":20,"36":18,"37":18,"38":2,"39":14,"40":6,"41":12,"42":220,"43":214,"44":214,"45":6,"46":210,"47":8,"48":18,"49":5},"b":{"0":[1,4],"1":[4,4],"2":[4,4,3],"3":[4,4],"4":[4,2],"5":[0],"6":[0],"7":[2,0],"8":[2,0],"9":[0,0],"10":[14],"11":[64,8],"12":[4,60],"13":[280,32],"14":[2,62],"15":[64,4],"16":[18,46],"17":[2,62],"18":[2,62],"19":[64,64],"20":[2,0],"21":[0,2],"22":[4,60],"23":[4,4],"24":[4,4],"25":[60,56],"26":[4,46],"27":[42,8],"28":[2,6],"29":[224,224],"30":[4,214],"31":[2,0],"32":[2,0],"33":[0,8],"34":[8,8],"35":[2,0],"36":[2,0],"37":[6,8],"38":[6,0],"39":[6,6],"40":[8,202]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"1eb3bd9452ba91d80ca3b395f38a37b58c603177","contentHash":"edf7240d773ce351cdb5efc29077004c"},"/Users/brianmcbride/Development/me/feathers-arangodb/lib/error-handler.js":{"path":"/Users/brianmcbride/Development/me/feathers-arangodb/lib/error-handler.js","statementMap":{"0":{"start":{"line":1,"column":15},"end":{"line":1,"column":44}},"1":{"start":{"line":3,"column":0},"end":{"line":16,"column":2}},"2":{"start":{"line":8,"column":2},"end":{"line":13,"column":3}},"3":{"start":{"line":9,"column":4},"end":{"line":12,"column":7}},"4":{"start":{"line":15,"column":2},"end":{"line":15,"column":14}}},"fnMap":{"0":{"name":"errorHandler","decl":{"start":{"line":3,"column":26},"end":{"line":3,"column":38}},"loc":{"start":{"line":3,"column":47},"end":{"line":16,"column":1}},"line":3}},"branchMap":{"0":{"loc":{"start":{"line":8,"column":2},"end":{"line":13,"column":3}},"type":"if","locations":[{"start":{"line":8,"column":2},"end":{"line":13,"column":3}},{"start":{"line":8,"column":2},"end":{"line":13,"column":3}}],"line":8}},"s":{"0":1,"1":1,"2":2,"3":0,"4":2},"f":{"0":2},"b":{"0":[0,2]},"_coverageSchema":"43e27e138ebf9cfc5966b082cf9a028302ed4184","hash":"1562db56e4c4be0bbb2cf8b6e2d43d101bd363d3","contentHash":"27b0b99536f56af43cc919a1de4f43d1"}} -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: required 2 | language: node_js 3 | node_js: 4 | - node 5 | - '8' 6 | services: 7 | - docker 8 | before_install: 9 | - docker pull arangodb 10 | - docker run -e ARANGO_ROOT_PASSWORD=root -p 8529:8529 -d arangodb 11 | script: 12 | - yarn run test 13 | after_script: 14 | - kill -9 $(pgrep arangod) 15 | cache: 16 | yarn: true 17 | directories: 18 | - node_modules 19 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | ## [Unreleased](https://github.com/AnatidaeProject/feathers-arangodb/tree/HEAD) 4 | 5 | [Full Changelog](https://github.com/AnatidaeProject/feathers-arangodb/compare/v3.0.0...HEAD) 6 | 7 | **Closed issues:** 8 | 9 | - An in-range update of arangojs is breaking the build 🚨 [\#9](https://github.com/AnatidaeProject/feathers-arangodb/issues/9) 10 | - Inclues collection [\#7](https://github.com/AnatidaeProject/feathers-arangodb/issues/7) 11 | - An in-range update of @feathersjs/socketio is breaking the build 🚨 [\#6](https://github.com/AnatidaeProject/feathers-arangodb/issues/6) 12 | 13 | ## [v3.0.0](https://github.com/AnatidaeProject/feathers-arangodb/tree/v3.0.0) (2018-11-09) 14 | [Full Changelog](https://github.com/AnatidaeProject/feathers-arangodb/compare/v1.1.0...v3.0.0) 15 | 16 | **Implemented enhancements:** 17 | 18 | - Enable $search filter in query [\#1](https://github.com/AnatidaeProject/feathers-arangodb/issues/1) 19 | 20 | **Closed issues:** 21 | 22 | - An in-range update of arangojs is breaking the build 🚨 [\#5](https://github.com/AnatidaeProject/feathers-arangodb/issues/5) 23 | 24 | **Merged pull requests:** 25 | 26 | - 2.x [\#10](https://github.com/AnatidaeProject/feathers-arangodb/pull/10) ([Brian-McBride](https://github.com/Brian-McBride)) 27 | 28 | ## [v1.1.0](https://github.com/AnatidaeProject/feathers-arangodb/tree/v1.1.0) (2018-09-08) 29 | **Merged pull requests:** 30 | 31 | - Update clone-deep to the latest version 🚀 [\#2](https://github.com/AnatidaeProject/feathers-arangodb/pull/2) ([greenkeeper[bot]](https://github.com/apps/greenkeeper)) 32 | 33 | 34 | 35 | \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)* -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2018 Brian McBride 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # feathers-arangodb 3 | [![Build Status](https://travis-ci.org/AnatidaeProject/feathers-arangodb.png?branch=master)](https://travis-ci.org/AnatidaeProject/feathers-arangodb) 4 | [![Dependency Status](https://img.shields.io/david/AnatidaeProject/feathers-arangodb.svg?style=flat-square)](https://david-dm.org/AnatidaeProject/feathers-arangodb) 5 | [![Download Status](https://img.shields.io/npm/dm/feathers-arangodb.svg?style=flat-square)](https://www.npmjs.com/package/feathers-arangodb) 6 | 7 | A [Feathers](https://feathersjs.com) database adapter for [ArangoDB](https://www.arango.org/) using [official NodeJS driver for ArangoDB](https://github.com/arangodb/arangojs). 8 | 9 | ```bash 10 | $ npm install --save arangojs feathers-arangodb 11 | ``` 12 | 13 | > __Important:__ `feathers-arangodb` implements the [Feathers Common database adapter API](https://docs.feathersjs.com/api/databases/common.html) and [querying syntax](https://docs.feathersjs.com/api/databases/querying.html). 14 | 15 | > This adapter also requires a [running ArangoDB](https://docs.arangodb.com/3.3/Manual/GettingStarted/) database server. 16 | 17 | --- 18 | 19 | ### Simple Server Example 20 | ```javascript 21 | import express from '@feathersjs/express'; 22 | import feathers, {HookContext} from '@feathersjs/feathers'; 23 | import cors from 'cors'; 24 | import helmet from 'helmet'; 25 | import compress from 'compression'; 26 | import ArangoDbService, { IArangoDbService, IOptions, AUTH_TYPES } from 'feathers-arangodb' 27 | import { aql } from "arangojs"; 28 | 29 | // Set up your feathers app. 30 | const app = express(feathers()); 31 | app.use(helmet()); 32 | app.use(cors()); 33 | app.use(compress()); 34 | app.use(express.json()); 35 | app.use(express.urlencoded({ extended: true })); 36 | app.configure(express.rest()); 37 | 38 | // Create your database settings 39 | const todoDatabase:IOptions = { 40 | collection: 'TODOS', 41 | database: 'YOUR_DATABASE_NAME', 42 | authType: AUTH_TYPES.BASIC_AUTH, 43 | username: 'root', 44 | password: 'root', 45 | }; 46 | // Fast and simple CRUD 47 | app.use('todos', ArangoDbService(todoDatabase)); 48 | 49 | // Add in some hooks! 50 | const todoService = >app.service('todos'); 51 | todoService.hooks({ 52 | after: { 53 | create: [ 54 | async (context:HookContext) => { 55 | // Maybe we want run another AQL query directly on the database. 56 | const { database, collection } = await todoService.connect(); 57 | // Do a query 58 | const cursor = await database.query(aql`RETURN LENGTH(${collection})`) 59 | // Parse the cursor 60 | const count = await cursor.next(); 61 | // Assign some data to the stuff 62 | context.result = { 63 | count, 64 | data: context.result 65 | }; 66 | return context; 67 | } 68 | ] 69 | } 70 | }); 71 | 72 | // Start the app listening 73 | app.listen(8080); 74 | console.log('Listening on port 8080'); 75 | ``` 76 | 77 | #### Database Options 78 | 79 | **id** *(optional)* : String : Translated ID key value in payloads. Actual storage in database is saved in the `_key` key/value within ArangoDB. Defaults to `_key` 80 | 81 | **expandData** *(optional)* : Boolean : Adapter filters out `_rev` and `_id` from ArangoDB. Setting expandData to true will include these in the payload results. Defaults to `false` 82 | 83 | **collection** *(required)* : DocumentCollection | String : Either a string name of a collection, which will be created if it doesn't exist in database, or a reference to an existing arangoDB collection object. 84 | 85 | **database** *(required)* : Database | String : Either a string name of a database, which will be created if it doesn't exist on the ArangoDB server, or a reference to an existing ArangoDB database object. 86 | 87 | **graph** *(optional)* : Graph | { properties, opts } : Graph options to create a new graph. `name` is required in the properties. [See Documentation](https://docs.arangodb.com/devel/HTTP/Gharial/Management.html#create-a-graph) 88 | 89 | **authType** *(optional)* : String : String value of either `BASIC_AUTH` or `BEARER_AUTH`. Used to define the type of auth to ArangoDB ([see documentation](https://docs.arangodb.com/devel/Drivers/JS/Reference/Database/#databaseusebasicauth)). Defaults to `BASIC_AUTH` 90 | 91 | **username** *(optional)* : String : Used for auth, plaintext username 92 | 93 | **password** *(optional)* : String : Used for auth, plaintext password 94 | 95 | **token** *(optional)* : String : If token is supplied, auth uses token instead of username/password. 96 | 97 | **dbConfig** *(optional)* : ArangoDbConfig : ArangoDB Config file for a new database. [See Documentation](https://docs.arangodb.com/devel/Drivers/JS/Reference/Database/#new-database) 98 | 99 | **events** *(optional)* : Array : FeathersJS Events - [See Documentation](https://docs.feathersjs.com/api/events.html) 100 | 101 | **paginate** *(optional)* : FeathersJS Paginate : FeathersJS Paginate - [See Documentation](https://docs.feathersjs.com/api/databases/common.html#pagination) 102 | 103 | Copyright (c) 2018 104 | 105 | Licensed under the [MIT license](LICENSE). 106 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transform: { 3 | "^.+\\.tsx?$": "ts-jest", 4 | }, 5 | testRegex: "(/tests/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$", 6 | moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], 7 | collectCoverage: true, 8 | collectCoverageFrom: [ 9 | "src/**/*.{js,jsx,ts,tsx}", 10 | "!**/node_modules/**", 11 | "!**/vendor/**", 12 | "!./lib/**", 13 | "!./coverage/**" 14 | ], 15 | "reporters": [ "default", "jest-junit" ], 16 | "testEnvironment": "node", 17 | "testURL": "http://localhost" 18 | }; -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const errors_1 = require("@feathersjs/errors"); 7 | const graph_1 = require("arangojs/lib/cjs/graph"); 8 | const lodash_isempty_1 = __importDefault(require("lodash.isempty")); 9 | const lodash_isstring_1 = __importDefault(require("lodash.isstring")); 10 | const lodash_omit_1 = __importDefault(require("lodash.omit")); 11 | const v4_1 = __importDefault(require("uuid/v4")); 12 | const auto_database_1 = require("./auto-database"); 13 | const queryBuilder_1 = require("./queryBuilder"); 14 | var AUTH_TYPES; 15 | (function (AUTH_TYPES) { 16 | AUTH_TYPES["BASIC_AUTH"] = "BASIC_AUTH"; 17 | AUTH_TYPES["BEARER_AUTH"] = "BEARER_AUTH"; 18 | })(AUTH_TYPES = exports.AUTH_TYPES || (exports.AUTH_TYPES = {})); 19 | class DbService { 20 | constructor(options) { 21 | this.events = []; 22 | // Runtime checks 23 | /* istanbul ignore next */ 24 | if (!options.collection) { 25 | throw new Error("A collection reference or name is required"); 26 | } 27 | /* istanbul ignore next */ 28 | if (!options.database) { 29 | throw new Error("A database reference or name is required"); 30 | } 31 | /* istanbul ignore next */ 32 | if (options.id && ["_rev"].indexOf(options.id) !== -1) { 33 | throw new Error(`Database id name of ${options.id} is a reserved key`); 34 | } 35 | this._id = options.id || "_id"; 36 | this.events = options.events || this.events; 37 | this._paginate = options.paginate || {}; 38 | this.options = options; 39 | // Set the database if passed an existing DB 40 | /* istanbul ignore next */ 41 | if (options.database instanceof Promise) { 42 | this._databasePromise = options.database; 43 | } 44 | else if (options.database instanceof auto_database_1.AutoDatabse) { 45 | this._database = options.database; 46 | } 47 | else if (!lodash_isstring_1.default(options.database)) { 48 | throw new Error("Database reference or name (string) is required"); 49 | } 50 | if (options.graph instanceof Promise) { 51 | this._graphPromise = options.graph; 52 | } 53 | else if (options.graph instanceof graph_1.Graph) { 54 | this._graph = options.graph; 55 | } 56 | // Set the collection if it is connected 57 | /* istanbul ignore next */ 58 | if (options.collection instanceof Promise) { 59 | this._collectionPromise = options.collection; 60 | } 61 | else if (!lodash_isstring_1.default(options.collection) && !!options.collection) { 62 | this._collection = (options.collection); 63 | } 64 | else if (!options.collection) { 65 | throw new Error("Collection reference or name (string) is required"); 66 | } 67 | } 68 | async connect() { 69 | const { authType, username, password, token, graph } = this.options; 70 | if (this._database === undefined && this._databasePromise) { 71 | this._database = await this._databasePromise; 72 | } 73 | /* istanbul ignore next */ 74 | if (this._database === undefined) { 75 | let db = new auto_database_1.AutoDatabse(); 76 | switch (authType) { 77 | case AUTH_TYPES.BASIC_AUTH: 78 | db.useBasicAuth(username, password); 79 | break; 80 | case AUTH_TYPES.BEARER_AUTH: 81 | /* istanbul ignore next Testing will assuming working SDK */ 82 | if (token) { 83 | await db.useBearerAuth(token || ""); 84 | } 85 | else { 86 | await db.login(username, password); 87 | } 88 | break; 89 | } 90 | await db.autoUseDatabase(this.options.database); 91 | this._database = db; 92 | } 93 | if (!this._graph && this._graphPromise) { 94 | this._graph = await this._graphPromise; 95 | } 96 | if (graph && !this._graph) { 97 | const { properties, opts } = graph; 98 | if (this._database instanceof auto_database_1.AutoDatabse) { 99 | this._graph = await this._database.autoGraph(properties, opts); 100 | } 101 | else { 102 | throw `Auto creation of graphs requires instance of AutoDatabase`; 103 | } 104 | } 105 | /* istanbul ignore next This doens't need to be tested */ 106 | if (this._collectionPromise) { 107 | this._collection = await this._collectionPromise; 108 | } 109 | if (this._collection === undefined) { 110 | if (this._database instanceof auto_database_1.AutoDatabse) { 111 | this._collection = await this._database.autoCollection(this.options 112 | .collection); 113 | } 114 | else { 115 | throw `Auto creation of collections requires instance of AutoDatabase`; 116 | } 117 | } 118 | return { 119 | database: this._database, 120 | collection: this._collection 121 | }; 122 | } 123 | get id() { 124 | return this._id; 125 | } 126 | get database() { 127 | return this._database; 128 | } 129 | get collection() { 130 | return this._collection; 131 | } 132 | get paginate() { 133 | return this._paginate; 134 | } 135 | set paginate(option) { 136 | this._paginate = option || this._paginate; 137 | } 138 | _injectPagination(params) { 139 | params = params || {}; 140 | if (lodash_isempty_1.default(this._paginate) || (params && params.paginate) === false) { 141 | return params; 142 | } 143 | const paginate = params.paginate || this._paginate; 144 | params.query = params.query || {}; 145 | let limit = parseInt(params.query.$limit); 146 | limit = 147 | isNaN(limit) || limit === null 148 | ? paginate.default || paginate.max || 0 149 | : limit; 150 | limit = Math.min(limit, paginate.max || paginate.default || limit); 151 | params.query.$limit = limit; 152 | return params; 153 | } 154 | fixKeySend(data) { 155 | const aData = Array.isArray(data) ? data : [data]; 156 | if (aData.length < 1) { 157 | return aData; 158 | } 159 | return aData.map((item) => { 160 | const id = item[this._id] || v4_1.default(); 161 | return Object.assign({ _key: id }, lodash_omit_1.default(item, "_id", "_rev", "_key")); 162 | }); 163 | } 164 | fixKeyReturn(item) { 165 | const idObj = {}; 166 | idObj[this._id] = item._key; 167 | const removeKeys = [this._id, "_key"]; 168 | if (!this.options.expandData) { 169 | removeKeys.push("_id", "_rev"); 170 | } 171 | return Object.assign({}, idObj, lodash_omit_1.default(item, removeKeys)); 172 | } 173 | async _returnMap(database, query, errorMessage, removeArray = true, paging = false) { 174 | const cursor = (await database 175 | .query(query, { count: paging, options: { fullCount: paging } }) 176 | .catch(error => { 177 | if (error && 178 | error.isArangoError && 179 | error.errorNum === 1202 && 180 | errorMessage) { 181 | throw new errors_1.NotFound(errorMessage); 182 | } 183 | else { 184 | throw error; 185 | } 186 | })); 187 | const result = await cursor.map(item => this.fixKeyReturn(item)); 188 | if (result.length === 0 && errorMessage) { 189 | throw new errors_1.NotFound(errorMessage); 190 | } 191 | if (paging) { 192 | return { 193 | total: cursor.extra.stats.fullCount, 194 | data: result 195 | }; 196 | } 197 | return result.length > 1 || !removeArray ? result : result[0]; 198 | } 199 | async find(params) { 200 | const { database, collection } = await this.connect(); 201 | params = this._injectPagination(params); 202 | const queryBuilder = new queryBuilder_1.QueryBuilder(params); 203 | const colVar = queryBuilder.addBindVar(collection.name, true); 204 | const query = { 205 | query: ` 206 | FOR doc IN ${colVar} 207 | ${queryBuilder.filter} 208 | ${queryBuilder.sort} 209 | ${queryBuilder.limit} 210 | ${queryBuilder.returnFilter} 211 | `, 212 | bindVars: queryBuilder.bindVars 213 | }; 214 | const result = (await this._returnMap(database, query, undefined, false, !lodash_isempty_1.default(this._paginate))); 215 | if (!lodash_isempty_1.default(this._paginate)) { 216 | return { 217 | total: result.total, 218 | // @ts-ignore Will be defined based on previous logic 219 | limit: params.query.$limit || 0, 220 | // @ts-ignore Will be defined based on previous logic 221 | skip: params.query.$skip || 0, 222 | data: result.data 223 | }; 224 | } 225 | return result; 226 | } 227 | async get(id, params) { 228 | const { database, collection } = await this.connect(); 229 | const queryBuilder = new queryBuilder_1.QueryBuilder(params); 230 | const query = { 231 | query: ` 232 | FOR doc IN ${queryBuilder.addBindVar(collection.name, true)} 233 | FILTER doc._key == ${queryBuilder.addBindVar(id)} 234 | ${queryBuilder.filter} 235 | ${queryBuilder.returnFilter} 236 | `, 237 | bindVars: queryBuilder.bindVars 238 | }; 239 | return this._returnMap(database, query, `No record found for id '${id}'`); 240 | } 241 | async create(data, params) { 242 | data = this.fixKeySend(data); 243 | const { database, collection } = await this.connect(); 244 | const queryBuilder = new queryBuilder_1.QueryBuilder(params); 245 | const query = { 246 | query: ` 247 | FOR item IN ${queryBuilder.addBindVar(data)} 248 | INSERT item IN ${queryBuilder.addBindVar(collection.name, true)} 249 | let doc = NEW 250 | ${queryBuilder.returnFilter} 251 | `, 252 | bindVars: queryBuilder.bindVars 253 | }; 254 | return this._returnMap(database, query); 255 | } 256 | async _replaceOrPatch(fOpt = "REPLACE", id, data, params) { 257 | const { database, collection } = await this.connect(); 258 | const ids = Array.isArray(id) ? id : [id]; 259 | let query; 260 | if (ids.length > 0 && (ids[0] != null || ids[0] != undefined)) { 261 | const queryBuilder = new queryBuilder_1.QueryBuilder(params, "doc", "changed"); 262 | const colRef = queryBuilder.addBindVar(collection.name, true); 263 | query = { 264 | query: ` 265 | FOR doc IN ${queryBuilder.addBindVar(ids)} 266 | ${fOpt} doc WITH ${queryBuilder.addBindVar(data)} IN ${colRef} 267 | LET changed = NEW 268 | ${queryBuilder.returnFilter} 269 | `, 270 | bindVars: queryBuilder.bindVars 271 | }; 272 | } 273 | else { 274 | const queryBuilder = new queryBuilder_1.QueryBuilder(params, "doc", "changed"); 275 | const colRef = queryBuilder.addBindVar(collection.name, true); 276 | query = { 277 | query: ` 278 | FOR doc IN ${colRef} 279 | ${queryBuilder.filter} 280 | ${fOpt} doc WITH ${queryBuilder.addBindVar(data)} IN ${colRef} 281 | LET changed = NEW 282 | ${queryBuilder.returnFilter} 283 | `, 284 | bindVars: queryBuilder.bindVars 285 | }; 286 | } 287 | return this._returnMap(database, query, `No record found for id '${id}'`); 288 | } 289 | async update(id, data, params) { 290 | return this._replaceOrPatch("REPLACE", id, data, params); 291 | } 292 | async patch(id, data, params) { 293 | return this._replaceOrPatch("UPDATE", id, data, params); 294 | } 295 | async remove(id, params) { 296 | // Eliminate null or empty clauses 297 | const ids = Array.isArray(id) ? id : [id]; 298 | // Setup connection & verify 299 | const { database, collection } = await this.connect(); 300 | if (!database) { 301 | throw new Error("Database not initialized"); 302 | } 303 | if (!collection) { 304 | throw new Error("Collection not initialized"); 305 | } 306 | // Build query 307 | let query; 308 | if (id && (!Array.isArray(id) || (Array.isArray(id) && id.length > 0))) { 309 | const queryBuilder = new queryBuilder_1.QueryBuilder(params, "doc", "removed"); 310 | query = { 311 | query: ` 312 | FOR doc IN ${queryBuilder.addBindVar(ids)} 313 | REMOVE doc IN ${queryBuilder.addBindVar(collection.name, true)} 314 | LET removed = OLD 315 | ${queryBuilder.returnFilter} 316 | `, 317 | bindVars: queryBuilder.bindVars 318 | }; 319 | } 320 | else { 321 | const queryBuilder = new queryBuilder_1.QueryBuilder(params, "doc", "removed"); 322 | const colRef = queryBuilder.addBindVar(collection.name, true); 323 | query = { 324 | query: ` 325 | FOR doc IN ${colRef} 326 | ${queryBuilder.filter} 327 | REMOVE doc IN ${colRef} 328 | LET removed = OLD 329 | ${queryBuilder.returnFilter} 330 | `, 331 | bindVars: queryBuilder.bindVars 332 | }; 333 | } 334 | return this._returnMap(database, query); 335 | // let cursor: ArrayCursor; 336 | // cursor = await database.query(query); 337 | // let result: any[] = await cursor.map(item => this.fixKeyReturn(item)); 338 | // return result.length > 1 ? result : result[0]; 339 | } 340 | async setup(app, path) { 341 | await this.connect(); 342 | } 343 | } 344 | exports.DbService = DbService; 345 | function ArangoDbService(options) { 346 | return new DbService(options); 347 | } 348 | exports.default = ArangoDbService; 349 | -------------------------------------------------------------------------------- /mocha.opts: -------------------------------------------------------------------------------- 1 | --recursive test/ 2 | --exit 3 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "feathers-arangodb", 3 | "version": "2.1.6", 4 | "description": "ArangoDB Service/Adapter for FeathersJS", 5 | "homepage": "https://github.com/AnatidaeProject/feathers-arangodb", 6 | "main": "lib/", 7 | "types": "lib/", 8 | "author": "Brian McBride", 9 | "repository": { 10 | "type": "git", 11 | "url": "git://github.com/Brian-McBride/feathers-arangodb.git" 12 | }, 13 | "bugs": { 14 | "url": "https://github.com/Brian-McBride/feathers-arangodb/issues" 15 | }, 16 | "license": "MIT", 17 | "keywords": [ 18 | "feathers", 19 | "feathers-plugin", 20 | "REST", 21 | "Socket.io", 22 | "realtime", 23 | "arango", 24 | "arangodb", 25 | "service" 26 | ], 27 | "scripts": { 28 | "publish": "git push origin --tags && npm run changelog && git push origin", 29 | "changelog": "github_changelog_generator && git add CHANGELOG.md && git commit -am \"Updating changelog\"", 30 | "release:patch": "npm version patch && npm publish", 31 | "release:minor": "npm version minor && npm publish", 32 | "release:major": "npm version major && npm publish", 33 | "coverage": "jest", 34 | "test": "npm run coverage", 35 | "build": "tsc" 36 | }, 37 | "engines": { 38 | "node": ">= 8" 39 | }, 40 | "dependencies": { 41 | "@feathersjs/commons": "^4.0.0", 42 | "@feathersjs/errors": "^3.3.4", 43 | "arangojs": "^6.9.0", 44 | "lodash.get": "^4.4.2", 45 | "lodash.isboolean": "^3.0.3", 46 | "lodash.isempty": "^4.4.0", 47 | "lodash.isnumber": "^3.0.3", 48 | "lodash.isstring": "^4.0.1", 49 | "lodash.omit": "^4.5.0", 50 | "uberproto": "^2.0.4", 51 | "uuid": "^3.3.2" 52 | }, 53 | "devDependencies": { 54 | "@feathersjs/feathers": "^3.2.3", 55 | "@types/feathersjs__errors": "^3.2.1", 56 | "@types/feathersjs__express": "^1.1.4", 57 | "@types/feathersjs__feathers": "^3.1.0", 58 | "@types/feathersjs__socketio": "^3.0.3", 59 | "@types/jest": "^23.3.10", 60 | "@types/lodash.get": "^4.4.4", 61 | "@types/lodash.isboolean": "^3.0.4", 62 | "@types/lodash.isempty": "^4.4.4", 63 | "@types/lodash.isnumber": "^3.0.4", 64 | "@types/lodash.isstring": "^4.0.4", 65 | "@types/lodash.omit": "^4.5.4", 66 | "@types/uuid": "^3.4.4", 67 | "eslint": "^5.9.0", 68 | "jest": "^23.6.0", 69 | "jest-junit": "^6.0.0", 70 | "jest-runner-tslint": "^1.0.5", 71 | "nodemon": "^1.18.7", 72 | "nyc": "^13.1.0", 73 | "prettier": "^1.15.3", 74 | "ts-jest": "^23.10.5", 75 | "ts-node": "^7.0.1", 76 | "tslint": "^5.11.0", 77 | "tslint-config-prettier": "^1.17.0", 78 | "typescript": "^3.2.1" 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /setup_arangodb.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 4 | cd $DIR 5 | 6 | VERSION=3.3.1 7 | NAME=ArangoDB-$VERSION 8 | 9 | if [ ! -d "$DIR/$NAME" ]; then 10 | # download ArangoDB 11 | echo "curl -s -L http://www.arangodb.org/repositories/travisCI/$NAME.tar.gz -o $NAME.tar.gz" 12 | curl -s -L http://www.arangodb.org/repositories/travisCI/$NAME.tar.gz -o $NAME.tar.gz 13 | echo "tar zxf $NAME.tar.gz" 14 | tar zvxf $NAME.tar.gz 15 | fi 16 | 17 | ARCH=$(arch) 18 | PID=$(echo $PPID) 19 | TMP_DIR="/tmp/arangodb.$PID" 20 | PID_FILE="/tmp/arangodb.$PID.pid" 21 | ARANGODB_DIR="$DIR/$NAME" 22 | ARANGOD="${ARANGODB_DIR}/bin/arangod_x86_64" 23 | 24 | # create database directory 25 | mkdir ${TMP_DIR} 26 | 27 | echo "Starting ArangoDB '${ARANGOD}'" 28 | 29 | ${ARANGOD} \ 30 | --database.directory ${TMP_DIR} \ 31 | --configuration none \ 32 | --server.endpoint tcp://127.0.0.1:8529 \ 33 | --javascript.app-path ${ARANGODB_DIR}/js/apps \ 34 | --javascript.startup-directory ${ARANGODB_DIR}/js \ 35 | --database.maximal-journal-size 1048576 \ 36 | --server.authentication false & 37 | 38 | sleep 2 39 | 40 | echo "Check for arangod process" 41 | process=$(ps auxww | grep "bin/arangod" | grep -v grep) 42 | 43 | if [ "x$process" == "x" ]; then 44 | echo "no 'arangod' process found" 45 | echo "ARCH = $ARCH" 46 | exit 1 47 | fi 48 | 49 | echo "Waiting until ArangoDB is ready on port 8529" 50 | 51 | n=0 52 | # timeout value for startup 53 | timeout=60 54 | while [[ (-z `curl -H 'Authorization: Basic cm9vdDo=' -s 'http://127.0.0.1:8529/_api/version' `) && (n -lt timeout) ]] ; do 55 | echo -n "." 56 | sleep 1s 57 | n=$[$n+1] 58 | done 59 | 60 | if [[ n -eq timeout ]]; 61 | then 62 | echo "Could not start ArangoDB. Timeout reached." 63 | exit 1 64 | fi 65 | 66 | 67 | echo "ArangoDB is up" 68 | -------------------------------------------------------------------------------- /src/auto-database.ts: -------------------------------------------------------------------------------- 1 | /* 2 | Extends the ArangoDB Database Class to offer helper functions. 3 | */ 4 | import { Database, DocumentCollection } from "arangojs"; 5 | import { Config } from "arangojs/lib/cjs/connection"; 6 | import { Graph, GraphVertexCollection } from "arangojs/lib/cjs/graph"; 7 | import { ArangoError } from "arangojs/lib/cjs/error"; 8 | 9 | export class AutoDatabse extends Database { 10 | constructor(config?: Config) { 11 | super(config); 12 | } 13 | 14 | /** 15 | * Will asthmatically create a database of the name if it doesn't exist. 16 | * @param databaseName 17 | */ 18 | async autoUseDatabase(databaseName: string): Promise { 19 | const databaseList = await this.listUserDatabases(); 20 | /* istanbul ignore next */ 21 | if (databaseList.indexOf(databaseName) === -1) { 22 | /* istanbul ignore next ArangoDB Driver tests covered in driver*/ 23 | await this.createDatabase(databaseName).catch((err: ArangoError) => { 24 | /* istanbul ignore next Ignoring this type of error*/ 25 | if (err.isArangoError && err.errorNum == 1207) { 26 | // If a database with the same name is created at the same time as another, this can cause a race condition. 27 | // Ignore race conditions and continue. 28 | return true; 29 | } else { 30 | throw err; 31 | } 32 | }); 33 | } 34 | this.useDatabase(databaseName); 35 | return this; 36 | } 37 | 38 | /** 39 | * Will automatically create a graph if one doesn't exist 40 | * @param properties 41 | * @param opts 42 | */ 43 | async autoGraph(properties: any, opts?: any): Promise { 44 | const name = properties.name; 45 | let graph = this.graph(name); 46 | const exists = await graph.exists(); 47 | if (!exists) { 48 | await graph.create(properties).catch((err: ArangoError) => { 49 | /* istanbul ignore next Ignoring this type of error*/ 50 | if (err.isArangoError && err.errorNum == 1207) { 51 | // If a database with the same name is created at the same time as another, this can cause a race condition. 52 | // Ignore race conditions and continue. 53 | return true; 54 | } else { 55 | throw err; 56 | } 57 | }); 58 | } 59 | return graph; 60 | } 61 | 62 | /** 63 | * Will automatically create a collection of the name if it doesn't exist. 64 | * @param collectionName 65 | * @param graphRef 66 | */ 67 | async autoCollection( 68 | collectionName: string, 69 | graphRef?: Graph 70 | ): Promise { 71 | /* istanbul ignore next */ 72 | const collectionList = graphRef 73 | ? await graphRef.listVertexCollections() 74 | : await this.collections(); 75 | /* istanbul ignore next */ 76 | if ( 77 | collectionList.map((item: any) => item.name).indexOf(collectionName) === 78 | -1 79 | ) { 80 | /* istanbul ignore next */ 81 | if (graphRef) { 82 | await graphRef.addVertexCollection(collectionName); 83 | } else { 84 | /* istanbul ignore next */ 85 | await this.collection(collectionName) 86 | .create({ waitForSync: true }) 87 | .catch(err => { 88 | /* istanbul ignore next Ignoring this type of error*/ 89 | if (err.isArangoError && err.errorNum == 1207) { 90 | // If a collection with the same name is created at the same time as another, this can cause a race condition. 91 | // Ignore race conditions and continue. 92 | return true; 93 | } else { 94 | throw err; 95 | } 96 | }); 97 | } 98 | } 99 | return graphRef 100 | ? graphRef.vertexCollection(collectionName) 101 | : this.collection(collectionName); 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { NotFound } from "@feathersjs/errors"; 2 | import { Database, DocumentCollection } from "arangojs"; 3 | import { LoadBalancingStrategy } from "arangojs/lib/async/connection"; 4 | import { AqlQuery } from "arangojs/lib/cjs/aql-query"; 5 | import { ArangoError } from "arangojs/lib/cjs/error"; 6 | import { Graph } from "arangojs/lib/cjs/graph"; 7 | import { 8 | Application, 9 | Id, 10 | NullableId, 11 | Paginated, 12 | Params, 13 | Service 14 | } from "feathersjs__feathers"; 15 | import _isEmpty from "lodash.isempty"; 16 | import isString from "lodash.isstring"; 17 | import omit from "lodash.omit"; 18 | import uuid from "uuid/v4"; 19 | import { AutoDatabse } from "./auto-database"; 20 | import { QueryBuilder } from "./queryBuilder"; 21 | import { GraphVertexCollection } from "arangojs/lib/cjs/graph"; 22 | import { ArrayCursor } from "arangojs/lib/cjs/cursor"; 23 | 24 | export declare type ArangoDbConfig = 25 | | string 26 | | string[] 27 | | Partial<{ 28 | url: string | string[]; 29 | isAbsolute: boolean; 30 | arangoVersion: number; 31 | loadBalancingStrategy: LoadBalancingStrategy; 32 | maxRetries: false | number; 33 | agent: any; 34 | agentOptions: { 35 | [key: string]: any; 36 | }; 37 | headers: { 38 | [key: string]: string; 39 | }; 40 | }>; 41 | 42 | export enum AUTH_TYPES { 43 | BASIC_AUTH = "BASIC_AUTH", 44 | BEARER_AUTH = "BEARER_AUTH" 45 | } 46 | 47 | export declare interface Paginate { 48 | max?: number; 49 | default?: number; 50 | } 51 | 52 | export interface IConnectResponse { 53 | database: AutoDatabse | Database; 54 | collection: DocumentCollection | GraphVertexCollection; 55 | graph?: Graph; 56 | } 57 | 58 | export interface IGraphOptions { 59 | properties?: any; 60 | opts?: { waitForSync?: boolean }; 61 | } 62 | 63 | export interface IOptions { 64 | id?: string; 65 | expandData?: boolean; 66 | collection: 67 | | DocumentCollection 68 | | GraphVertexCollection 69 | | string 70 | | Promise; 71 | database: AutoDatabse | Database | string | Promise; 72 | graph?: Graph | IGraphOptions; 73 | authType?: AUTH_TYPES; 74 | username?: string; 75 | password?: string; 76 | token?: string; 77 | dbConfig?: ArangoDbConfig; 78 | events?: any[]; 79 | paginate?: Paginate; 80 | } 81 | 82 | export interface IArangoDbService extends Service { 83 | events: any[]; 84 | paginate: Paginate; 85 | readonly id: string; 86 | readonly database: Database; 87 | readonly collection: DocumentCollection | GraphVertexCollection; 88 | connect(): Promise; 89 | setup(): Promise; 90 | } 91 | 92 | export class DbService { 93 | public events: any[] = []; 94 | public readonly options: IOptions; 95 | private readonly _id: string; 96 | private _database: AutoDatabse | Database | undefined; 97 | private _databasePromise: Promise | undefined; 98 | private _collection: DocumentCollection | GraphVertexCollection | undefined; 99 | private _collectionPromise: 100 | | Promise 101 | | undefined; 102 | private _graph: Graph | undefined; 103 | private _graphPromise: Promise | undefined; 104 | private _paginate: Paginate; 105 | constructor(options: IOptions) { 106 | // Runtime checks 107 | /* istanbul ignore next */ 108 | if (!options.collection) { 109 | throw new Error("A collection reference or name is required"); 110 | } 111 | /* istanbul ignore next */ 112 | if (!options.database) { 113 | throw new Error("A database reference or name is required"); 114 | } 115 | /* istanbul ignore next */ 116 | if (options.id && ["_rev"].indexOf(options.id) !== -1) { 117 | throw new Error(`Database id name of ${options.id} is a reserved key`); 118 | } 119 | this._id = options.id || "_id"; 120 | this.events = options.events || this.events; 121 | this._paginate = options.paginate || {}; 122 | this.options = options; 123 | // Set the database if passed an existing DB 124 | /* istanbul ignore next */ 125 | if (options.database instanceof Promise) { 126 | this._databasePromise = options.database; 127 | } else if (options.database instanceof AutoDatabse) { 128 | this._database = options.database; 129 | } else if (!isString(options.database)) { 130 | throw new Error("Database reference or name (string) is required"); 131 | } 132 | 133 | if (options.graph instanceof Promise) { 134 | this._graphPromise = options.graph; 135 | } 136 | else if (options.graph instanceof Graph) { 137 | this._graph = options.graph; 138 | } 139 | 140 | // Set the collection if it is connected 141 | /* istanbul ignore next */ 142 | if (options.collection instanceof Promise) { 143 | this._collectionPromise = options.collection; 144 | } else if (!isString(options.collection) && !!options.collection) { 145 | this._collection = ( 146 | options.collection 147 | ); 148 | } else if (!options.collection) { 149 | throw new Error("Collection reference or name (string) is required"); 150 | } 151 | } 152 | 153 | public async connect(): Promise { 154 | const { authType, username, password, token, graph, dbConfig } = this.options; 155 | if (this._database === undefined && this._databasePromise) { 156 | this._database = await this._databasePromise; 157 | } 158 | /* istanbul ignore next */ 159 | if (this._database === undefined) { 160 | let db = new AutoDatabse(dbConfig); 161 | switch (authType) { 162 | case AUTH_TYPES.BASIC_AUTH: 163 | db.useBasicAuth(username, password); 164 | break; 165 | case AUTH_TYPES.BEARER_AUTH: 166 | /* istanbul ignore next Testing will assuming working SDK */ 167 | if (token) { 168 | await db.useBearerAuth(token || ""); 169 | } else { 170 | await db.login(username, password); 171 | } 172 | break; 173 | } 174 | await db.autoUseDatabase(this.options.database as string); 175 | this._database = db; 176 | } 177 | 178 | if (!this._graph && this._graphPromise) { 179 | this._graph = await this._graphPromise; 180 | } 181 | 182 | if (graph && !this._graph) { 183 | const { properties, opts } = graph; 184 | if (this._database instanceof AutoDatabse) { 185 | this._graph = await this._database.autoGraph(properties, opts); 186 | } else { 187 | throw `Auto creation of graphs requires instance of AutoDatabase`; 188 | } 189 | } 190 | 191 | /* istanbul ignore next This doens't need to be tested */ 192 | if (this._collectionPromise) { 193 | this._collection = await this._collectionPromise; 194 | } 195 | 196 | if (this._collection === undefined) { 197 | if (this._database instanceof AutoDatabse) { 198 | this._collection = await this._database.autoCollection(this.options 199 | .collection as string); 200 | } else { 201 | throw `Auto creation of collections requires instance of AutoDatabase`; 202 | } 203 | } 204 | 205 | return { 206 | database: this._database, 207 | collection: this._collection 208 | }; 209 | } 210 | 211 | get id(): string { 212 | return this._id; 213 | } 214 | 215 | get database(): AutoDatabse | Database | undefined { 216 | return this._database; 217 | } 218 | 219 | get collection(): DocumentCollection | GraphVertexCollection | undefined { 220 | return this._collection; 221 | } 222 | 223 | get paginate(): Paginate { 224 | return this._paginate; 225 | } 226 | 227 | set paginate(option: Paginate) { 228 | this._paginate = option || this._paginate; 229 | } 230 | 231 | public _injectPagination(params: Params): Params { 232 | params = params || {}; 233 | if (_isEmpty(this._paginate) || (params && params.paginate) === false) { 234 | return params; 235 | } 236 | const paginate = (params.paginate as Paginate) || this._paginate; 237 | params.query = params.query || {}; 238 | let limit = parseInt(params.query.$limit); 239 | limit = 240 | isNaN(limit) || limit === null 241 | ? paginate.default || paginate.max || 0 242 | : limit; 243 | limit = Math.min(limit, paginate.max || paginate.default || limit); 244 | params.query.$limit = limit; 245 | return params; 246 | } 247 | 248 | public fixKeySend(data: T | T[]): Partial | Array> { 249 | const aData: any[] = Array.isArray(data) ? data : [data]; 250 | if (aData.length < 1) { 251 | return aData; 252 | } 253 | return aData.map((item: any) => { 254 | const id = item[this._id] || uuid(); 255 | return { _key: id, ...omit(item, "_id", "_rev", "_key") }; 256 | }) as Array>; 257 | } 258 | 259 | public fixKeyReturn(item: any): any { 260 | const idObj: any = {}; 261 | idObj[this._id] = item._key; 262 | const removeKeys = [this._id, "_key"]; 263 | if (!this.options.expandData) { 264 | removeKeys.push("_id", "_rev"); 265 | } 266 | return { ...idObj, ...omit(item, removeKeys) }; 267 | } 268 | 269 | public async _returnMap( 270 | database: AutoDatabse | Database, 271 | query: AqlQuery, 272 | errorMessage?: string, 273 | removeArray = true, 274 | paging = false 275 | ) { 276 | const cursor: ArrayCursor = ( 277 | await database 278 | .query(query, { count: paging, options: { fullCount: paging } }) 279 | .catch(error => { 280 | if ( 281 | error && 282 | error.isArangoError && 283 | error.errorNum === 1202 && 284 | errorMessage 285 | ) { 286 | throw new NotFound(errorMessage); 287 | } else { 288 | throw error; 289 | } 290 | }) 291 | ); 292 | const result: any[] = await cursor.map(item => this.fixKeyReturn(item)); 293 | if (result.length === 0 && errorMessage) { 294 | throw new NotFound(errorMessage); 295 | } 296 | if (paging) { 297 | return { 298 | total: cursor.extra.stats.fullCount, 299 | data: result 300 | }; 301 | } 302 | return result.length > 1 || !removeArray ? result : result[0]; 303 | } 304 | 305 | public async find(params: Params): Promise> { 306 | const { database, collection } = await this.connect(); 307 | params = this._injectPagination(params); 308 | const queryBuilder = new QueryBuilder(params); 309 | const colVar = queryBuilder.addBindVar(collection.name, true); 310 | const query: AqlQuery = { 311 | query: ` 312 | FOR doc IN ${colVar} 313 | ${queryBuilder.filter} 314 | ${queryBuilder.sort} 315 | ${queryBuilder.limit} 316 | ${queryBuilder.returnFilter} 317 | `, 318 | bindVars: queryBuilder.bindVars 319 | }; 320 | const result = (await this._returnMap( 321 | database, 322 | query, 323 | undefined, 324 | false, 325 | !_isEmpty(this._paginate) 326 | )) as any; 327 | if (!_isEmpty(this._paginate)) { 328 | return { 329 | total: result.total, 330 | // @ts-ignore Will be defined based on previous logic 331 | limit: params.query.$limit || 0, 332 | // @ts-ignore Will be defined based on previous logic 333 | skip: params.query.$skip || 0, 334 | data: result.data 335 | }; 336 | } 337 | return result; 338 | } 339 | 340 | public async get(id: Id, params: Params) { 341 | const { database, collection } = await this.connect(); 342 | const queryBuilder = new QueryBuilder(params); 343 | const query: AqlQuery = { 344 | query: ` 345 | FOR doc IN ${queryBuilder.addBindVar(collection.name, true)} 346 | FILTER doc._key == ${queryBuilder.addBindVar(id)} 347 | ${queryBuilder.filter} 348 | ${queryBuilder.returnFilter} 349 | `, 350 | bindVars: queryBuilder.bindVars 351 | }; 352 | return this._returnMap(database, query, `No record found for id '${id}'`); 353 | } 354 | 355 | public async create( 356 | data: Partial | Array>, 357 | params: Params 358 | ) { 359 | data = this.fixKeySend(data); 360 | const { database, collection } = await this.connect(); 361 | const queryBuilder = new QueryBuilder(params); 362 | const query: AqlQuery = { 363 | query: ` 364 | FOR item IN ${queryBuilder.addBindVar(data)} 365 | INSERT item IN ${queryBuilder.addBindVar(collection.name, true)} 366 | let doc = NEW 367 | ${queryBuilder.returnFilter} 368 | `, 369 | bindVars: queryBuilder.bindVars 370 | }; 371 | return this._returnMap(database, query); 372 | } 373 | 374 | public async _replaceOrPatch( 375 | fOpt = "REPLACE", 376 | id: NullableId | NullableId[], 377 | data: Partial, 378 | params: Params 379 | ) { 380 | const { database, collection } = await this.connect(); 381 | const ids: NullableId[] = Array.isArray(id) ? id : [id]; 382 | let query: AqlQuery; 383 | if (ids.length > 0 && (ids[0] != null || ids[0] != undefined)) { 384 | const queryBuilder = new QueryBuilder(params, "doc", "changed"); 385 | const colRef = queryBuilder.addBindVar(collection.name, true); 386 | query = { 387 | query: ` 388 | FOR doc IN ${queryBuilder.addBindVar(ids)} 389 | ${fOpt} doc WITH ${queryBuilder.addBindVar(data)} IN ${colRef} 390 | LET changed = NEW 391 | ${queryBuilder.returnFilter} 392 | `, 393 | bindVars: queryBuilder.bindVars 394 | }; 395 | } else { 396 | const queryBuilder = new QueryBuilder(params, "doc", "changed"); 397 | const colRef = queryBuilder.addBindVar(collection.name, true); 398 | query = { 399 | query: ` 400 | FOR doc IN ${colRef} 401 | ${queryBuilder.filter} 402 | ${fOpt} doc WITH ${queryBuilder.addBindVar(data)} IN ${colRef} 403 | LET changed = NEW 404 | ${queryBuilder.returnFilter} 405 | `, 406 | bindVars: queryBuilder.bindVars 407 | }; 408 | } 409 | return this._returnMap(database, query, `No record found for id '${id}'`); 410 | } 411 | 412 | public async update( 413 | id: NullableId | NullableId[], 414 | data: Partial, 415 | params: Params 416 | ) { 417 | return this._replaceOrPatch("REPLACE", id, data, params); 418 | } 419 | 420 | public async patch( 421 | id: NullableId | NullableId[], 422 | data: Partial, 423 | params: Params 424 | ) { 425 | return this._replaceOrPatch("UPDATE", id, data, params); 426 | } 427 | 428 | public async remove(id: NullableId | NullableId[], params: Params) { 429 | // Eliminate null or empty clauses 430 | const ids: NullableId[] = Array.isArray(id) ? id : [id]; 431 | // Setup connection & verify 432 | const { database, collection } = await this.connect(); 433 | if (!database) { 434 | throw new Error("Database not initialized"); 435 | } 436 | if (!collection) { 437 | throw new Error("Collection not initialized"); 438 | } 439 | // Build query 440 | let query: AqlQuery; 441 | if (id && (!Array.isArray(id) || (Array.isArray(id) && id.length > 0))) { 442 | const queryBuilder = new QueryBuilder(params, "doc", "removed"); 443 | query = { 444 | query: ` 445 | FOR doc IN ${queryBuilder.addBindVar(ids)} 446 | REMOVE doc IN ${queryBuilder.addBindVar(collection.name, true)} 447 | LET removed = OLD 448 | ${queryBuilder.returnFilter} 449 | `, 450 | bindVars: queryBuilder.bindVars 451 | }; 452 | } else { 453 | const queryBuilder = new QueryBuilder(params, "doc", "removed"); 454 | const colRef = queryBuilder.addBindVar(collection.name, true); 455 | query = { 456 | query: ` 457 | FOR doc IN ${colRef} 458 | ${queryBuilder.filter} 459 | REMOVE doc IN ${colRef} 460 | LET removed = OLD 461 | ${queryBuilder.returnFilter} 462 | `, 463 | bindVars: queryBuilder.bindVars 464 | }; 465 | } 466 | 467 | return this._returnMap(database, query); 468 | // let cursor: ArrayCursor; 469 | // cursor = await database.query(query); 470 | // let result: any[] = await cursor.map(item => this.fixKeyReturn(item)); 471 | // return result.length > 1 ? result : result[0]; 472 | } 473 | 474 | public async setup(app: Application, path: string) { 475 | await this.connect(); 476 | } 477 | } 478 | 479 | export default function ArangoDbService(options: IOptions): DbService | any { 480 | return new DbService(options); 481 | } 482 | -------------------------------------------------------------------------------- /src/queryBuilder.ts: -------------------------------------------------------------------------------- 1 | import _isString from "lodash.isstring"; 2 | import _isNumber from "lodash.isnumber"; 3 | import _isBoolean from "lodash.isboolean"; 4 | import _omit from "lodash.omit"; 5 | import _get from "lodash.get"; 6 | import _isEmpty from "lodash.isempty"; 7 | import { Params } from "@feathersjs/feathers"; 8 | 9 | export class QueryBuilder { 10 | reserved = [ 11 | "$select", 12 | "$limit", 13 | "$skip", 14 | "$sort", 15 | "$in", 16 | "$nin", 17 | "$lt", 18 | "$lte", 19 | "$gt", 20 | "$gte", 21 | "$ne", 22 | "$not", 23 | "$or", 24 | "$aql" 25 | ]; 26 | bindVars: { [key: string]: any } = {}; 27 | maxLimit = 1000000000; // A billion records... 28 | _limit: number = -1; 29 | _countNeed: string = ""; 30 | _skip: number = 0; 31 | sort: string = ""; 32 | filter: string = ""; 33 | returnFilter: string = ""; 34 | varCount: number = 0; 35 | 36 | constructor( 37 | params: Params, 38 | docName: string = "doc", 39 | returnDocName: string = "doc" 40 | ) { 41 | this.create(params, docName, returnDocName); 42 | } 43 | 44 | addBindVar(value: any, collection = false): string { 45 | const varName = (collection ? "@" : "") + `value${this.varCount++}`; 46 | this.bindVars[varName] = value; 47 | return `@${varName}`; 48 | } 49 | 50 | selectBuilder(params: Params, docName: string = "doc"): string { 51 | let filter = `RETURN ${docName}`; 52 | const select = _get(params, "query.$select", null); 53 | if (select && select.length > 0) { 54 | filter = `RETURN {"_key":${docName}._key,`; 55 | select.forEach((key: string, i: number) => { 56 | filter += `"${key}":${docName}.${key}`; 57 | filter += select.length > i + 1 ? "," : ""; 58 | }); 59 | filter += "}"; 60 | } 61 | this.returnFilter = filter; 62 | return filter; 63 | } 64 | 65 | create( 66 | params: Params, 67 | docName: string = "doc", 68 | returnDocName: string = "doc" 69 | ): QueryBuilder { 70 | this.selectBuilder(params, returnDocName); 71 | const query = _get(params, "query", null); 72 | this._runCheck(query, docName, returnDocName); 73 | return this; 74 | } 75 | 76 | _runCheck( 77 | query: any, 78 | docName: string = "doc", 79 | returnDocName: string = "doc", 80 | operator = "AND" 81 | ) { 82 | if (!query || _isEmpty(query)) return this; 83 | Object.keys(query).forEach((key: string) => { 84 | const testKey = key.toLowerCase(); 85 | const value = query[key]; 86 | switch (testKey) { 87 | case "$or": 88 | const aValue = Array.isArray(value) ? value : [value]; 89 | aValue.forEach(item => 90 | this._runCheck(item, docName, returnDocName, "OR") 91 | ); 92 | break; 93 | case "$select": 94 | break; 95 | case "$limit": 96 | this._limit = parseInt(value); 97 | break; 98 | case "$skip": 99 | this._skip = parseInt(value); 100 | break; 101 | case "$sort": 102 | this.addSort(value, docName); 103 | break; 104 | default: 105 | this.addFilter(key, value, docName, operator); 106 | } 107 | }); 108 | } 109 | 110 | get limit(): string { 111 | if (this._limit === -1 && this._skip === 0) return ""; 112 | const realLimit = this._limit > -1 ? this._limit : this.maxLimit; 113 | return `LIMIT ${this._skip}, ${realLimit}`; 114 | } 115 | 116 | addSort(sort: any, docName: string = "doc") { 117 | Object.keys(sort).forEach(key => { 118 | /* istanbul ignore next */ 119 | if (this.sort === "") { 120 | this.sort = "SORT "; 121 | } else { 122 | this.sort += ", "; 123 | } 124 | this.sort += ` ${docName}.${key} ${ 125 | parseInt(sort[key]) === -1 ? "DESC" : "" 126 | }`; 127 | }); 128 | } 129 | 130 | addFilter( 131 | key: string, 132 | value: any, 133 | docName: string = "doc", 134 | operator = "AND" 135 | ): QueryBuilder { 136 | const stack = ( 137 | fOpt: string, 138 | arg1: string, 139 | arg2: string, 140 | equality: string 141 | ) => { 142 | this.filter += ` ${arg1} ${equality} ${arg2} `; 143 | delete value[fOpt]; 144 | return this.addFilter(key, value, docName, operator); 145 | }; 146 | 147 | if (typeof value === "object" && _isEmpty(value)) return this; 148 | if (this.filter === "") { 149 | this.filter = "FILTER"; 150 | } else { 151 | this.filter += operator; 152 | operator = "AND"; 153 | } 154 | if (_isString(value) || _isBoolean(value) || _isNumber(value)) { 155 | this.filter += ` ${docName}.${key} == ${this.addBindVar(value)} `; 156 | return this; 157 | } else if (typeof value === "object" && value["$in"]) { 158 | return stack( 159 | "$in", 160 | this.addBindVar(value["$in"]), 161 | `${docName}.${key}`, 162 | "ANY ==" 163 | ); 164 | } else if (typeof value === "object" && value["$nin"]) { 165 | return stack( 166 | "$nin", 167 | this.addBindVar(value["$nin"]), 168 | `${docName}.${key}`, 169 | "NONE ==" 170 | ); 171 | } else if (typeof value === "object" && value["$not"]) { 172 | return stack( 173 | "$not", 174 | `${docName}.${key}`, 175 | this.addBindVar(value["$not"]), 176 | "!=" 177 | ); 178 | } else if (typeof value === "object" && value["$lt"]) { 179 | return stack( 180 | "$lt", 181 | `${docName}.${key}`, 182 | this.addBindVar(value["$lt"]), 183 | "<" 184 | ); 185 | } else if (typeof value === "object" && value["$lte"]) { 186 | return stack( 187 | "$lte", 188 | `${docName}.${key}`, 189 | this.addBindVar(value["$lte"]), 190 | "<=" 191 | ); 192 | } else if (typeof value === "object" && value["$gt"]) { 193 | return stack( 194 | "$gt", 195 | `${docName}.${key}`, 196 | this.addBindVar(value["$gt"]), 197 | ">" 198 | ); 199 | } else if (typeof value === "object" && value["$gte"]) { 200 | return stack( 201 | "$gte", 202 | `${docName}.${key}`, 203 | this.addBindVar(value["$gte"]), 204 | ">=" 205 | ); 206 | } else if (typeof value === "object" && value["$ne"]) { 207 | return stack( 208 | "$ne", 209 | `${docName}.${key}`, 210 | this.addBindVar(value["$ne"]), 211 | "!=" 212 | ); 213 | } else { 214 | /* istanbul ignore next */ 215 | const leftovers = _omit(value, this.reserved); 216 | /* istanbul ignore next */ 217 | if (!_isEmpty(leftovers)) 218 | this._runCheck(value, docName + `.${key}`, "AND"); 219 | } 220 | /* istanbul ignore next */ 221 | return this; 222 | } 223 | } 224 | -------------------------------------------------------------------------------- /tests/auto-database.tests.ts: -------------------------------------------------------------------------------- 1 | import { AutoDatabse } from '../src/auto-database'; 2 | import { GraphVertexCollection } from "arangojs/lib/cjs/graph"; 3 | 4 | describe('AutoDatabase Class', () => { 5 | const db = new AutoDatabse(); 6 | const testDatabase = 'TEST_AUTO_DB'; 7 | const testCollection = 'TEST_AUTO_COL'; 8 | const testGraph = { 9 | name: 'TEST_AUTO_GRAPH', 10 | edgeDefinitions: [{ 11 | collection: 'edges', 12 | from: ['TEST_AUTO_COL'], 13 | to: ['TEST_AUTO_COL'] 14 | }] 15 | }; 16 | const testUser = 'root'; 17 | const testPass = 'root'; 18 | 19 | beforeAll(async (done) => { 20 | db.useBasicAuth(testUser, testPass); 21 | done(); 22 | }); 23 | 24 | afterAll(async (done) => { 25 | const database = new AutoDatabse(); 26 | database.useBasicAuth(testUser, testPass); 27 | await database.dropDatabase(testDatabase); 28 | done(); 29 | }); 30 | 31 | 32 | it('Creates a database when needed', async () => { 33 | await db.autoUseDatabase(testDatabase); 34 | const info = await db.get(); 35 | expect(info.name).toEqual(testDatabase); 36 | }); 37 | 38 | it('Uses found database when needed', async () => { 39 | await db.autoUseDatabase(testDatabase); 40 | const info = await db.get(); 41 | expect(info.name).toEqual(testDatabase); 42 | }); 43 | 44 | it('Creates a collection when needed', async () => { 45 | const col = await db.autoCollection(testCollection); 46 | const info = await col.get(); 47 | expect(info.name).toEqual(testCollection); 48 | }); 49 | 50 | it('Uses found collection when needed', async () => { 51 | const col = await db.autoCollection(testCollection); 52 | const info = await col.get(); 53 | expect(info.name).toEqual(testCollection); 54 | }); 55 | 56 | it('Creates a graph when needed', async () => { 57 | const graph = await db.autoGraph(testGraph); 58 | const info = await graph.get(); 59 | expect(info.name).toEqual(testGraph.name); 60 | }); 61 | 62 | it('Uses found graph when needed', async () => { 63 | const graph = await db.autoGraph(testGraph); 64 | const info = await graph.get(); 65 | expect(info.name).toEqual(testGraph.name); 66 | }); 67 | 68 | it('Uses found graph when needed', async () => { 69 | const graph = await db.autoGraph(testGraph); 70 | const col:any = await db.autoCollection('ANOTHER_TEST_COL', graph); 71 | expect(col.graph.name).toEqual(testGraph.name); 72 | }); 73 | 74 | }); 75 | -------------------------------------------------------------------------------- /tests/feathers.tests.ts: -------------------------------------------------------------------------------- 1 | import feathers from '@feathersjs/feathers'; 2 | import { Application, Service } from 'feathersjs__feathers'; 3 | import { NotFound } from '@feathersjs/errors'; 4 | import ArangoDbService, { IArangoDbService, AUTH_TYPES } from '../src'; 5 | import { AutoDatabse } from '../src/auto-database'; 6 | 7 | const serviceName = 'people'; 8 | const idProp = 'id'; 9 | 10 | describe(`Feathers common tests, ${serviceName} service with \\${idProp}\\ id property `, () => { 11 | const promiseDatabase = 'TEST_PROMISE_DB'; 12 | const testDatabase = 'TEST_DB'; 13 | const testCollection = 'TEST_COL'; 14 | const testUser = 'root'; 15 | const testPass = 'root'; 16 | let app: Application; 17 | let service: IArangoDbService; 18 | let _ids: any = {}; 19 | 20 | beforeAll(async () => { 21 | app = feathers(); 22 | app.use( 23 | `/${serviceName}`, 24 | ArangoDbService({ 25 | id: idProp, 26 | collection: testCollection, 27 | database: testDatabase, 28 | authType: AUTH_TYPES.BASIC_AUTH, 29 | username: testUser, 30 | password: testPass, 31 | events: ['testing'] 32 | }) 33 | ); 34 | service = >app.service(serviceName); 35 | }); 36 | 37 | afterAll(async (done) => { 38 | const database = new AutoDatabse(); 39 | database.useBasicAuth(testUser, testPass); 40 | await database.dropDatabase(testDatabase); 41 | await database.dropDatabase(promiseDatabase); 42 | done(); 43 | }); 44 | 45 | beforeEach(async () => { 46 | const data: any = await service.create({ 47 | name: 'Doug', 48 | age: 32 49 | }); 50 | _ids.Doug = data[idProp]; 51 | }); 52 | 53 | afterEach(async () => { 54 | await service.remove(_ids.Doug).catch(() => {}); 55 | }); 56 | 57 | it('Service connects', async () => { 58 | await service.connect(); 59 | expect(service.database).toBeDefined(); 60 | expect(service.collection).toBeDefined(); 61 | }); 62 | 63 | it('Can connect to a specified database url', async () => { 64 | app.use( 65 | `/tasks`, 66 | ArangoDbService({ 67 | id: idProp, 68 | collection: 'tasks', 69 | database: testDatabase, 70 | authType: AUTH_TYPES.BASIC_AUTH, 71 | username: testUser, 72 | password: testPass, 73 | events: ['testing'], 74 | dbConfig: { 75 | url: 'http://localhost:8529', 76 | } 77 | }) 78 | ); 79 | const otherUrl = >app.service('tasks'); 80 | await otherUrl.connect(); 81 | expect(otherUrl.database).toBeDefined(); 82 | expect(otherUrl.collection).toBeDefined(); 83 | }); 84 | 85 | it('Service setup check', async () => { 86 | await service.setup(); 87 | expect(service.database).toBeDefined(); 88 | expect(service.collection).toBeDefined(); 89 | }); 90 | 91 | it('works', async () => { 92 | const something = true; 93 | expect(service).toBeDefined(); 94 | expect(something).toBeTruthy(); 95 | }); 96 | 97 | it('sets `id` property on the service', () => { 98 | expect(service.id).toEqual(idProp); 99 | }); 100 | 101 | it('Accepts a promise as a database reference', async () => { 102 | const autoDb = new AutoDatabse(); 103 | autoDb.useBasicAuth(testUser, testPass); 104 | const promiseDb = autoDb.autoUseDatabase(promiseDatabase); 105 | const dbService = ArangoDbService({ 106 | id: idProp, 107 | collection: testCollection, 108 | database: promiseDb 109 | }); 110 | await dbService.connect(); 111 | const info = await dbService.database.get(); 112 | expect(dbService.database).toBeDefined(); 113 | expect(dbService.collection).toBeDefined(); 114 | expect(info.name).toEqual(promiseDatabase); 115 | }); 116 | 117 | it('Accepts a promise as a collection reference', async () => { 118 | const autoDb = new AutoDatabse(); 119 | autoDb.useBasicAuth(testUser, testPass); 120 | const db = await autoDb.autoUseDatabase(promiseDatabase); 121 | const collectionPromise = autoDb.autoCollection('PROMISE_COLLECTION'); 122 | const dbService = ArangoDbService({ 123 | id: idProp, 124 | collection: collectionPromise, 125 | database: db 126 | }); 127 | await dbService.connect(); 128 | const info = await dbService.collection.get(); 129 | expect(dbService.database).toBeDefined(); 130 | expect(dbService.collection).toBeDefined(); 131 | expect(info.name).toEqual('PROMISE_COLLECTION'); 132 | }); 133 | 134 | it('Accepts string as database & collection', async () => { 135 | const dbService = ArangoDbService({ 136 | id: idProp, 137 | collection: testCollection, 138 | database: testDatabase, 139 | authType: AUTH_TYPES.BASIC_AUTH, 140 | username: testUser, 141 | password: testPass 142 | }); 143 | await dbService.connect(); 144 | expect(dbService.database).toBeDefined(); 145 | expect(dbService.collection).toBeDefined(); 146 | }); 147 | 148 | it('Accepts a database & collection as arguments', async () => { 149 | const database = new AutoDatabse(); 150 | database.useBasicAuth(testUser, testPass); 151 | database.useDatabase(testDatabase); 152 | const collection = await database.collection(testCollection); 153 | const dbService = ArangoDbService({ 154 | database, 155 | collection 156 | }); 157 | expect(dbService.database).toBeDefined(); 158 | expect(dbService.collection).toBeDefined(); 159 | }); 160 | 161 | it('sets `events` property from options', () => { 162 | expect(service.events.indexOf('testing')).not.toEqual(-1); 163 | }); 164 | 165 | describe('extend', () => { 166 | it('extends and uses extended method', async done => { 167 | const now = new Date().getTime(); 168 | // @ts-ignore Extend added inside feathersJS via Uberproto 169 | const extended = service.extend({ 170 | create: function create(data: any) { 171 | data.time = now; 172 | return this._super.apply(this, arguments); 173 | } 174 | }); 175 | const createResult = await extended.create({ name: 'Dave' }); 176 | const removeResult = await extended.remove(createResult[idProp]); 177 | expect(removeResult.time).toEqual(now); 178 | done(); 179 | }); 180 | }); 181 | 182 | describe('get', () => { 183 | 184 | it('returns an instance that exists', async () => { 185 | const result = await service.get(_ids.Doug); 186 | expect(result[idProp].toString()).toEqual(_ids.Doug.toString()); 187 | expect(result.name).toEqual('Doug'); 188 | expect(result.age).toEqual(32); 189 | }); 190 | 191 | it('supports $select', async () => { 192 | const result = await service.get(_ids.Doug, { 193 | query: { $select: ['name'] } 194 | }); 195 | expect(result[idProp]).toEqual(_ids.Doug); 196 | expect(result.name).toEqual('Doug'); 197 | expect(result.age).toBeUndefined(); 198 | }); 199 | 200 | it('returns NotFound error for non-existing id', done => { 201 | const badId = '568225fbfe21222432e836ff'; 202 | service 203 | .get(badId) 204 | .then(() => { 205 | throw Error('Should NOT succeed!!!'); 206 | }) 207 | .catch(error => { 208 | expect(error instanceof NotFound).toBeTruthy(); 209 | expect(error.message).toEqual(`No record found for id '${badId}'`); 210 | done(); 211 | }); 212 | }); 213 | }); 214 | 215 | describe('remove', () => { 216 | 217 | it('deletes an existing instance and returns the deleted instance', async () => { 218 | const result = await service.remove(_ids.Doug); 219 | expect(result.name).toEqual('Doug'); 220 | }); 221 | 222 | it('deletes an existing instance supports $select', async () => { 223 | const result = await service.remove(_ids.Doug, {query: { $select: ['name']}}); 224 | expect(result[idProp]).toEqual(_ids.Doug); 225 | expect(result.name).toEqual('Doug'); 226 | expect(result.age).toBeUndefined(); 227 | }); 228 | 229 | it('deletes multiple instances', async () => { 230 | await service.create({name: 'Dave', age: 29, created: true}); 231 | await service.create({name: 'David', age: 48, created: true}); 232 | const result = await service.remove(null, {query: { created: true }}); 233 | const names = result.map((person:any) => person.name); 234 | expect(names.indexOf('Dave')).toBeGreaterThan(-1); 235 | expect(names.indexOf('David')).toBeGreaterThan(-1); 236 | }) 237 | }); 238 | 239 | describe('find', () => { 240 | // Doug 32, Bob 25, ALice 19 241 | beforeEach(async () => { 242 | const bob = await service.create({ name: 'Bob', age: 25 }); 243 | _ids.Bob = bob[idProp]; 244 | const alice = await service.create({ name: 'Alice', age: 19 }); 245 | _ids.Alice = alice[idProp]; 246 | }); 247 | 248 | afterEach(async () => { 249 | await service.remove(_ids.Bob); 250 | await service.remove(_ids.Alice); 251 | }); 252 | 253 | it('returns all items', async () => { 254 | const result = <[any]> await service.find(); 255 | expect(Array.isArray(result)).toBeTruthy(); 256 | expect(result.length).toEqual(3); 257 | }); 258 | 259 | it('filters results by a single parameter', async () => { 260 | const result = <[any]>await service.find({ query: { name: 'Alice' } }); 261 | expect(Array.isArray(result)).toBeTruthy(); 262 | expect(result.length).toEqual(1); 263 | expect(result[0].name).toEqual('Alice'); 264 | }); 265 | 266 | it('filters results by multiple parameters', async () => { 267 | // TODO This is a POOR test. Should be strengthened by having more than one age 19 or Alice 268 | const result = <[any]>await service.find({ query: { name: 'Alice', age: 19 } }); 269 | expect(Array.isArray(result)).toBeTruthy(); 270 | expect(result.length).toEqual(1); 271 | expect(result[0].name).toEqual('Alice'); 272 | }); 273 | 274 | describe('special filters', () => { 275 | 276 | it('can $sort', async () => { 277 | const params = { 278 | query: { $sort: { name: 1 } } 279 | }; 280 | const result = >await service.find(params); 281 | expect(result.length).toEqual(3); 282 | expect(result[0].name).toEqual('Alice'); 283 | expect(result[1].name).toEqual('Bob'); 284 | expect(result[2].name).toEqual('Doug'); 285 | }); 286 | 287 | it('can $sort with strings', async () => { 288 | const params = { 289 | query: { $sort: { name: '1' } } 290 | }; 291 | const result = >await service.find(params); 292 | expect(result.length).toEqual(3); 293 | expect(result[0].name).toEqual('Alice'); 294 | expect(result[1].name).toEqual('Bob'); 295 | expect(result[2].name).toEqual('Doug'); 296 | }); 297 | 298 | it('can $limit', async () => { 299 | const params = { 300 | query: { $limit: 2 } 301 | }; 302 | const result = await service.find(params); 303 | expect(result.length).toEqual(2); 304 | }); 305 | 306 | it('can $limit 0', async () => { 307 | const params = { 308 | query: { $limit: 0 } 309 | }; 310 | const result = await service.find(params); 311 | expect(result.length).toEqual(0); 312 | }); 313 | 314 | it('can $skip', async () => { 315 | const params = { 316 | query: { $sort: { name: 1 }, $skip: 1 } 317 | }; 318 | const result = await service.find(params); 319 | expect(result.length).toEqual(2); 320 | expect(result[0].name).toEqual('Bob'); 321 | expect(result[1].name).toEqual('Doug'); 322 | }); 323 | 324 | it('can $select', async () => { 325 | const params = { 326 | query: { name: 'Alice', $select: ['name'] } 327 | }; 328 | const result = await service.find(params); 329 | expect(result.length).toEqual(1); 330 | expect(result[0].name).toEqual('Alice'); 331 | expect(result[0].age).toBeUndefined(); 332 | }); 333 | 334 | it('can $or', async () => { 335 | const params = { 336 | query: { $or: [{ name: 'Alice' }, { name: 'Bob' }], $sort: { name: 1 } } 337 | }; 338 | const result = await service.find(params); 339 | expect(result.length).toEqual(2); 340 | expect(result[0].name).toEqual('Alice'); 341 | expect(result[1].name).toEqual('Bob'); 342 | }); 343 | 344 | it('can $not', async () => { 345 | const params = { 346 | query: { age: { $not: 19 }, name: { $not: 'Doug' } } 347 | }; 348 | const result = await service.find(params); 349 | expect(result.length).toEqual(1); 350 | expect(result[0].name).toEqual('Bob'); 351 | }); 352 | 353 | it('can $in', async () => { 354 | const params = { 355 | query: { name: { $in: ['Alice', 'Bob'] }, $sort: { name: 1 } } 356 | }; 357 | const result = await service.find(params); 358 | expect(result.length).toEqual(2); 359 | expect(result[0].name).toEqual('Alice'); 360 | expect(result[1].name).toEqual('Bob'); 361 | }); 362 | 363 | it('can $nin', async () => { 364 | const params = { 365 | query: { name: { $nin: ['Alice', 'Bob'] } } 366 | }; 367 | const result = await service.find(params); 368 | expect(result.length).toEqual(1); 369 | expect(result[0].name).toEqual('Doug'); 370 | }); 371 | 372 | it('can $lt', async () => { 373 | const params = { 374 | query: { age: { $lt: 30 }, $sort: { name: 1 } } 375 | }; 376 | const result = await service.find(params); 377 | expect(result.length).toEqual(2); 378 | expect(result[0].name).toEqual('Alice'); 379 | expect(result[1].name).toEqual('Bob'); 380 | }); 381 | 382 | it('can $lte', async () => { 383 | const params = { 384 | query: { age: { $lte: 25 }, $sort: { name: 1 } } 385 | }; 386 | const result = await service.find(params); 387 | expect(result.length).toEqual(2); 388 | expect(result[0].name).toEqual('Alice'); 389 | expect(result[1].name).toEqual('Bob'); 390 | }); 391 | 392 | it('can $gt', async () => { 393 | const params = { 394 | query: { age: { $gt: 30 }, $sort: { name: 1 } } 395 | }; 396 | const result = await service.find(params); 397 | expect(result.length).toEqual(1); 398 | expect(result[0].name).toEqual('Doug'); 399 | }); 400 | 401 | it('can $gte', async () => { 402 | const params = { 403 | query: { age: { $gte: 25 }, $sort: { name: 1 } } 404 | }; 405 | const result = await service.find(params); 406 | expect(result.length).toEqual(2); 407 | expect(result[0].name).toEqual('Bob'); 408 | expect(result[1].name).toEqual('Doug'); 409 | }); 410 | 411 | it('can $ne', async () => { 412 | const params = { 413 | query: { age: { $ne: 25 }, $sort: { name: 1 } } 414 | }; 415 | const result = await service.find(params); 416 | expect(result.length).toEqual(2); 417 | expect(result[0].name).toEqual('Alice'); 418 | expect(result[1].name).toEqual('Doug'); 419 | }); 420 | 421 | it('can $gt and $lt and $sort', async () => { 422 | const params = { 423 | query: { age: { $gt: 18, $lt: 30 }, $sort: { name: 1 } } 424 | }; 425 | const result = await service.find(params); 426 | expect(result.length).toEqual(2); 427 | expect(result[0].name).toEqual('Alice'); 428 | expect(result[1].name).toEqual('Bob'); 429 | }); 430 | 431 | it('can handle nested $or queries and $sort', async () => { 432 | const params = { 433 | query: { 434 | $or: [{ name: 'Doug' }, { 435 | age: { 436 | $gte: 18, 437 | $lt: 25 438 | } 439 | }], 440 | $sort: { name: 1 } 441 | } 442 | }; 443 | const result = await service.find(params); 444 | expect(result.length).toEqual(2); 445 | expect(result[0].name).toEqual('Alice'); 446 | expect(result[1].name).toEqual('Doug'); 447 | }); 448 | }); 449 | 450 | describe('paginate', () => { 451 | beforeEach(() => { 452 | service.paginate = { default: 1, max: 2 }; 453 | }); 454 | afterEach(() => { 455 | service.paginate = {}; 456 | }); 457 | 458 | it('returns paginated object, paginates by default and shows total', async () => { 459 | const params = { query: { $sort: { name: -1 } } }; 460 | const result = await service.find(params); 461 | expect(result.total).toEqual(3); 462 | expect(result.limit).toEqual(1); 463 | expect(result.skip).toEqual(0); 464 | expect(result.data[0].name).toEqual('Doug'); 465 | }); 466 | 467 | it('paginates max and skips', async () => { 468 | const params = { query: { $skip: 1, $limit: 4, $sort: { name: -1 } } }; 469 | const result = await service.find(params); 470 | expect(result.total).toEqual(3); 471 | expect(result.limit).toEqual(2); 472 | expect(result.skip).toEqual(1); 473 | expect(result.data[0].name).toEqual('Bob'); 474 | expect(result.data[1].name).toEqual('Alice'); 475 | }); 476 | 477 | it('$limit 0 with pagination', async () => { 478 | const params = { query: { $limit: 0 } }; 479 | const result = await service.find(params); 480 | expect(result.data.length).toEqual(0); 481 | }); 482 | 483 | it('allows to override paginate in params', async () => { 484 | const params = { paginate: { default: 2, max: 1000 } }; 485 | const result = await service.find(params); 486 | expect(result.limit).toEqual(2); 487 | expect(result.skip).toEqual(0); 488 | }); 489 | }); 490 | }); 491 | 492 | describe('update', () => { 493 | 494 | it('replaces an existing instance, does not modify original data', async () => { 495 | const newData:any = { name: 'Dougler'}; 496 | newData[idProp] = _ids.Doug; 497 | const result = await service.update(_ids.Doug, newData); 498 | expect(result[idProp]).toEqual(_ids.Doug); 499 | expect(result.name).toEqual('Dougler'); 500 | expect(result.age).toBeUndefined(); 501 | }); 502 | 503 | it('replaces an existing instance, supports $select', async () => { 504 | const newData:any = { name: 'Dougler', age: 10}; 505 | newData[idProp] = _ids.Doug; 506 | const result = await service.update(_ids.Doug, newData, {query: { $select: ['name'] }}); 507 | expect(result[idProp]).toEqual(_ids.Doug); 508 | expect(result.name).toEqual('Dougler'); 509 | expect(result.age).toBeUndefined(); 510 | }); 511 | 512 | it('returns NotFound error for non-existing id', async (done) => { 513 | const badId = '568225fbfe21222432e836ff'; 514 | const newData:any = { name: 'NotFound'}; 515 | newData[idProp] = badId; 516 | await service.update(badId, newData).catch( error => { 517 | expect(error instanceof NotFound).toBeTruthy(); 518 | expect(error.message).toEqual(`No record found for id '${badId}'`); 519 | done(); 520 | }) 521 | }); 522 | }); 523 | 524 | describe('patch', () => { 525 | it('updates an existing instance, does not modify original data', async () => { 526 | const newData:any = { name: 'PatchDoug'}; 527 | newData[idProp] = _ids.Doug; 528 | const result = await service.patch(_ids.Doug, newData); 529 | expect(result[idProp]).toEqual(_ids.Doug); 530 | expect(result.name).toEqual('PatchDoug'); 531 | expect(result.age).toEqual(32); 532 | }); 533 | 534 | it('updates an existing instance, supports $select', async () => { 535 | const newData:any = { name: 'PatchDoug'}; 536 | newData[idProp] = _ids.Doug; 537 | const result = await service.patch(_ids.Doug, newData, {query: { $select: ['name'] }}); 538 | expect(result[idProp]).toEqual(_ids.Doug); 539 | expect(result.name).toEqual('PatchDoug'); 540 | expect(result.age).toBeUndefined() 541 | }); 542 | 543 | it('patches multiple instances', async (done) => { 544 | const params = { query: { created: true } }; 545 | await service.create({name: 'Dave', age: 29, created: true}); 546 | await service.create({name: 'David', age: 3, created: true}); 547 | const result = await service.patch(null, { age: 2 }, params); 548 | expect(result.length).toEqual(2); 549 | expect(result[0].age).toEqual(2); 550 | expect(result[1].age).toEqual(2); 551 | await service.remove(null, params); 552 | done() 553 | }); 554 | 555 | it('patches multiple instances and returns the actually changed items', async (done) => { 556 | const params = { query: { age: { $lt: 10 } } }; 557 | await service.create({name: 'Dave', age: 8, created: true}); 558 | await service.create({name: 'David', age: 4, created: true}); 559 | const result = await service.patch(null, { age: 2 }, params); 560 | expect(result.length).toEqual(2); 561 | expect(result[0].age).toEqual(2); 562 | expect(result[1].age).toEqual(2); 563 | await service.remove(null, params); 564 | done(); 565 | }); 566 | 567 | it('patches multiple, returns correct items', async (done) => { 568 | await service.create({name: 'Dave', age: 2, created: true}); 569 | await service.create({name: 'David', age: 2, created: true}); 570 | await service.create({name: 'Frank', age: 8, created: true}); 571 | const result = await service.patch(null, { age: 8 }, { query: { age: 2 } }); 572 | expect(result.length).toEqual(2); 573 | expect(result[0].age).toEqual(8); 574 | expect(result[1].age).toEqual(8); 575 | await service.remove(null, { query: { age: 8 } }); 576 | done(); 577 | }); 578 | 579 | it('returns NotFound error for non-existing id', async (done) => { 580 | const badId = '568225fbfe21222432e836ff'; 581 | const newData:any = { name: 'NotFound'}; 582 | newData[idProp] = badId; 583 | await service.patch(badId, newData).catch( error => { 584 | expect(error instanceof NotFound).toBeTruthy(); 585 | expect(error.message).toEqual(`No record found for id '${badId}'`); 586 | done(); 587 | }) 588 | }); 589 | }); 590 | 591 | describe('create', () => { 592 | it('creates a single new instance and returns the created instance', async () => { 593 | const originalData = { name: 'Bill', age: 40 }; 594 | const result = await service.create(originalData); 595 | expect(result).toBeDefined(); 596 | expect(result).toMatchObject(originalData); 597 | await service.remove(result[idProp]); 598 | }); 599 | 600 | it('creates a single new instance, supports $select', async () => { 601 | const originalData = { name: 'William', age: 23 }; 602 | const result = await service.create(originalData, {query: { $select: ['name'] }}); 603 | expect(result).toBeDefined(); 604 | expect(result.name).toEqual('William'); 605 | expect(result.age).toBeUndefined(); 606 | await service.remove(result[idProp]); 607 | }); 608 | 609 | it('creates multiple new instances', async () => { 610 | const originalData = [{ 611 | name: 'Gerald', 612 | age: 18 613 | }, { 614 | name: 'Herald', 615 | age: 18 616 | }]; 617 | const result = await service.create(originalData); 618 | expect(result).toBeDefined(); 619 | expect(Array.isArray(result)).toBeTruthy(); 620 | expect(result[0].name).toEqual('Gerald'); 621 | expect(result[1].name).toEqual('Herald'); 622 | await service.remove(result[0][idProp]); 623 | await service.remove(result[1][idProp]); 624 | }); 625 | }); 626 | 627 | /// HERE WE GO !!!!!!! 628 | describe('Services don\'t call public methods internally', () => { 629 | let throwing:any; 630 | beforeAll(() => { 631 | // @ts-ignore Extended isn't properly typed 632 | throwing = service.extend({ 633 | get store() { 634 | // @ts-ignore Not sure where this comes from... 635 | return service.store; 636 | }, 637 | 638 | find: function find() { 639 | throw new Error('find method called'); 640 | }, 641 | get: function get() { 642 | throw new Error('get method called'); 643 | }, 644 | create: function create() { 645 | throw new Error('create method called'); 646 | }, 647 | update: function update() { 648 | throw new Error('update method called'); 649 | }, 650 | patch: function patch() { 651 | throw new Error('patch method called'); 652 | }, 653 | remove: function remove() { 654 | throw new Error('remove method called'); 655 | } 656 | }); 657 | }); 658 | 659 | it('find', async () => { 660 | await service.find.call(throwing); 661 | }); 662 | 663 | it('get', async () => { 664 | await service.get.call(throwing, _ids.Doug); 665 | }); 666 | 667 | it('create', async () => { 668 | const result = await service.create.call(throwing, { name: 'Bob', age: 25 }); 669 | await service.remove(result[idProp]); 670 | }); 671 | 672 | it('update', async () => { 673 | await service.update.call(throwing, _ids.Doug, { name: 'Dougler' }); 674 | }); 675 | 676 | it('patch', async () => { 677 | await service.patch.call(throwing, _ids.Doug, { name: 'PatchDoug' }); 678 | }); 679 | 680 | it('remove', async () => { 681 | await service.remove.call(throwing, _ids.Doug); 682 | }); 683 | 684 | }) 685 | 686 | }); 687 | 688 | function getTestData(key: string | number): any { 689 | const data = { 690 | 1: { 691 | name: 'Alice', 692 | age: 23, 693 | color: 'blue' 694 | } 695 | }; 696 | } 697 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": ["./src/**/*"], /* This includes all the files from the src dir. NOT VALID */ 3 | "exclude": [ 4 | "node-modules", 5 | "lib" 6 | ], 7 | "compilerOptions": { 8 | /* Basic Options */ 9 | "target": "es2017", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ 10 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ 11 | // "lib": ["./src/**/*"], /* Specify library files to be included in the compilation. */ 12 | // "allowJs": true, /* Allow javascript files to be compiled. */ 13 | // "checkJs": true, /* Report errors in .js files. */ 14 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 15 | "declaration": true, /* Generates corresponding '.d.ts' file. */ 16 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 17 | // "sourceMap": true, /* Generates corresponding '.map' file. */ 18 | // "outFile": "./", /* Concatenate and emit output to single file. */ 19 | "outDir": "lib", /* Redirect output structure to the directory. */ 20 | // "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 21 | // "composite": true, /* Enable project compilation */ 22 | // "removeComments": true, /* Do not emit comments to output. */ 23 | // "noEmit": true, /* Do not emit outputs. */ 24 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 25 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 26 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 27 | 28 | /* Strict Type-Checking Options */ 29 | "strict": true, /* Enable all strict type-checking options. */ 30 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 31 | // "strictNullChecks": true, /* Enable strict null checks. */ 32 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 33 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 34 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 35 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 36 | 37 | /* Additional Checks */ 38 | // "noUnusedLocals": true, /* Report errors on unused locals. */ 39 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 40 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 41 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 42 | 43 | /* Module Resolution Options */ 44 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 45 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 46 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 47 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 48 | // "typeRoots": [], /* List of folders to include type definitions from. */ 49 | // "types": [], /* Type declaration files to be included in compilation. */ 50 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 51 | "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ 52 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 53 | 54 | /* Source Map Options */ 55 | // "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 56 | // "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */ 57 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 58 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 59 | 60 | /* Experimental Options */ 61 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 62 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": ["tslint:latest", "tslint-config-prettier"], 3 | "rules": { 4 | // -- Strict errors -- 5 | // These lint rules are likely always a good idea. 6 | "object-literal-sort-keys": false, 7 | 8 | // Force function overloads to be declared together. This ensures readers understand APIs. 9 | "adjacent-overload-signatures": true, 10 | 11 | // Do not allow the subtle/obscure comma operator. 12 | "ban-comma-operator": true, 13 | 14 | // Do not allow internal modules or namespaces . These are deprecated in favor of ES6 modules. 15 | "no-namespace": true, 16 | 17 | // Do not allow parameters to be reassigned. To avoid bugs, developers should instead assign new values to new vars. 18 | "no-parameter-reassignment": true, 19 | 20 | // Force the use of ES6-style imports instead of /// imports. 21 | "no-reference": true, 22 | 23 | // Do not allow type assertions that do nothing. This is a big warning that the developer may not understand the 24 | // code currently being edited (they may be incorrectly handling a different type case that does not exist). 25 | "no-unnecessary-type-assertion": true, 26 | 27 | // Disallow nonsensical label usage. 28 | "label-position": true, 29 | 30 | // Disallows the (often typo) syntax if (var1 = var2). Replace with if (var2) { var1 = var2 }. 31 | "no-conditional-assignment": true, 32 | 33 | // Disallows constructors for primitive types (e.g. new Number('123'), though Number('123') is still allowed). 34 | "no-construct": true, 35 | 36 | // Do not allow super() to be called twice in a constructor. 37 | "no-duplicate-super": true, 38 | 39 | // Do not allow the same case to appear more than once in a switch block. 40 | "no-duplicate-switch-case": true, 41 | 42 | // Do not allow a variable to be declared more than once in the same block. Consider function parameters in this 43 | // rule. 44 | "no-duplicate-variable": [true, "check-parameters"], 45 | 46 | // Disallows a variable definition in an inner scope from shadowing a variable in an outer scope. Developers should 47 | // instead use a separate variable name. 48 | "no-shadowed-variable": true, 49 | 50 | // Empty blocks are almost never needed. Allow the one general exception: empty catch blocks. 51 | "no-empty": [true, "allow-empty-catch"], 52 | 53 | // Functions must either be handled directly (e.g. with a catch() handler) or returned to another function. 54 | // This is a major source of errors in Cloud Functions and the team strongly recommends leaving this rule on. 55 | "no-floating-promises": true, 56 | 57 | // Do not allow any imports for modules that are not in package.json. These will almost certainly fail when 58 | // deployed. 59 | "no-implicit-dependencies": true, 60 | 61 | // The 'this' keyword can only be used inside of classes. 62 | "no-invalid-this": true, 63 | 64 | // Do not allow strings to be thrown because they will not include stack traces. Throw Errors instead. 65 | "no-string-throw": true, 66 | 67 | // Disallow control flow statements, such as return, continue, break, and throw in finally blocks. 68 | "no-unsafe-finally": true, 69 | 70 | // Do not allow variables to be used before they are declared. 71 | "no-use-before-declare": true, 72 | 73 | // Expressions must always return a value. Avoids common errors like const myValue = functionReturningVoid(); 74 | "no-void-expression": [true, "ignore-arrow-function-shorthand"], 75 | 76 | // Disallow duplicate imports in the same file. 77 | "no-duplicate-imports": true, 78 | 79 | 80 | // -- Strong Warnings -- 81 | // These rules should almost never be needed, but may be included due to legacy code. 82 | // They are left as a warning to avoid frustration with blocked deploys when the developer 83 | // understand the warning and wants to deploy anyway. 84 | 85 | // Warn when an empty interface is defined. These are generally not useful. 86 | "no-empty-interface": {"severity": "warning"}, 87 | 88 | // Warn when an import will have side effects. 89 | "no-import-side-effect": {"severity": "warning"}, 90 | 91 | // Warn when variables are defined with var. Var has subtle meaning that can lead to bugs. Strongly prefer const for 92 | // most values and let for values that will change. 93 | "no-var-keyword": {"severity": "warning"}, 94 | 95 | // Prefer === and !== over == and !=. The latter operators support overloads that are often accidental. 96 | "triple-equals": {"severity": "warning"}, 97 | 98 | // Warn when using deprecated APIs. 99 | "deprecation": {"severity": "warning"}, 100 | 101 | // -- Light Warnigns -- 102 | // These rules are intended to help developers use better style. Simpler code has fewer bugs. These would be "info" 103 | // if TSLint supported such a level. 104 | 105 | // prefer for( ... of ... ) to an index loop when the index is only used to fetch an object from an array. 106 | // (Even better: check out utils like .map if transforming an array!) 107 | "prefer-for-of": {"severity": "warning"}, 108 | 109 | // Warns if function overloads could be unified into a single function with optional or rest parameters. 110 | "unified-signatures": {"severity": "warning"}, 111 | 112 | // Warns if code has an import or variable that is unused. 113 | "no-unused-variable": {"severity": "warning"}, 114 | 115 | // Prefer const for values that will not change. This better documents code. 116 | "prefer-const": {"severity": "warning"}, 117 | 118 | // Multi-line object liiterals and function calls should have a trailing comma. This helps avoid merge conflicts. 119 | "trailing-comma": {"severity": "warning"}, 120 | 121 | // Allow logging 122 | "no-console": false 123 | }, 124 | 125 | "linterOptions": { 126 | "exclude": [ 127 | "config/**/*.js", 128 | "node_modules/**/*.ts", 129 | "coverage/lcov-report/*.js" 130 | ] 131 | }, 132 | 133 | "defaultSeverity": "error" 134 | } 135 | --------------------------------------------------------------------------------