├── .gitignore ├── LICENSE ├── README.md ├── crud.js ├── example.js ├── index.js ├── package-lock.json └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | # Logs 4 | logs 5 | *.log 6 | npm-debug.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | 13 | # Directory for instrumented libs generated by jscoverage/JSCover 14 | lib-cov 15 | 16 | # Coverage directory used by tools like istanbul 17 | coverage 18 | 19 | # nyc test coverage 20 | .nyc_output 21 | 22 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 23 | .grunt 24 | 25 | # node-waf configuration 26 | .lock-wscript 27 | 28 | # Compiled binary addons (http://nodejs.org/api/addons.html) 29 | build/Release 30 | 31 | # Dependency directories 32 | node_modules 33 | jspm_packages 34 | 35 | # Optional npm cache directory 36 | .npm 37 | 38 | # Optional REPL history 39 | .node_repl_history 40 | 41 | .idea/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Teoman Soygul 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, 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, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # js-api 2 | Creates a REST API server from given JavaScript/JSON objects. 3 | Uses [Koa](https://github.com/koajs/koa) for the REST API. 4 | Extendable with custom routes and middleware. 5 | 6 | ## Quickstart 7 | Install the package in your project directory: 8 | 9 | ```bash 10 | npm install js-api 11 | ``` 12 | 13 | Start js-api server with some data: 14 | 15 | ```javascript 16 | var jsapi = require('js-api'); 17 | 18 | var data = {posts: [{id: 'p1', title: 'first post', body: 'lorem ipsum'}]}; 19 | 20 | jsapi.start(data, 3000); 21 | ``` 22 | 23 | Now browse to [http://localhost:3000/posts](http://localhost:3000/posts) and you will see the posts in JSON format. 24 | 25 | ## Custom Routes and Middleware 26 | See [example.js](example.js) for a complete example with custom middleware and custom route definitions for resources. 27 | 28 | You can download the entire repo and start the example directly with: 29 | 30 | ```bash 31 | npm install 32 | npm start 33 | ``` 34 | 35 | And browse to [http://localhost:3000/posts](http://localhost:3000/posts) to see the contents of the example. 36 | 37 | ## License 38 | MIT 39 | -------------------------------------------------------------------------------- /crud.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * Generates generic Koa CRUD controller for a given resource. 5 | */ 6 | 7 | var route = require('koa-route'), 8 | _ = require('lodash'); 9 | 10 | /** 11 | * Register Koa routes on a given Koa app for a given resource. 12 | */ 13 | exports.init = function (app, resource, routeName) { 14 | routeName = '/' + routeName 15 | 16 | // handle non-array objects 17 | if (!Array.isArray(resource)) { 18 | app.use(route.get(routeName, function *() { 19 | this.body = resource 20 | })); 21 | 22 | return; 23 | } 24 | 25 | // list all items filtered by query (if any) 26 | app.use(route.get(routeName, function *() { 27 | this.body = _.filter(resource, this.query) 28 | })); 29 | 30 | // get one item by id 31 | app.use(route.get(routeName + '/:id', function *(id) { 32 | var item = _.find(resource, {id: id}); 33 | if (!item) { 34 | this.status = 404; 35 | return; 36 | } 37 | this.body = item; 38 | })); 39 | 40 | // create new item 41 | app.use(route.post(routeName, function *() { 42 | resource.push(this.request.body); 43 | this.status = 201; 44 | this.body = this.request.body; 45 | })); 46 | 47 | // update item by id 48 | app.use(route.put(routeName + '/:id', function *(id) { 49 | var i = _.findIndex(resource, {id: id}); 50 | resource[i] = this.request.body; 51 | this.status = 200; 52 | this.body = this.request.body; 53 | })); 54 | 55 | // delete item by id 56 | app.use(route.delete(routeName + '/:id', function *(id) { 57 | var i = _.findIndex(resource, {id: id}); 58 | resource.splice(i, 1); 59 | this.status = 204; 60 | })); 61 | }; 62 | -------------------------------------------------------------------------------- /example.js: -------------------------------------------------------------------------------- 1 | var jsapi = require('./index'); // this is a regular Koa app 2 | 3 | var data = { 4 | posts: [ 5 | {id: 'p1', title: 'first post', body: 'lorem ip sum'}, 6 | {id: 'p2', title: 'second post', body: 'dolor sit amet'} 7 | ], 8 | users: [ 9 | {id: 'u1', name: 'Chuck'} 10 | ], 11 | home: { 12 | title: 'My Title', 13 | content: 'Lorem ipsum.' 14 | } 15 | }; 16 | 17 | // define custom API route for 'users' 18 | data.users.route = 'local-users' 19 | 20 | // define custom Koa middleware/routes if necessary 21 | jsapi.use(function *(next){ 22 | var start = new Date; 23 | yield next; 24 | var ms = new Date - start; 25 | console.log('%s %s - %s', this.method, this.url, ms); 26 | }); 27 | 28 | jsapi.start(data, 3000); 29 | 30 | // ########### Below is the testing part for the above server definition ############ // 31 | 32 | console.log('Running example tests:') 33 | 34 | var request = require('request'); 35 | var uri = 'http://localhost:3000/' 36 | 37 | request({url: uri + 'local-users/u1', json: true}, function (error, response, body) { 38 | console.log('get user #1:', body) 39 | }) 40 | 41 | request({url: uri + 'posts/p1', json: true}, function (error, response, body) { 42 | console.log('get post #1:', body) 43 | }) 44 | 45 | request({url: uri + 'posts', method: 'POST', json: {id:'p3', title: 'third post', body: 'quick brown fox'}}, function (error, response, body) { 46 | console.log('create post #3:', body) 47 | }) 48 | 49 | request({url: uri + 'posts/p1', method: 'PUT', json: {id:'p1', title: 'first post', body: 'some proper body'}}, function (error, response, body) { 50 | console.log('update post #1:', body) 51 | }) 52 | 53 | request({url: uri + 'posts', json: true}, function (error, response, body) { 54 | console.log('all posts:', body) 55 | }) 56 | 57 | request({url: uri + 'home', json: true}, function (error, response, body) { 58 | console.log('home page:', body) 59 | }) -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * Entry point for JS-API app. 5 | * Initializes the database and starts listening for requests on configured port. 6 | */ 7 | 8 | var koa = require('koa'), 9 | app = koa(), 10 | logger = require('koa-logger'), 11 | cors = require('koa-cors'), 12 | bodyParser = require('koa-bodyparser'), 13 | _ = require('lodash'), 14 | crud = require('./crud'); 15 | 16 | // Koa config 17 | app.use(logger()); 18 | 19 | app.use(cors({ 20 | maxAge: 0, 21 | credentials: true, 22 | methods: 'GET, HEAD, OPTIONS, PUT, POST, DELETE', 23 | headers: 'Origin, X-Requested-With, Content-Type, Accept, Authorization' 24 | })); 25 | 26 | app.use(bodyParser()); 27 | 28 | app.start = function (data, port) { 29 | port = port || 3000; 30 | data = data || {}; 31 | 32 | // mount all resources defined in data as a generic crud route 33 | _.forOwn(data, function(resource, key) { 34 | crud.init(app, resource, resource.route || key); 35 | }); 36 | 37 | app.listen(port) 38 | 39 | console.log('JS-API server started on port %s', port) 40 | } 41 | 42 | module.exports = app; 43 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "js-api", 3 | "version": "1.4.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.7", 9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 10 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 11 | "requires": { 12 | "mime-types": "~2.1.24", 13 | "negotiator": "0.6.2" 14 | } 15 | }, 16 | "ajv": { 17 | "version": "6.12.6", 18 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 19 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 20 | "requires": { 21 | "fast-deep-equal": "^3.1.1", 22 | "fast-json-stable-stringify": "^2.0.0", 23 | "json-schema-traverse": "^0.4.1", 24 | "uri-js": "^4.2.2" 25 | } 26 | }, 27 | "ansi-regex": { 28 | "version": "2.1.1", 29 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 30 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 31 | }, 32 | "ansi-styles": { 33 | "version": "2.2.1", 34 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 35 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" 36 | }, 37 | "any-promise": { 38 | "version": "1.3.0", 39 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 40 | "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" 41 | }, 42 | "asn1": { 43 | "version": "0.2.4", 44 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 45 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 46 | "requires": { 47 | "safer-buffer": "~2.1.0" 48 | } 49 | }, 50 | "assert-plus": { 51 | "version": "1.0.0", 52 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 53 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 54 | }, 55 | "asynckit": { 56 | "version": "0.4.0", 57 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 58 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 59 | }, 60 | "aws-sign2": { 61 | "version": "0.7.0", 62 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 63 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 64 | }, 65 | "aws4": { 66 | "version": "1.11.0", 67 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", 68 | "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" 69 | }, 70 | "bcrypt-pbkdf": { 71 | "version": "1.0.2", 72 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 73 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 74 | "requires": { 75 | "tweetnacl": "^0.14.3" 76 | } 77 | }, 78 | "bytes": { 79 | "version": "3.1.0", 80 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 81 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 82 | }, 83 | "call-bind": { 84 | "version": "1.0.2", 85 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 86 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 87 | "requires": { 88 | "function-bind": "^1.1.1", 89 | "get-intrinsic": "^1.0.2" 90 | } 91 | }, 92 | "caseless": { 93 | "version": "0.12.0", 94 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 95 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 96 | }, 97 | "chalk": { 98 | "version": "1.1.3", 99 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 100 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 101 | "requires": { 102 | "ansi-styles": "^2.2.1", 103 | "escape-string-regexp": "^1.0.2", 104 | "has-ansi": "^2.0.0", 105 | "strip-ansi": "^3.0.0", 106 | "supports-color": "^2.0.0" 107 | } 108 | }, 109 | "co": { 110 | "version": "4.6.0", 111 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 112 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 113 | }, 114 | "co-body": { 115 | "version": "5.2.0", 116 | "resolved": "https://registry.npmjs.org/co-body/-/co-body-5.2.0.tgz", 117 | "integrity": "sha512-sX/LQ7LqUhgyaxzbe7IqwPeTr2yfpfUIQ/dgpKo6ZI4y4lpQA0YxAomWIY+7I7rHWcG02PG+OuPREzMW/5tszQ==", 118 | "requires": { 119 | "inflation": "^2.0.0", 120 | "qs": "^6.4.0", 121 | "raw-body": "^2.2.0", 122 | "type-is": "^1.6.14" 123 | } 124 | }, 125 | "combined-stream": { 126 | "version": "1.0.8", 127 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 128 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 129 | "requires": { 130 | "delayed-stream": "~1.0.0" 131 | } 132 | }, 133 | "composition": { 134 | "version": "2.3.0", 135 | "resolved": "https://registry.npmjs.org/composition/-/composition-2.3.0.tgz", 136 | "integrity": "sha1-dCgFN0yrVQxSCjNmL1pzLgII1vI=", 137 | "requires": { 138 | "any-promise": "^1.1.0", 139 | "co": "^4.0.2" 140 | } 141 | }, 142 | "content-disposition": { 143 | "version": "0.5.3", 144 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 145 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 146 | "requires": { 147 | "safe-buffer": "5.1.2" 148 | } 149 | }, 150 | "content-type": { 151 | "version": "1.0.4", 152 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 153 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 154 | }, 155 | "cookies": { 156 | "version": "0.7.3", 157 | "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.7.3.tgz", 158 | "integrity": "sha512-+gixgxYSgQLTaTIilDHAdlNPZDENDQernEMiIcZpYYP14zgHsCt4Ce1FEjFtcp6GefhozebB6orvhAAWx/IS0A==", 159 | "requires": { 160 | "depd": "~1.1.2", 161 | "keygrip": "~1.0.3" 162 | } 163 | }, 164 | "copy-to": { 165 | "version": "2.0.1", 166 | "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", 167 | "integrity": "sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=" 168 | }, 169 | "core-util-is": { 170 | "version": "1.0.2", 171 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 172 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 173 | }, 174 | "dashdash": { 175 | "version": "1.14.1", 176 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 177 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 178 | "requires": { 179 | "assert-plus": "^1.0.0" 180 | } 181 | }, 182 | "debug": { 183 | "version": "2.6.9", 184 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 185 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 186 | "requires": { 187 | "ms": "2.0.0" 188 | } 189 | }, 190 | "deep-equal": { 191 | "version": "1.0.1", 192 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 193 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" 194 | }, 195 | "delayed-stream": { 196 | "version": "1.0.0", 197 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 198 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 199 | }, 200 | "delegates": { 201 | "version": "1.0.0", 202 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 203 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 204 | }, 205 | "depd": { 206 | "version": "1.1.2", 207 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 208 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 209 | }, 210 | "destroy": { 211 | "version": "1.0.4", 212 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 213 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 214 | }, 215 | "ecc-jsbn": { 216 | "version": "0.1.2", 217 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 218 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 219 | "requires": { 220 | "jsbn": "~0.1.0", 221 | "safer-buffer": "^2.1.0" 222 | } 223 | }, 224 | "ee-first": { 225 | "version": "1.1.1", 226 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 227 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 228 | }, 229 | "error-inject": { 230 | "version": "1.0.0", 231 | "resolved": "https://registry.npmjs.org/error-inject/-/error-inject-1.0.0.tgz", 232 | "integrity": "sha1-4rPZG1Su1nLzCdlQ0VSFD6EdTzc=" 233 | }, 234 | "escape-html": { 235 | "version": "1.0.3", 236 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 237 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 238 | }, 239 | "escape-string-regexp": { 240 | "version": "1.0.5", 241 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 242 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 243 | }, 244 | "extend": { 245 | "version": "3.0.2", 246 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 247 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 248 | }, 249 | "extsprintf": { 250 | "version": "1.3.0", 251 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 252 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 253 | }, 254 | "fast-deep-equal": { 255 | "version": "3.1.3", 256 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 257 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 258 | }, 259 | "fast-json-stable-stringify": { 260 | "version": "2.1.0", 261 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 262 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 263 | }, 264 | "forever-agent": { 265 | "version": "0.6.1", 266 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 267 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 268 | }, 269 | "form-data": { 270 | "version": "2.3.3", 271 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 272 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 273 | "requires": { 274 | "asynckit": "^0.4.0", 275 | "combined-stream": "^1.0.6", 276 | "mime-types": "^2.1.12" 277 | } 278 | }, 279 | "fresh": { 280 | "version": "0.5.2", 281 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 282 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 283 | }, 284 | "function-bind": { 285 | "version": "1.1.1", 286 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 287 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 288 | }, 289 | "get-intrinsic": { 290 | "version": "1.1.1", 291 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", 292 | "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", 293 | "requires": { 294 | "function-bind": "^1.1.1", 295 | "has": "^1.0.3", 296 | "has-symbols": "^1.0.1" 297 | } 298 | }, 299 | "getpass": { 300 | "version": "0.1.7", 301 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 302 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 303 | "requires": { 304 | "assert-plus": "^1.0.0" 305 | } 306 | }, 307 | "har-schema": { 308 | "version": "2.0.0", 309 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 310 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 311 | }, 312 | "har-validator": { 313 | "version": "5.1.5", 314 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", 315 | "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", 316 | "requires": { 317 | "ajv": "^6.12.3", 318 | "har-schema": "^2.0.0" 319 | } 320 | }, 321 | "has": { 322 | "version": "1.0.3", 323 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 324 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 325 | "requires": { 326 | "function-bind": "^1.1.1" 327 | } 328 | }, 329 | "has-ansi": { 330 | "version": "2.0.0", 331 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 332 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 333 | "requires": { 334 | "ansi-regex": "^2.0.0" 335 | } 336 | }, 337 | "has-symbols": { 338 | "version": "1.0.2", 339 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", 340 | "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" 341 | }, 342 | "http-assert": { 343 | "version": "1.4.1", 344 | "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.4.1.tgz", 345 | "integrity": "sha512-rdw7q6GTlibqVVbXr0CKelfV5iY8G2HqEUkhSk297BMbSpSL8crXC+9rjKoMcZZEsksX30le6f/4ul4E28gegw==", 346 | "requires": { 347 | "deep-equal": "~1.0.1", 348 | "http-errors": "~1.7.2" 349 | }, 350 | "dependencies": { 351 | "http-errors": { 352 | "version": "1.7.3", 353 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", 354 | "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", 355 | "requires": { 356 | "depd": "~1.1.2", 357 | "inherits": "2.0.4", 358 | "setprototypeof": "1.1.1", 359 | "statuses": ">= 1.5.0 < 2", 360 | "toidentifier": "1.0.0" 361 | } 362 | } 363 | } 364 | }, 365 | "http-errors": { 366 | "version": "1.8.0", 367 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", 368 | "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", 369 | "requires": { 370 | "depd": "~1.1.2", 371 | "inherits": "2.0.4", 372 | "setprototypeof": "1.2.0", 373 | "statuses": ">= 1.5.0 < 2", 374 | "toidentifier": "1.0.0" 375 | }, 376 | "dependencies": { 377 | "setprototypeof": { 378 | "version": "1.2.0", 379 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 380 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 381 | } 382 | } 383 | }, 384 | "http-signature": { 385 | "version": "1.2.0", 386 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 387 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 388 | "requires": { 389 | "assert-plus": "^1.0.0", 390 | "jsprim": "^1.2.2", 391 | "sshpk": "^1.7.0" 392 | } 393 | }, 394 | "humanize-number": { 395 | "version": "0.0.2", 396 | "resolved": "https://registry.npmjs.org/humanize-number/-/humanize-number-0.0.2.tgz", 397 | "integrity": "sha1-EcCvakcWQ2M1iFiASPF5lUFInBg=" 398 | }, 399 | "iconv-lite": { 400 | "version": "0.4.24", 401 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 402 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 403 | "requires": { 404 | "safer-buffer": ">= 2.1.2 < 3" 405 | } 406 | }, 407 | "inflation": { 408 | "version": "2.0.0", 409 | "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", 410 | "integrity": "sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8=" 411 | }, 412 | "inherits": { 413 | "version": "2.0.4", 414 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 415 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 416 | }, 417 | "is-typedarray": { 418 | "version": "1.0.0", 419 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 420 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 421 | }, 422 | "isarray": { 423 | "version": "0.0.1", 424 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 425 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 426 | }, 427 | "isstream": { 428 | "version": "0.1.2", 429 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 430 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 431 | }, 432 | "jsbn": { 433 | "version": "0.1.1", 434 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 435 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 436 | }, 437 | "json-schema": { 438 | "version": "0.2.3", 439 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 440 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 441 | }, 442 | "json-schema-traverse": { 443 | "version": "0.4.1", 444 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 445 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 446 | }, 447 | "json-stringify-safe": { 448 | "version": "5.0.1", 449 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 450 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 451 | }, 452 | "jsprim": { 453 | "version": "1.4.1", 454 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 455 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 456 | "requires": { 457 | "assert-plus": "1.0.0", 458 | "extsprintf": "1.3.0", 459 | "json-schema": "0.2.3", 460 | "verror": "1.10.0" 461 | } 462 | }, 463 | "keygrip": { 464 | "version": "1.0.3", 465 | "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.0.3.tgz", 466 | "integrity": "sha512-/PpesirAIfaklxUzp4Yb7xBper9MwP6hNRA6BGGUFCgbJ+BM5CKBtsoxinNXkLHAr+GXS1/lSlF2rP7cv5Fl+g==" 467 | }, 468 | "koa": { 469 | "version": "1.6.2", 470 | "resolved": "https://registry.npmjs.org/koa/-/koa-1.6.2.tgz", 471 | "integrity": "sha512-oeH9b78oNQeDzmgXSmjzHIw7eT9584Lhp9h+r7zcXnzNf+2vJf021GEJsIQ5owj8Wu2x5pArrYjURnp37rv+5Q==", 472 | "requires": { 473 | "accepts": "^1.2.2", 474 | "co": "^4.4.0", 475 | "composition": "^2.1.1", 476 | "content-disposition": "~0.5.0", 477 | "content-type": "^1.0.0", 478 | "cookies": "~0.7.0", 479 | "debug": "^2.6.9", 480 | "delegates": "^1.0.0", 481 | "destroy": "^1.0.3", 482 | "error-inject": "~1.0.0", 483 | "escape-html": "~1.0.1", 484 | "fresh": "^0.5.2", 485 | "http-assert": "^1.1.0", 486 | "http-errors": "^1.2.8", 487 | "koa-compose": "^2.3.0", 488 | "koa-is-json": "^1.0.0", 489 | "mime-types": "^2.0.7", 490 | "on-finished": "^2.1.0", 491 | "only": "0.0.2", 492 | "parseurl": "^1.3.0", 493 | "statuses": "^1.2.0", 494 | "type-is": "^1.5.5", 495 | "vary": "^1.0.0" 496 | } 497 | }, 498 | "koa-bodyparser": { 499 | "version": "2.5.0", 500 | "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-2.5.0.tgz", 501 | "integrity": "sha1-PrckP0eZii53LbBfbcTg9PPMvfA=", 502 | "requires": { 503 | "co-body": "^5.1.0", 504 | "copy-to": "^2.0.1" 505 | } 506 | }, 507 | "koa-compose": { 508 | "version": "2.5.1", 509 | "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-2.5.1.tgz", 510 | "integrity": "sha1-cmz7F2lN5cufvwPArfFyMD+D8VY=" 511 | }, 512 | "koa-cors": { 513 | "version": "0.0.16", 514 | "resolved": "https://registry.npmjs.org/koa-cors/-/koa-cors-0.0.16.tgz", 515 | "integrity": "sha1-mBB5k6eQnjTAQphsXsYVbXfzQy4=" 516 | }, 517 | "koa-is-json": { 518 | "version": "1.0.0", 519 | "resolved": "https://registry.npmjs.org/koa-is-json/-/koa-is-json-1.0.0.tgz", 520 | "integrity": "sha1-JzwH7c3Ljfaiwat9We52SRRR7BQ=" 521 | }, 522 | "koa-logger": { 523 | "version": "1.3.1", 524 | "resolved": "https://registry.npmjs.org/koa-logger/-/koa-logger-1.3.1.tgz", 525 | "integrity": "sha1-rT9fIZOzM0Mo8+uZphj0sEvui9U=", 526 | "requires": { 527 | "bytes": "1", 528 | "chalk": "^1.1.3", 529 | "humanize-number": "0.0.2", 530 | "passthrough-counter": "^1.0.0" 531 | }, 532 | "dependencies": { 533 | "bytes": { 534 | "version": "1.0.0", 535 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", 536 | "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=" 537 | } 538 | } 539 | }, 540 | "koa-route": { 541 | "version": "2.4.2", 542 | "resolved": "https://registry.npmjs.org/koa-route/-/koa-route-2.4.2.tgz", 543 | "integrity": "sha1-DeInmJ5qpzNHaKu/sWxRmtmn+nE=", 544 | "requires": { 545 | "debug": "*", 546 | "methods": "~1.1.0", 547 | "path-to-regexp": "^1.2.0" 548 | } 549 | }, 550 | "lodash": { 551 | "version": "4.17.21", 552 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 553 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 554 | }, 555 | "media-typer": { 556 | "version": "0.3.0", 557 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 558 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 559 | }, 560 | "methods": { 561 | "version": "1.1.2", 562 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 563 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 564 | }, 565 | "mime-db": { 566 | "version": "1.47.0", 567 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", 568 | "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==" 569 | }, 570 | "mime-types": { 571 | "version": "2.1.30", 572 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", 573 | "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", 574 | "requires": { 575 | "mime-db": "1.47.0" 576 | } 577 | }, 578 | "ms": { 579 | "version": "2.0.0", 580 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 581 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 582 | }, 583 | "negotiator": { 584 | "version": "0.6.2", 585 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 586 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 587 | }, 588 | "oauth-sign": { 589 | "version": "0.9.0", 590 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 591 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 592 | }, 593 | "object-inspect": { 594 | "version": "1.10.3", 595 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", 596 | "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==" 597 | }, 598 | "on-finished": { 599 | "version": "2.3.0", 600 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 601 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 602 | "requires": { 603 | "ee-first": "1.1.1" 604 | } 605 | }, 606 | "only": { 607 | "version": "0.0.2", 608 | "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", 609 | "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=" 610 | }, 611 | "parseurl": { 612 | "version": "1.3.3", 613 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 614 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 615 | }, 616 | "passthrough-counter": { 617 | "version": "1.0.0", 618 | "resolved": "https://registry.npmjs.org/passthrough-counter/-/passthrough-counter-1.0.0.tgz", 619 | "integrity": "sha1-GWfZ5m2lcrXAI8eH2xEqOHqxZvo=" 620 | }, 621 | "path-to-regexp": { 622 | "version": "1.8.0", 623 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", 624 | "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", 625 | "requires": { 626 | "isarray": "0.0.1" 627 | } 628 | }, 629 | "performance-now": { 630 | "version": "2.1.0", 631 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 632 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 633 | }, 634 | "psl": { 635 | "version": "1.8.0", 636 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", 637 | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" 638 | }, 639 | "punycode": { 640 | "version": "2.1.1", 641 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 642 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 643 | }, 644 | "qs": { 645 | "version": "6.10.1", 646 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", 647 | "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", 648 | "requires": { 649 | "side-channel": "^1.0.4" 650 | } 651 | }, 652 | "raw-body": { 653 | "version": "2.4.1", 654 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz", 655 | "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==", 656 | "requires": { 657 | "bytes": "3.1.0", 658 | "http-errors": "1.7.3", 659 | "iconv-lite": "0.4.24", 660 | "unpipe": "1.0.0" 661 | }, 662 | "dependencies": { 663 | "http-errors": { 664 | "version": "1.7.3", 665 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", 666 | "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", 667 | "requires": { 668 | "depd": "~1.1.2", 669 | "inherits": "2.0.4", 670 | "setprototypeof": "1.1.1", 671 | "statuses": ">= 1.5.0 < 2", 672 | "toidentifier": "1.0.0" 673 | } 674 | } 675 | } 676 | }, 677 | "request": { 678 | "version": "2.88.2", 679 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", 680 | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", 681 | "requires": { 682 | "aws-sign2": "~0.7.0", 683 | "aws4": "^1.8.0", 684 | "caseless": "~0.12.0", 685 | "combined-stream": "~1.0.6", 686 | "extend": "~3.0.2", 687 | "forever-agent": "~0.6.1", 688 | "form-data": "~2.3.2", 689 | "har-validator": "~5.1.3", 690 | "http-signature": "~1.2.0", 691 | "is-typedarray": "~1.0.0", 692 | "isstream": "~0.1.2", 693 | "json-stringify-safe": "~5.0.1", 694 | "mime-types": "~2.1.19", 695 | "oauth-sign": "~0.9.0", 696 | "performance-now": "^2.1.0", 697 | "qs": "~6.5.2", 698 | "safe-buffer": "^5.1.2", 699 | "tough-cookie": "~2.5.0", 700 | "tunnel-agent": "^0.6.0", 701 | "uuid": "^3.3.2" 702 | }, 703 | "dependencies": { 704 | "qs": { 705 | "version": "6.5.2", 706 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 707 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 708 | } 709 | } 710 | }, 711 | "safe-buffer": { 712 | "version": "5.1.2", 713 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 714 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 715 | }, 716 | "safer-buffer": { 717 | "version": "2.1.2", 718 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 719 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 720 | }, 721 | "setprototypeof": { 722 | "version": "1.1.1", 723 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 724 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 725 | }, 726 | "side-channel": { 727 | "version": "1.0.4", 728 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 729 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 730 | "requires": { 731 | "call-bind": "^1.0.0", 732 | "get-intrinsic": "^1.0.2", 733 | "object-inspect": "^1.9.0" 734 | } 735 | }, 736 | "sshpk": { 737 | "version": "1.16.1", 738 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 739 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 740 | "requires": { 741 | "asn1": "~0.2.3", 742 | "assert-plus": "^1.0.0", 743 | "bcrypt-pbkdf": "^1.0.0", 744 | "dashdash": "^1.12.0", 745 | "ecc-jsbn": "~0.1.1", 746 | "getpass": "^0.1.1", 747 | "jsbn": "~0.1.0", 748 | "safer-buffer": "^2.0.2", 749 | "tweetnacl": "~0.14.0" 750 | } 751 | }, 752 | "statuses": { 753 | "version": "1.5.0", 754 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 755 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 756 | }, 757 | "strip-ansi": { 758 | "version": "3.0.1", 759 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 760 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 761 | "requires": { 762 | "ansi-regex": "^2.0.0" 763 | } 764 | }, 765 | "supports-color": { 766 | "version": "2.0.0", 767 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 768 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" 769 | }, 770 | "toidentifier": { 771 | "version": "1.0.0", 772 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 773 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 774 | }, 775 | "tough-cookie": { 776 | "version": "2.5.0", 777 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 778 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 779 | "requires": { 780 | "psl": "^1.1.28", 781 | "punycode": "^2.1.1" 782 | } 783 | }, 784 | "tunnel-agent": { 785 | "version": "0.6.0", 786 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 787 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 788 | "requires": { 789 | "safe-buffer": "^5.0.1" 790 | } 791 | }, 792 | "tweetnacl": { 793 | "version": "0.14.5", 794 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 795 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 796 | }, 797 | "type-is": { 798 | "version": "1.6.18", 799 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 800 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 801 | "requires": { 802 | "media-typer": "0.3.0", 803 | "mime-types": "~2.1.24" 804 | } 805 | }, 806 | "unpipe": { 807 | "version": "1.0.0", 808 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 809 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 810 | }, 811 | "uri-js": { 812 | "version": "4.4.1", 813 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 814 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 815 | "requires": { 816 | "punycode": "^2.1.0" 817 | } 818 | }, 819 | "uuid": { 820 | "version": "3.4.0", 821 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 822 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" 823 | }, 824 | "vary": { 825 | "version": "1.1.2", 826 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 827 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 828 | }, 829 | "verror": { 830 | "version": "1.10.0", 831 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 832 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 833 | "requires": { 834 | "assert-plus": "^1.0.0", 835 | "core-util-is": "1.0.2", 836 | "extsprintf": "^1.2.0" 837 | } 838 | } 839 | } 840 | } 841 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "js-api", 3 | "version": "1.5.0", 4 | "description": "JavaScript/JSON objects to REST API in seconds.", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node example.js" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/soygul/js-api.git" 12 | }, 13 | "author": "Teoman Soygul", 14 | "license": "MIT", 15 | "bugs": { 16 | "url": "https://github.com/soygul/js-api/issues" 17 | }, 18 | "homepage": "https://github.com/soygul/js-api", 19 | "dependencies": { 20 | "koa": "1.6.2", 21 | "koa-bodyparser": "2.5.0", 22 | "koa-cors": "0.0.16", 23 | "koa-logger": "1.3.1", 24 | "koa-route": "2.4.2", 25 | "lodash": "4.17.21", 26 | "request": "2.88.2" 27 | } 28 | } 29 | --------------------------------------------------------------------------------